2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include <zeitgeist.h>
25
#include "applet-struct.h"
26
#include "applet-search.h"
29
static ZeitgeistEvent *_get_event_template_for_category (CDEventType iCategory)
31
if (myData.pEvents == NULL)
33
myData.pEvents = g_new0 (ZeitgeistEvent*, CD_NB_EVENT_TYPES);
35
ZeitgeistSubject *subj;
36
subj = zeitgeist_subject_new_full ("", // any type of uri.
38
"", // manifestation (ZEITGEIST_NFO_FILE_DATA_OBJECT/ZEITGEIST_NFO_REMOTE_DATA_OBJECT)
43
myData.pEvents[CD_EVENT_ALL] = zeitgeist_event_new_full (
44
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
45
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
46
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
47
subj, // a list of subjects
48
NULL); // terminated with NULL
50
subj = zeitgeist_subject_new_full ("file://*", // uri, application://* for apps
51
ZEITGEIST_NFO_DOCUMENT, // interpretation
52
ZEITGEIST_NFO_FILE_DATA_OBJECT, // manifestation
57
myData.pEvents[CD_EVENT_DOCUMENT] = zeitgeist_event_new_full (
58
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
59
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
60
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
61
subj, // a list of subjects
62
NULL); // terminated with NULL
64
/**subj = zeitgeist_subject_new_full ("file://*", // uri, application://* for apps
65
ZEITGEIST_NFO_FOLDER, // interpretation
66
ZEITGEIST_NFO_FILE_DATA_OBJECT, // manifestation
71
myData.pEvents[CD_EVENT_FOLDER] = zeitgeist_event_new_full (
72
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
73
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
74
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
75
subj, // a list of subjects
76
NULL); // terminated with NULL*/
78
subj = zeitgeist_subject_new_full ("file://*", // uri, application://* for apps
79
ZEITGEIST_NFO_IMAGE, // interpretation
80
ZEITGEIST_NFO_FILE_DATA_OBJECT, // manifestation
85
myData.pEvents[CD_EVENT_IMAGE] = zeitgeist_event_new_full (
86
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
87
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
88
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
89
subj, // a list of subjects
90
NULL); // terminated with NULL
92
subj = zeitgeist_subject_new_full ("file://*", // uri, application://* for apps
93
ZEITGEIST_NFO_AUDIO, // interpretation
94
ZEITGEIST_NFO_FILE_DATA_OBJECT, // manifestation
99
myData.pEvents[CD_EVENT_AUDIO] = zeitgeist_event_new_full (
100
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
101
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
102
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
103
subj, // a list of subjects
104
NULL); // terminated with NULL
106
subj = zeitgeist_subject_new_full ("file://*", // uri, application://* for apps
107
ZEITGEIST_NFO_VIDEO, // interpretation
108
ZEITGEIST_NFO_FILE_DATA_OBJECT, // manifestation
113
myData.pEvents[CD_EVENT_VIDEO] = zeitgeist_event_new_full (
114
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
115
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
116
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
117
subj, // a list of subjects
118
NULL); // terminated with NULL
120
subj = zeitgeist_subject_new_full ("", // url
121
ZEITGEIST_NFO_WEBSITE, // interpretation
122
ZEITGEIST_NFO_REMOTE_DATA_OBJECT, // manifestation
127
myData.pEvents[CD_EVENT_WEB] = zeitgeist_event_new_full (
128
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
129
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
130
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
131
subj, // a list of subjects
132
NULL); // terminated with NULL
134
subj = zeitgeist_subject_new_full ("file://*", // uri, application://* for apps
135
"!"ZEITGEIST_NFO_DOCUMENT, // interpretation
141
myData.pEvents[CD_EVENT_OTHER] = zeitgeist_event_new_full (
142
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
143
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
144
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
145
subj, // a list of subjects
146
NULL); // terminated with NULL
147
/**subj = zeitgeist_subject_new_full ("", // uri, application://* for apps
148
"!"ZEITGEIST_NFO_FOLDER, // interpretation
154
zeitgeist_event_add_subject (myData.pEvents[CD_EVENT_OTHER], subj);*/
155
subj = zeitgeist_subject_new_full ("", // uri, application://* for apps
156
"!"ZEITGEIST_NFO_IMAGE, // interpretation
162
zeitgeist_event_add_subject (myData.pEvents[CD_EVENT_OTHER], subj);
163
subj = zeitgeist_subject_new_full ("", // uri, application://* for apps
164
"!"ZEITGEIST_NFO_AUDIO, // interpretation
170
zeitgeist_event_add_subject (myData.pEvents[CD_EVENT_OTHER], subj);
171
subj = zeitgeist_subject_new_full ("", // uri, application://* for apps
172
"!"ZEITGEIST_NFO_VIDEO, // interpretation
178
zeitgeist_event_add_subject (myData.pEvents[CD_EVENT_OTHER], subj);
181
g_return_val_if_fail (iCategory < CD_NB_EVENT_TYPES, NULL);
182
g_object_ref (myData.pEvents[iCategory]);
183
return myData.pEvents[iCategory];
187
static void on_related_events_received (ZeitgeistLog *log, GAsyncResult *res, gpointer *user_data)
189
ZeitgeistResultSet *events;
190
GError *error = NULL;
191
CDOnGetEventsFunc pCallback = user_data[0];
192
gpointer data = user_data[1];
194
events = zeitgeist_log_find_events_finish (log, res, &error);
197
cd_warning ("Error reading results: %s", error->message);
198
g_error_free (error);
201
cd_debug ("Got %i events:", zeitgeist_result_set_size (events));
203
if (zeitgeist_result_set_has_next (events))
204
pCallback (events, data);
205
g_object_unref (events);
207
void cd_find_recent_related_files (const gchar **cMimeTypes, CDOnGetEventsFunc pCallback, gpointer data) // right-click on a launcher/appli
209
cd_debug ("%s ()", __func__);
210
static gpointer s_data[2];
211
s_data[0] = pCallback;
214
GPtrArray* zg_templates = g_ptr_array_sized_new (10);
216
for (i = 0; cMimeTypes[i] != NULL; i ++)
218
ZeitgeistSubject *subj = zeitgeist_subject_new_full ("file:*", // uri, application://* for apps
219
"", // interpretation
221
cMimeTypes[i], // mimetype
225
ZeitgeistEvent* ev = zeitgeist_event_new_full (
226
ZEITGEIST_ZG_ACCESS_EVENT, // interpretation type of the event (ZEITGEIST_ZG_EVENT_INTERPRETATION)
227
ZEITGEIST_ZG_USER_ACTIVITY, // manifestation type of the event (ZEITGEIST_ZG_EVENT_MANIFESTATION)
228
"", // actor (the party responsible for triggering the event, eg: app://firefox.desktop)
229
subj, NULL); // a list of subjects, terminated with NULL
230
g_ptr_array_add (zg_templates, ev);
233
if (myData.pLog == NULL)
234
myData.pLog = zeitgeist_log_new ();
236
zeitgeist_log_find_events (myData.pLog,
237
zeitgeist_time_range_new_to_now (),
239
ZEITGEIST_STORAGE_STATE_ANY,
240
myConfig.iNbRelatedFilesMax,
241
ZEITGEIST_RESULT_TYPE_MOST_RECENT_EVENTS, // MOST_RECENT_ORIGIN for folders
242
(GCancellable *)NULL,
243
(GAsyncReadyCallback)on_related_events_received,
248
static void on_recent_events_received (ZeitgeistLog *log, GAsyncResult *res, gpointer *user_data)
250
ZeitgeistResultSet *events;
251
GError *error = NULL;
252
CDOnGetEventsFunc pCallback = user_data[0];
253
gpointer data = user_data[1];
255
events = zeitgeist_log_find_events_finish (log, res, &error);
258
g_warning ("Error reading results: %s", error->message);
259
g_error_free (error);
263
cd_debug ("Got %i events:", zeitgeist_result_set_size (events));
265
if (zeitgeist_result_set_has_next (events))
266
pCallback (events, data);
267
g_object_unref (events);
269
void cd_find_recent_events (CDEventType iEventType, int iSortType, CDOnGetEventsFunc pCallback, gpointer data) // sorted by date or frequency, click on the icon
271
static gpointer s_data[2];
272
s_data[0] = pCallback;
276
ZeitgeistSubject *subj;
277
ev = _get_event_template_for_category (iEventType);
279
GPtrArray* zg_templates = g_ptr_array_sized_new (1);
280
g_ptr_array_add (zg_templates, ev);
282
if (myData.pLog == NULL)
283
myData.pLog = zeitgeist_log_new ();
285
zeitgeist_log_find_events (myData.pLog,
286
zeitgeist_time_range_new_to_now (),
288
ZEITGEIST_STORAGE_STATE_ANY,
289
myConfig.iNbResultsMax,
290
iSortType == 0 ? ZEITGEIST_RESULT_TYPE_MOST_RECENT_EVENTS : ZEITGEIST_RESULT_TYPE_MOST_POPULAR_SUBJECTS,
291
(GCancellable *)NULL,
292
(GAsyncReadyCallback)on_recent_events_received,
297
static void on_events_received (ZeitgeistIndex *index, GAsyncResult *res, gpointer *user_data)
299
ZeitgeistResultSet *events;
300
GError *error = NULL;
301
CDOnGetEventsFunc pCallback = user_data[0];
302
gpointer data = user_data[1];
304
events = zeitgeist_index_search_finish (index, res, &error);
307
g_warning ("Error reading results: %s", error->message);
308
g_error_free (error);
312
cd_message ("Got %i events:", zeitgeist_result_set_size (events));
314
if (zeitgeist_result_set_has_next (events))
315
pCallback (events, data);
316
g_object_unref (events);
318
void cd_search_events (const gchar *cQuery, CDEventType iEventType, CDOnGetEventsFunc pCallback, gpointer data) // dialog box on middle-click
320
static gpointer s_data[2];
321
s_data[0] = pCallback;
324
if (myData.pIndex == NULL)
325
myData.pIndex = zeitgeist_index_new ();
327
cd_debug ("Searching for '%s'...", cQuery);
329
GPtrArray* zg_templates = g_ptr_array_sized_new (1);
330
ZeitgeistEvent *ev = _get_event_template_for_category (iEventType);
331
g_ptr_array_add (zg_templates, ev);
332
zeitgeist_index_search (myData.pIndex,
334
zeitgeist_time_range_new_anytime (),
337
myConfig.iNbResultsMax, // number of events
338
ZEITGEIST_RESULT_TYPE_RELEVANCY, // sorting type
340
(GAsyncReadyCallback)on_events_received,
345
static void on_delete_events (ZeitgeistLog *log, GAsyncResult *res, gpointer *user_data)
347
cd_debug ("events deleted");
348
CDOnDeleteEventsFunc pCallback = user_data[0];
349
gpointer data = user_data[1];
350
int iNbEvents = GPOINTER_TO_INT (user_data[2]);
352
GError *error = NULL;
353
gboolean bSuccess = zeitgeist_log_delete_events_finish (log, res, &error);
356
cd_warning ("Error deleting log: %s", error->message);
357
g_error_free (error);
362
pCallback (iNbEvents, data);
365
static void on_deleting_event_received (ZeitgeistLog *log, GAsyncResult *res, gpointer *user_data)
367
CDOnDeleteEventsFunc pCallback = user_data[0];
368
gpointer data = user_data[1];
370
GError *error = NULL;
371
GArray *event_ids = zeitgeist_log_find_event_ids_finish (log, res, &error);
372
cd_debug ("got %d events", event_ids->len);
375
cd_warning ("Error finding in log: %s", error->message);
376
g_error_free (error);
381
user_data[2] = GINT_TO_POINTER (event_ids->len);
382
zeitgeist_log_delete_events (log,
384
(GCancellable *)NULL,
385
(GAsyncReadyCallback)on_delete_events,
388
static void on_delete_whole_log (ZeitgeistLog *log, GAsyncResult *res, gpointer *user_data)
390
CDOnDeleteEventsFunc pCallback = user_data[0];
391
gpointer data = user_data[1];
393
GError *error = NULL;
394
gboolean bSuccess = zeitgeist_log_delete_log_finish (log, res, &error);
397
cd_warning ("Error deleting log: %s", error->message);
398
g_error_free (error);
403
pCallback (-1, data);
406
void cd_delete_recent_events (int iNbDays, CDOnDeleteEventsFunc pCallback, gpointer data) // entry in the menu
408
static gpointer s_data[3];
409
s_data[0] = pCallback;
413
if (myData.pLog == NULL)
414
myData.pLog = zeitgeist_log_new ();
418
// find events IDs of less than 'iNbDays' days
420
time_t t = (time_t) time (NULL);
421
gint64 now = t * 1e3; // msec
422
ZeitgeistTimeRange *time_range = zeitgeist_time_range_new (now - iNbDays*24*3600*1e3, now);
424
GPtrArray* event_templates = g_ptr_array_new ();
426
zeitgeist_log_find_event_ids (myData.pLog,
429
ZEITGEIST_STORAGE_STATE_ANY,
430
999, // 999 is the max number of events available in zeitgeist 0.2, and 1499 is the max in sqlite3 :-/
431
ZEITGEIST_RESULT_TYPE_MOST_RECENT_EVENTS,
432
(GCancellable *)NULL,
433
(GAsyncReadyCallback)on_deleting_event_received,
436
else // delete the whole log
438
zeitgeist_log_delete_log (myData.pLog,
439
(GCancellable *)NULL,
440
(GAsyncReadyCallback)on_delete_whole_log,
446
void cd_delete_event (guint32 id, CDOnDeleteEventsFunc pCallback, gpointer data)
448
static gpointer s_data[3];
449
s_data[0] = pCallback;
451
s_data[2] = GINT_TO_POINTER (1);
453
GArray *event_ids = g_array_sized_new (TRUE,
457
g_array_append_val (event_ids, id);
459
zeitgeist_log_delete_events (myData.pLog,
461
(GCancellable *)NULL,
462
(GAsyncReadyCallback)on_delete_events,
463
s_data); // this function unrefs the array