10 /* SERVICE_ definitions */
12 #define SERVICE_FILES 0
13 #define SERVICE_FOLDERS 1
14 #define SERVICE_DOCUMENTS 2
15 #define SERVICE_IMAGES 3
16 #define SERVICE_MUSIC 4
17 #define SERVICE_VIDEOS 5
18 #define SERVICE_TEXT_FILES 6
19 #define SERVICE_DEVELOPMENT_FILES 7
20 #define SERVICE_OTHER_FILES 8
21 #define SERVICE_VFS_FILES 9
22 #define SERVICE_VFS_FOLDERS 10
23 #define SERVICE_VFS_DOCUMENTS 11
24 #define SERVICE_VFS_IMAGES 12
25 #define SERVICE_VFS_MUSIC 13
26 #define SERVICE_VFS_VIDEOS 14
27 #define SERVICE_VFS_TEXT_FILES 15
28 #define SERVICE_VFS_DEVELOPMENT_FILES 16
29 #define SERVICE_VFS_OTHER_FILES 17
30 #define SERVICE_CONVERSATIONS 18
31 #define SERVICE_PLAYLISTS 19
32 #define SERVICE_APPLICATIONS 20
33 #define SERVICE_CONTACTS 21
34 #define SERVICE_EMAILS 22
35 #define SERVICE_EMAILATTACHMENTS 23
36 #define SERVICE_APPOINTMENTS 24
37 #define SERVICE_TASKS 25
38 #define SERVICE_BOOKMARKS 26
39 #define SERVICE_HISTORY 27
40 #define SERVICE_PROJECTS 28
41 #define SERVICE_MAX 28
43 /* MetasataTypes definitions */
45 #define DATA_STRING_INDEXABLE 0
47 #define DATA_NUMERIC 2
51 #include "const-c.inc"
53 SV* get_instance(char* class)
55 TrackerClient* client = NULL;
56 SV* obj_ref = newSViv(0);
57 SV* obj = newSVrv(obj_ref, class);
59 client = tracker_connect(FALSE);
63 sv_setiv(obj, (IV)client);
69 void assert_valid_servicetype(int servicetype)
71 if( (servicetype < SERVICE_MIN) || (servicetype > SERVICE_MAX) )
72 croak("Invalid service type : %d\n", servicetype);
76 void assert_valid_mdtype(int mdtype)
78 if( (mdtype < DATA_MIN) || (mdtype > DATA_MAX) )
79 croak("Invalid metadata type : %d\n", mdtype);
83 char* service_name(char* class, int type)
85 assert_valid_servicetype(type);
86 return tracker_type_to_service_name(type);
90 int service_type(char* class, const char* name)
92 return tracker_service_name_to_type(name);
96 void store_in_hash_and_free(gpointer key, gpointer value, gpointer perlhash)
98 hv_store(perlhash, key, strlen(key), newSVpvn(value, strlen(value)), 0);
103 void store_in_array(gpointer data, gpointer perlarray)
105 /* inspired from tracker-tag.c's get_meta_table_data */
106 char **meta, **meta_p;
109 meta = (char **) data;
110 for(meta_p = meta; *meta_p; meta_p++) {
112 av_push((AV *)perlarray, newSVpv(*meta_p, 0));
117 void DESTROY(SV* obj) {
118 TrackerClient* client = (TrackerClient*) SvIV(SvRV(obj));
119 tracker_disconnect(client);
123 MODULE = LibTracker::Client PACKAGE = LibTracker::Client
126 INCLUDE: const-xs.inc
134 service_name (class, type)
140 service_type (class, name)
150 GError *error = NULL;
151 TrackerClient* client;
153 client = (TrackerClient*) SvIV(SvRV(obj));
154 ST(0) = sv_newmortal();
155 ret = tracker_get_version(client, &error);
157 ST(0) = &PL_sv_undef;
159 sv_setiv( ST(0), ret );
167 GError *error = NULL;
168 TrackerClient* client;
170 client = (TrackerClient*) SvIV(SvRV(obj));
171 ST(0) = sv_newmortal();
172 ret = tracker_get_status(client, &error);
174 ST(0) = &PL_sv_undef;
176 sv_setpv( ST(0), ret );
181 get_services (obj, main_only)
186 GError *error = NULL;
187 TrackerClient* client;
191 main_only = (!!main_only); /* either 0 or 1 */
192 client = (TrackerClient*) SvIV(SvRV(obj));
193 ret = tracker_get_services(client, main_only, &error);
194 rh = (HV *) sv_2mortal( (SV *) newHV() );
196 RETVAL = &PL_sv_undef;
198 g_hash_table_foreach( ret, store_in_hash_and_free, (gpointer) rh );
199 RETVAL = newRV( (SV *) rh);
206 get_metadata (obj, servicetype, id, keys)
216 GError *error = NULL;
217 TrackerClient* client;
224 || ( SvTYPE( SvRV(keys) ) != SVt_PVAV )
225 || ( (numkeys = av_len( (AV *) SvRV(keys))) < 0 ) ) {
228 assert_valid_servicetype(servicetype);
229 /* convert keys to a char** - this is inspired from the
230 * avref2charptrptr function from perldap
232 Newxz(_keys, numkeys + 2, char *);
233 for (i = 0; i <= numkeys; i++) {
234 current_val = av_fetch( (AV *) SvRV(keys), i, 0 );
235 placeholder = SvPV(*current_val, length);
236 /* store a copy in _keys */
237 Newxz(_keys[i], length+1, char);
238 Copy(placeholder, _keys[i], length+1, char);
242 client = (TrackerClient*) SvIV(SvRV(obj));
243 ret = tracker_metadata_get(client, servicetype, id, _keys, &error);
244 rh = (HV *) sv_2mortal( (SV *) newHV() );
246 RETVAL = &PL_sv_undef;
248 for(i = 0; _keys[i] && ret[i]; i++)
249 hv_store(rh, _keys[i], strlen(_keys[i]), newSVpv(ret[i], 0), 0);
250 g_strfreev(ret); /* don't leak anything */
251 RETVAL = newRV( (SV *) rh);
258 set_metadata (obj, servicetype, id, data)
269 GError *error = NULL;
270 TrackerClient* client;
276 /* the iter_init prepares the hash iterator and gives us
277 * the number of keys in the hash
280 || ( SvTYPE( SvRV(data) ) != SVt_PVHV )
281 || ( (numkeys = hv_iterinit((HV *)SvRV(data))) < 1 ) ) {
285 datahash = (HV *) SvRV(data);
287 assert_valid_servicetype(servicetype);
288 /* convert keys to a char** - this is inspired from the
289 * avref2charptrptr function from perldap
291 Newxz(_keys, numkeys + 1, char *);
292 Newxz(_values, numkeys + 1, char *);
293 for (i = 0; i < numkeys; i++) {
294 current_val = hv_iternextsv(datahash, &placeholder, &keylen);
295 /* store the copy of the key in _keys */
296 Newxz(_keys[i], keylen + 1, char);
297 Copy(placeholder, _keys[i], keylen + 1, char);
298 /* store the copy of the value in _values */
299 placeholder = SvPV(current_val, length);
300 Newxz(_values[i], length + 1, char);
301 Copy(placeholder, _values[i], length + 1, char);
306 client = (TrackerClient*) SvIV(SvRV(obj));
307 tracker_metadata_set(client, servicetype, id, _keys, _values, &error);
308 ST(0) = sv_newmortal();
310 ST(0) = &PL_sv_undef;
312 sv_setiv( ST(0), numkeys );
316 register_metadata_type (obj, name, type)
321 GError *error = NULL;
322 TrackerClient* client;
324 assert_valid_mdtype(type);
325 client = (TrackerClient*) SvIV(SvRV(obj));
326 tracker_metadata_register_type(client, name, type, &error);
328 croak("tracker_metadata_register_type failed with code %d (%s)", error->code, error->message);
332 get_metadata_type_details (obj, name)
338 MetaDataTypeDetails* ret;
339 GError *error = NULL;
340 TrackerClient* client;
342 client = (TrackerClient*) SvIV(SvRV(obj));
343 ret = tracker_metadata_get_type_details(client, name, &error);
345 RETVAL = &PL_sv_undef;
349 /* set up a hashref for args to "new" */
350 args = (HV *) sv_2mortal( (SV *) newHV() );
351 hv_store(args, "type", 4, newSVpv(ret->type, 0), 0);
352 hv_store(args, "is_embedded", 11, newSViv(ret->is_embedded), 0);
353 hv_store(args, "is_writeable", 12, newSViv(ret->is_writeable), 0);
355 /* instantiate new MetadataTypeDetails object */
357 XPUSHs(sv_2mortal(newSVpv("LibTracker::Client::MetaDataTypeDetails", 0)));
358 XPUSHs(sv_2mortal(newRV((SV*)args)));
360 count = call_method("new", G_SCALAR);
363 croak("LibTracker::Client::MetaDataTypeDetails->new returned unexpected number of args. Expected 1, got %d", count);
364 RETVAL = newSVsv((SV *)POPs);
374 get_registered_metadata_classes (obj)
379 GError *error = NULL;
380 TrackerClient* client;
383 client = (TrackerClient*) SvIV(SvRV(obj));
384 ret = tracker_metadata_get_registered_classes(client, &error);
385 ra = (AV *) sv_2mortal( (SV *) newAV() );
387 RETVAL = &PL_sv_undef;
389 for(i = 0; ret[i]; i++)
390 av_push(ra, newSVpv(ret[i], 0));
391 RETVAL = newRV( (SV *) ra);
392 g_strfreev(ret); /* don't leak */
399 get_registered_metadata_types (obj, classname)
401 const char* classname;
405 GError *error = NULL;
406 TrackerClient* client;
409 client = (TrackerClient*) SvIV(SvRV(obj));
410 ret = tracker_metadata_get_registered_types(client, classname, &error);
411 ra = (AV *) sv_2mortal( (SV *) newAV() );
413 RETVAL = &PL_sv_undef;
415 for(i = 0; ret[i]; i++)
416 av_push(ra, newSVpv(ret[i], 0));
417 RETVAL = newRV( (SV *) ra);
418 g_strfreev(ret); /* don't leak */
425 get_writeable_metadata_types (obj, classname)
427 const char* classname;
431 GError *error = NULL;
432 TrackerClient* client;
435 client = (TrackerClient*) SvIV(SvRV(obj));
436 ret = tracker_metadata_get_writeable_types(client, classname, &error);
437 ra = (AV *) sv_2mortal( (SV *) newAV() );
439 RETVAL = &PL_sv_undef;
441 for(i = 0; ret[i]; i++)
442 av_push(ra, newSVpv(ret[i], 0));
443 RETVAL = newRV( (SV *) ra);
444 g_strfreev(ret); /* don't leak */
451 get_all_keywords (obj, servicetype)
456 GError *error = NULL;
457 TrackerClient* client;
460 assert_valid_servicetype(servicetype);
461 client = (TrackerClient*) SvIV(SvRV(obj));
462 ret = tracker_keywords_get_list(client, servicetype, &error);
463 ra = (AV *) sv_2mortal( (SV *) newAV() );
465 RETVAL = &PL_sv_undef;
467 g_ptr_array_foreach(ret, store_in_array, (gpointer)ra);
468 RETVAL = newRV( (SV *) ra);
469 g_ptr_array_free(ret, TRUE); /* don't leak */
476 get_keywords (obj, servicetype, id)
483 GError *error = NULL;
484 TrackerClient* client;
487 assert_valid_servicetype(servicetype);
488 client = (TrackerClient*) SvIV(SvRV(obj));
489 ret = tracker_keywords_get(client, servicetype, id, &error);
490 ra = (AV *) sv_2mortal( (SV *) newAV() );
492 RETVAL = &PL_sv_undef;
494 for(i = 0; ret[i]; i++)
495 av_push(ra, newSVpv(ret[i], 0));
496 RETVAL = newRV( (SV *) ra);
497 g_strfreev(ret); /* don't leak */
504 add_keywords (obj, servicetype, id, values)
513 GError *error = NULL;
514 TrackerClient* client;
520 || ( SvTYPE( SvRV(values) ) != SVt_PVAV )
521 || ( (num = av_len( (AV *) SvRV(values))) < 0 ) ) {
524 assert_valid_servicetype(servicetype);
525 /* convert keys to a char** - this is inspired from the
526 * avref2charptrptr function from perldap
528 Newxz(_values, num + 2, char *); /* av_len returns elem-1 */
529 for (i = 0; i <= num; i++) {
530 current_val = av_fetch( (AV *) SvRV(values), i, 0 );
531 placeholder = SvPV(*current_val, length);
532 /* store a copy in _values */
533 Newxz(_values[i], length+1, char);
534 Copy(placeholder, _values[i], length+1, char);
538 client = (TrackerClient*) SvIV(SvRV(obj));
539 tracker_keywords_add(client, servicetype, id, _values, &error);
540 ST(0) = sv_newmortal();
542 ST(0) = &PL_sv_undef;
544 sv_setiv( ST(0), num + 1);
548 remove_keywords (obj, servicetype, id, values)
557 GError *error = NULL;
558 TrackerClient* client;
564 || ( SvTYPE( SvRV(values) ) != SVt_PVAV )
565 || ( (num = av_len( (AV *) SvRV(values))) < 0 ) ) {
568 assert_valid_servicetype(servicetype);
569 /* convert keys to a char** - this is inspired from the
570 * avref2charptrptr function from perldap
572 Newxz(_values, num + 2, char *); /* av_len returns elem+1 */
573 for (i = 0; i <= num; i++) {
574 current_val = av_fetch( (AV *) SvRV(values), i, 0 );
575 placeholder = SvPV(*current_val, length);
576 /* store a copy in _values */
577 Newxz(_values[i], length+1, char);
578 Copy(placeholder, _values[i], length+1, char);
582 client = (TrackerClient*) SvIV(SvRV(obj));
583 tracker_keywords_remove(client, servicetype, id, _values, &error);
584 ST(0) = sv_newmortal();
586 ST(0) = &PL_sv_undef;
588 sv_setiv( ST(0), num + 1);
592 remove_all_keywords (obj, servicetype, id)
597 GError *error = NULL;
598 TrackerClient* client;
600 assert_valid_servicetype(servicetype);
601 client = (TrackerClient*) SvIV(SvRV(obj));
602 tracker_keywords_remove_all(client, servicetype, id, &error);
603 ST(0) = sv_newmortal();
605 ST(0) = &PL_sv_undef;
611 search_keywords (obj, lqi, servicetype, keywords, offset, maxhits)
623 GError *error = NULL;
624 TrackerClient* client;
630 if( (!SvROK(keywords))
631 || ( SvTYPE( SvRV(keywords) ) != SVt_PVAV )
632 || ( (num = av_len( (AV *) SvRV(keywords))) < 0 ) ) {
635 assert_valid_servicetype(servicetype);
636 /* convert keywords to a char** - this is inspired from the
637 * avref2charptrptr function from perldap
639 Newxz(_keywords, num + 2, char *);
640 for (i = 0; i <= num; i++) {
641 current_val = av_fetch( (AV *) SvRV(keywords), i, 0 );
642 placeholder = SvPV(*current_val, length);
643 /* store a copy in _keywords */
644 Newxz(_keywords[i], length+1, char);
645 Copy(placeholder, _keywords[i], length+1, char);
649 client = (TrackerClient*) SvIV(SvRV(obj));
650 ret = tracker_keywords_search(client, lqi, servicetype, _keywords, offset, maxhits, &error);
651 ra = (AV *) sv_2mortal( (SV *) newAV() );
653 RETVAL = &PL_sv_undef;
655 for(i = 0; ret[i]; i++)
656 av_push(ra, newSVpv(ret[i], 0));
657 RETVAL = newRV( (SV *) ra);
658 g_strfreev(ret); /* don't leak */
665 search_text (obj, lqi, servicetype, searchtext, offset, maxhits)
669 const char* searchtext;
675 GError *error = NULL;
676 TrackerClient* client;
679 assert_valid_servicetype(servicetype);
680 client = (TrackerClient*) SvIV(SvRV(obj));
681 ret = tracker_search_text(client, lqi, servicetype, searchtext, offset, maxhits, &error);
682 ra = (AV *) sv_2mortal( (SV *) newAV() );
684 RETVAL = &PL_sv_undef;
686 for(i = 0; ret[i]; i++)
687 av_push(ra, newSVpv(ret[i], 0));
688 RETVAL = newRV( (SV *) ra);
689 g_strfreev(ret); /* don't leak */
696 get_snippet (obj, servicetype, path, searchtext)
700 const char* searchtext;
703 GError *error = NULL;
704 TrackerClient* client;
706 assert_valid_servicetype(servicetype);
707 client = (TrackerClient*) SvIV(SvRV(obj));
708 ST(0) = sv_newmortal();
709 ret = tracker_search_get_snippet(client, servicetype, path, searchtext, &error);
711 ST(0) = &PL_sv_undef;
713 sv_setpv( ST(0), ret );
718 search_metadata (obj, servicetype, field, searchtext, offset, maxhits)
722 const char* searchtext;
728 GError *error = NULL;
729 TrackerClient* client;
732 assert_valid_servicetype(servicetype);
733 client = (TrackerClient*) SvIV(SvRV(obj));
734 ret = tracker_search_metadata(client, servicetype, field, searchtext, offset, maxhits, &error);
735 ra = (AV *) sv_2mortal( (SV *) newAV() );
737 RETVAL = &PL_sv_undef;
739 for(i = 0; ret[i]; i++)
740 av_push(ra, newSVpv(ret[i], 0));
741 RETVAL = newRV( (SV *) ra);
742 g_strfreev(ret); /* don't leak */
749 get_suggestion (obj, searchtext, maxdist)
751 const char* searchtext;
755 GError *error = NULL;
756 TrackerClient* client;
758 client = (TrackerClient*) SvIV(SvRV(obj));
759 ST(0) = sv_newmortal();
760 ret = tracker_search_suggest(client,searchtext, maxdist, &error);
762 ST(0) = &PL_sv_undef;
764 sv_setpv( ST(0), ret );
769 get_files_by_service (obj, lqi, servicetype, offset, maxhits)
778 GError *error = NULL;
779 TrackerClient* client;
782 assert_valid_servicetype(servicetype);
783 client = (TrackerClient*) SvIV(SvRV(obj));
784 ret = tracker_files_get_by_service_type(client, lqi, servicetype, offset, maxhits, &error);
785 ra = (AV *) sv_2mortal( (SV *) newAV() );
787 RETVAL = &PL_sv_undef;
789 for(i = 0; ret[i]; i++)
790 av_push(ra, newSVpv(ret[i], 0));
791 RETVAL = newRV( (SV *) ra);
792 g_strfreev(ret); /* don't leak */
804 /* this is stolen from Inline::C documentation */
805 temp = PL_markstack_ptr++;
807 if(PL_markstack_ptr != temp) {
808 /* truly void, because dXSARGS not invoked */
809 PL_markstack_ptr = temp;
812 /* must have used dXSARGS; list context implied */
813 return; /* assume stack size is correct */