2 #include <atalk/standards.h>
12 #include <atalk/talloc.h>
13 #include <atalk/logger.h>
14 #include <atalk/errchk.h>
15 #include <atalk/spotlight.h>
17 #include "slmod_tracker_0_6_map.h"
19 struct yy_buffer_state;
20 typedef struct yy_buffer_state *YY_BUFFER_STATE;
21 extern int yylex (void);
22 extern void yyerror (char const *);
23 extern void *yyterminate(void);
24 extern YY_BUFFER_STATE yy_scan_string( const char *str);
25 extern void yy_delete_buffer ( YY_BUFFER_STATE buffer );
27 /* forward declarations */
28 static char *map_expr(const char *attr, char op, const char *val);
29 static time_t isodate2unix(const char *s);
31 /* global vars, eg needed by the lexer */
35 static ServiceType ts_type; /* Tracker query object type */
36 static gchar *ts_search; /* Tracker query search term */
40 #define SPRAW_TIME_OFFSET 978307200
41 extern int map_spotlight_to_tracker_0_6_query(slq_t *slq, ServiceType *type, gchar **search);
55 %type <sval> match function expr line
62 %token OBRACE CBRACE EQUAL UNEQUAL GT LT COMMA QUOTE
87 if (strcmp($1, $3) != 0)
94 | OBRACE expr CBRACE {$$ = $2;}
97 if (strcmp($1, $3) != 0)
108 | expr OR expr {YYABORT;}
112 WORD EQUAL QUOTE WORD QUOTE {$$ = map_expr($1, '=', $4);}
113 | WORD UNEQUAL QUOTE WORD QUOTE {YYABORT;}
114 | WORD LT QUOTE WORD QUOTE {YYABORT;}
115 | WORD GT QUOTE WORD QUOTE {YYABORT;}
116 | WORD EQUAL QUOTE WORD QUOTE WORD {$$ = map_expr($1, '=', $4);}
117 | WORD UNEQUAL QUOTE WORD QUOTE WORD {YYABORT;}
118 | WORD LT QUOTE WORD QUOTE WORD {YYABORT;}
119 | WORD GT QUOTE WORD QUOTE WORD {YYABORT;}
123 FUNC_INRANGE OBRACE WORD COMMA date COMMA date CBRACE {YYABORT;}
127 DATE_ISO OBRACE WORD CBRACE {$$ = isodate2unix($3);}
128 | WORD {$$ = atoi($1) + SPRAW_TIME_OFFSET;}
133 static time_t isodate2unix(const char *s)
137 if (strptime(s, "%Y-%m-%dT%H:%M:%SZ", &tm) == NULL)
142 static void map_type_search(const char *val)
144 for (struct MDTypeMap *p = MDTypeMap; p->mdtm_value; p++) {
145 if (strcmp(p->mdtm_value, val) == 0) {
146 if (p->mdtm_type == -1)
147 ts_type = SERVICE_OTHER_FILES;
149 ts_type = p->mdtm_type;
153 ts_type = SERVICE_OTHER_FILES;
156 static char *map_expr(const char *attr, char op, const char *val)
159 bstring q, search, replace;
162 for (struct spotlight_tracker_map *p = spotlight_tracker_map; p->stm_spotlight_attr; p++) {
163 if (strcmp(p->stm_spotlight_attr, attr) == 0) {
164 switch (p->stm_type) {
168 search = bfromcstr("*");
169 replace = bfromcstr("");
170 bfindreplace(q, search, replace, 0);
171 result = talloc_strdup(ts_slq, bdata(q));
178 map_type_search(val);
182 yyerror("unknown Spotlight attribute type");
195 void yyerror(const char *str)
198 printf("yyerror: %s\n", str);
200 LOG(log_error, logtype_sl, "yyerror: %s", str);
210 * Map a Spotlight RAW query string to a Tracker 0.6 query
212 * @param[in] slq Spotlight query handle
213 * @param[out] type mapped file type
214 * @param[out] search mapped search term
215 * @return 0 on success, -1 on error
217 int map_spotlight_to_tracker_0_6_query(slq_t *slq_in,
222 YY_BUFFER_STATE s = NULL;
225 s = yy_scan_string(ts_slq->slq_qstring);
227 /* Default object type is file */
228 *type = SERVICE_FILES;
231 EC_ZERO( yyparse() );
242 int main(int argc, char **argv)
248 printf("usage: %s QUERY\n", argv[0]);
252 ts_slq = talloc_zero(NULL, slq_t);
253 struct vol *vol = talloc_zero(ts_slq, struct vol);
254 vol->v_path = "/Volumes/test";
255 ts_slq->slq_vol = vol;
257 s = yy_scan_string(argv[1]);
264 printf("Tracker 0.6 query: service: %s, searchterm: %s\n",
265 tracker_type_to_service_name(ts_type), ts_search);