paperbox r127 - in trunk: . src



Author: markoa
Date: Wed Apr 23 22:50:13 2008
New Revision: 127
URL: http://svn.gnome.org/viewvc/paperbox?rev=127&view=rev

Log:
Towards all-async communication

Modified:
   trunk/ChangeLog
   trunk/src/browser.cc
   trunk/src/browser.hh
   trunk/src/tracker-phone.cc
   trunk/src/tracker-phone.hh

Modified: trunk/src/browser.cc
==============================================================================
--- trunk/src/browser.cc	(original)
+++ trunk/src/browser.cc	Wed Apr 23 22:50:13 2008
@@ -34,6 +34,7 @@
     using std::list;
     using std::vector;
     using boost::shared_ptr;
+    using Glib::ustring;
 
     ///
 
@@ -69,6 +70,9 @@
 
         tracker_client_->get_all_document_uris(uri_queue_);
 
+        tracker_client_->signal_add_tags_request_completed().connect(
+            sigc::mem_fun(*this, &Browser::on_add_tags_request_completed));
+
         Glib::signal_idle().connect(
             sigc::mem_fun(*this, &Browser::on_idle_initial_document_retrieval));
     }
@@ -134,13 +138,33 @@
         return signal_tags_changed_;
     }
 
-    // Does the validation work and forwards the add request to TrackerPhone
     void
-    Browser::add_tags(const Glib::ustring& uri,
-                      const std::vector<Glib::ustring>& tags)
+    Browser::on_add_tags_request_completed(bool status,
+                                           const ustring& uri,
+                                           const vector<ustring>& tags)
     {
-        using Glib::ustring;
+        doc_map::iterator doc_iter = docs_.find(uri.raw());
+        if (doc_iter == docs_.end() || tags.empty())
+            LOG_DD("Tags added for a non-existing document: " << uri);
+
+        shared_ptr<Document> doc = doc_iter->second;
+
+        // TODO: be properly status-aware
+        if (status) {
+            vector<ustring>::const_iterator it(tags.begin());
+            vector<ustring>::const_iterator end(tags.end());
 
+            for ( ; it != end; ++it) doc->add_tag(*it);
+
+            vector<ustring> tags_removed_none;
+            signal_tags_changed_.emit(uri, tags, tags_removed_none);
+        }
+    }
+
+    // Does the validation work and forwards the add request to TrackerPhone
+    void
+    Browser::add_tags(const ustring& uri, const vector<ustring>& tags)
+    {
         doc_map::iterator doc_iter = docs_.find(uri.raw());
 
         if (doc_iter == docs_.end() || tags.empty()) return;
@@ -160,21 +184,7 @@
 
         if (tags_copy.empty()) return;
 
-        try {
-            tracker_client_->add_tags(uri, tags_copy);
-
-            vector<ustring>::iterator it(tags_copy.begin());
-            vector<ustring>::iterator end(tags_copy.end());
-            for ( ; it != end; ++it)
-                doc->add_tag(*it);
-
-            vector<ustring> tags_removed; // none
-            signal_tags_changed_.emit(uri, tags_copy, tags_removed);
-        }
-        catch (const std::runtime_error& ex) {
-            LOG_EXCEPTION("Could not add tags for " << uri
-                          << ": " << ex.what());
-        }
+        tracker_client_->add_tags(uri, tags_copy);
     }
 
     // Does the validation work and forwards the remove request to TrackerPhone
@@ -182,8 +192,6 @@
     Browser::remove_tags(const Glib::ustring& uri,
                          const std::vector<Glib::ustring>& tags)
     {
-        using Glib::ustring;
-
         doc_map::iterator doc_iter = docs_.find(uri.raw());
 
         if (doc_iter == docs_.end() || tags.empty()) return;

Modified: trunk/src/browser.hh
==============================================================================
--- trunk/src/browser.hh	(original)
+++ trunk/src/browser.hh	Wed Apr 23 22:50:13 2008
@@ -95,6 +95,11 @@
 
         bool on_idle_initial_document_retrieval();
 
+        void on_add_tags_request_completed(
+            bool status,
+            const Glib::ustring& uri,
+            const std::vector<Glib::ustring>& tags);
+
         boost::shared_ptr<TrackerPhone> tracker_client_;
         std::queue<Glib::ustring> uri_queue_;
         doc_map docs_;

Modified: trunk/src/tracker-phone.cc
==============================================================================
--- trunk/src/tracker-phone.cc	(original)
+++ trunk/src/tracker-phone.cc	Wed Apr 23 22:50:13 2008
@@ -87,6 +87,52 @@
         return array;
     }
 
