Mac-Spotlight
view release on metacpan or search on metacpan
MDQuery/MDQuery.xs view on Meta::CPAN
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include </System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Headers/MDQuery.h>
MODULE = Mac::Spotlight::MDQuery PACKAGE = Mac::Spotlight::MDQuery
CFStringRef
kMDQueryScopeHome()
=item Would it be more efficient to do a PPCODE that pushes the object
pointer? Do we care?
=cut
CODE:
RETVAL = kMDQueryScopeHome;
OUTPUT:
RETVAL
CFStringRef
kMDQueryScopeComputer()
CODE:
RETVAL = kMDQueryScopeComputer;
OUTPUT:
RETVAL
CFStringRef
kMDQueryScopeNetwork()
CODE:
RETVAL = kMDQueryScopeNetwork;
OUTPUT:
RETVAL
MDQueryRef
_new(queryString)
char* queryString
CODE:
CFStringRef query = CFStringCreateWithCString(kCFAllocatorDefault, queryString, CFStringGetSystemEncoding());
RETVAL = (MDQueryRef)MDQueryCreate(kCFAllocatorDefault, query, NULL, NULL);
CFRelease(query);
if (RETVAL == NULL)
RETVAL = nil;
OUTPUT:
RETVAL
void
_setSearchScope(query, scopes)
MDQueryRef query
AV* scopes
PREINIT:
int x;
void** itemsList;
SV** itemPtr;
IV cfItem;
CODE:
itemsList = (void**)malloc(sizeof(void*) * (av_len(scopes)+1));
for (x = 0; x <= av_len(scopes); x++) {
itemPtr = av_fetch(scopes, x, 0);
if (sv_derived_from(*itemPtr, "CFStringRef")) {
cfItem = SvIV((SV*)SvRV(*itemPtr));
cfItem = INT2PTR(CFStringRef, cfItem);
if (CFGetTypeID(cfItem) != CFStringGetTypeID())
Perl_croak(aTHX_ "setScope was passed something not a string!");
itemsList[x] = cfItem;
}
else if (SvPOK(*itemPtr))
itemsList[x] = CFStringCreateWithCString(kCFAllocatorDefault,
SvPV_nolen(*itemPtr),
CFStringGetSystemEncoding());
else
Perl_croak(aTHX_ "setScope was passed something not a string!");
}
CFArrayRef scopesList = CFArrayCreate(kCFAllocatorDefault,
(const void**)itemsList,
av_len(scopes) + 1,
NULL);
MDQuerySetSearchScope(query, scopesList, 0);
CFRelease(scopesList);
free(itemsList);
SV*
_execute(query)
MDQueryRef query
CODE:
if (!MDQueryExecute(query, kMDQuerySynchronous))
RETVAL = newSV(0);
else
RETVAL = newSV(1);
OUTPUT:
RETVAL
void
_stop(query)
MDQueryRef query
CODE:
MDQueryStop(query);
void
_getResults(query)
MDQueryRef query
PPCODE:
CFIndex x;
SV* tmpHash;
SV* tmpScalar;
int i = MDQueryGetResultCount(query);
for (x = 0; x < i; x++) {
tmpHash = sv_2mortal((SV*)newHV());
tmpScalar = newSVsv(&PL_sv_undef);
sv_setref_pv(tmpScalar, "MDItemRef", (void*)MDQueryGetResultAtIndex(query, x));
hv_store((HV*)tmpHash, "mdiObj", 6, tmpScalar, 0);
XPUSHs(sv_bless(sv_2mortal(newRV(tmpHash)), gv_stashpv("Mac::Spotlight::MDItem", FALSE)));
}
XSRETURN(i);
void
_destroy(query)
MDQueryRef query
CODE:
CFRelease(query);
( run in 0.470 second using v1.01-cache-2.11-cpan-5511b514fd6 )