Merge lp:~wyuka/zeitgeist-datasources/purple into lp:zeitgeist-datasources/0.8

Proposed by Tirtha Chatterjee
Status: Needs review
Proposed branch: lp:~wyuka/zeitgeist-datasources/purple
Merge into: lp:zeitgeist-datasources/0.8
Diff against target: 857 lines (+821/-1)
3 files modified
configure.ac (+21/-1)
purple/Makefile.am (+35/-0)
purple/zeitgeist_dataprovider.c (+765/-0)
To merge this branch: bzr merge lp:~wyuka/zeitgeist-datasources/purple
Reviewer Review Type Date Requested Status
Michal Hruby (community) code Needs Fixing
Manish Sinha (मनीष सिन्हा) license Needs Fixing
Review via email: mp+65605@code.launchpad.net

Commit message

Added a datasource for libpurple

Description of the change

Added a datasource for libpurple, the library used by Pidgin and Adium.

To post a comment you must log in.
Revision history for this message
Manish Sinha (मनीष सिन्हा) (manishsinha) wrote :

In purple/zeitgeist_dataprovider.c

> Zeitgeist dataprovider for XChat is free software;

Should be purple instead of XChat

> Zeitgeist dataprovider for XChat is distributed in the hope that

Should be again purple.

review: Needs Fixing (license)
Revision history for this message
Manish Sinha (मनीष सिन्हा) (manishsinha) wrote :

This would take some time as we need to make sure that the ontology are proper and does correspond to telepathy's data-source ontology perfectly to avoid any issues

Revision history for this message
Michal Hruby (mhr3) wrote :

First of all, I really don't think logging every sent and received url is a good idea, I'd get rid of all of that. (anyway if the user clicks on the url, it'll be logged by the browser dataproviders). @manish: objections?

Second, signed-on/off are not too interesting either imo, at very least they shouldn't be USER_ACTIVITY.

Let's get to something more specific (line numbers as seen in LP's diff):
681 727: libzg has method (zeitgeist_interpretation_for_mimetype) which turns mime-type into Interpretation, use that please.
...,686,...: storage parameter for ZeitgeistSubject is often wrong, local files are never "net".

Other than that there are a couple of leaks:
619: account_uri
671, 717: file
672, 718: parent

I'm no purple plugin expert, but I'd say you should disconnect the signals in the unload method.

review: Needs Fixing (code)
Revision history for this message
Michal Hruby (mhr3) wrote :

Oh and all instances g_file_get_uri leak as well.

Revision history for this message
Manish Sinha (मनीष सिन्हा) (manishsinha) wrote :

@Michal

I see there is anyway not harm in logging all the sent and received URLs. The use-case can be "I sent you the URL of _some_random_person_ facebook profile, didn't you see it". Logging the URL might help in this case

Unmerged revisions

152. By Tirtha Chatterjee

