[Libreoffice-commits] core.git: 3 commits - connectivity/source

Mathias Hasselmann mathias at openismus.com
Fri Mar 8 05:58:11 PST 2013


 connectivity/source/drivers/evoab2/EApi.cxx              |   57 +++++++++++----
 connectivity/source/drivers/evoab2/EApi.h                |    1 
 connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx |    8 --
 connectivity/source/drivers/evoab2/NResultSet.cxx        |   21 +++++
 4 files changed, 64 insertions(+), 23 deletions(-)

New commits:
commit b2983b4653339d83d3e98df4d44608f031dabe9f
Author: Mathias Hasselmann <mathias at openismus.com>
Date:   Fri Mar 8 11:47:10 2013 +0100

    evoab2: Follow API changes in EDS 3.8
    
    EDS 3.8 deprecates e_book_client_new() and replaces it with various
    e_book_client_connect() functions. This patch follows the change
    and enables direct read access for the addressbook. That means
    instead of receiving contacts via the D-Bus session bus, the
    connectivity driver now directly accesses the underlaying SQLite
    data base (for reading).
    
    This patch also shuffles code in EApiInit() slightly to avoid
    excessive if/else nesting.
    
    Change-Id: If41fb92eed2ea26bbf2d3125a9ba2250f142c5a2

diff --git a/connectivity/source/drivers/evoab2/EApi.cxx b/connectivity/source/drivers/evoab2/EApi.cxx
index 987510c..8b7b5cd 100644
--- a/connectivity/source/drivers/evoab2/EApi.cxx
+++ b/connectivity/source/drivers/evoab2/EApi.cxx
@@ -63,7 +63,7 @@ static ApiMap aCommonApiMap[] =
     SYM_MAP( e_book_query_field_exists )
 };
 
-//< 3-6 api
+//< 3.6 api
 static ApiMap aOldApiMap[] =
 {
     SYM_MAP( e_book_get_addressbooks ),
@@ -76,7 +76,7 @@ static ApiMap aOldApiMap[] =
     SYM_MAP( e_source_group_peek_sources )
 };
 
-//>= 3-6 api
+//>= 3.6 api
 static ApiMap aNewApiMap[] =
 {
     SYM_MAP( e_source_registry_list_sources ),
@@ -87,12 +87,24 @@ static ApiMap aNewApiMap[] =
     SYM_MAP( e_source_get_display_name ),
     SYM_MAP( e_source_get_uid ),
     SYM_MAP( e_source_registry_ref_source),
-    SYM_MAP( e_book_client_new ),
     SYM_MAP( e_client_open_sync ),
     SYM_MAP( e_client_get_source ),
     SYM_MAP( e_book_client_get_contacts_sync ),
     SYM_MAP( e_client_util_free_object_slist )
 };
+
+//== indirect read access (3.6 only)
+static ApiMap aClientApiMap36[] =
+{
+    SYM_MAP( e_book_client_new )
+};
+
+//>= direct read access API (>= 3.8)
+static ApiMap aClientApiMap38[] =
+{
+    SYM_MAP( e_book_client_connect_direct_sync )
+};
+
 #undef SYM_MAP
 
 template<size_t N> static bool
@@ -122,22 +134,33 @@ bool EApiInit()
         aModule = osl_loadModule( rtl::OUString::createFromAscii
                                   ( eBookLibNames[ j ] ).pData,
                                   SAL_LOADMODULE_DEFAULT );
-        if( aModule)
+
+        if( aModule == NULL)
+            continue;
+
+        if (tryLink( aModule, eBookLibNames[ j ], aCommonApiMap))
         {
-            if (tryLink( aModule, eBookLibNames[ j ], aCommonApiMap))
+            if (eds_check_version( 3, 6, 0 ) != NULL)
+            {
+                if (tryLink( aModule, eBookLibNames[ j ], aOldApiMap))
+                    return true;
+            }
+            else if (tryLink( aModule, eBookLibNames[ j ], aNewApiMap))
             {
-                if (eds_check_version(3, 6, 0) == NULL)
+                if (eds_check_version( 3, 7, 6 ) != NULL)
                 {
-                    if (tryLink( aModule, eBookLibNames[ j ], aNewApiMap))
+                    if (tryLink( aModule, eBookLibNames[ j ], aClientApiMap36))
                         return true;
                 }
-                else if (tryLink( aModule, eBookLibNames[ j ], aOldApiMap))
+                else
                 {
-                    return true;
+                    if (tryLink( aModule, eBookLibNames[ j ], aClientApiMap38))
+                        return true;
                 }
             }
-            osl_unloadModule( aModule );
         }