+    void
+    ustring_array_to_vector(char** carray, std::vector<Glib::ustring>& vec)
+    {
+        char** citer;
+        for (citer = carray; *citer; ++citer) {
+            Glib::ustring ustr(*citer);
+            vec.push_back(ustr);
+        }
+    }
+
+} // anonymous namespace
+
+namespace paperbox {
+
+    struct AsyncTagPack
+    {
+        TrackerPhone* phone;
+        Glib::ustring uri;
+        char** tags;
+    };
+
+} // namespace paperbox
+
+namespace {
+
+    void
+    tracker_add_reply(GError* error, paperbox::AsyncTagPack* pack)
+    {
+        bool success = true;
+
+        if (error) {
+            LOG_ERROR("Tracker add tags request failed: " << error->message);
+            g_clear_error(&error);
+            success = false;
+        }
+
+        std::vector<Glib::ustring> cpp_tags;
+        ustring_array_to_vector(pack->tags, cpp_tags);
+
+        pack->phone->signal_add_tags_request_completed().emit(
+            success, pack->uri, cpp_tags);
+
+        g_strfreev(pack->tags);
+        delete pack;
+    }
+
 } // anonymous namespace
 
 namespace paperbox {
@@ -110,6 +156,12 @@
         tracker_disconnect(tracker_connection_);
     }
 
+    TrackerPhone::SignalAddCompleted&
+    TrackerPhone::signal_add_tags_request_completed()
+    {
+        return signal_add_completed_;
+    }
+
     bool
     TrackerPhone::ping_tracker()
     {
@@ -279,22 +331,18 @@
     TrackerPhone::add_tags(const Glib::ustring& uri,
                            const vector<Glib::ustring> tags)
     {
-        GError* error = 0;
-
         char** ctags = ustring_vector_to_array(tags);
-
-        tracker_keywords_add (tracker_connection_,
-                              SERVICE_DOCUMENTS,
-                              uri.c_str(),
-                              ctags,
-                              &error);
-
-        g_strfreev (ctags);
-
-        if (error) {
-            LOG_ERROR("Ha! Adding tags failed: " << error->message);
-            throw std::runtime_error(error->message);
-        }
+        AsyncTagPack* data = new AsyncTagPack;
+        data->phone = this;
+        data->uri = uri;
+        data->tags = ctags;
+
+        tracker_keywords_add_async (tracker_connection_,
+                                    SERVICE_DOCUMENTS,
+                                    uri.c_str(),
+                                    ctags,
+                                    (TrackerVoidReply) tracker_add_reply,
+                                    data);
     }
 
     void

Modified: trunk/src/tracker-phone.hh
==============================================================================
--- trunk/src/tracker-phone.hh	(original)
+++ trunk/src/tracker-phone.hh	Wed Apr 23 22:50:13 2008
@@ -28,6 +28,7 @@
 #include <boost/noncopyable.hpp>
 #include <boost/shared_ptr.hpp>
 #include <glibmm/ustring.h>
+#include <sigc++/sigc++.h>
 #include <tracker.h>
 #include "document.hh"
 
@@ -39,6 +40,12 @@
     class TrackerPhone : private boost::noncopyable
     {
     public:
+        typedef sigc::signal<void,
+                             bool,                               // success
+                             const Glib::ustring&,               // uri
+                             const std::vector<Glib::ustring> >  // tags
+        SignalAddCompleted;
+
         explicit TrackerPhone() throw (std::runtime_error);
         virtual ~TrackerPhone();
 
@@ -52,6 +59,8 @@
         void add_tags(const Glib::ustring& uri,
                       const std::vector<Glib::ustring> tags);
 
+        SignalAddCompleted& signal_add_tags_request_completed();
+
         void remove_tags(const Glib::ustring& uri,
                          const std::vector<Glib::ustring> tags);
 
@@ -63,6 +72,8 @@
         void attach_tags(boost::shared_ptr<Document>& document);
 
         TrackerClient* tracker_connection_;
+
+        SignalAddCompleted signal_add_completed_;
     };
 
 } // namespace paperbox



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