Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:yukoff:openSUSE:Leap:42.1:Backports
modem-manager-gui
modem-manager-gui-0.0.17.1-fix-libebook-api-bre...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File modem-manager-gui-0.0.17.1-fix-libebook-api-break.patch of Package modem-manager-gui
diff -rupN modem-manager-gui-0.0.17.1.old/src/addressbooks.c modem-manager-gui-0.0.17.1/src/addressbooks.c --- modem-manager-gui-0.0.17.1.old/src/addressbooks.c 2014-08-28 15:04:24.000000000 +0400 +++ modem-manager-gui-0.0.17.1/src/addressbooks.c 2015-04-25 21:10:05.137967000 +0300 @@ -36,6 +36,8 @@ #include "vcard.h" #include "addressbooks.h" +#define MMGUI_ADDRESSBOOKS_GNOME_CONNECT_TIMEOUT 15 + #define MMGUI_ADDRESSBOOKS_AKONADI_LINK_PATH "%s/.local/share/akonadi/socket-localhost" #define MMGUI_ADDRESSBOOKS_AKONADI_SOCKET_PATH "%s/akonadiserver.socket" #define MMGUI_ADDRESSBOOKS_AKONADI_DBUS_INTERFACE "org.freedesktop.Akonadi.Control" @@ -78,7 +80,6 @@ struct _mmgui_addressbooks_akonadi_colle typedef struct _mmgui_addressbooks_akonadi_collection *mmgui_addressbooks_akonadi_collection_t; - //KDE (Akonadi) static gboolean mmgui_addressbooks_session_service_activate(gchar *interface, guint *status); static gint mmgui_addressbooks_open_kde_socket(void); @@ -871,14 +872,25 @@ static gboolean mmgui_addressbooks_get_g addressbooks->gnomesourcename = ""; } - if (addressbooks->e_book_client_connect_sync != NULL) { - /*Version 3.8*/ - client = (EBookClient *)(addressbooks->e_book_client_connect_sync)(source, NULL, &error); - if (client == NULL) { - (addressbooks->e_book_query_unref)(query); - g_debug("Failed to get EBookClient: %s\n", error->message); - g_error_free(error); - return FALSE; + if ((addressbooks->e_book_client_connect_sync != NULL) || (addressbooks->e_book_client_connect_sync316 != NULL)) { + if (addressbooks->gnomelibversion >= 16) { + /*Version 3.16 ...*/ + client = (EBookClient *)(addressbooks->e_book_client_connect_sync316)(source, MMGUI_ADDRESSBOOKS_GNOME_CONNECT_TIMEOUT, NULL, &error); + if (client == NULL) { + (addressbooks->e_book_query_unref)(query); + g_debug("Failed to get EBookClient: %s\n", error->message); + g_error_free(error); + return FALSE; + } + } else { + /*Version 3.8 ... 3.16*/ + client = (EBookClient *)(addressbooks->e_book_client_connect_sync)(source, NULL, &error); + if (client == NULL) { + (addressbooks->e_book_query_unref)(query); + g_debug("Failed to get EBookClient: %s\n", error->message); + g_error_free(error); + return FALSE; + } } } else { /*Versions 3.2 ... 3.6*/ @@ -889,7 +901,7 @@ static gboolean mmgui_addressbooks_get_g g_error_free(error); return FALSE; } - + if (!(addressbooks->e_client_open_sync)((EClient *)client, TRUE, NULL, &error)) { (addressbooks->e_book_query_unref)(query); g_debug("Failed to open EBookClient: %s\n", error->message); @@ -941,6 +953,7 @@ static gboolean mmgui_addressbooks_get_g mmgui_addressbooks_t mmgui_addressbooks_new(mmgui_libpaths_cache_t libcache) { mmgui_addressbooks_t addressbooks; + gpointer *connectfunc; gboolean libopened; guint akonadistatus; @@ -953,6 +966,7 @@ mmgui_addressbooks_t mmgui_addressbooks_ /*Open module*/ addressbooks->ebookmodule = g_module_open(mmgui_libpaths_cache_get_library_name(libcache, "libebook-1.2"), G_MODULE_BIND_LAZY); + addressbooks->gnomelibversion = mmgui_libpaths_cache_get_library_major_version(libcache, "libebook-1.2"); if (addressbooks->ebookmodule != NULL) { libopened = TRUE; @@ -974,7 +988,13 @@ mmgui_addressbooks_t mmgui_addressbooks_ addressbooks->e_book_query_to_string = NULL; addressbooks->e_book_client_get_contacts_sync = NULL; } else { - if (!g_module_symbol(addressbooks->ebookmodule, "e_book_client_connect_sync", (gpointer *)&(addressbooks->e_book_client_connect_sync))) { + /*API was broken in version 3.16*/ + if (addressbooks->gnomelibversion >= 16) { + connectfunc = (gpointer *)&(addressbooks->e_book_client_connect_sync316); + } else { + connectfunc = (gpointer *)&(addressbooks->e_book_client_connect_sync); + } + if (!g_module_symbol(addressbooks->ebookmodule, "e_book_client_connect_sync", connectfunc)) { /*Since version 3.2 used these functions, but in 3.8 they are deprecated*/ libopened = libopened && g_module_symbol(addressbooks->ebookmodule, "e_book_client_new", (gpointer *)&(addressbooks->e_book_client_new)); libopened = libopened && g_module_symbol(addressbooks->ebookmodule, "e_client_open_sync", (gpointer *)&(addressbooks->e_client_open_sync)); diff -rupN modem-manager-gui-0.0.17.1.old/src/addressbooks.h modem-manager-gui-0.0.17.1/src/addressbooks.h --- modem-manager-gui-0.0.17.1.old/src/addressbooks.h 2014-08-28 00:24:41.000000000 +0400 +++ modem-manager-gui-0.0.17.1/src/addressbooks.h 2015-04-25 21:00:50.449376000 +0300 @@ -247,6 +247,7 @@ typedef const gchar *(*e_source_get_disp typedef EBookClient *(*e_book_client_new_func)(ESource *source, GError **error); typedef gboolean (*e_client_open_sync_func)(EClient *client, gboolean only_if_exists, gpointer cancellable, GError **error); typedef EClient *(*e_book_client_connect_sync_func)(ESource *source, gpointer cancellable, GError **error); +typedef EClient *(*e_book_client_connect_sync316_func)(ESource *source, guint32 wait_for_connected_seconds, gpointer cancellable, GError **error); typedef gchar *(*e_book_query_to_string_func)(EBookQuery *q); typedef gboolean (*e_book_client_get_contacts_sync_func)(EBookClient *client, const gchar *sexp, GSList **out_contacts, gpointer cancellable, GError **error); typedef EBook *(*e_book_new_system_addressbook_func)(GError **error); @@ -269,6 +270,7 @@ struct _mmgui_addressbooks { e_book_client_new_func e_book_client_new; e_client_open_sync_func e_client_open_sync; e_book_client_connect_sync_func e_book_client_connect_sync; + e_book_client_connect_sync316_func e_book_client_connect_sync316; e_book_query_to_string_func e_book_query_to_string; e_book_client_get_contacts_sync_func e_book_client_get_contacts_sync; e_book_new_system_addressbook_func e_book_new_system_addressbook; @@ -280,6 +282,7 @@ struct _mmgui_addressbooks { e_contact_get_func e_contact_get; //GNOME stuff gboolean gnomesupported; + gint gnomelibversion; GSList *gnomecontacts; const gchar *gnomesourcename; //Akonadi access data diff -rupN modem-manager-gui-0.0.17.1.old/src/libpaths.c modem-manager-gui-0.0.17.1/src/libpaths.c --- modem-manager-gui-0.0.17.1.old/src/libpaths.c 2014-01-05 18:23:44.000000000 +0400 +++ modem-manager-gui-0.0.17.1/src/libpaths.c 2015-04-25 20:40:08.544962000 +0300 @@ -32,6 +32,7 @@ #define MMGUI_LIBPATHS_CACHE_FILE "/etc/ld.so.cache" #define MMGUI_LIBPATHS_CACHE_SOEXT ".so" +#define MMGUI_LIBPATHS_CACHE_SOEXT_LEN 3 #define MMGUI_LIBPATHS_CACHE_LIB_TEMP "/usr/lib/%s.so" #define MMGUI_LIBPATHS_CACHE_PATH_TEMP "/usr/lib/%s.so" /*Cache file*/ @@ -39,17 +40,21 @@ #define MMGUI_LIBPATHS_LOCAL_CACHE_DIR "modem-manager-gui" #define MMGUI_LIBPATHS_LOCAL_CACHE_FILE "libpaths.conf" #define MMGUI_LIBPATHS_LOCAL_CACHE_PERM 0755 +#define MMGUI_LIBPATHS_LOCAL_CACHE_VER 2 /*Cache file sections*/ #define MMGUI_LIBPATHS_FILE_ROOT_SECTION "cache" #define MMGUI_LIBPATHS_FILE_TIMESTAMP "timestamp" +#define MMGUI_LIBPATHS_FILE_VERSION "version" #define MMGUI_LIBPATHS_FILE_NAME "name" #define MMGUI_LIBPATHS_FILE_PATH "path" +#define MMGUI_LIBPATHS_FILE_MAJORVER "majorver" struct _mmgui_libpaths_entry { gchar *id; gchar *libname; gchar *libpath; + gint majorver; }; typedef struct _mmgui_libpaths_entry *mmgui_libpaths_entry_t; @@ -60,6 +65,7 @@ static gboolean mmgui_libpaths_cache_ope const gchar *homepath; gchar *confpath; guint64 localtimestamp; + gint filever; GError *error; if (libcache == NULL) return FALSE; @@ -95,11 +101,28 @@ static gboolean mmgui_libpaths_cache_ope localtimestamp = g_key_file_get_uint64(libcache->localkeyfile, MMGUI_LIBPATHS_FILE_ROOT_SECTION, MMGUI_LIBPATHS_FILE_TIMESTAMP, &error); if (error == NULL) { if (localtimestamp == dbtimestamp) { - libcache->updatelocal = FALSE; + /*Timestamp is up to date - check version*/ + filever = g_key_file_get_integer(libcache->localkeyfile, MMGUI_LIBPATHS_FILE_ROOT_SECTION, MMGUI_LIBPATHS_FILE_VERSION, &error); + if (error == NULL) { + if (filever >= MMGUI_LIBPATHS_LOCAL_CACHE_VER) { + /*Acceptable version of file*/ + libcache->updatelocal = FALSE; + } else { + /*Old version of file*/ + libcache->updatelocal = TRUE; + } + } else { + /*Unknown version of file*/ + libcache->updatelocal = TRUE; + g_debug("Local cache contain unreadable version identifier: %s", error->message); + g_error_free(error); + } } else { + /*Wrong timestamp*/ libcache->updatelocal = TRUE; } } else { + /*Unknown timestamp*/ libcache->updatelocal = TRUE; g_debug("Local cache contain unreadable timestamp: %s", error->message); g_error_free(error); @@ -126,6 +149,8 @@ static gboolean mmgui_libpaths_cache_clo if (update) { /*Save timestamp*/ g_key_file_set_int64(libcache->localkeyfile, MMGUI_LIBPATHS_FILE_ROOT_SECTION, MMGUI_LIBPATHS_FILE_TIMESTAMP, (gint64)libcache->modtime); + /*Save version of file*/ + g_key_file_set_integer(libcache->localkeyfile, MMGUI_LIBPATHS_FILE_ROOT_SECTION, MMGUI_LIBPATHS_FILE_VERSION, MMGUI_LIBPATHS_LOCAL_CACHE_VER); /*Write to file*/ error = NULL; filedata = g_key_file_to_data(libcache->localkeyfile, &datasize, &error); @@ -158,6 +183,8 @@ static gboolean mmgui_libpaths_cache_add if (cachedlib->libpath != NULL) { g_key_file_set_string(libcache->localkeyfile, cachedlib->id, MMGUI_LIBPATHS_FILE_PATH, cachedlib->libpath); } + /*Library major version*/ + g_key_file_set_integer(libcache->localkeyfile, cachedlib->id, MMGUI_LIBPATHS_FILE_MAJORVER, cachedlib->majorver); } } @@ -183,8 +210,10 @@ static gboolean mmgui_libpaths_cache_get } } else { cachedlib->libname = NULL; - g_debug("Local cache does not contain library name: %s", error->message); - g_error_free(error); + if (error != NULL) { + g_debug("Local cache does not contain library name: %s", error->message); + g_error_free(error); + } } /*Library path*/ error = NULL; @@ -197,8 +226,26 @@ static gboolean mmgui_libpaths_cache_get } } else { cachedlib->libpath = NULL; - g_debug("Local cache does not contain library path: %s", error->message); - g_error_free(error); + if (error != NULL) { + g_debug("Local cache does not contain library path: %s", error->message); + g_error_free(error); + } + } + /*Library major version*/ + error = NULL; + if (g_key_file_has_key(libcache->localkeyfile, cachedlib->id, MMGUI_LIBPATHS_FILE_MAJORVER, &error)) { + error = NULL; + cachedlib->majorver = g_key_file_get_integer(libcache->localkeyfile, cachedlib->id, MMGUI_LIBPATHS_FILE_MAJORVER, &error); + if (error != NULL) { + g_debug("Local cache contain unreadable library major version: %s", error->message); + g_error_free(error); + } + } else { + cachedlib->majorver = 0; + if (error != NULL) { + g_debug("Local cache does not contain library major version: %s", error->message); + g_error_free(error); + } } } } @@ -223,6 +270,7 @@ static void mmgui_libpaths_cache_destroy if (cachedlib->libpath != NULL) { g_free(cachedlib->libpath); } + cachedlib->majorver = 0; g_free(cachedlib); } @@ -232,6 +280,12 @@ static gboolean mmgui_libpaths_cache_get gchar *libext, *libid; guint pathlen, sym, lnsym, lilen, lnlen; gboolean res; + gchar *majorverstart, *majorverend; + gsize fragmentlen; + gint i, d; + guint mult; + gchar curdigit; + gchar digits[2][10] = {{'0','1','2','3','4','5','6','7','8','9'}, {0,1,2,3,4,5,6,7,8,9}}; if ((libcache == NULL) || (libpath == NULL)) return FALSE; @@ -281,6 +335,42 @@ static gboolean mmgui_libpaths_cache_get mmgui_libpaths_cache_add_to_local_cache_file(libcache, cachedlib); g_debug("Library path: %s (%s)\n", cachedlib->libpath, libid); } + + cachedlib->majorver = 0; + + if ((libext[MMGUI_LIBPATHS_CACHE_SOEXT_LEN] == '.') && (libext[MMGUI_LIBPATHS_CACHE_SOEXT_LEN+1] != '\0')) { + majorverstart = libext + MMGUI_LIBPATHS_CACHE_SOEXT_LEN + 1; + majorverend = strchr(majorverstart, '.'); + if (majorverend != NULL) { + fragmentlen = majorverend - majorverstart; + } else { + fragmentlen = strlen(libext) - (MMGUI_LIBPATHS_CACHE_SOEXT_LEN + 1); + } + + if (fragmentlen > 0) { + mult = 1; + for (i=fragmentlen-1; i>=0; i--) { + /*Seqrch for digit*/ + curdigit = -1; + for (d=0; d<10; d++) { + if (digits[0][d] == majorverstart[i]) { + curdigit = digits[1][d]; + break; + } + } + /*Add digit*/ + if (curdigit != -1) { + cachedlib->majorver += mult * curdigit; + mult *= 10; + } else { + cachedlib->majorver = 0; + break; + } + } + mmgui_libpaths_cache_add_to_local_cache_file(libcache, cachedlib); + g_debug("Library version: %i (%s)\n", cachedlib->majorver, libid); + } + } res = TRUE; } @@ -510,3 +600,20 @@ gchar *mmgui_libpaths_cache_get_library_ return libcache->safename; } } + +gint mmgui_libpaths_cache_get_library_major_version(mmgui_libpaths_cache_t libcache, gchar *libname) +{ + mmgui_libpaths_entry_t cachedlib; + + if ((libcache == NULL) || (libname == NULL)) return 0; + + cachedlib = (mmgui_libpaths_entry_t)g_hash_table_lookup(libcache->cache, libname); + + if (cachedlib != NULL) { + /*Cached library version*/ + return cachedlib->majorver; + } else { + /*Safe library version*/ + return 0; + } +} diff -rupN modem-manager-gui-0.0.17.1.old/src/libpaths.h modem-manager-gui-0.0.17.1/src/libpaths.h --- modem-manager-gui-0.0.17.1.old/src/libpaths.h 2013-06-17 23:02:10.000000000 +0400 +++ modem-manager-gui-0.0.17.1/src/libpaths.h 2015-04-25 20:40:28.911690000 +0300 @@ -41,5 +41,6 @@ mmgui_libpaths_cache_t mmgui_libpaths_ca void mmgui_libpaths_cache_close(mmgui_libpaths_cache_t libcache); gchar *mmgui_libpaths_cache_get_library_name(mmgui_libpaths_cache_t libcache, gchar *libname); gchar *mmgui_libpaths_cache_get_library_path(mmgui_libpaths_cache_t libcache, gchar *libname); +gint mmgui_libpaths_cache_get_library_major_version(mmgui_libpaths_cache_t libcache, gchar *libname); #endif /* __LIBPATHS_H__ */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor