diff --git a/coreapi/contact_providers_priv.h b/coreapi/contact_providers_priv.h new file mode 100644 index 000000000..41b7bd327 --- /dev/null +++ b/coreapi/contact_providers_priv.h @@ -0,0 +1,67 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef CONTACT_PROVIDERS_PRIV_H +#define CONTACT_PROVIDERS_PRIV_H + +#include +#include "linphonecore.h" + +/* Base for contact search and contact provider */ + +struct _LinphoneContactSearch{ + belle_sip_object_t base; + ContactSearchID id; + char* predicate; + ContactSearchCallback cb; + void* data; +}; + +#define LINPHONE_CONTACT_SEARCH(obj) BELLE_SIP_CAST(obj,LinphoneContactSearch) +BELLE_SIP_DECLARE_VPTR(LinphoneContactSearch) + + +struct _LinphoneContactProvider { + belle_sip_object_t base; + LinphoneCore* lc; +}; + +#define LINPHONE_CONTACT_PROVIDER(obj) BELLE_SIP_CAST(obj,LinphoneContactProvider) + +typedef LinphoneContactSearch* (*LinphoneContactProviderStartSearchMethod)( LinphoneContactProvider* thiz, const char* predicate, ContactSearchCallback cb, void* data ); +typedef unsigned int (*LinphoneContactProviderCancelSearchMethod)( LinphoneContactProvider* thiz, LinphoneContactSearch *request ); + +BELLE_SIP_DECLARE_CUSTOM_VPTR_BEGIN(LinphoneContactProvider,belle_sip_object_t) + const char* name; /*!< Name of the contact provider (LDAP, Google, ...) */ + + /* pure virtual methods: inheriting objects must implement these */ + LinphoneContactProviderStartSearchMethod begin_search; + LinphoneContactProviderCancelSearchMethod cancel_search; +BELLE_SIP_DECLARE_CUSTOM_VPTR_END + +/* LDAP search and contact providers */ + + +#define LINPHONE_LDAP_CONTACT_SEARCH(obj) BELLE_SIP_CAST(obj,LinphoneLDAPContactSearch) +BELLE_SIP_DECLARE_VPTR(LinphoneLDAPContactSearch) + +#define LINPHONE_LDAP_CONTACT_PROVIDER(obj) BELLE_SIP_CAST(obj,LinphoneLDAPContactProvider) + +BELLE_SIP_DECLARE_CUSTOM_VPTR_BEGIN(LinphoneLDAPContactProvider,LinphoneContactProvider) +BELLE_SIP_DECLARE_CUSTOM_VPTR_END + + +#endif // CONTACT_PROVIDERS_PRIV_H diff --git a/coreapi/contactprovider.c b/coreapi/contactprovider.c index 835e8c62a..86541b2a3 100644 --- a/coreapi/contactprovider.c +++ b/coreapi/contactprovider.c @@ -14,11 +14,13 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "contact_providers_priv.h" #include "contactprovider.h" #include -/* LinphoneContactSearchRequest - */ +/* ############################ * + * LinphoneContactSearchRequest * + * ############################ */ void linphone_contact_search_init(LinphoneContactSearch* obj, const char* predicate, @@ -57,6 +59,21 @@ int linphone_contact_search_compare(const void* a, const void* b) { return !(ra->id == rb->id); // return 0 if id is equal, 1 otherwise } +LinphoneContactSearch*linphone_ldap_contact_search_ref(void* obj) +{ + return LINPHONE_CONTACT_SEARCH(belle_sip_object_ref(obj)); +} + +void linphone_ldap_contact_search_unref(void* obj) +{ + belle_sip_object_unref(obj); +} + +LinphoneContactSearch* linphone_contact_search_cast(void* obj) +{ + return LINPHONE_CONTACT_SEARCH(obj); +} + BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneContactSearch); BELLE_SIP_INSTANCIATE_VPTR(LinphoneContactSearch,belle_sip_object_t, @@ -66,9 +83,11 @@ BELLE_SIP_INSTANCIATE_VPTR(LinphoneContactSearch,belle_sip_object_t, FALSE ); -/* - * LinphoneContactProvider - */ + + +/* ####################### * + * LinphoneContactProvider * + * ####################### */ void linphone_contact_provider_init(LinphoneContactProvider* obj, LinphoneCore* lc){ @@ -79,6 +98,30 @@ static void contact_provider_destroy(LinphoneContactProvider* obj){ (void)obj; } +LinphoneContactSearch* linphone_contact_provider_begin_search(LinphoneContactProvider* obj, const char* predicate, ContactSearchCallback cb, void* data) +{ + return BELLE_SIP_OBJECT_VPTR(obj,LinphoneContactProvider)->begin_search( LINPHONE_CONTACT_PROVIDER(obj), predicate, cb, data); +} + +unsigned int linphone_contact_provider_cancel_search(LinphoneContactProvider* obj, LinphoneContactSearch* request) +{ + return BELLE_SIP_OBJECT_VPTR(obj,LinphoneContactProvider)->cancel_search( LINPHONE_CONTACT_PROVIDER(obj), request); +} + +LinphoneContactProvider* linphone_contact_provider_ref(void* obj) +{ + return LINPHONE_CONTACT_PROVIDER(belle_sip_object_ref(obj)); +} + +void linphone_contact_provider_unref(void* obj) +{ + belle_sip_object_unref(obj); +} + +LinphoneContactProvider*linphone_contact_provider_cast(void* obj) +{ + return LINPHONE_CONTACT_PROVIDER(obj); +} BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneContactProvider); BELLE_SIP_INSTANCIATE_CUSTOM_VPTR(LinphoneContactProvider)= @@ -95,4 +138,3 @@ BELLE_SIP_INSTANCIATE_CUSTOM_VPTR(LinphoneContactProvider)= NULL /* cancel_search -> pure virtual */ }; - diff --git a/coreapi/contactprovider.h b/coreapi/contactprovider.h index 857bd1a8d..83cbee1b7 100644 --- a/coreapi/contactprovider.h +++ b/coreapi/contactprovider.h @@ -14,50 +14,30 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include #include "linphonecore.h" /* LinphoneContactSearchRequest */ -struct _LinphoneContactSearch{ - belle_sip_object_t base; - ContactSearchID id; - char* predicate; - ContactSearchCallback cb; - void* data; -}; - -#define LINPHONE_CONTACT_SEARCH(obj) BELLE_SIP_CAST(obj,LinphoneContactSearch) -BELLE_SIP_DECLARE_VPTR(LinphoneContactSearch) - - void linphone_contact_search_init(LinphoneContactSearch* obj, const char* predicate, ContactSearchCallback cb, void* cb_data); ContactSearchID linphone_contact_search_get_id(LinphoneContactSearch* obj); const char* linphone_contact_search_get_predicate(LinphoneContactSearch* obj); void linphone_contact_search_invoke_cb(LinphoneContactSearch* req, MSList* friends); - +LinphoneContactSearch* linphone_contact_search_ref(void* obj); +void linphone_contact_search_unref(void* obj); +LinphoneContactSearch* linphone_contact_search_cast( void*obj ); /* LinphoneContactProvider */ -struct _LinphoneContactProvider { - belle_sip_object_t base; - LinphoneCore* lc; -}; - -typedef struct _LinphoneContactProvider LinphoneContactProvider; -typedef LinphoneContactSearch* (*LinphoneContactProviderStartSearchMethod)( LinphoneContactProvider* thiz, const char* predicate, ContactSearchCallback cb, void* data ); -typedef unsigned int (*LinphoneContactProviderCancelSearchMethod)( LinphoneContactProvider* thiz, LinphoneContactSearch *request ); -#define LINPHONE_CONTACT_PROVIDER(obj) BELLE_SIP_CAST(obj,LinphoneContactProvider) - -BELLE_SIP_DECLARE_CUSTOM_VPTR_BEGIN(LinphoneContactProvider,belle_sip_object_t) - const char* name; /*!< Name of the contact provider (LDAP, Google, ...) */ - - /* pure virtual methods: inheriting objects must implement these */ - LinphoneContactProviderStartSearchMethod begin_search; - LinphoneContactProviderCancelSearchMethod cancel_search; -BELLE_SIP_DECLARE_CUSTOM_VPTR_END - - void linphone_contact_provider_init(LinphoneContactProvider* obj, LinphoneCore* lc); LinphoneCore* linphone_contact_provider_get_core(LinphoneContactProvider* obj); const char* linphone_contact_provider_get_name(LinphoneContactProvider* obj); +LinphoneContactProvider* linphone_contact_provider_ref(void* obj); +void linphone_contact_provider_unref(void* obj); +LinphoneContactProvider* linphone_contact_provider_cast( void*obj ); + +LinphoneContactSearch* linphone_contact_provider_begin_search(LinphoneContactProvider* obj, + const char* predicate, + ContactSearchCallback cb, + void* data); +unsigned int linphone_contact_provider_cancel_search(LinphoneContactProvider* obj, + LinphoneContactSearch* request); diff --git a/coreapi/ldap/ldapprovider.c b/coreapi/ldap/ldapprovider.c index 2c783d6fa..ee8fb2720 100644 --- a/coreapi/ldap/ldapprovider.c +++ b/coreapi/ldap/ldapprovider.c @@ -18,6 +18,7 @@ #include "linphonecore.h" #include "linphonecore_utils.h" #include "lpconfig.h" +#include "contact_providers_priv.h" #include #include @@ -571,7 +572,7 @@ static int linphone_ldap_contact_provider_bind( LinphoneLDAPContactProvider* obj } else { int err; ldap_get_option(obj->ld, LDAP_OPT_RESULT_CODE, &err); - ms_error("ldap_sasl_bind error returned %d, err %d (%s), auth_method: %s", + ms_error("ldap_sasl_bind error returned %x, err %x (%s), auth_method: %s", ret, err, ldap_err2string(err), auth_mechanism ); } @@ -616,6 +617,10 @@ LinphoneLDAPContactProvider*linphone_ldap_contact_provider_create(LinphoneCore* belle_sip_object_unref(obj); obj = NULL; } else { + // prevents blocking calls to bind() when the server is invalid, but this is not working for now.. + // see bug https://bugzilla.mozilla.org/show_bug.cgi?id=79509 + ldap_set_option( obj->ld, LDAP_OPT_CONNECT_ASYNC, LDAP_OPT_ON); + // register our hook into iterate so that LDAP can do its magic asynchronously. linphone_core_add_iterate_hook(lc, linphone_ldap_contact_provider_iterate, obj); } @@ -740,6 +745,27 @@ static int linphone_ldap_contact_provider_marshal(LinphoneLDAPContactProvider* o } +LinphoneLDAPContactProvider*linphone_ldap_contact_provider_ref(void* obj) +{ + return linphone_ldap_contact_provider_cast(belle_sip_object_ref(obj)); +} + + +void linphone_ldap_contact_provider_unref(void* obj) +{ + belle_sip_object_unref(obj); +} + +inline LinphoneLDAPContactSearch*linphone_ldap_contact_search_cast(void* obj) +{ + return BELLE_SIP_CAST(obj, LinphoneLDAPContactSearch); +} + + +LinphoneLDAPContactProvider* linphone_ldap_contact_provider_cast(void* obj) +{ + return BELLE_SIP_CAST(obj, LinphoneLDAPContactProvider); +} BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneLDAPContactProvider); @@ -758,3 +784,4 @@ BELLE_SIP_INSTANCIATE_CUSTOM_VPTR(LinphoneLDAPContactProvider)= } }; + diff --git a/coreapi/ldap/ldapprovider.h b/coreapi/ldap/ldapprovider.h index 73878ee7c..0310a84bc 100644 --- a/coreapi/ldap/ldapprovider.h +++ b/coreapi/ldap/ldapprovider.h @@ -16,30 +16,25 @@ #include "contactprovider.h" -#include typedef struct _LinphoneLDAPContactProvider LinphoneLDAPContactProvider; /* LinphoneLDAPContactSearch */ typedef struct _LinphoneLDAPContactSearch LinphoneLDAPContactSearch; -#define LINPHONE_LDAP_CONTACT_SEARCH(obj) BELLE_SIP_CAST(obj,LinphoneLDAPContactSearch) -BELLE_SIP_DECLARE_VPTR(LinphoneLDAPContactSearch) - LinphoneLDAPContactSearch* linphone_ldap_contact_search_create(LinphoneLDAPContactProvider* ld, const char* predicate, ContactSearchCallback cb, void* cb_data); unsigned int linphone_ldap_contact_search_result_count(LinphoneLDAPContactSearch* obj); +LinphoneLDAPContactSearch* linphone_ldap_contact_search_cast( void* obj ); /* LinphoneLDAPContactProvider */ -#define LINPHONE_LDAP_CONTACT_PROVIDER(obj) BELLE_SIP_CAST(obj,LinphoneLDAPContactProvider) - -BELLE_SIP_DECLARE_CUSTOM_VPTR_BEGIN(LinphoneLDAPContactProvider,LinphoneContactProvider) -BELLE_SIP_DECLARE_CUSTOM_VPTR_END - LinphoneLDAPContactProvider* linphone_ldap_contact_provider_create(LinphoneCore* lc, const LinphoneDictionary* config); -unsigned int linphone_ldap_contact_provider_get_max_result(const LinphoneLDAPContactProvider* obj); +unsigned int linphone_ldap_contact_provider_get_max_result(const LinphoneLDAPContactProvider* obj); +LinphoneLDAPContactProvider* linphone_ldap_contact_provider_ref( void* obj ); +void linphone_ldap_contact_provider_unref( void* obj ); +LinphoneLDAPContactProvider* linphone_ldap_contact_provider_cast( void* obj ); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 870512454..45c740a29 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -5677,13 +5677,6 @@ static void linphone_core_uninit(LinphoneCore *lc) } #endif //BUILD_UPNP -#ifdef BUILD_LDAP - if( lc->ldap != NULL ) { - belle_sip_object_unref(lc->ldap); - lc->ldap = NULL; - } -#endif - if (lp_config_needs_commit(lc->config)) lp_config_sync(lc->config); lp_config_destroy(lc->config); lc->config = NULL; /* Mark the config as NULL to block further calls */ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 1e61cd37f..ab1af9c2a 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -2203,8 +2203,9 @@ LINPHONE_PUBLIC const char *linphone_core_get_video_display_filter(LinphoneCore LINPHONE_PUBLIC void linphone_core_set_video_display_filter(LinphoneCore *lc, const char *filtername); -/** Contact Providers +/** Belle Sip-based objects need unique ids */ + BELLE_SIP_DECLARE_TYPES_BEGIN(linphone,10000) BELLE_SIP_TYPE_ID(LinphoneContactSearch), BELLE_SIP_TYPE_ID(LinphoneContactProvider), @@ -2212,10 +2213,14 @@ BELLE_SIP_TYPE_ID(LinphoneLDAPContactProvider), BELLE_SIP_TYPE_ID(LinphoneLDAPContactSearch) BELLE_SIP_DECLARE_TYPES_END + +/** Contact Providers + */ + typedef unsigned int ContactSearchID; -struct _LinphoneContactSearch; typedef struct _LinphoneContactSearch LinphoneContactSearch; +typedef struct _LinphoneContactProvider LinphoneContactProvider; typedef void (*ContactSearchCallback)( LinphoneContactSearch* id, MSList* friends, void* data );