paperbox r131 - in trunk: . src



Author: markoa
Date: Fri Apr 25 14:56:42 2008
New Revision: 131
URL: http://svn.gnome.org/viewvc/paperbox?rev=131&view=rev

Log:
Connect to Tracker.KeywordAdded/Removed

Added:
   trunk/src/tracker-phone-signals-marshal.c
   trunk/src/tracker-phone-signals-marshal.h
Modified:
   trunk/ChangeLog
   trunk/src/Makefile.am
   trunk/src/browser.cc
   trunk/src/tracker-phone.cc
   trunk/src/tracker-phone.hh

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Fri Apr 25 14:56:42 2008
@@ -52,7 +52,9 @@
 	thumbnailer.cc \
 	thumbnailer.hh \
 	tracker-phone.cc \
-	tracker-phone.hh
+	tracker-phone.hh \
+	tracker-phone-signals-marshal.c \
+	tracker-phone-signals-marshal.h
 
 global_defines = \
   -DPREFIX=\""$(prefix)"\" \

Modified: trunk/src/browser.cc
==============================================================================
--- trunk/src/browser.cc	(original)
+++ trunk/src/browser.cc	Fri Apr 25 14:56:42 2008
@@ -82,10 +82,10 @@
         tracker_client_->signal_documents_request_completed().connect(
             sigc::mem_fun(*this, &Browser::on_documents));
 
-        tracker_client_->signal_add_tags_request_completed().connect(
+        tracker_client_->signal_tags_added().connect(
             sigc::mem_fun(*this, &Browser::on_add_tags_request_completed));
 
-        tracker_client_->signal_remove_tags_request_completed().connect(
+        tracker_client_->signal_tags_removed().connect(
             sigc::mem_fun(*this, &Browser::on_remove_tags_request_completed));
     }
 

Added: trunk/src/tracker-phone-signals-marshal.c
==============================================================================
--- (empty file)
+++ trunk/src/tracker-phone-signals-marshal.c	Fri Apr 25 14:56:42 2008
@@ -0,0 +1,88 @@
+
+#include	<glib-object.h>
+
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* VOID:STRING,STRING,STRING */
+void
+TRACKER_PHONE__VOID__STRING_STRING_STRING (GClosure     *closure,
+                                           GValue       *return_value G_GNUC_UNUSED,
+                                           guint         n_param_values,
+                                           const GValue *param_values,
+                                           gpointer      invocation_hint G_GNUC_UNUSED,
+                                           gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__STRING_STRING_STRING) (gpointer     data1,
+                                                           gpointer     arg_1,
+                                                           gpointer     arg_2,
+                                                           gpointer     arg_3,
+                                                           gpointer     data2);
+  register GMarshalFunc_VOID__STRING_STRING_STRING callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 4);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_string (param_values + 1),
+            g_marshal_value_peek_string (param_values + 2),
+            g_marshal_value_peek_string (param_values + 3),
+            data2);
+}
+

Added: trunk/src/tracker-phone-signals-marshal.h
==============================================================================
--- (empty file)
+++ trunk/src/tracker-phone-signals-marshal.h	Fri Apr 25 14:56:42 2008
@@ -0,0 +1,20 @@
+
+#ifndef __TRACKER_PHONE__MARSHAL_H__
+#define __TRACKER_PHONE__MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+/* VOID:STRING,STRING,STRING */
+extern void TRACKER_PHONE__VOID__STRING_STRING_STRING (GClosure     *closure,
+                                                       GValue       *return_value,
+                                                       guint         n_param_values,
+                                                       const GValue *param_values,
+                                                       gpointer      invocation_hint,
+                                                       gpointer      marshal_data);
+
+G_END_DECLS
+
+#endif /* __TRACKER_PHONE__MARSHAL_H__ */
+

Modified: trunk/src/tracker-phone.cc
==============================================================================
--- trunk/src/tracker-phone.cc	(original)
+++ trunk/src/tracker-phone.cc	Fri Apr 25 14:56:42 2008
@@ -28,6 +28,7 @@
 #include "file-utils.hh"
 #include "tag-request.hh"
 #include "tracker-phone.hh"
+#include "tracker-phone-signals-marshal.h"
 
 namespace {
 
@@ -155,6 +156,7 @@
     void
     on_tracker_void_reply(GError* error, paperbox::AsyncTagPack* pack)
     {
+/*
         bool success = true;
 
         if (error) {
@@ -173,17 +175,50 @@
         ustring_array_to_vector(pack->tags, cpp_tags);
 
         if (pack->req_type == paperbox::ASYNC_REQUEST_TYPE_ADD) {
-            pack->phone->signal_add_tags_request_completed().emit(
-                success, pack->uri, cpp_tags);
+            pack->phone->signal_tags_added().emit(success,
+                                                  pack->uri,
+                                                  cpp_tags);
+
         } else if (pack->req_type == paperbox::ASYNC_REQUEST_TYPE_REMOVE) {
-            pack->phone->signal_remove_tags_request_completed().emit(
-                success, pack->uri, cpp_tags);
+            pack->phone->signal_tags_removed().emit(success,
+                                                    pack->uri,
+                                                    cpp_tags);
         }
-
+*/
         g_strfreev(pack->tags);
         delete pack;
     }
 
+    // Handler for D-Bus signal Tracker.Keywords/KeywordAdded
+    void
+    on_tracker_keyword_added(DBusGProxy* /*proxy*/,
+                             const char* /*service*/,
+                             const char* curi,
+                             const char* ckeyword,
+                             paperbox::TrackerPhone* phone)
+    {
+        Glib::ustring uri(curi);
+        std::vector<Glib::ustring> tags;
+        tags.push_back(Glib::ustring(ckeyword));
+
+        phone->signal_tags_added().emit(true, uri, tags);
+    }
+
+    // Handler for D-Bus signal Tracker.Keywords/KeywordRemoved
+    void
+    on_tracker_keyword_removed(DBusGProxy* /*proxy*/,
+                               const char* /*service*/,
+                               const char* curi,
+                               const char* ckeyword,
+                               paperbox::TrackerPhone* phone)
+    {
+        Glib::ustring uri(curi);
+        std::vector<Glib::ustring> tags;
+        tags.push_back(Glib::ustring(ckeyword));
+
+        phone->signal_tags_removed().emit(true, uri, tags);
+    }
+
 } // anonymous namespace
 
 namespace paperbox {
@@ -193,13 +228,17 @@
 
     TrackerPhone::TrackerPhone() throw (std::runtime_error)
         :
-        tracker_connection_(0)
+        tracker_connection_(0),
+        bus_(0),
+        remote_kw_object_(0)
     {
         gboolean enable_warnings = TRUE;
         tracker_connection_ = tracker_connect(enable_warnings);
 
         if (! tracker_connection_)
             throw std::runtime_error("Unable to connect to Tracker daemon.");
+
+        connect_to_dbus_signals();
     }
 
     TrackerPhone::~TrackerPhone()
@@ -213,16 +252,16 @@
         return signal_documents_;
     }
 