add events logging for purple

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'configure.ac'
--- configure.ac 2011-06-04 21:51:56 +0000
+++ configure.ac 2011-06-23 01:16:19 +0000
@@ -65,7 +65,7 @@
65AC_MSG_NOTICE([Requested to enable all plugins: ${all_plugins}])65AC_MSG_NOTICE([Requested to enable all plugins: ${all_plugins}])
6666
67# The full list of plugins67# The full list of plugins
68allowed_plugins="bzr chrome eog geany gedit vim emacs tomboy telepathy xchat rhythmbox firefox-40-libzg totem-libzg firefox-36-libzg"68allowed_plugins="bzr chrome eog geany purple gedit vim emacs tomboy telepathy xchat rhythmbox firefox-40-libzg totem-libzg firefox-36-libzg"
69# currently disabled = "epiphany"69# currently disabled = "epiphany"
7070
71# npapi-plugin has a template Makefile.am, but don't use it directly71# npapi-plugin has a template Makefile.am, but don't use it directly
@@ -180,6 +180,22 @@
180 continue180 continue
181 fi181 fi
182 ;;182 ;;
183 purple)
184 if test "${HAVE_LIBZG}" != "yes" ; then
185 plugin_error_or_ignore "libzeitgeist not found"
186 continue
187 fi
188 if test "x$HAVE_GTK" = "xno"; then
189 plugin_error_or_ignore "You need to install gtk development headers"
190 continue
191 fi
192 PKG_CHECK_MODULES(PURPLE, purple >= 2.0.0,
193 [HAVE_PURPLE=yes], [HAVE_PURPLE=no])
194 if test "${HAVE_PURPLE}" != "yes" ; then
195 plugin_error_or_ignore "libpurple headers not found"
196 continue
197 fi
198 ;;
183 npapi-plugin)199 npapi-plugin)
184 if test "${HAVE_LIBZG}" != "yes" ; then200 if test "${HAVE_LIBZG}" != "yes" ; then
185 plugin_error_or_ignore "libzeitgeist not found"201 plugin_error_or_ignore "libzeitgeist not found"
@@ -321,6 +337,10 @@
321 AC_CONFIG_FILES([geany/Makefile])337 AC_CONFIG_FILES([geany/Makefile])
322 continue 2338 continue 2
323 ;;339 ;;
340 purple)
341 AC_CONFIG_FILES([purple/Makefile])
342 continue 2
343 ;;
324 gedit)344 gedit)
325 AC_CONFIG_FILES([gedit/Makefile])345 AC_CONFIG_FILES([gedit/Makefile])
326 continue 2346 continue 2
327347
=== added directory 'purple'
=== added file 'purple/Makefile.am'
--- purple/Makefile.am 1970-01-01 00:00:00 +0000
+++ purple/Makefile.am 2011-06-23 01:16:19 +0000
@@ -0,0 +1,35 @@
1purpleplugindir = $(libdir)/purple-2/
2purpleplugin_LTLIBRARIES = zeitgeist_dataprovider.la
3
4zeitgeist_dataprovider_la_SOURCES = \
5 zeitgeist_dataprovider.c
6zeitgeist_dataprovider_la_CFLAGS = \
7 -fPIC -Wall -std=c99 \
8 $(ZEITGEIST_CFLAGS) \
9 $(PURPLE_CFLAGS) \
10 $(NULL)
11
12zeitgeist_dataprovider_la_LIBADD = \
13 $(ZEITGEIST_LIBS) \
14 $(PURPLE_LIBS) \
15 $(NULL)
16zeitgeist_dataprovider_la_LDFLAGS = \
17 -module -avoid-version \
18 $(NULL)
19
20# we want to allow also local install
21PURPLE_PLUGIN_HOME_DIR = ~/.purple/plugins
22
23PLUGIN_FILES = zeitgeist_dataprovider.so
24
25local-install:
26 mkdir -p $(PURPLE_PLUGIN_HOME_DIR)
27 cp $(PLUGIN_FILES) $(PURPLE_PLUGIN_HOME_DIR)
28
29local-uninstall:
30 for f in $(PLUGIN_FILES); \
31 do \
32 echo remove $$f; \
33 rm -f $(PURPLE_PLUGIN_HOME_DIR)/$$f; \
34 done
35
036
=== added file 'purple/zeitgeist_dataprovider.c'
--- purple/zeitgeist_dataprovider.c 1970-01-01 00:00:00 +0000
+++ purple/zeitgeist_dataprovider.c 2011-06-23 01:16:19 +0000
@@ -0,0 +1,765 @@
1/*
2 * zeitgeist-dataprovider.c
3 * This file is part of Zeitgeist dataprovider for libpurple.
4 *
5 * Copyright (C) 2011 - Tirtha Chatterjee <tirtha.p.chatterjee@gmail.com>
6 *
7 * Zeitgeist dataprovider for XChat is free software;
8 * you can redistribute it and/or modify it under the terms of the GNU Lesser
9 * General Public License as published by the Free Software Foundation; either
10 * version 3 of the License, or (at your option) any later version.
11 *
12 * Zeitgeist dataprovider for XChat is distributed in the hope that
13 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
14 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 * See the GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#define ZEITGEIST_NCO_CONTACT_GROUP "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#ContactGroup"
23#define ZEITGEIST_NCO_CONTACT "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact"
24
25#define PURPLE_PLUGINS
26
27#define ZEITGEIST_ID "core-zeitgeist"
28
29#include <stdio.h>
30
31#include "cipher.h"
32#include "connection.h"
33#include "conversation.h"
34#include "core.h"
35#include "debug.h"
36#include "ft.h"
37#include "signals.h"
38#include "version.h"
39#include "status.h"
40#include "sound.h"
41
42#include <zeitgeist.h>
43
44#define PNAME "Zeitgeist"
45#define PDESC "Inform Zeitgeist about your activity"
46#define PVERSION "0.1"
47
48static ZeitgeistLog *zg_log = NULL; /* Zeitgeist-daemon handle*/
49static GSList* signed_in_accounts = NULL;
50
51char *
52get_uri_for_group(PurpleGroup *group)
53{
54 char* uri = g_strdup_printf("group://%s",
55 purple_escape_filename(purple_group_get_name(group)));
56 return uri;
57}
58
59char *
60get_uri_for_buddy(PurpleBuddy *buddy)
61{
62 char* uri = g_strdup_printf("buddy://%s",
63 purple_escape_filename(purple_buddy_get_name(buddy)));
64 return uri;
65}
66
67char *
68get_uri_for_account(PurpleAccount *account)
69{
70 char* uri = g_strdup_printf("account://%s",
71 purple_escape_filename(purple_normalize(account,
72 purple_account_get_username(account))));
73 return uri;
74}
75
76char *
77get_uri_for_conversation(PurpleConversation* conv)
78{
79 PurpleAccount *account = purple_conversation_get_account(conv);
80 PurpleConversationType type = purple_conversation_get_type(conv);
81 const char *name = purple_conversation_get_name(conv);
82
83 PurplePlugin *prpl;
84 PurplePluginProtocolInfo *prpl_info;
85 const char *prpl_name;
86 const char *target;
87 char *uri;
88
89 prpl = purple_find_prpl(purple_account_get_protocol_id(account));
90 if (!prpl)
91 return NULL;
92 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
93 prpl_name = prpl_info->list_icon(account, NULL);
94
95 if (type == PURPLE_CONV_TYPE_CHAT) {
96 char *temp = g_strdup_printf("%s.chat", purple_normalize(account, name));
97 target = purple_escape_filename(temp);
98 g_free(temp);
99 } else {
100 target = purple_escape_filename(purple_normalize(account, name));
101 }
102
103 uri = g_strdup_printf("conversation://%s/%s", prpl_name,
104 target);
105
106 return uri;
107}
108
109static void store_urls(const char *buffer,
110 PurpleAccount *account, const char *target, gboolean sent_or_received)
111{
112 GRegex *strip_tags_regex = g_regex_new("<(.*?)>", 0, 0, NULL);
113 GRegex *url_regex = g_regex_new("((https?)|(ftp))://[\\S]+", 0, 0, NULL);
114 GError *error = NULL;
115 GMatchInfo *match_info;
116 char *cur = g_regex_replace_literal(strip_tags_regex, buffer, -1, 0, "", 0, NULL);
117 g_regex_unref(strip_tags_regex);
118
119 g_regex_match_full(url_regex, cur, -1, 0, 0, &match_info, &error);
120 while (g_match_info_matches (match_info))
121 {
122 char *url = g_match_info_fetch (match_info, 0);
123 const char *text = target;
124
125 ZeitgeistEvent *event;
126
127 event = zeitgeist_event_new_full (
128 (sent_or_received ? ZEITGEIST_ZG_SEND_EVENT:
129 ZEITGEIST_ZG_RECEIVE_EVENT),
130 (sent_or_received ? ZEITGEIST_ZG_USER_ACTIVITY:
131 ZEITGEIST_ZG_WORLD_ACTIVITY),
132 "application://pidgin.desktop",
133 zeitgeist_subject_new_full (
134 url,
135 ZEITGEIST_NFO_BOOKMARK,
136 ZEITGEIST_NFO_REMOTE_DATA_OBJECT,
137 "text/plain",
138 url,
139 text,
140 "net"),
141 NULL);
142
143 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
144 (sent_or_received ? ZEITGEIST_ZG_SEND_EVENT:
145 ZEITGEIST_ZG_RECEIVE_EVENT),
146 (sent_or_received ? ZEITGEIST_ZG_USER_ACTIVITY:
147 ZEITGEIST_ZG_WORLD_ACTIVITY),
148 "application://pidgin.desktop",
149 url,
150 ZEITGEIST_NCO_BOOKMARK,
151 ZEITGEIST_NFO_REMOTE_DATA_OBJECT,
152 "text/plain",
153 url,
154 text,
155 "net");*/
156
157 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
158
159 g_free (url);
160 g_match_info_next (match_info, &error);
161 }
162 g_match_info_free (match_info);
163 g_regex_unref (url_regex);
164
165 if (error != NULL)
166 {
167 g_error_free (error);
168 return;
169 }
170 g_free(cur);
171}
172
173/**************************************************************************
174 * Buddy List subsystem signal callbacks
175 **************************************************************************/
176
177static void
178blist_node_added_cb(PurpleBlistNode *bnode, void *data)
179{
180 if (PURPLE_BLIST_NODE_IS_GROUP(bnode))
181 {
182 const char *text = purple_group_get_name(PURPLE_GROUP(bnode));
183 char *group_uri = get_uri_for_group(PURPLE_GROUP(bnode));
184
185 ZeitgeistEvent *event;
186
187 event = zeitgeist_event_new_full (
188 ZEITGEIST_ZG_CREATE_EVENT,
189 ZEITGEIST_ZG_USER_ACTIVITY,
190 "application://pidgin.desktop",
191 zeitgeist_subject_new_full (
192 group_uri,
193 ZEITGEIST_NCO_CONTACT_GROUP,
194 ZEITGEIST_NFO_SOFTWARE_SERVICE,
195 "text/plain",
196 "application://pidgin.desktop",
197 text,
198 "net"),
199 NULL);
200
201 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
202 ZEITGEIST_ZG_CREATE_EVENT,
203 ZEITGEIST_ZG_USER_ACTIVITY,
204 "application://pidgin.desktop",
205 group_uri,
206 ZEITGEIST_NCO_CONTACT,
207 ZEITGEIST_NFO_SOFTWARE_SERVICE,
208 "text/plain",
209 "application://pidgin.desktop",
210 text,
211 "net");*/
212
213 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
214
215 g_free(group_uri);
216 }
217 else if (PURPLE_BLIST_NODE_IS_BUDDY(bnode))
218 {
219 const char *text = purple_buddy_get_alias(PURPLE_BUDDY(bnode));
220 char *group_uri = get_uri_for_group(
221 purple_buddy_get_group(PURPLE_BUDDY(bnode)));
222 char *buddy_uri = get_uri_for_buddy(PURPLE_BUDDY(bnode));
223
224 ZeitgeistEvent *event;
225
226 event = zeitgeist_event_new_full (
227 ZEITGEIST_ZG_CREATE_EVENT,
228 ZEITGEIST_ZG_USER_ACTIVITY,
229 "application://pidgin.desktop",
230 zeitgeist_subject_new_full (
231 buddy_uri,
232 ZEITGEIST_NCO_CONTACT,
233 ZEITGEIST_NFO_SOFTWARE_SERVICE,
234 "text/plain",
235 group_uri,
236 text,
237 "net"),
238 NULL);
239
240 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
241 ZEITGEIST_ZG_CREATE_EVENT,
242 ZEITGEIST_ZG_USER_ACTIVITY,
243 "application://pidgin.desktop",
244 buddy_uri,
245 ZEITGEIST_NCO_CONTACT,
246 ZEITGEIST_NFO_SOFTWARE_SERVICE,
247 "text/plain",
248 group_uri,
249 text,
250 "net");*/
251
252 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
253
254 g_free(group_uri);
255 g_free(buddy_uri);
256 }
257 else
258 return;
259}
260
261static void
262blist_node_removed_cb(PurpleBlistNode *bnode, void *data)
263{
264 if (PURPLE_BLIST_NODE_IS_GROUP(bnode))
265 {
266 const char *text = purple_group_get_name(PURPLE_GROUP(bnode));
267 char *group_uri = get_uri_for_group(PURPLE_GROUP(bnode));
268 ZeitgeistEvent *event;
269
270 event = zeitgeist_event_new_full (
271 ZEITGEIST_ZG_CREATE_EVENT,
272 ZEITGEIST_ZG_USER_ACTIVITY,
273 "application://pidgin.desktop",
274 zeitgeist_subject_new_full (
275 group_uri,
276 ZEITGEIST_NCO_CONTACT_GROUP,
277 ZEITGEIST_NFO_SOFTWARE_SERVICE,
278 "text/plain",
279 "application://pidgin.desktop",
280 text,
281 "net"),
282 NULL);
283
284 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
285 ZEITGEIST_ZG_CREATE_EVENT,
286 ZEITGEIST_ZG_USER_ACTIVITY,
287 "application://pidgin.desktop",
288 group_uri,
289 ZEITGEIST_NCO_CONTACT,
290 ZEITGEIST_NFO_SOFTWARE_SERVICE,
291 "text/plain",
292 "application://pidgin.desktop",
293 text,
294 "net");*/
295
296 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
297
298 g_free(group_uri);
299 }
300 else if (PURPLE_BLIST_NODE_IS_BUDDY(bnode))
301 {
302 const char *text = purple_buddy_get_alias(PURPLE_BUDDY(bnode));
303 char *group_uri = get_uri_for_group(
304 purple_buddy_get_group(PURPLE_BUDDY(bnode)));
305 char *buddy_uri = get_uri_for_buddy(PURPLE_BUDDY(bnode));
306
307 ZeitgeistEvent *event;
308
309 event = zeitgeist_event_new_full (
310 ZEITGEIST_ZG_DELETE_EVENT,
311 ZEITGEIST_ZG_USER_ACTIVITY,
312 "application://pidgin.desktop",
313 zeitgeist_subject_new_full (
314 buddy_uri,
315 ZEITGEIST_NCO_CONTACT,
316 ZEITGEIST_NFO_SOFTWARE_SERVICE,
317 "text/plain",
318 group_uri,
319 text,
320 "net"),
321 NULL);
322
323 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
324 ZEITGEIST_ZG_DELETE_EVENT,
325 ZEITGEIST_ZG_USER_ACTIVITY,
326 "application://pidgin.desktop",
327 buddy_uri,
328 ZEITGEIST_NCO_CONTACT,
329 ZEITGEIST_NFO_SOFTWARE_SERVICE,
330 "text/plain",
331 group_uri,
332 text,
333 "net");*/
334
335 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
336
337 g_free(group_uri);
338 g_free(buddy_uri);
339 }
340 else
341 return;
342}
343
344/**************************************************************************
345 * Connection subsystem signal callbacks
346 **************************************************************************/
347
348static void
349signed_on_cb(PurpleConnection *gc, void *data) //TODO
350{
351 PurpleAccount* account = purple_connection_get_account(gc);
352 char *acname = g_strdup(purple_normalize(account,
353 purple_account_get_username(account)));
354
355 const char *text = acname;
356 char *account_uri = get_uri_for_account(account);
357
358 ZeitgeistEvent *event;
359
360 event = zeitgeist_event_new_full (
361 ZEITGEIST_ZG_ACCESS_EVENT,
362 ZEITGEIST_ZG_USER_ACTIVITY,
363 "application://pidgin.desktop",
364 zeitgeist_subject_new_full (
365 account_uri,
366 ZEITGEIST_NCO_CONTACT,
367 ZEITGEIST_NFO_SOFTWARE_SERVICE,
368 "text/plain",
369 "application://pidgin.desktop",
370 text,
371 "net"),
372 NULL);
373
374 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
375 ZEITGEIST_ZG_ACCESS_EVENT,
376 ZEITGEIST_ZG_USER_ACTIVITY,
377 "application://pidgin.desktop",
378 account_uri,
379 ZEITGEIST_NCO_CONTACT,
380 ZEITGEIST_NFO_SOFTWARE_SERVICE,
381 "text/plain",
382 "application://pidgin.desktop",
383 text,
384 "net");*/
385
386 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
387
388 g_free(account_uri);
389 signed_in_accounts = g_slist_append(signed_in_accounts, acname);
390 // this is to make sure that a sign off in an account can't happen
391 // without a sign-on, looks dumb. however it happens during
392 // connection errors. so this check.
393}
394
395static void
396signed_off_cb(PurpleConnection *gc, void *data) //TODO
397{
398 PurpleAccount* account = purple_connection_get_account(gc);
399 const char *acname = purple_normalize(account,
400 purple_account_get_username(account));
401 char* acc;
402 GSList* current_account = signed_in_accounts;
403 while (current_account != NULL)
404 {
405 acc = current_account->data;
406 if (g_str_equal(acname, acc))
407 {
408 const char *text = acname;
409 char *account_uri = get_uri_for_account(account);
410
411 ZeitgeistEvent *event;
412
413 event = zeitgeist_event_new_full (
414 ZEITGEIST_ZG_LEAVE_EVENT,
415 ZEITGEIST_ZG_USER_ACTIVITY,
416 "application://pidgin.desktop",
417 zeitgeist_subject_new_full (
418 account_uri,
419 ZEITGEIST_NCO_CONTACT,
420 ZEITGEIST_NFO_SOFTWARE_SERVICE,
421 "text/plain",
422 "application://pidgin.desktop",
423 text,
424 "net"),
425 NULL);
426
427 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
428 ZEITGEIST_ZG_LEAVE_EVENT,
429 ZEITGEIST_ZG_USER_ACTIVITY,
430 "application://pidgin.desktop",
431 account_uri,
432 ZEITGEIST_NCO_CONTACT,
433 ZEITGEIST_NFO_SOFTWARE_SERVICE,
434 "text/plain",
435 "application://pidgin.desktop",
436 text,
437 "net");*/
438
439 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
440
441 g_free(account_uri);
442 g_free(acc);
443 signed_in_accounts = g_slist_delete_link(signed_in_accounts,
444 current_account);
445 }
446 else
447 {
448 current_account = current_account->next;
449 }
450 }
451}
452
453/**************************************************************************
454 * Conversation subsystem signal callbacks
455 **************************************************************************/
456static void
457sent_im_msg_cb(PurpleAccount *account,
458 const char *recipient, const char *buffer, void *data)
459{
460 store_urls(buffer, account, recipient, TRUE);
461}
462
463static void
464received_im_msg_cb(PurpleAccount *account, char *sender,
465 char *buffer, PurpleConversation *conv,
466 PurpleMessageFlags flags, void *data)
467{
468 store_urls(buffer, account, sender, FALSE);
469}
470
471static void
472received_chat_msg_cb(PurpleAccount *account, char *sender,
473 char *buffer, PurpleConversation *chat,
474 PurpleMessageFlags flags, void *data)
475{
476 store_urls(buffer, account, sender, FALSE);
477}
478
479static void
480conversation_created_cb(PurpleConversation *conv, void *data)
481{
482 char *conv_uri = get_uri_for_conversation(conv);
483 char *account_uri = get_uri_for_account(
484 purple_conversation_get_account(conv));
485 const char *text = purple_conversation_get_title(conv);
486
487
488 ZeitgeistEvent *event;
489
490 event = zeitgeist_event_new_full (
491 ZEITGEIST_ZG_ACCESS_EVENT,
492 ZEITGEIST_ZG_USER_ACTIVITY, //FIXME: this may be world activity
493 //find a way to check
494 "application://pidgin.desktop",
495 zeitgeist_subject_new_full (
496 conv_uri,
497 ZEITGEIST_NMO_IMMESSAGE,
498 ZEITGEIST_NFO_SOFTWARE_SERVICE,
499 "text/plain",
500 account_uri,
501 text,
502 "net"),
503 NULL);
504
505 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
506 ZEITGEIST_ZG_ACCESS_EVENT,
507 ZEITGEIST_ZG_USER_ACTIVITY,
508 "application://pidgin.desktop",
509 conv_uri,
510 ZEITGEIST_NMO_IMMESSAGE,
511 ZEITGEIST_NFO_SOFTWARE_SERVICE,
512 "text/plain",
513 account_uri,
514 text,
515 "net");*/
516
517 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
518
519 g_free(conv_uri);
520 g_free(account_uri);
521}
522
523static void
524deleting_conversation_cb(PurpleConversation *conv, void *data)
525{
526 char *conv_uri = get_uri_for_conversation(conv);
527 char *account_uri = get_uri_for_account(
528 purple_conversation_get_account(conv));
529 const char *text = purple_conversation_get_title(conv);
530
531 ZeitgeistEvent *event;
532
533 event = zeitgeist_event_new_full (
534 ZEITGEIST_ZG_DELETE_EVENT,
535 ZEITGEIST_ZG_USER_ACTIVITY,
536 "application://pidgin.desktop",
537 zeitgeist_subject_new_full (
538 conv_uri,
539 ZEITGEIST_NMO_IMMESSAGE,
540 ZEITGEIST_NFO_SOFTWARE_SERVICE,
541 "text/plain",
542 account_uri,
543 text,
544 "net"),
545 NULL);
546
547 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
548 ZEITGEIST_ZG_DELETE_EVENT,
549 ZEITGEIST_ZG_USER_ACTIVITY,
550 "application://pidgin.desktop",
551 conv_uri,
552 ZEITGEIST_NMO_IMMESSAGE,
553 ZEITGEIST_NFO_SOFTWARE_SERVICE,
554 "text/plain",
555 account_uri,
556 text,
557 "net");*/
558
559 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
560
561 g_free(conv_uri);
562}
563
564/**************************************************************************
565 * File transfer signal callbacks
566 **************************************************************************/
567
568static void
569ft_recv_complete_cb(PurpleXfer *xfer, gpointer data) {
570 const char *text = purple_xfer_get_filename(xfer);
571 char *content_type = g_content_type_guess(
572 purple_xfer_get_local_filename(xfer),
573 NULL, 0, NULL);
574 char *mime_type = g_content_type_get_mime_type(content_type);
575 if (mime_type == NULL)
576 mime_type = g_strdup("application/octet-stream");
577 // TODO: check if this is the best possible solution
578 g_free(content_type);
579 GFile *file = g_file_new_for_path(purple_xfer_get_local_filename(xfer));
580 GFile *parent = g_file_get_parent(file);
581 ZeitgeistEvent *event;
582
583 event = zeitgeist_event_new_full (
584 ZEITGEIST_ZG_RECEIVE_EVENT,
585 ZEITGEIST_ZG_WORLD_ACTIVITY,
586 "application://pidgin.desktop",
587 zeitgeist_subject_new_full (
588 g_file_get_uri(file),
589 ZEITGEIST_NFO_DOCUMENT, //FIXME: should check MIME types
590 ZEITGEIST_NFO_FILE_DATA_OBJECT,
591 mime_type,
592 (parent? g_file_get_uri(parent) : g_file_get_uri(file)),
593 text,
594 "net"),
595 NULL);
596
597 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
598 ZEITGEIST_ZG_RECEIVE_EVENT,
599 ZEITGEIST_ZG_WORLD_ACTIVITY,
600 "application://pidgin.desktop",
601 g_file_get_uri(file),
602 ZEITGEIST_NFO_DOCUMENT,
603 ZEITGEIST_NFO_FILE_DATA_OBJECT,
604 mime_type,
605 (parent? g_file_get_uri(parent) : g_file_get_uri(file)),
606 text,
607 "net");*/
608
609 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
610
611 g_free(mime_type);
612}
613
614static void
615ft_send_complete_cb(PurpleXfer *xfer, gpointer data) {
616 const char *text = purple_xfer_get_filename(xfer);
617 char *content_type = g_content_type_guess(
618 purple_xfer_get_local_filename(xfer),
619 NULL, 0, NULL);
620 char *mime_type = g_content_type_get_mime_type(content_type);
621 if (mime_type == NULL)
622 mime_type = g_strdup("application/octet-stream");
623 // TODO: check if this is the best possible solution
624 g_free(content_type);
625 GFile *file = g_file_new_for_path(purple_xfer_get_local_filename(xfer));
626 GFile *parent = g_file_get_parent(file);
627 ZeitgeistEvent *event;
628
629 event = zeitgeist_event_new_full (
630 ZEITGEIST_ZG_SEND_EVENT,
631 ZEITGEIST_ZG_USER_ACTIVITY,
632 "application://pidgin.desktop",
633 zeitgeist_subject_new_full (
634 g_file_get_uri(file),
635 ZEITGEIST_NFO_DOCUMENT, //FIXME: should check MIME types
636 ZEITGEIST_NFO_FILE_DATA_OBJECT,
637 mime_type,
638 (parent? g_file_get_uri(parent) : g_file_get_uri(file)),
639 text,
640 "net"),
641 NULL);
642
643 /*g_print("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
644 ZEITGEIST_ZG_SEND_EVENT,
645 ZEITGEIST_ZG_USER_ACTIVITY,
646 "application://pidgin.desktop",
647 g_file_get_uri(file),
648 ZEITGEIST_NFO_DOCUMENT,
649 ZEITGEIST_NFO_FILE_DATA_OBJECT,
650 mime_type,
651 (parent? g_file_get_uri(parent) : g_file_get_uri(file)),
652 text,
653 "net");*/
654
655 zeitgeist_log_insert_events_no_reply (zg_log, event, NULL);
656
657 g_free(mime_type);
658}
659
660/**************************************************************************
661 * Plugin stuff
662 **************************************************************************/
663static gboolean
664plugin_load(PurplePlugin *plugin)
665{
666 zg_log = zeitgeist_log_new();
667
668 void *blist_handle = purple_blist_get_handle();
669 void *conn_handle = purple_connections_get_handle();
670 void *conv_handle = purple_conversations_get_handle();
671 void *ft_handle = purple_xfers_get_handle();
672
673 /* Buddy List subsystem signals */
674 purple_signal_connect(blist_handle, "blist-node-added",
675 plugin, PURPLE_CALLBACK(blist_node_added_cb), NULL);
676 purple_signal_connect(blist_handle, "blist-node-removed",
677 plugin, PURPLE_CALLBACK(blist_node_removed_cb), NULL);
678 //purple_signal_connect(blist_handle, "blist-node-aliased",
679 // plugin, PURPLE_CALLBACK(blist_node_aliased), NULL);
680
681 /* Connection subsystem signals */
682 purple_signal_connect(conn_handle, "signed-on",
683 plugin, PURPLE_CALLBACK(signed_on_cb), NULL);
684 purple_signal_connect(conn_handle, "signed-off",
685 plugin, PURPLE_CALLBACK(signed_off_cb), NULL);
686
687 /* Conversations subsystem signals */
688 purple_signal_connect(conv_handle, "sent-im-msg",
689 plugin, PURPLE_CALLBACK(sent_im_msg_cb), NULL);
690 purple_signal_connect(conv_handle, "received-im-msg",
691 plugin, PURPLE_CALLBACK(received_im_msg_cb), NULL);
692 purple_signal_connect(conv_handle, "received-chat-msg",
693 plugin, PURPLE_CALLBACK(received_chat_msg_cb), NULL);
694 purple_signal_connect(conv_handle, "conversation-created",
695 plugin, PURPLE_CALLBACK(conversation_created_cb), NULL);
696 purple_signal_connect(conv_handle, "deleting-conversation",
697 plugin, PURPLE_CALLBACK(deleting_conversation_cb), NULL);
698
699 /* File transfer signals */
700 purple_signal_connect(ft_handle, "file-recv-complete",
701 plugin, PURPLE_CALLBACK(ft_recv_complete_cb), NULL);
702 purple_signal_connect(ft_handle, "file-send-complete",
703 plugin, PURPLE_CALLBACK(ft_send_complete_cb), NULL);
704
705 return TRUE;
706}
707
708static gboolean
709plugin_unload(PurplePlugin *plugin)
710{
711 GSList *current_account = signed_in_accounts;
712 char *acc;
713 while (current_account != NULL)
714 {
715 acc = current_account->data;
716 g_free(acc);
717 current_account = current_account->next;
718 }
719 g_slist_free(signed_in_accounts);
720 signed_in_accounts = NULL;
721
722 return TRUE;
723}
724
725static PurplePluginInfo info =
726{
727 PURPLE_PLUGIN_MAGIC,
728 PURPLE_MAJOR_VERSION,
729 PURPLE_MINOR_VERSION,
730 PURPLE_PLUGIN_STANDARD, /**< type */
731 NULL, /**< ui_requirement */
732 0, /**< flags */
733 NULL, /**< dependencies */
734 PURPLE_PRIORITY_DEFAULT, /**< priority */
735
736 ZEITGEIST_ID, /**< id */
737 PNAME, /**< name */
738 PVERSION, /**< version */
739 /** summary */
740 PDESC, /** description */
741 PDESC,
742 "Tirtha Chatterjee <tirtha.p.chatterjee@gmail.com>", /**< author */
743 "http://www.zeitgeist-project.com/", /**< homepage */
744
745 plugin_load, /**< load */
746 plugin_unload, /**< unload */
747 NULL, /**< destroy */
748
749 NULL, /**< ui_info */
750 NULL, /**< extra_info */
751 NULL,
752 NULL,
753 /* Padding */
754 NULL,
755 NULL,
756 NULL,
757 NULL
758};
759
760static void
761init_plugin(PurplePlugin *plugin)
762{
763}
764
765PURPLE_INIT_PLUGIN(zeitgeist, init_plugin, info)

Subscribers

People subscribed via source and target branches