10 /* SERVICE_ definitions */
11 #define SERVICE_FILES 0
12 #define SERVICE_FOLDERS 1
13 #define SERVICE_DOCUMENTS 2
14 #define SERVICE_IMAGES 3
15 #define SERVICE_MUSIC 4
16 #define SERVICE_VIDEOS 5
17 #define SERVICE_TEXT_FILES 6
18 #define SERVICE_DEVELOPMENT_FILES 7
19 #define SERVICE_OTHER_FILES 8
20 #define SERVICE_VFS_FILES 9
21 #define SERVICE_VFS_FOLDERS 10
22 #define SERVICE_VFS_DOCUMENTS 11
23 #define SERVICE_VFS_IMAGES 12
24 #define SERVICE_VFS_MUSIC 13
25 #define SERVICE_VFS_VIDEOS 14
26 #define SERVICE_VFS_TEXT_FILES 15
27 #define SERVICE_VFS_DEVELOPMENT_FILES 16
28 #define SERVICE_VFS_OTHER_FILES 17
29 #define SERVICE_CONVERSATIONS 18
30 #define SERVICE_PLAYLISTS 19
31 #define SERVICE_APPLICATIONS 20
32 #define SERVICE_CONTACTS 21
33 #define SERVICE_EMAILS 22
34 #define SERVICE_EMAILATTACHMENTS 23
35 #define SERVICE_APPOINTMENTS 24
36 #define SERVICE_TASKS 25
37 #define SERVICE_BOOKMARKS 26
38 #define SERVICE_HISTORY 27
39 #define SERVICE_PROJECTS 28
42 /* MetasataTypes definitions */
43 #define DATA_STRING_INDEXABLE 0
45 #define DATA_NUMERIC 2
49 #include "const-c.inc"
51 SV* get_instance(char* class)
53 TrackerClient* client = NULL;
54 SV* obj_ref = newSViv(0);
55 SV* obj = newSVrv(obj_ref, class);
57 client = tracker_connect(FALSE);
61 sv_setiv(obj, (IV)client);
67 char* service_name(char* class, int type)
69 return tracker_type_to_service_name(type);
73 int service_type(char* class, const char* name)
75 return tracker_service_name_to_type(name);
79 void store_in_hash_and_free(gpointer key, gpointer value, gpointer perlhash)
81 hv_store(perlhash, key, strlen(key), newSVpvn(value, strlen(value)), 0);
86 void store_in_array(gpointer data, gpointer perlarray)
88 /* inspired from tracker-tag.c's get_meta_table_data */
89 char **meta, **meta_p;
92 meta = (char **) data;
93 for(meta_p = meta; *meta_p; meta_p++) {
95 av_push((AV *)perlarray, newSVpv(*meta_p, 0));
100 void DESTROY(SV* obj) {
101 TrackerClient* client = (TrackerClient*) SvIV(SvRV(obj));
102 tracker_disconnect(client);
106 MODULE = LibTracker::Client PACKAGE = LibTracker::Client
109 INCLUDE: const-xs.inc
117 service_name (class, type)
123 service_type (class, name)
133 GError *error = NULL;
134 TrackerClient* client;
136 client = (TrackerClient*) SvIV(SvRV(obj));
137 ST(0) = sv_newmortal();
138 ret = tracker_get_version(client, &error);
140 ST(0) = &PL_sv_undef;
142 sv_setiv( ST(0), ret );
150 GError *error = NULL;
151 TrackerClient* client;
153 client = (TrackerClient*) SvIV(SvRV(obj));
154 ST(0) = sv_newmortal();
155 ret = tracker_get_status(client, &error);
157 ST(0) = &PL_sv_undef;
159 sv_setpv( ST(0), ret );
164 get_services (obj, main_only)
169 GError *error = NULL;
170 TrackerClient* client;
174 main_only = (!!main_only); /* either 0 or 1 */
175 client = (TrackerClient*) SvIV(SvRV(obj));
176 ret = tracker_get_services(client, main_only, &error);
177 rh = (HV *) sv_2mortal( (SV *) newHV() );
179 RETVAL = &PL_sv_undef;
181 g_hash_table_foreach( ret, store_in_hash_and_free, (gpointer) rh );
182 RETVAL = newRV( (SV *) rh);
189 get_metadata (obj, servicetype, id, keys)
199 GError *error = NULL;
200 TrackerClient* client;
207 || ( SvTYPE( SvRV(keys) ) != SVt_PVAV )
208 || ( (numkeys = av_len( (AV *) SvRV(keys))) < 0 ) ) {
211 /* convert keys to a char** - this is inspired from the
212 * avref2charptrptr function from perldap
214 Newxz(_keys, numkeys + 2, char *);
215 for (i = 0; i <= numkeys; i++) {
216 current_val = av_fetch( (AV *) SvRV(keys), i, 0 );
217 placeholder = SvPV(*current_val, length);
218 /* store a copy in _keys */
219 Newxz(_keys[i], length+1, char);
220 Copy(placeholder, _keys[i], length+1, char);
224 client = (TrackerClient*) SvIV(SvRV(obj));
225 ret = tracker_metadata_get(client, servicetype, id, _keys, &error);
226 rh = (HV *) sv_2mortal( (SV *) newHV() );
228 RETVAL = &PL_sv_undef;
230 for(i = 0; _keys[i] && ret[i]; i++)
231 hv_store(rh, _keys[i], strlen(_keys[i]), newSVpv(ret[i], 0), 0);
232 g_strfreev(ret); /* don't leak anything */
233 RETVAL = newRV( (SV *) rh);
240 set_metadata (obj, servicetype, id, data)
251 GError *error = NULL;
252 TrackerClient* client;
258 /* the iter_init prepares the hash iterator and gives us
259 * the number of keys in the hash
262 || ( SvTYPE( SvRV(data) ) != SVt_PVHV )
263 || ( (numkeys = hv_iterinit((HV *)SvRV(data))) < 1 ) ) {
267 datahash = (HV *) SvRV(data);
269 /* convert keys to a char** - this is inspired from the
270 * avref2charptrptr function from perldap
272 Newxz(_keys, numkeys + 1, char *);
273 Newxz(_values, numkeys + 1, char *);
274 for (i = 0; i < numkeys; i++) {
275 current_val = hv_iternextsv(datahash, &placeholder, &keylen);
276 /* store the copy of the key in _keys */
277 Newxz(_keys[i], keylen + 1, char);
278 Copy(placeholder, _keys[i], keylen + 1, char);
279 /* store the copy of the value in _values */
280 placeholder = SvPV(current_val, length);
281 Newxz(_values[i], length + 1, char);
282 Copy(placeholder, _values[i], length + 1, char);
287 client = (TrackerClient*) SvIV(SvRV(obj));
288 tracker_metadata_set(client, servicetype, id, _keys, _values, &error);
289 ST(0) = sv_newmortal();
291 ST(0) = &PL_sv_undef;
293 sv_setiv( ST(0), numkeys );
297 register_metadata_type (obj, name, type)
302 GError *error = NULL;
303 TrackerClient* client;
305 client = (TrackerClient*) SvIV(SvRV(obj));
306 tracker_metadata_register_type(client, name, type, &error);
308 croak("tracker_metadata_register_type failed with code %d (%s)", error->code, error->message);
312 get_metadata_type_details (obj, name)
318 MetaDataTypeDetails* ret;
319 GError *error = NULL;
320 TrackerClient* client;
322 client = (TrackerClient*) SvIV(SvRV(obj));
323 ret = tracker_metadata_get_type_details(client, name, &error);
325 RETVAL = &PL_sv_undef;
329 /* set up a hashref for args to "new" */
330 args = (HV *) sv_2mortal( (SV *) newHV() );
331 hv_store(args, "type", 4, newSVpv(ret->type, 0), 0);
332 hv_store(args, "is_embedded", 11, newSViv(ret->is_embedded), 0);
333 hv_store(args, "is_writeable", 12, newSViv(ret->is_writeable), 0);
335 /* instantiate new MetadataTypeDetails object */
337 XPUSHs(sv_2mortal(newSVpv("LibTracker::Client::MetaDataTypeDetails", 0)));
338 XPUSHs(sv_2mortal(newRV((SV*)args)));
340 count = call_method("new", G_SCALAR);
343 croak("LibTracker::Client::MetaDataTypeDetails->new returned unexpected number of args. Expected 1, got %d", count);
344 RETVAL = newSVsv((SV *)POPs);
354 get_registered_metadata_classes (obj)
359 GError *error = NULL;
360 TrackerClient* client;
363 client = (TrackerClient*) SvIV(SvRV(obj));
364 ret = tracker_metadata_get_registered_classes(client, &error);
365 ra = (AV *) sv_2mortal( (SV *) newAV() );
367 RETVAL = &PL_sv_undef;
369 for(i = 0; ret[i]; i++)
370 av_push(ra, newSVpv(ret[i], 0));
371 RETVAL = newRV( (SV *) ra);
372 g_strfreev(ret); /* don't leak */
379 get_registered_metadata_types (obj, classname)
381 const char* classname;
385 GError *error = NULL;
386 TrackerClient* client;
389 client = (TrackerClient*) SvIV(SvRV(obj));
390 ret = tracker_metadata_get_registered_types(client, classname, &error);
391 ra = (AV *) sv_2mortal( (SV *) newAV() );
393 RETVAL = &PL_sv_undef;
395 for(i = 0; ret[i]; i++)
396 av_push(ra, newSVpv(ret[i], 0));
397 RETVAL = newRV( (SV *) ra);
398 g_strfreev(ret); /* don't leak */
405 get_writeable_metadata_types (obj, classname)
407 const char* classname;
411 GError *error = NULL;
412 TrackerClient* client;
415 client = (TrackerClient*) SvIV(SvRV(obj));
416 ret = tracker_metadata_get_writeable_types(client, classname, &error);
417 ra = (AV *) sv_2mortal( (SV *) newAV() );
419 RETVAL = &PL_sv_undef;
421 for(i = 0; ret[i]; i++)
422 av_push(ra, newSVpv(ret[i], 0));
423 RETVAL = newRV( (SV *) ra);
424 g_strfreev(ret); /* don't leak */
431 get_all_keywords (obj, servicetype)
436 GError *error = NULL;
437 TrackerClient* client;
440 client = (TrackerClient*) SvIV(SvRV(obj));
441 ret = tracker_keywords_get_list(client, servicetype, &error);
442 ra = (AV *) sv_2mortal( (SV *) newAV() );
444 RETVAL = &PL_sv_undef;
446 g_ptr_array_foreach(ret, store_in_array, (gpointer)ra);
447 RETVAL = newRV( (SV *) ra);
448 g_ptr_array_free(ret, TRUE); /* don't leak */
455 get_keywords (obj, servicetype, id)
462 GError *error = NULL;
463 TrackerClient* client;
466 client = (TrackerClient*) SvIV(SvRV(obj));
467 ret = tracker_keywords_get(client, servicetype, id, &error);
468 ra = (AV *) sv_2mortal( (SV *) newAV() );
470 RETVAL = &PL_sv_undef;
472 for(i = 0; ret[i]; i++)
473 av_push(ra, newSVpv(ret[i], 0));
474 RETVAL = newRV( (SV *) ra);
475 g_strfreev(ret); /* don't leak */
482 add_keywords (obj, servicetype, id, values)
491 GError *error = NULL;
492 TrackerClient* client;
498 || ( SvTYPE( SvRV(values) ) != SVt_PVAV )
499 || ( (num = av_len( (AV *) SvRV(values))) < 0 ) ) {
502 /* convert keys to a char** - this is inspired from the
503 * avref2charptrptr function from perldap
505 Newxz(_values, num + 2, char *); /* av_len returns elem-1 */
506 for (i = 0; i <= num; i++) {
507 current_val = av_fetch( (AV *) SvRV(values), i, 0 );
508 placeholder = SvPV(*current_val, length);
509 /* store a copy in _values */
510 Newxz(_values[i], length+1, char);
511 Copy(placeholder, _values[i], length+1, char);
515 client = (TrackerClient*) SvIV(SvRV(obj));
516 tracker_keywords_add(client, servicetype, id, _values, &error);
517 ST(0) = sv_newmortal();
519 ST(0) = &PL_sv_undef;
521 sv_setiv( ST(0), num + 1);
525 remove_keywords (obj, servicetype, id, values)
534 GError *error = NULL;
535 TrackerClient* client;
541 || ( SvTYPE( SvRV(values) ) != SVt_PVAV )
542 || ( (num = av_len( (AV *) SvRV(values))) < 0 ) ) {
545 /* convert keys to a char** - this is inspired from the
546 * avref2charptrptr function from perldap
548 Newxz(_values, num + 2, char *); /* av_len returns elem+1 */
549 for (i = 0; i <= num; i++) {
550 current_val = av_fetch( (AV *) SvRV(values), i, 0 );
551 placeholder = SvPV(*current_val, length);
552 /* store a copy in _values */
553 Newxz(_values[i], length+1, char);
554 Copy(placeholder, _values[i], length+1, char);
558 client = (TrackerClient*) SvIV(SvRV(obj));
559 tracker_keywords_remove(client, servicetype, id, _values, &error);
560 ST(0) = sv_newmortal();
562 ST(0) = &PL_sv_undef;
564 sv_setiv( ST(0), num + 1);
568 remove_all_keywords (obj, servicetype, id)
573 GError *error = NULL;
574 TrackerClient* client;
576 client = (TrackerClient*) SvIV(SvRV(obj));
577 tracker_keywords_remove_all(client, servicetype, id, &error);
578 ST(0) = sv_newmortal();
580 ST(0) = &PL_sv_undef;
586 search_keywords (obj, lqi, servicetype, keywords, offset, maxhits)
598 GError *error = NULL;
599 TrackerClient* client;
605 if( (!SvROK(keywords))
606 || ( SvTYPE( SvRV(keywords) ) != SVt_PVAV )
607 || ( (num = av_len( (AV *) SvRV(keywords))) < 0 ) ) {
610 /* convert keywords to a char** - this is inspired from the
611 * avref2charptrptr function from perldap
613 Newxz(_keywords, num + 2, char *);
614 for (i = 0; i <= num; i++) {
615 current_val = av_fetch( (AV *) SvRV(keywords), i, 0 );
616 placeholder = SvPV(*current_val, length);
617 /* store a copy in _keywords */
618 Newxz(_keywords[i], length+1, char);
619 Copy(placeholder, _keywords[i], length+1, char);
623 client = (TrackerClient*) SvIV(SvRV(obj));
624 ret = tracker_keywords_search(client, lqi, servicetype, _keywords, offset, maxhits, &error);
625 ra = (AV *) sv_2mortal( (SV *) newAV() );
627 RETVAL = &PL_sv_undef;
629 for(i = 0; ret[i]; i++)
630 av_push(ra, newSVpv(ret[i], 0));
631 RETVAL = newRV( (SV *) ra);
632 g_strfreev(ret); /* don't leak */
639 search_text (obj, lqi, servicetype, searchtext, offset, maxhits)
643 const char* searchtext;
649 GError *error = NULL;
650 TrackerClient* client;
653 client = (TrackerClient*) SvIV(SvRV(obj));
654 ret = tracker_search_text(client, lqi, servicetype, searchtext, offset, maxhits, &error);
655 ra = (AV *) sv_2mortal( (SV *) newAV() );
657 RETVAL = &PL_sv_undef;
659 for(i = 0; ret[i]; i++)
660 av_push(ra, newSVpv(ret[i], 0));
661 RETVAL = newRV( (SV *) ra);
662 g_strfreev(ret); /* don't leak */
669 get_snippet (obj, servicetype, path, searchtext)
673 const char* searchtext;
676 GError *error = NULL;
677 TrackerClient* client;
679 client = (TrackerClient*) SvIV(SvRV(obj));
680 ST(0) = sv_newmortal();
681 ret = tracker_search_get_snippet(client, servicetype, path, searchtext, &error);
683 ST(0) = &PL_sv_undef;
685 sv_setpv( ST(0), ret );
690 search_metadata (obj, servicetype, field, searchtext, offset, maxhits)
694 const char* searchtext;
700 GError *error = NULL;
701 TrackerClient* client;
704 client = (TrackerClient*) SvIV(SvRV(obj));
705 ret = tracker_search_metadata(client, servicetype, field, searchtext, offset, maxhits, &error);
706 ra = (AV *) sv_2mortal( (SV *) newAV() );
708 RETVAL = &PL_sv_undef;
710 for(i = 0; ret[i]; i++)
711 av_push(ra, newSVpv(ret[i], 0));
712 RETVAL = newRV( (SV *) ra);
713 g_strfreev(ret); /* don't leak */
720 get_suggestion (obj, searchtext, maxdist)
722 const char* searchtext;
726 GError *error = NULL;
727 TrackerClient* client;
729 client = (TrackerClient*) SvIV(SvRV(obj));
730 ST(0) = sv_newmortal();
731 ret = tracker_search_suggest(client,searchtext, maxdist, &error);
733 ST(0) = &PL_sv_undef;
735 sv_setpv( ST(0), ret );
740 get_files_by_service (obj, lqi, servicetype, offset, maxhits)
749 GError *error = NULL;
750 TrackerClient* client;
753 client = (TrackerClient*) SvIV(SvRV(obj));
754 ret = tracker_files_get_by_service_type(client, lqi, servicetype, offset, maxhits, &error);
755 ra = (AV *) sv_2mortal( (SV *) newAV() );
757 RETVAL = &PL_sv_undef;
759 for(i = 0; ret[i]; i++)
760 av_push(ra, newSVpv(ret[i], 0));
761 RETVAL = newRV( (SV *) ra);
762 g_strfreev(ret); /* don't leak */
774 /* this is stolen from Inline::C documentation */
775 temp = PL_markstack_ptr++;
777 if(PL_markstack_ptr != temp) {
778 /* truly void, because dXSARGS not invoked */
779 PL_markstack_ptr = temp;
782 /* must have used dXSARGS; list context implied */
783 return; /* assume stack size is correct */