-    TrackerPhone::SignalTagRequest&
-    TrackerPhone::signal_add_tags_request_completed()
+    TrackerPhone::SignalTags&
+    TrackerPhone::signal_tags_added()
     {
-        return signal_add_completed_;
+        return signal_tags_added_;
     }
 
-    TrackerPhone::SignalTagRequest&
-    TrackerPhone::signal_remove_tags_request_completed()
+    TrackerPhone::SignalTags&
+    TrackerPhone::signal_tags_removed()
     {
-        return signal_remove_completed_;
+        return signal_tags_removed_;
     }
 
     bool
@@ -237,6 +276,53 @@
     }
 
     void
+    TrackerPhone::connect_to_dbus_signals()
+    {
+        GError* error = 0;
+
+        // get a bus and proxy
+        bus_ = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+        if (!bus_) throw std::runtime_error("Couldn't connect to session bus.");
+  
+        remote_kw_object_ =
+            dbus_g_proxy_new_for_name (bus_,
+                                       "org.freedesktop.Tracker",
+                                       "/org/freedesktop/tracker",
+                                       "org.freedesktop.Tracker.Keywords");
+        if (! remote_kw_object_)
+            throw std::runtime_error("Failed to get a Tracker.Keywords proxy.");
+
+        // register a marshaller
+        dbus_g_object_register_marshaller(
+            TRACKER_PHONE__VOID__STRING_STRING_STRING,
+            G_TYPE_NONE,
+            G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
+
+        // tell DBus what the type signature is,
+        // for each of the signal callbacks
+        dbus_g_proxy_add_signal(remote_kw_object_,
+                                "KeywordAdded",
+                                G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+                                G_TYPE_INVALID);
+
+        dbus_g_proxy_add_signal(remote_kw_object_,
+                                "KeywordRemoved",
+                                G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+                                G_TYPE_INVALID);
+
+        // connect to signals
+        dbus_g_proxy_connect_signal(remote_kw_object_,
+                                    "KeywordAdded",
+                                    G_CALLBACK(on_tracker_keyword_added),
+                                    this, NULL);
+
+        dbus_g_proxy_connect_signal(remote_kw_object_,
+                                    "KeywordRemoved",
+                                    G_CALLBACK(on_tracker_keyword_removed),
+                                    this, NULL);
+    }
+
+    void
     TrackerPhone::request_all_documents()
     {
         int live_query_id = -1;

Modified: trunk/src/tracker-phone.hh
==============================================================================
--- trunk/src/tracker-phone.hh	(original)
+++ trunk/src/tracker-phone.hh	Fri Apr 25 14:56:42 2008
@@ -45,11 +45,13 @@
                              const std::queue<Glib::ustring>& >
         SignalDocuments;
 
+        // Tags can be added or removed after the application request
+        // or externally. success may be false only in the former case.
         typedef sigc::signal<void,
                              bool,                               // success
                              const Glib::ustring&,               // uri
                              const std::vector<Glib::ustring>& > // tags
-        SignalTagRequest;
+        SignalTags;
 
         explicit TrackerPhone() throw (std::runtime_error);
         virtual ~TrackerPhone();
@@ -69,11 +71,13 @@
 
         SignalDocuments& signal_documents_request_completed();
 
-        SignalTagRequest& signal_add_tags_request_completed();
+        SignalTags& signal_tags_added();
 
-        SignalTagRequest& signal_remove_tags_request_completed();
+        SignalTags& signal_tags_removed();
 
     protected:
+        void connect_to_dbus_signals();
+
         void prepare_document(const Glib::ustring& uri,
                               char** keys,
                               boost::shared_ptr<Document>& document);
@@ -81,10 +85,12 @@
         void attach_tags(boost::shared_ptr<Document>& document);
 
         TrackerClient* tracker_connection_;
+        DBusGConnection* bus_;
+        DBusGProxy* remote_kw_object_;
 
-        SignalDocuments  signal_documents_;
-        SignalTagRequest signal_add_completed_;
-        SignalTagRequest signal_remove_completed_;
+        SignalDocuments signal_documents_;
+        SignalTags signal_tags_added_;
+        SignalTags signal_tags_removed_;
     };
 
 } // namespace paperbox



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]