PageRenderTime 47ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/src/tracker/grl-tracker-utils.c

https://gitlab.com/grilofw/grilo-plugins
C | 706 lines | 559 code | 114 blank | 33 comment | 83 complexity | 34cffbcc5a93ef71ad1a5d50c6d34ce6 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /*
  2. * Copyright (C) 2011 Igalia S.L.
  3. * Copyright (C) 2011 Intel Corporation.
  4. *
  5. * Contact: Iago Toral Quiroga <itoral@igalia.com>
  6. *
  7. * Authors: Lionel Landwerlin <lionel.g.landwerlin@linux.intel.com>
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public License
  11. * as published by the Free Software Foundation; version 2.1 of
  12. * the License, or (at your option) any later version.
  13. *
  14. * This library is distributed in the hope that it will be useful, but
  15. * WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  22. * 02110-1301 USA
  23. *
  24. */
  25. #ifdef HAVE_CONFIG_H
  26. #include "config.h"
  27. #endif
  28. #include "grl-tracker-utils.h"
  29. #include <glib/gi18n-lib.h>
  30. /**/
  31. static GHashTable *grl_to_sparql_mapping = NULL;
  32. static GHashTable *sparql_to_grl_mapping = NULL;
  33. GrlKeyID grl_metadata_key_tracker_urn;
  34. GrlKeyID grl_metadata_key_gibest_hash;
  35. /**/
  36. static gchar *
  37. build_flavored_key (gchar *key, const gchar *flavor)
  38. {
  39. gint i = 0;
  40. while (key[i] != '\0') {
  41. if (!g_ascii_isalnum (key[i])) {
  42. key[i] = '_';
  43. }
  44. i++;
  45. }
  46. return g_strdup_printf ("%s_%s", key, flavor);
  47. }
  48. static void
  49. set_orientation (TrackerSparqlCursor *cursor,
  50. gint column,
  51. GrlMedia *media,
  52. GrlKeyID key)
  53. {
  54. const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL);
  55. if (g_str_has_suffix (str, "nfo#orientation-top"))
  56. grl_data_set_int (GRL_DATA (media), key, 0);
  57. else if (g_str_has_suffix (str, "nfo#orientation-right"))
  58. grl_data_set_int (GRL_DATA (media), key, 90);
  59. else if (g_str_has_suffix (str, "nfo#orientation-bottom"))
  60. grl_data_set_int (GRL_DATA (media), key, 180);
  61. else if (g_str_has_suffix (str, "nfo#orientation-left"))
  62. grl_data_set_int (GRL_DATA (media), key, 270);
  63. }
  64. static void
  65. set_date (TrackerSparqlCursor *cursor,
  66. gint column,
  67. GrlMedia *media,
  68. GrlKeyID key)
  69. {
  70. const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL);
  71. if (key == GRL_METADATA_KEY_CREATION_DATE
  72. || key == GRL_METADATA_KEY_MODIFICATION_DATE) {
  73. GDateTime *date = grl_date_time_from_iso8601 (str);
  74. if (date) {
  75. grl_data_set_boxed (GRL_DATA (media), key, date);
  76. g_date_time_unref (date);
  77. }
  78. }
  79. }
  80. static void
  81. set_title_from_filename (TrackerSparqlCursor *cursor,
  82. gint column,
  83. GrlMedia *media,
  84. GrlKeyID key)
  85. {
  86. const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL);
  87. if (key == GRL_METADATA_KEY_TITLE) {
  88. grl_data_set_boolean (GRL_DATA (media), GRL_METADATA_KEY_TITLE_FROM_FILENAME, TRUE);
  89. grl_media_set_title (media, str);
  90. }
  91. }
  92. static void
  93. set_title (TrackerSparqlCursor *cursor,
  94. gint column,
  95. GrlMedia *media,
  96. GrlKeyID key)
  97. {
  98. const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL);
  99. grl_data_set_boolean (GRL_DATA (media), GRL_METADATA_KEY_TITLE_FROM_FILENAME, FALSE);
  100. grl_media_set_title (media, str);
  101. }
  102. static tracker_grl_sparql_t *
  103. insert_key_mapping (GrlKeyID grl_key,
  104. const gchar *sparql_key_attr,
  105. const gchar *sparql_key_attr_call,
  106. const gchar *sparql_key_flavor)
  107. {
  108. tracker_grl_sparql_t *assoc = g_new0 (tracker_grl_sparql_t, 1);
  109. GList *assoc_list = g_hash_table_lookup (grl_to_sparql_mapping,
  110. GRLKEYID_TO_POINTER (grl_key));
  111. gchar *canon_name = g_strdup (GRL_METADATA_KEY_GET_NAME (grl_key));
  112. assoc->grl_key = grl_key;
  113. assoc->sparql_key_name = build_flavored_key (canon_name,
  114. sparql_key_flavor);
  115. assoc->sparql_key_attr = sparql_key_attr;
  116. assoc->sparql_key_attr_call = sparql_key_attr_call;
  117. assoc->sparql_key_flavor = sparql_key_flavor;
  118. assoc_list = g_list_append (assoc_list, assoc);
  119. g_hash_table_insert (grl_to_sparql_mapping,
  120. GRLKEYID_TO_POINTER (grl_key),
  121. assoc_list);
  122. g_hash_table_insert (sparql_to_grl_mapping,
  123. (gpointer) assoc->sparql_key_name,
  124. assoc);
  125. g_hash_table_insert (sparql_to_grl_mapping,
  126. (gpointer) GRL_METADATA_KEY_GET_NAME (grl_key),
  127. assoc);
  128. g_free (canon_name);
  129. return assoc;
  130. }
  131. static tracker_grl_sparql_t *
  132. insert_key_mapping_with_setter (GrlKeyID grl_key,
  133. const gchar *sparql_key_attr,
  134. const gchar *sparql_key_attr_call,
  135. const gchar *sparql_key_flavor,
  136. tracker_grl_sparql_setter_cb_t setter)
  137. {
  138. tracker_grl_sparql_t *assoc;
  139. assoc = insert_key_mapping (grl_key,
  140. sparql_key_attr,
  141. sparql_key_attr_call,
  142. sparql_key_flavor);
  143. assoc->set_value = setter;
  144. return assoc;
  145. }
  146. void
  147. grl_tracker_setup_key_mappings (void)
  148. {
  149. GrlRegistry *registry = grl_registry_get_default ();
  150. grl_metadata_key_tracker_urn =
  151. grl_registry_lookup_metadata_key (registry, "tracker-urn");
  152. grl_metadata_key_gibest_hash =
  153. grl_registry_lookup_metadata_key (registry, "gibest-hash");
  154. grl_to_sparql_mapping = g_hash_table_new (g_direct_hash, g_direct_equal);
  155. sparql_to_grl_mapping = g_hash_table_new (g_str_hash, g_str_equal);
  156. insert_key_mapping (grl_metadata_key_tracker_urn,
  157. NULL,
  158. "?urn",
  159. "file");
  160. insert_key_mapping (GRL_METADATA_KEY_ALBUM,
  161. NULL,
  162. "nmm:albumTitle(nmm:musicAlbum(?urn))",
  163. "audio");
  164. insert_key_mapping (GRL_METADATA_KEY_ARTIST,
  165. NULL,
  166. "nmm:artistName(nmm:performer(?urn))",
  167. "audio");
  168. insert_key_mapping (GRL_METADATA_KEY_AUTHOR,
  169. NULL,
  170. "nmm:artistName(nmm:performer(?urn))",
  171. "audio");
  172. insert_key_mapping (GRL_METADATA_KEY_BITRATE,
  173. "nfo:averageBitrate",
  174. "nfo:averageBitrate(?urn)",
  175. "audio");
  176. insert_key_mapping (GRL_METADATA_KEY_CHILDCOUNT,
  177. "nfo:entryCounter",
  178. "nfo:entryCounter(?urn)",
  179. "directory");
  180. insert_key_mapping (GRL_METADATA_KEY_SIZE,
  181. NULL,
  182. "nfo:fileSize(?urn)",
  183. "file");
  184. insert_key_mapping (grl_metadata_key_gibest_hash,
  185. NULL,
  186. "(select nfo:hashValue(?h) { ?urn nfo:hasHash ?h . ?h nfo:hashAlgorithm \"gibest\" })",
  187. "video");
  188. insert_key_mapping_with_setter (GRL_METADATA_KEY_MODIFICATION_DATE,
  189. "nfo:fileLastModified",
  190. "nfo:fileLastModified(?urn)",
  191. "file",
  192. set_date);
  193. insert_key_mapping (GRL_METADATA_KEY_DURATION,
  194. "nfo:duration",
  195. "nfo:duration(?urn)",
  196. "audio");
  197. insert_key_mapping (GRL_METADATA_KEY_FRAMERATE,
  198. "nfo:frameRate",
  199. "nfo:frameRate(?urn)",
  200. "video");
  201. insert_key_mapping (GRL_METADATA_KEY_HEIGHT,
  202. "nfo:height",
  203. "nfo:height(?urn)",
  204. "video");
  205. insert_key_mapping (GRL_METADATA_KEY_ID,
  206. "tracker:id",
  207. "tracker:id(?urn)",
  208. "file");
  209. insert_key_mapping_with_setter (GRL_METADATA_KEY_LAST_PLAYED,
  210. "nfo:fileLastAccessed",
  211. "nfo:fileLastAccessed(?urn)",
  212. "file",
  213. set_date);
  214. insert_key_mapping (GRL_METADATA_KEY_MIME,
  215. "nie:mimeType",
  216. "nie:mimeType(?urn)",
  217. "file");
  218. insert_key_mapping (GRL_METADATA_KEY_SITE,
  219. "nie:url",
  220. "nie:url(?urn)",
  221. "file");
  222. insert_key_mapping_with_setter (GRL_METADATA_KEY_TITLE,
  223. "nie:title",
  224. "nie:title(?urn)",
  225. "audio",
  226. set_title);
  227. insert_key_mapping_with_setter (GRL_METADATA_KEY_TITLE,
  228. "nfo:fileName",
  229. "nfo:fileName(?urn)",
  230. "file",
  231. set_title_from_filename);
  232. insert_key_mapping (GRL_METADATA_KEY_URL,
  233. "nie:url",
  234. "nie:url(?urn)",
  235. "file");
  236. insert_key_mapping (GRL_METADATA_KEY_WIDTH,
  237. "nfo:width",
  238. "nfo:width(?urn)",
  239. "video");
  240. insert_key_mapping (GRL_METADATA_KEY_SEASON,
  241. "nmm:season",
  242. "nmm:season(?urn)",
  243. "video");
  244. insert_key_mapping (GRL_METADATA_KEY_EPISODE,
  245. "nmm:episodeNumber",
  246. "nmm:episodeNumber(?urn)",
  247. "video");
  248. insert_key_mapping_with_setter (GRL_METADATA_KEY_CREATION_DATE,
  249. "nie:contentCreated",
  250. "nie:contentCreated(?urn)",
  251. "image",
  252. set_date);
  253. insert_key_mapping (GRL_METADATA_KEY_CAMERA_MODEL,
  254. NULL,
  255. "nfo:model(nfo:equipment(?urn))",
  256. "image");
  257. insert_key_mapping (GRL_METADATA_KEY_FLASH_USED,
  258. "nmm:flash",
  259. "nmm:flash(?urn)",
  260. "image");
  261. insert_key_mapping (GRL_METADATA_KEY_EXPOSURE_TIME,
  262. "nmm:exposureTime",
  263. "nmm:exposureTime(?urn)",
  264. "image");
  265. insert_key_mapping (GRL_METADATA_KEY_ISO_SPEED,
  266. "nmm:isoSpeed",
  267. "nmm:isoSpeed(?urn)",
  268. "image");
  269. insert_key_mapping_with_setter (GRL_METADATA_KEY_ORIENTATION,
  270. "nfo:orientation",
  271. "nfo:orientation(?urn)",
  272. "image",
  273. set_orientation);
  274. insert_key_mapping (GRL_METADATA_KEY_PLAY_COUNT,
  275. "nie:usageCounter",
  276. "nie:usageCounter(?urn)",
  277. "media");
  278. insert_key_mapping (GRL_METADATA_KEY_LAST_PLAYED,
  279. "nie:contentAccessed",
  280. "nie:contentAccessed(?urn)",
  281. "media");
  282. insert_key_mapping (GRL_METADATA_KEY_LAST_POSITION,
  283. "nfo:lastPlayedPosition",
  284. "nfo:lastPlayedPosition(?urn)",
  285. "media");
  286. insert_key_mapping (GRL_METADATA_KEY_START_TIME,
  287. "nfo:audioOffset",
  288. "nfo:audioOffset(?urn)",
  289. "media");
  290. if (grl_tracker_upnp_present) {
  291. insert_key_mapping (GRL_METADATA_KEY_THUMBNAIL,
  292. "upnp:thumbnail",
  293. "upnp:thumbnail(?urn)",
  294. "media");
  295. }
  296. insert_key_mapping (GRL_METADATA_KEY_TRACK_NUMBER,
  297. "nmm:trackNumber",
  298. "nmm:trackNumber(?urn)",
  299. "audio");
  300. }
  301. tracker_grl_sparql_t *
  302. grl_tracker_get_mapping_from_sparql (const gchar *key)
  303. {
  304. return (tracker_grl_sparql_t *) g_hash_table_lookup (sparql_to_grl_mapping,
  305. key);
  306. }
  307. static GList *
  308. get_mapping_from_grl (const GrlKeyID key)
  309. {
  310. return (GList *) g_hash_table_lookup (grl_to_sparql_mapping,
  311. GRLKEYID_TO_POINTER (key));
  312. }
  313. gboolean
  314. grl_tracker_key_is_supported (const GrlKeyID key)
  315. {
  316. return g_hash_table_lookup (grl_to_sparql_mapping,
  317. GRLKEYID_TO_POINTER (key)) != NULL;
  318. }
  319. /**/
  320. gchar *
  321. grl_tracker_source_get_device_constraint (GrlTrackerSourcePriv *priv)
  322. {
  323. if (priv->tracker_datasource == NULL ||
  324. priv->tracker_datasource[0] == '\0')
  325. return g_strdup ("");
  326. return g_strdup_printf ("?urn nie:dataSource <%s> .",
  327. priv->tracker_datasource);
  328. }
  329. gchar *
  330. grl_tracker_source_get_select_string (const GList *keys)
  331. {
  332. const GList *key = keys;
  333. GString *gstr = g_string_new ("");
  334. GList *assoc_list;
  335. tracker_grl_sparql_t *assoc;
  336. assoc_list = get_mapping_from_grl (grl_metadata_key_tracker_urn);
  337. assoc = (tracker_grl_sparql_t *) assoc_list->data;
  338. g_string_append_printf (gstr, "%s AS %s ",
  339. assoc->sparql_key_attr_call,
  340. assoc->sparql_key_name);
  341. while (key != NULL) {
  342. assoc_list = get_mapping_from_grl (GRLPOINTER_TO_KEYID (key->data));
  343. while (assoc_list != NULL) {
  344. assoc = (tracker_grl_sparql_t *) assoc_list->data;
  345. if (assoc != NULL) {
  346. g_string_append_printf (gstr, "%s AS %s ",
  347. assoc->sparql_key_attr_call,
  348. assoc->sparql_key_name);
  349. }
  350. assoc_list = assoc_list->next;
  351. }
  352. key = key->next;
  353. }
  354. return g_string_free (gstr, FALSE);
  355. }
  356. static void
  357. gen_prop_insert_string (GString *gstr,
  358. tracker_grl_sparql_t *assoc,
  359. GrlData *data)
  360. {
  361. gchar *tmp;
  362. switch (GRL_METADATA_KEY_GET_TYPE (assoc->grl_key)) {
  363. case G_TYPE_STRING:
  364. tmp = g_strescape (grl_data_get_string (data, assoc->grl_key), NULL);
  365. g_string_append_printf (gstr, "%s \"%s\"",
  366. assoc->sparql_key_attr, tmp);
  367. g_free (tmp);
  368. break;
  369. case G_TYPE_INT:
  370. g_string_append_printf (gstr, "%s %i",
  371. assoc->sparql_key_attr,
  372. grl_data_get_int (data, assoc->grl_key));
  373. break;
  374. case G_TYPE_FLOAT:
  375. g_string_append_printf (gstr, "%s %f",
  376. assoc->sparql_key_attr,
  377. grl_data_get_float (data, assoc->grl_key));
  378. break;
  379. default:
  380. break;
  381. }
  382. }
  383. gchar *
  384. grl_tracker_tracker_get_insert_string (GrlMedia *media, const GList *keys)
  385. {
  386. gboolean first = TRUE;
  387. const GList *key = keys, *assoc_list;
  388. tracker_grl_sparql_t *assoc;
  389. GString *gstr = g_string_new ("");
  390. gchar *ret;
  391. while (key != NULL) {
  392. assoc_list = get_mapping_from_grl (GRLPOINTER_TO_KEYID (key->data));
  393. while (assoc_list != NULL) {
  394. assoc = (tracker_grl_sparql_t *) assoc_list->data;
  395. if (assoc != NULL) {
  396. if (grl_data_has_key (GRL_DATA (media),
  397. GRLPOINTER_TO_KEYID (key->data))) {
  398. if (first) {
  399. gen_prop_insert_string (gstr, assoc, GRL_DATA (media));
  400. first = FALSE;
  401. } else {
  402. g_string_append (gstr, " ; ");
  403. gen_prop_insert_string (gstr, assoc, GRL_DATA (media));
  404. }
  405. }
  406. }
  407. assoc_list = assoc_list->next;
  408. }
  409. key = key->next;
  410. }
  411. ret = gstr->str;
  412. g_string_free (gstr, FALSE);
  413. return ret;
  414. }
  415. gchar *
  416. grl_tracker_get_delete_string (const GList *keys)
  417. {
  418. gboolean first = TRUE;
  419. const GList *key = keys, *assoc_list;
  420. tracker_grl_sparql_t *assoc;
  421. GString *gstr = g_string_new ("");
  422. gchar *ret;
  423. gint var_n = 0;
  424. while (key != NULL) {
  425. assoc_list = get_mapping_from_grl (GRLPOINTER_TO_KEYID (key->data));
  426. while (assoc_list != NULL) {
  427. assoc = (tracker_grl_sparql_t *) assoc_list->data;
  428. if (assoc != NULL) {
  429. if (first) {
  430. g_string_append_printf (gstr, "%s ?v%i",
  431. assoc->sparql_key_attr, var_n);
  432. first = FALSE;
  433. } else {
  434. g_string_append_printf (gstr, " ; %s ?v%i",
  435. assoc->sparql_key_attr, var_n);
  436. }
  437. var_n++;
  438. }
  439. assoc_list = assoc_list->next;
  440. }
  441. key = key->next;
  442. }
  443. ret = gstr->str;
  444. g_string_free (gstr, FALSE);
  445. return ret;
  446. }
  447. gchar *
  448. grl_tracker_get_delete_conditional_string (const gchar *urn,
  449. const GList *keys)
  450. {
  451. gboolean first = TRUE;
  452. const GList *key = keys, *assoc_list;
  453. tracker_grl_sparql_t *assoc;
  454. GString *gstr = g_string_new ("");
  455. gchar *ret;
  456. gint var_n = 0;
  457. while (key != NULL) {
  458. assoc_list = get_mapping_from_grl (GRLPOINTER_TO_KEYID (key->data));
  459. while (assoc_list != NULL) {
  460. assoc = (tracker_grl_sparql_t *) assoc_list->data;
  461. if (assoc != NULL) {
  462. if (first) {
  463. g_string_append_printf (gstr, "OPTIONAL { <%s> %s ?v%i }",
  464. urn, assoc->sparql_key_attr, var_n);
  465. first = FALSE;
  466. } else {
  467. g_string_append_printf (gstr, " . OPTIONAL { <%s> %s ?v%i }",
  468. urn, assoc->sparql_key_attr, var_n);
  469. }
  470. var_n++;
  471. }
  472. assoc_list = assoc_list->next;
  473. }
  474. key = key->next;
  475. }
  476. ret = gstr->str;
  477. g_string_free (gstr, FALSE);
  478. return ret;
  479. }
  480. /**/
  481. /* Builds an appropriate GrlMedia based on ontology type returned by
  482. tracker, or NULL if unknown */
  483. GrlMedia *
  484. grl_tracker_build_grilo_media (const gchar *rdf_type)
  485. {
  486. GrlMedia *media = NULL;
  487. gchar **rdf_single_type;
  488. int i;
  489. GHashTable *ht;
  490. if (!rdf_type) {
  491. return NULL;
  492. }
  493. /* As rdf_type can be formed by several types, split them */
  494. rdf_single_type = g_strsplit (rdf_type, ",", -1);
  495. i = g_strv_length (rdf_single_type) - 1;
  496. ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
  497. for (; i>= 0; i--)
  498. g_hash_table_insert (ht, g_path_get_basename (rdf_single_type[i]), GINT_TO_POINTER(TRUE));
  499. if (g_hash_table_lookup (ht, RDF_TYPE_MUSIC)) {
  500. media = grl_media_audio_new ();
  501. } else if (g_hash_table_lookup (ht, RDF_TYPE_VIDEO)) {
  502. media = grl_media_video_new ();
  503. } else if (g_hash_table_lookup (ht, RDF_TYPE_IMAGE)) {
  504. media = grl_media_image_new ();
  505. } else if (g_hash_table_lookup (ht, RDF_TYPE_ARTIST)) {
  506. media = grl_media_box_new ();
  507. } else if (g_hash_table_lookup (ht, RDF_TYPE_ALBUM)) {
  508. media = grl_media_box_new ();
  509. } else if (g_hash_table_lookup (ht, RDF_TYPE_BOX)) {
  510. media = grl_media_box_new ();
  511. } else if (g_hash_table_lookup (ht, RDF_TYPE_FOLDER)) {
  512. media = grl_media_box_new ();
  513. }
  514. g_hash_table_destroy (ht);
  515. g_strfreev (rdf_single_type);
  516. if (!media)
  517. media = grl_media_new ();
  518. return media;
  519. }
  520. /**/
  521. static gchar *
  522. get_tracker_volume_name (const gchar *uri,
  523. const gchar *datasource)
  524. {
  525. gchar *source_name = NULL;
  526. GVolumeMonitor *volume_monitor;
  527. GList *mounts, *mount;
  528. GFile *file;
  529. if (uri != NULL && *uri != '\0') {
  530. volume_monitor = g_volume_monitor_get ();
  531. mounts = g_volume_monitor_get_mounts (volume_monitor);
  532. file = g_file_new_for_uri (uri);
  533. mount = mounts;
  534. while (mount != NULL) {
  535. GFile *m_file = g_mount_get_root (G_MOUNT (mount->data));
  536. if (g_file_equal (m_file, file)) {
  537. gchar *m_name = g_mount_get_name (G_MOUNT (mount->data));
  538. g_object_unref (G_OBJECT (m_file));
  539. source_name = g_strdup_printf (_("Removable - %s"), m_name);
  540. g_free (m_name);
  541. break;
  542. }
  543. g_object_unref (G_OBJECT (m_file));
  544. mount = mount->next;
  545. }
  546. g_list_free_full (mounts, g_object_unref);
  547. g_object_unref (G_OBJECT (file));
  548. g_object_unref (G_OBJECT (volume_monitor));
  549. } else {
  550. source_name = g_strdup (_("Local files"));
  551. }
  552. return source_name;
  553. }
  554. static gchar *
  555. get_tracker_upnp_name (const gchar *datasource_name)
  556. {
  557. return g_strdup_printf ("UPnP - %s", datasource_name);
  558. }
  559. gchar *
  560. grl_tracker_get_source_name (const gchar *rdf_type,
  561. const gchar *uri,
  562. const gchar *datasource,
  563. const gchar *datasource_name)
  564. {
  565. gchar *source_name = NULL;
  566. gchar **rdf_single_type;
  567. gint i;
  568. /* As rdf_type can be formed by several types, split them */
  569. rdf_single_type = g_strsplit (rdf_type, ",", -1);
  570. i = g_strv_length (rdf_single_type) - 1;
  571. while (i >= 0) {
  572. if (g_str_has_suffix (rdf_single_type[i], RDF_TYPE_VOLUME)) {
  573. source_name = get_tracker_volume_name (uri, datasource);
  574. break;
  575. } else if (g_str_has_suffix (rdf_single_type[i], RDF_TYPE_UPNP)) {
  576. source_name = get_tracker_upnp_name (datasource_name);
  577. break;
  578. }
  579. i--;
  580. }
  581. g_strfreev (rdf_single_type);
  582. return source_name;
  583. }
  584. const GList *
  585. grl_tracker_supported_keys (GrlSource *source)
  586. {
  587. static GList *supported_keys = NULL;
  588. if (!supported_keys) {
  589. supported_keys = g_hash_table_get_keys (grl_to_sparql_mapping);
  590. }
  591. return supported_keys;
  592. }