+
+        osl_unloadModule( aModule );
     }
     fprintf( stderr, "Can find no compliant libebook client libraries\n" );
     return false;
diff --git a/connectivity/source/drivers/evoab2/EApi.h b/connectivity/source/drivers/evoab2/EApi.h
index 8d188a9..59e2c3a 100644
--- a/connectivity/source/drivers/evoab2/EApi.h
+++ b/connectivity/source/drivers/evoab2/EApi.h
@@ -147,6 +147,7 @@ EAPI_EXTERN const gchar* (*eds_check_version) (guint required_major, guint requi
 EAPI_EXTERN const gchar* (*e_source_get_uid) (ESource *source);
 EAPI_EXTERN ESource* (*e_source_registry_ref_source) (ESourceRegistry *registry, const gchar *uid);
 EAPI_EXTERN EBookClient* (*e_book_client_new) (ESource *source, GError **error);
+EAPI_EXTERN EBookClient* (*e_book_client_connect_direct_sync) (ESourceRegistry *registry, ESource *source, GCancellable *cancellable, GError **error);
 EAPI_EXTERN gboolean (*e_client_open_sync) (EClient *client, gboolean only_if_exists, GCancellable *cancellable, GError **error);
 EAPI_EXTERN ESource* (*e_client_get_source) (EClient *client);
 EAPI_EXTERN gboolean (*e_book_client_get_contacts_sync) (EBookClient *client, const gchar *sexp, GSList **contacts, GCancellable *cancellable, GError **error);
diff --git a/connectivity/source/drivers/evoab2/NResultSet.cxx b/connectivity/source/drivers/evoab2/NResultSet.cxx
index 154db40..f3a5ca3 100644
--- a/connectivity/source/drivers/evoab2/NResultSet.cxx
+++ b/connectivity/source/drivers/evoab2/NResultSet.cxx
@@ -411,7 +411,7 @@ public:
             return NULL;
 
         ESource *pSource = e_source_registry_ref_source(get_e_source_registry(), id);
-        EBookClient *pBook = pSource ? e_book_client_new (pSource, NULL) : NULL;
+        EBookClient *pBook = pSource ? createClient (pSource) : NULL;
         if (pBook && !e_client_open_sync (pBook, TRUE, NULL, NULL))
         {
             g_object_unref (G_OBJECT (pBook));
@@ -479,6 +479,21 @@ public:
         m_pContacts = g_slist_sort_with_data( m_pContacts, &CompareContacts,
             const_cast< gpointer >( static_cast< gconstpointer >( &_rCompData ) ) );
     }
+
+protected:
+    virtual EBookClient * createClient( ESource *pSource )
+    {
+        return e_book_client_new (pSource, NULL);
+    }
+};
+
+class OEvoabVersion38Helper : public OEvoabVersion36Helper
+{
+protected:
+    virtual EBookClient * createClient( ESource *pSource )
+    {
+        return e_book_client_connect_direct_sync (get_e_source_registry (), pSource, NULL, NULL);
+    }
 };
 
 class OEvoabVersion35Helper : public OEvoabVersionHelper
