From: Mikel Astiz <[email protected]>

This new backend represents a phonebook accessible using the Bluetooth
PBAP profile.
---
 src/backends/pbap/PbapSyncSource.cpp         |  119 +++++++++++++++++++++
 src/backends/pbap/PbapSyncSource.h           |   62 +++++++++++
 src/backends/pbap/PbapSyncSourceRegister.cpp |  143 ++++++++++++++++++++++++++
 src/backends/pbap/configure-sub.in           |   36 +++++++
 src/backends/pbap/pbap.am                    |   29 +++++
 5 files changed, 389 insertions(+), 0 deletions(-)
 create mode 100644 src/backends/pbap/PbapSyncSource.cpp
 create mode 100644 src/backends/pbap/PbapSyncSource.h
 create mode 100644 src/backends/pbap/PbapSyncSourceRegister.cpp
 create mode 100644 src/backends/pbap/configure-sub.in
 create mode 100644 src/backends/pbap/pbap.am

diff --git a/src/backends/pbap/PbapSyncSource.cpp 
b/src/backends/pbap/PbapSyncSource.cpp
new file mode 100644
index 0000000..d2e689d
--- /dev/null
+++ b/src/backends/pbap/PbapSyncSource.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2007-2009 Patrick Ohly <[email protected]>
+ * Copyright (C) 2009 Intel Corporation
+ * Copyright (C) 2012 BMW Car IT GmbH. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301  USA
+ */
+
+#include "config.h"
+
+#ifdef ENABLE_PBAP
+
+#include "PbapSyncSource.h"
+
+// SyncEvolution includes a copy of Boost header files.
+// They are safe to use without creating additional
+// build dependencies. boost::filesystem requires a
+// library and therefore is avoided here. Some
+// utility functions from SyncEvolution are used
+// instead, plus standard C/Posix functions.
+#include <boost/algorithm/string/case_conv.hpp>
+#include <boost/tokenizer.hpp>
+
+#include <errno.h>
+#include <unistd.h>
+
+#include <syncevo/util.h>
+
+#include "src/gdbusxx/gdbus-cxx-bridge.h"
+
+#include <boost/algorithm/string/predicate.hpp>
+
+#include <syncevo/SyncContext.h>
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+PbapSyncSource::PbapSyncSource(const SyncSourceParams &params) :
+    TrackingSyncSource(params)
+{
+}
+
+std::string PbapSyncSource::getMimeType() const
+{
+    return "text/x-vcard";
+}
+
+std::string PbapSyncSource::getMimeVersion() const
+{
+    return "2.1";
+}
+
+void PbapSyncSource::open()
+{
+    const string &database = getDatabaseID();
+    const string prefix("obex-bt://");
+
+    if (!boost::starts_with(database, prefix)) {
+        throwError("database should specifiy device address 
(obex-bt://<bt-addr>)");
+    }
+
+    std::string address = database.substr(prefix.size());
+}
+
+bool PbapSyncSource::isEmpty()
+{
+    return true;
+}
+
+void PbapSyncSource::close()
+{
+}
+
+PbapSyncSource::Databases PbapSyncSource::getDatabases()
+{
+    Databases result;
+
+    result.push_back(Database("select database via bluetooth address",
+                              "[obex-bt://]<bt-addr>"));
+    return result;
+}
+
+void PbapSyncSource::listAllItems(RevisionMap_t &revisions)
+{
+}
+
+void PbapSyncSource::readItem(const string &uid, std::string &item, bool raw)
+{
+}
+
+TrackingSyncSource::InsertItemResult PbapSyncSource::insertItem(const string 
&uid, const std::string &item, bool raw)
+{
+    throw std::runtime_error("Operation not supported");
+}
+
+void PbapSyncSource::removeItem(const string &uid)
+{
+    throw std::runtime_error("Operation not supported");
+}
+
+SE_END_CXX
+
+#endif /* ENABLE_PBAP */
+
+#ifdef ENABLE_MODULES
+# include "PbapSyncSourceRegister.cpp"
+#endif
diff --git a/src/backends/pbap/PbapSyncSource.h 
b/src/backends/pbap/PbapSyncSource.h
new file mode 100644
index 0000000..7074b5d
--- /dev/null
+++ b/src/backends/pbap/PbapSyncSource.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2007-2009 Patrick Ohly <[email protected]>
+ * Copyright (C) 2012 BMW Car IT GmbH. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301  USA
+ */
+
+#ifndef INCL_PBAPSYNCSOURCE
+#define INCL_PBAPSYNCSOURCE
+
+#include <syncevo/TrackingSyncSource.h>
+
+#ifdef ENABLE_PBAP
+
+#include <memory>
+#include <boost/noncopyable.hpp>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+class PbapSyncSource : public TrackingSyncSource, private boost::noncopyable
+{
+  public:
+    PbapSyncSource(const SyncSourceParams &params);
+
+
+ protected:
+    /* implementation of SyncSource interface */
+    virtual void open();
+    virtual bool isEmpty();
+    virtual void close();
+    virtual Databases getDatabases();
+    virtual std::string getMimeType() const;
+    virtual std::string getMimeVersion() const;
+
+    /* implementation of TrackingSyncSource interface */
+    virtual void listAllItems(RevisionMap_t &revisions);
+    //virtual InsertItemResult insertItem(const string &luid, const 
std::string &item, bool raw);
+    virtual InsertItemResult insertItem(const string &luid, const std::string 
&item, bool raw);
+    void readItem(const std::string &luid, std::string &item, bool raw);
+    virtual void removeItem(const string &uid);
+
+ private:
+};
+
+SE_END_CXX
+
+#endif // ENABLE_PBAP
+#endif // INCL_PBAPSYNCSOURCE
diff --git a/src/backends/pbap/PbapSyncSourceRegister.cpp 
b/src/backends/pbap/PbapSyncSourceRegister.cpp
new file mode 100644
index 0000000..67c1505
--- /dev/null
+++ b/src/backends/pbap/PbapSyncSourceRegister.cpp
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <[email protected]>
+ * Copyright (C) 2009 Intel Corporation
+ * Copyright (C) 2012 BMW Car IT GmbH. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301  USA
+ */
+
+#include "PbapSyncSource.h"
+#include "test.h"
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+static SyncSource *createSource(const SyncSourceParams &params)
+{
+    SE_LOG_DEBUG(NULL, NULL, "---> PBAP::createSource()");
+
+    SourceType sourceType = SyncSource::getSourceType(params.m_nodes);
+    // The string returned by getSourceType() is always the one
+    // registered as main Aliases() below.
+    bool isMe = sourceType.m_backend == "PBAP Address Book";
+
+#ifndef ENABLE_PBAP
+    // tell SyncEvolution if the user wanted to use a disabled sync source,
+    // otherwise let it continue searching
+    return isMe ? RegisterSyncSource::InactiveSource : NULL;
+#else
+    // Also recognize one of the standard types?
+    // Not in the PbapSyncSource!
+    bool maybeMe = false /* sourceType.m_backend == "addressbook" */;
+
+    if (isMe || maybeMe) {
+        return new PbapSyncSource(params);
+    }
+    return NULL;
+#endif
+}
+
+static RegisterSyncSource registerMe("One-way sync using PBAP",
+#ifdef ENABLE_PBAP
+                                     true,
+#else
+                                     false,
+#endif
+                                     createSource,
+                                     "One-way sync using PBAP = pbap\n"
+                                     "   Requests phonebook entries using PBAP 
profile, and thus\n"
+                                     "   supporting read-only operations.\n"
+                                     "   The BT address is selected via 
database=obex-bt://<bt-addr>.\n",
+                                     Values() +
+                                     (Aliases("PBAP Address Book") + "pbap"));
+
+#ifdef ENABLE_PBAP
+
+// The anonymous namespace ensures that we don't get
+// name clashes: although the classes and objects are
+// only defined in this file, the methods generated
+// for local classes will clash with other methods
+// of other classes with the same name if no namespace
+// is used.
+//
+// The code above is not yet inside the anonymous
+// name space because it would show up inside
+// the CPPUnit unit test names. Use a unique class
+// name there.
+namespace {
+#if 0
+}
+#endif
+
+static class VCard30Test : public RegisterSyncSourceTest {
+public:
+    VCard30Test() : RegisterSyncSourceTest("file_contact", "eds_contact") {}
+
+    virtual void updateConfig(ClientTestConfig &config) const
+    {
+        config.m_type = "file:text/vcard:3.0";
+    }
+} VCard30Test;
+
+static class ICal20Test : public RegisterSyncSourceTest {
+public:
+    ICal20Test() : RegisterSyncSourceTest("file_event", "eds_event") {}
+
+    virtual void updateConfig(ClientTestConfig &config) const
+    {
+        config.m_type = "file:text/calendar:2.0";
+
+        // A sync source which supports linked items (= recurring
+        // event with detached exception) is expected to handle
+        // inserting the parent or child twice by turning the
+        // second operation into an update. The file backend is
+        // to dumb for that and therefore fails these tests:
+        //
+        // Client::Source::file_event::testLinkedItemsInsertParentTwice
+        // Client::Source::file_event::testLinkedItemsInsertChildTwice
+        //
+        // Disable linked item testing to avoid this.
+        config.m_sourceKnowsItemSemantic = false;
+    }
+} ICal20Test;
+
+static class ITodo20Test : public RegisterSyncSourceTest {
+public:
+    ITodo20Test() : RegisterSyncSourceTest("file_task", "eds_task") {}
+
+    virtual void updateConfig(ClientTestConfig &config) const
+    {
+        config.m_type = "file:text/calendar:2.0";
+    }
+} ITodo20Test;
+
+static class SuperTest : public RegisterSyncSourceTest {
+public:
+    SuperTest() : RegisterSyncSourceTest("file_calendar+todo", 
"calendar+todo") {}
+
+    virtual void updateConfig(ClientTestConfig &config) const
+    {
+        config.m_type = "virtual:text/x-vcalendar";
+        config.m_subConfigs = "file_event,file_task";
+    }
+
+} superTest;
+
+}
+
+#endif // ENABLE_PBAP
+
+SE_END_CXX
diff --git a/src/backends/pbap/configure-sub.in 
b/src/backends/pbap/configure-sub.in
new file mode 100644
index 0000000..d0ca1f8
--- /dev/null
+++ b/src/backends/pbap/configure-sub.in
@@ -0,0 +1,36 @@
+dnl -*- mode: Autoconf; -*-
+dnl Invoke autogen.sh to produce a configure script.
+
+dnl Checks for required libraris can go here; none required for simple files.
+dnl
+dnl This is from the sqlite backend:
+dnl PKG_CHECK_MODULES(SQLITE, sqlite3, SQLITEFOUND=yes, [SQLITEFOUND=no])
+dnl AC_SUBST(SQLITE_CFLAGS)
+dnl AC_SUBST(SQLITE_LIBS)
+
+PBAP_CFLAGS=
+PBAP_LIBS=
+AC_SUBST(PBAP_CFLAGS)
+AC_SUBST(BAP_LIBS)
+
+dnl If additional compile flags are necessary to include the header
+dnl files of the backend, then add them here.
+BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $PBAP_CFLAGS"
+
+dnl name of backend library (there could be more than one per directory),
+dnl name of the directory,
+dnl help string,
+dnl --enable/disable chosen explicitly
+dnl default, may depend on availability of prerequisites in more complex 
backends
+SE_ARG_ENABLE_BACKEND(pbap,
+                      pbap,
+                      [AS_HELP_STRING([--disable-pbap],
+                                      [disable pbap-based backend which 
provides one-way synchronization (default on)])],
+                      [enable_pbap="$enableval"],
+                      [enable_pbap="yes"]
+                     )
+
+if test "$enable_pbap" = "yes"; then
+        dnl It's good to check the prerequisites here, in case --enable-pbap 
was used.
+        AC_DEFINE(ENABLE_PBAP, 1, [pbap available])
+fi
diff --git a/src/backends/pbap/pbap.am b/src/backends/pbap/pbap.am
new file mode 100644
index 0000000..15b07e2
--- /dev/null
+++ b/src/backends/pbap/pbap.am
@@ -0,0 +1,29 @@
+dist_noinst_DATA += src/backends/pbap/configure-sub.in
+
+src_backends_pbap_lib = src/backends/pbap/syncpbap.la
+MOSTLYCLEANFILES += $(src_backends_pbap_lib)
+if ENABLE_MODULES
+src_backends_pbap_backenddir = $(BACKENDS_DIRECTORY)
+src_backends_pbap_backend_LTLIBRARIES = $(src_backends_pbap_lib)
+else
+noinst_LTLIBRARIES += $(src_backends_pbap_lib)
+endif
+
+src_backends_pbap_src = \
+  src/backends/pbap/PbapSyncSource.h \
+  src/backends/pbap/PbapSyncSource.cpp
+
+src_backends_pbap_syncpbap_la_SOURCES = $(src_backends_pbap_src)
+src_backends_pbap_syncpbap_la_LIBADD = $(PBAP_LIBS) $(SYNCEVOLUTION_LIBS)
+src_backends_pbap_syncpbap_la_LDFLAGS = -module -avoid-version
+src_backends_pbap_syncpbap_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) 
$(SYNCEVO_WFLAGS)
+src_backends_pbap_syncpbap_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) 
-I$(top_srcdir)/test $(BACKEND_CPPFLAGS)
+src_backends_pbap_syncpbap_la_DEPENDENCIES = $(SYNCEVOLUTION_LIBS)
+
+# If you need special test cases for your sync source, then
+# install them here. Here's how the sqlite backend does that:
+#
+#../../testcases/sqlite_vcard21.vcf: 
$(FUNAMBOL_SUBDIR)/test/test/testcases/vcard21.vcf
+#      mkdir -p ${@D}
+#      perl -e '$$_ = join("", <>); s/^(ADR|TEL|EMAIL|PHOTO).*?(?=^\S)//msg; 
s/;X-EVOLUTION-UI-SLOT=\d+//g; print;' $< >$@
+#all: ../../testcases/sqlite_vcard21.vcf
-- 
1.7.6.5

_______________________________________________
SyncEvolution mailing list
[email protected]
http://lists.syncevolution.org/listinfo/syncevolution

Reply via email to