paperbox r127 - in trunk: . src
- From: markoa svn gnome org
- To: svn-commits-list gnome org
- Subject: paperbox r127 - in trunk: . src
- Date: Wed, 23 Apr 2008 23:50:14 +0100 (BST)
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]