00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #define EDS_ABI_WRAPPER_NO_REDEFINE 1
00020 #include "eds_abi_wrapper.h"
00021 #include "EvolutionSyncClient.h"
00022
00023 #include <string>
00024 #include <sstream>
00025 #include <dlfcn.h>
00026 #include <stdarg.h>
00027
00028 namespace {
00029
00030 std::string lookupDebug, lookupInfo;
00031
00032 }
00033
00034 #ifdef EVOLUTION_COMPATIBILITY
00035
00036 struct EDSAbiWrapper EDSAbiWrapperSingleton;
00037
00038 namespace {
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 void *findSymbols(const char *libname, int minver, int maxver, ... )
00057 {
00058 void *dlhandle = NULL;
00059 std::ostringstream debug, info;
00060
00061 if (!dlhandle) {
00062 for (int ver = maxver;
00063 ver >= minver;
00064 --ver) {
00065 std::ostringstream soname;
00066 soname << libname << "." << ver;
00067 dlhandle = dlopen(soname.str().c_str(), RTLD_GLOBAL|RTLD_LAZY);
00068 if (dlhandle) {
00069 info << "using " << soname.str() << std::endl;
00070 break;
00071 }
00072 }
00073 }
00074
00075 if (!dlhandle) {
00076 for (int ver = maxver + 1;
00077 ver < maxver + 50;
00078 ++ver) {
00079 std::ostringstream soname;
00080 soname << libname << "." << ver;
00081 dlhandle = dlopen(soname.str().c_str(), RTLD_GLOBAL|RTLD_LAZY);
00082 if (dlhandle) {
00083 info << "using " << soname.str() << " - might not be compatible!" << std::endl;
00084 break;
00085 }
00086 }
00087 }
00088
00089 if (!dlhandle) {
00090 debug << libname << " not found (tried major versions " << minver << " to " << maxver + 49 << ")" << std::endl;
00091 } else {
00092 bool allfound = true;
00093
00094 va_list ap;
00095 va_start(ap, maxver);
00096 void **funcptr = va_arg(ap, void **);
00097 const char *symname = NULL;
00098 while (funcptr && allfound) {
00099 symname = va_arg(ap, const char *);
00100 *funcptr = dlsym(dlhandle, symname);
00101 if (!*funcptr) {
00102 debug << symname << " not found" << std::endl;
00103 allfound = false;
00104 }
00105 funcptr = va_arg(ap, void **);
00106 }
00107 va_end(ap);
00108
00109 if (!allfound) {
00110
00111 va_start(ap, maxver);
00112 funcptr = va_arg(ap, void **);
00113 while (funcptr) {
00114 va_arg(ap, const char *);
00115 *funcptr = NULL;
00116 funcptr = va_arg(ap, void **);
00117 }
00118 va_end(ap);
00119
00120 info << libname << " unusable, required function no longer available" << std::endl;
00121 dlclose(dlhandle);
00122 dlhandle = NULL;
00123 }
00124 }
00125
00126 lookupInfo += info.str();
00127 lookupDebug += info.str();
00128 lookupDebug += debug.str();
00129 return dlhandle;
00130 }
00131
00132 # ifdef HAVE_EDS
00133 void *edshandle;
00134 # endif
00135 # ifdef ENABLE_EBOOK
00136 void *ebookhandle;
00137 # endif
00138 # ifdef ENABLE_ECAL
00139 void *ecalhandle;
00140 # endif
00141
00142 }
00143
00144 #endif // EVOLUTION_COMPATIBILITY
00145
00146 extern "C" void EDSAbiWrapperInit()
00147 {
00148 #ifdef EVOLUTION_COMPATIBILITY
00149 # ifdef HAVE_EDS
00150 edshandle =
00151 findSymbols("libedataserver-1.2.so", 7, 11,
00152 &EDSAbiWrapperSingleton.e_source_get_type, "e_source_get_type",
00153 &EDSAbiWrapperSingleton.e_source_get_uri, "e_source_get_uri",
00154 &EDSAbiWrapperSingleton.e_source_group_get_type, "e_source_group_get_type",
00155 &EDSAbiWrapperSingleton.e_source_group_peek_sources, "e_source_group_peek_sources",
00156 &EDSAbiWrapperSingleton.e_source_list_peek_groups, "e_source_list_peek_groups",
00157 &EDSAbiWrapperSingleton.e_source_peek_name, "e_source_peek_name",
00158 (void *)0);
00159 # endif // HAVE_EDS
00160
00161 # ifdef ENABLE_EBOOK
00162 ebookhandle =
00163 findSymbols("libebook-1.2.so", 5, 9,
00164 &EDSAbiWrapperSingleton.e_book_add_contact, "e_book_add_contact",
00165 &EDSAbiWrapperSingleton.e_book_authenticate_user, "e_book_authenticate_user",
00166 &EDSAbiWrapperSingleton.e_book_commit_contact, "e_book_commit_contact",
00167 &EDSAbiWrapperSingleton.e_contact_duplicate, "e_contact_duplicate",
00168 &EDSAbiWrapperSingleton.e_contact_get_const, "e_contact_get_const",
00169 &EDSAbiWrapperSingleton.e_contact_get_type, "e_contact_get_type",
00170 &EDSAbiWrapperSingleton.e_contact_new_from_vcard, "e_contact_new_from_vcard",
00171 &EDSAbiWrapperSingleton.e_contact_set, "e_contact_set",
00172 &EDSAbiWrapperSingleton.e_book_error_quark, "e_book_error_quark",
00173 &EDSAbiWrapperSingleton.e_book_get_addressbooks, "e_book_get_addressbooks",
00174 &EDSAbiWrapperSingleton.e_book_get_changes, "e_book_get_changes",
00175 &EDSAbiWrapperSingleton.e_book_get_contact, "e_book_get_contact",
00176 &EDSAbiWrapperSingleton.e_book_get_contacts, "e_book_get_contacts",
00177 &EDSAbiWrapperSingleton.e_book_get_supported_auth_methods, "e_book_get_supported_auth_methods",
00178 &EDSAbiWrapperSingleton.e_book_get_uri, "e_book_get_uri",
00179 &EDSAbiWrapperSingleton.e_book_new, "e_book_new",
00180 &EDSAbiWrapperSingleton.e_book_new_default_addressbook, "e_book_new_default_addressbook",
00181 &EDSAbiWrapperSingleton.e_book_new_from_uri, "e_book_new_from_uri",
00182 &EDSAbiWrapperSingleton.e_book_new_system_addressbook, "e_book_new_system_addressbook",
00183 &EDSAbiWrapperSingleton.e_book_open, "e_book_open",
00184 &EDSAbiWrapperSingleton.e_book_query_any_field_contains, "e_book_query_any_field_contains",
00185 &EDSAbiWrapperSingleton.e_book_query_unref, "e_book_query_unref",
00186 &EDSAbiWrapperSingleton.e_book_remove_contact, "e_book_remove_contact",
00187 &EDSAbiWrapperSingleton.e_vcard_to_string, "e_vcard_to_string",
00188 (void *)0);
00189 # endif // ENABLE_EBOOK
00190
00191 # ifdef ENABLE_ECAL
00192 ecalhandle =
00193 findSymbols("libecal-1.2.so", 3, 7,
00194 &EDSAbiWrapperSingleton.e_cal_add_timezone, "e_cal_add_timezone",
00195 &EDSAbiWrapperSingleton.e_cal_component_get_icalcomponent, "e_cal_component_get_icalcomponent",
00196 &EDSAbiWrapperSingleton.e_cal_component_get_last_modified, "e_cal_component_get_last_modified",
00197 &EDSAbiWrapperSingleton.e_cal_component_get_type, "e_cal_component_get_type",
00198 &EDSAbiWrapperSingleton.e_cal_create_object, "e_cal_create_object",
00199 &EDSAbiWrapperSingleton.e_calendar_error_quark, "e_calendar_error_quark",
00200 &EDSAbiWrapperSingleton.e_cal_get_component_as_string, "e_cal_get_component_as_string",
00201 &EDSAbiWrapperSingleton.e_cal_get_object, "e_cal_get_object",
00202 &EDSAbiWrapperSingleton.e_cal_get_object_list_as_comp, "e_cal_get_object_list_as_comp",
00203 &EDSAbiWrapperSingleton.e_cal_get_sources, "e_cal_get_sources",
00204 &EDSAbiWrapperSingleton.e_cal_get_timezone, "e_cal_get_timezone",
00205 &EDSAbiWrapperSingleton.e_cal_modify_object, "e_cal_modify_object",
00206 &EDSAbiWrapperSingleton.e_cal_new, "e_cal_new",
00207 &EDSAbiWrapperSingleton.e_cal_new_from_uri, "e_cal_new_from_uri",
00208 &EDSAbiWrapperSingleton.e_cal_new_system_calendar, "e_cal_new_system_calendar",
00209 &EDSAbiWrapperSingleton.e_cal_new_system_tasks, "e_cal_new_system_tasks",
00210 &EDSAbiWrapperSingleton.e_cal_open, "e_cal_open",
00211 &EDSAbiWrapperSingleton.e_cal_remove_object, "e_cal_remove_object",
00212 &EDSAbiWrapperSingleton.e_cal_remove_object_with_mod, "e_cal_remove_object_with_mod",
00213 &EDSAbiWrapperSingleton.e_cal_set_auth_func, "e_cal_set_auth_func",
00214 &EDSAbiWrapperSingleton.icalcomponent_add_component, "icalcomponent_add_component",
00215 &EDSAbiWrapperSingleton.icalcomponent_as_ical_string, "icalcomponent_as_ical_string",
00216 &EDSAbiWrapperSingleton.icalcomponent_free, "icalcomponent_free",
00217 &EDSAbiWrapperSingleton.icalcomponent_get_first_component, "icalcomponent_get_first_component",
00218 &EDSAbiWrapperSingleton.icalcomponent_get_first_property, "icalcomponent_get_first_property",
00219 &EDSAbiWrapperSingleton.icalcomponent_get_next_component, "icalcomponent_get_next_component",
00220 &EDSAbiWrapperSingleton.icalcomponent_get_next_property, "icalcomponent_get_next_property",
00221 &EDSAbiWrapperSingleton.icalcomponent_get_recurrenceid, "icalcomponent_get_recurrenceid",
00222 &EDSAbiWrapperSingleton.icalcomponent_get_timezone, "icalcomponent_get_timezone",
00223 &EDSAbiWrapperSingleton.icalcomponent_get_uid, "icalcomponent_get_uid",
00224 &EDSAbiWrapperSingleton.icalcomponent_isa, "icalcomponent_isa",
00225 &EDSAbiWrapperSingleton.icalcomponent_new_clone, "icalcomponent_new_clone",
00226 &EDSAbiWrapperSingleton.icalcomponent_new_from_string, "icalcomponent_new_from_string",
00227 &EDSAbiWrapperSingleton.icalcomponent_remove_property, "icalcomponent_remove_property",
00228 &EDSAbiWrapperSingleton.icalcomponent_set_uid, "icalcomponent_set_uid",
00229 &EDSAbiWrapperSingleton.icalcomponent_vanew, "icalcomponent_vanew",
00230 &EDSAbiWrapperSingleton.icalparameter_get_tzid, "icalparameter_get_tzid",
00231 &EDSAbiWrapperSingleton.icalparameter_set_tzid, "icalparameter_set_tzid",
00232 &EDSAbiWrapperSingleton.icalproperty_get_description, "icalproperty_get_description",
00233 &EDSAbiWrapperSingleton.icalproperty_get_first_parameter, "icalproperty_get_first_parameter",
00234 &EDSAbiWrapperSingleton.icalproperty_get_lastmodified, "icalproperty_get_lastmodified",
00235 &EDSAbiWrapperSingleton.icalproperty_get_next_parameter, "icalproperty_get_next_parameter",
00236 &EDSAbiWrapperSingleton.icalproperty_get_summary, "icalproperty_get_summary",
00237 &EDSAbiWrapperSingleton.icalproperty_new_description, "icalproperty_new_description",
00238 &EDSAbiWrapperSingleton.icalproperty_new_summary, "icalproperty_new_summary",
00239 &EDSAbiWrapperSingleton.icalproperty_set_value_from_string, "icalproperty_set_value_from_string",
00240 &EDSAbiWrapperSingleton.icaltime_as_ical_string, "icaltime_as_ical_string",
00241 &EDSAbiWrapperSingleton.icaltimezone_free, "icaltimezone_free",
00242 &EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone, "icaltimezone_get_builtin_timezone",
00243 &EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone_from_tzid, "icaltimezone_get_builtin_timezone_from_tzid",
00244 &EDSAbiWrapperSingleton.icaltimezone_get_component, "icaltimezone_get_component",
00245 &EDSAbiWrapperSingleton.icaltimezone_get_tzid, "icaltimezone_get_tzid",
00246 &EDSAbiWrapperSingleton.icaltimezone_new, "icaltimezone_new",
00247 &EDSAbiWrapperSingleton.icaltimezone_set_component, "icaltimezone_set_component",
00248 (void *)0);
00249 # endif // ENABLE_ECAL
00250 #endif // EVOLUTION_COMPATIBILITY
00251 }
00252
00253 extern "C" const char *EDSAbiWrapperInfo() { return lookupInfo.c_str(); }
00254 extern "C" const char *EDSAbiWrapperDebug() { return lookupDebug.c_str(); }