@@ -614,7 +629,9 @@ OEvoabResultSet::OEvoabResultSet( OCommonStatement* pStmt, OEvoabConnection *pCo
     ,m_nIndex(-1)
     ,m_nLength(0)
 {
-    if (eds_check_version(3, 6, 0) == NULL)
+    if (eds_check_version( 3, 7, 6 ) == NULL)
+        m_pVersionHelper  = new OEvoabVersion38Helper;
+    else if (eds_check_version( 3, 6, 0 ) == NULL)
         m_pVersionHelper  = new OEvoabVersion36Helper;
     else
         m_pVersionHelper  = new OEvoabVersion35Helper;
commit c20518286c5599a3a649f06450838490382f93fc
Author: Mathias Hasselmann <mathias at openismus.com>
Date:   Fri Mar 8 13:03:12 2013 +0100

    evoab2: Move get_e_source_registry() to EApi.cxx
    
    get_e_source_registry() was declared in EApi.hxx, but defined in
    NDatabaseMetaData.cxx. This doesn't seem right, the header file
    and the purpose of the function indicate that it belongs into
    EApi.cxx.
    
    Change-Id: Iea3f11a901398aa3f467b96fbe8778c403887bcb

diff --git a/connectivity/source/drivers/evoab2/EApi.cxx b/connectivity/source/drivers/evoab2/EApi.cxx
index 8e0d0db..987510c 100644
--- a/connectivity/source/drivers/evoab2/EApi.cxx
+++ b/connectivity/source/drivers/evoab2/EApi.cxx
@@ -143,4 +143,12 @@ bool EApiInit()
     return false;
 }
 
+ESourceRegistry *get_e_source_registry()
+{
+    static ESourceRegistry *theInstance;
+    if (!theInstance)
+        theInstance = e_source_registry_new_sync(NULL, NULL);
+    return theInstance;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx b/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx
index bfe9f01..a214bd1 100644
--- a/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx
+++ b/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx
@@ -1086,14 +1086,6 @@ Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getColumns(
     return xResultSet;
 }
 
-ESourceRegistry *get_e_source_registry()
-{
-    static ESourceRegistry *theInstance;
-    if (!theInstance)
-        theInstance = e_source_registry_new_sync(NULL, NULL);
-    return theInstance;
-}
-
 // -------------------------------------------------------------------------
 bool isSourceBackend(ESource *pSource, const char *backendname)
 {
commit e3645fad6b2ea48851bcf6fdfb895ced74a6d8cb
Author: Mathias Hasselmann <mathias at openismus.com>
Date:   Fri Mar 8 11:14:09 2013 +0100

    evoab2: Avoid G_N_ELEMENTS when loading symbols
    
    With G_N_ELEMENTS() the array name has to be twice, which can cause
    hard to spot typos in code derived from copy-and-paste, as we have
    here in the module loader. C++ can avoid the duplication by using
    the proper templates.
    
    Change-Id: I485e28a92e74b7e24f4a59cced6e5635f3a53a38

diff --git a/connectivity/source/drivers/evoab2/EApi.cxx b/connectivity/source/drivers/evoab2/EApi.cxx
index 608b1f9..8e0d0db 100644
--- a/connectivity/source/drivers/evoab2/EApi.cxx
+++ b/connectivity/source/drivers/evoab2/EApi.cxx
@@ -95,10 +95,10 @@ static ApiMap aNewApiMap[] =
 };
 #undef SYM_MAP
 
-static bool
-tryLink( oslModule &aModule, const char *pName, ApiMap *pMap, guint nEntries )
+template<size_t N> static bool
+tryLink( oslModule &aModule, const char *pName, const ApiMap (&pMap)[N])
 {
-    for (guint i = 0; i < nEntries; ++i)
+    for (guint i = 0; i < N; ++i)
     {
         SymbolFunc aMethod = (SymbolFunc)osl_getFunctionSymbol
             (aModule, OUString::createFromAscii ( pMap[ i ].sym_name ).pData);
@@ -124,14 +124,14 @@ bool EApiInit()
                                   SAL_LOADMODULE_DEFAULT );
         if( aModule)
         {
-            if (tryLink( aModule, eBookLibNames[ j ], aCommonApiMap, G_N_ELEMENTS(aCommonApiMap)))
+            if (tryLink( aModule, eBookLibNames[ j ], aCommonApiMap))
             {
                 if (eds_check_version(3, 6, 0) == NULL)
                 {
-                    if (tryLink( aModule, eBookLibNames[ j ], aNewApiMap, G_N_ELEMENTS(aNewApiMap)))
+                    if (tryLink( aModule, eBookLibNames[ j ], aNewApiMap))
                         return true;
                 }
-                else if (tryLink( aModule, eBookLibNames[ j ], aOldApiMap, G_N_ELEMENTS(aOldApiMap)))
+                else if (tryLink( aModule, eBookLibNames[ j ], aOldApiMap))
                 {
                     return true;
                 }


More information about the Libreoffice-commits mailing list