diff --git a/src/ods-bluez.c b/src/ods-bluez.c index 63d2b1e..6115448 100644 --- a/src/ods-bluez.c +++ b/src/ods-bluez.c @@ -356,11 +356,24 @@ get_remote_service_handles_cb (DBusGProxy *proxy, DBusGProxyCall *call, DBUS_TYPE_G_UINT_ARRAY, &handle_array, G_TYPE_INVALID); + /* check if we were looking for Nokia specific FTP service and failed */ + if (handle_array->len == 0 && !strcmp (cb_data->uuid, OBEX_NOKIAFTP_UUID)) { + g_free (cb_data->uuid); + cb_data->uuid = g_strdup (OBEX_FTP_UUID); + dbus_g_proxy_begin_call (proxy, + "GetRemoteServiceHandles", + (DBusGProxyCallNotify) get_remote_service_handles_cb, + cb_data, NULL, + G_TYPE_STRING, cb_data->address, + G_TYPE_STRING, cb_data->uuid, + G_TYPE_INVALID); + return; + } + /* service search failed */ if (!ret || handle_array->len == 0) { - /* It means that Host is down */ g_clear_error (&error); g_set_error (&error, ODS_ERROR, ODS_ERROR_CONNECTION_ATTEMPT_FAILED, - "Host down"); + "Service search failed"); cb (-1, error, cb_data->data); cb_data_free (cb_data); g_clear_error (&error); @@ -407,8 +420,21 @@ ods_bluez_get_client_socket (OdsBluez *bluez, cb_data = g_new0 (GetClientSocketData, 1); cb_data->cb = func; cb_data->address = g_strdup (address); - cb_data->uuid = g_strdup (uuid); cb_data->data = data; + /* From Johan Hedberg: + * + * some Nokia Symbian phones have two OBEX FTP services: one + * identified with the normal UUID and another with a Nokia specific + * 128 bit UUID. The service found behind the normal identifier is + * very limited in features on these phones while the other one + * supports full OBEX FTP (don't ask me why). + */ + /* if FTP was requested, use NOKIAFTP instead, + * if it isn't found we retreat to FTP in get_remote_service_handles_cb */ + if (!strcmp (uuid, OBEX_FTP_UUID)) + cb_data->uuid = g_strdup (OBEX_NOKIAFTP_UUID); + else + cb_data->uuid = g_strdup (uuid); /* Discover channel for needed service only if we don't know it yet */ if (channel == 0) { diff --git a/src/ods-common.h b/src/ods-common.h index 65eb37e..928d7e1 100644 --- a/src/ods-common.h +++ b/src/ods-common.h @@ -35,6 +35,25 @@ enum { ODS_SERVICE_PBAP }; +/** Standard folder browsing service UUID */ +#define OBEX_FTP_UUID \ + "\xF9\xEC\x7B\xC4\x95\x3C\x11\xD2\x98\x4E\x52\x54\x00\xDC\x9E\x09" +/** Length of OBEX_FTP_UUID */ +#define OBEX_FTP_UUID_LEN 16 + +/** Nokia OBEX PC Suite Services (used instead of standard FTP for some devices) */ +#define OBEX_NOKIAFTP_UUID \ + "\x00\x00\x50\x05\x00\x00\x10\x00\x80\x00\x00\x02\xEE\x00\x00\x01" +/** Length of OBEX_NOKIAFTP_UUID */ +#define OBEX_NOKIAFTP_UUID_LEN 16 + +/** Phone Book Access Profile UUID */ +#define OBEX_PBAP_UUID \ + "\x79\x61\x35\xF0\xF0\xC5\x11\xD8\x09\x66\x08\x00\x20\x0C\x9A\x66" +/** Length of OBEX_PBAP_UUID */ +#define OBEX_PBAP_UUID_LEN 16 + + #define ODS_OPP_RFCOMM_CHANNEL 9 #define ODS_FTP_RFCOMM_CHANNEL 10 #define ODS_PBAP_RFCOMM_CHANNEL 15 diff --git a/src/ods-manager.h b/src/ods-manager.h index 79366b9..28ab021 100644 --- a/src/ods-manager.h +++ b/src/ods-manager.h @@ -24,6 +24,7 @@ #include #include +#include "ods-common.h" G_BEGIN_DECLS @@ -34,18 +35,6 @@ G_BEGIN_DECLS #define ODS_MANAGER_FTP_STR "ftp" #define ODS_MANAGER_PBAP_STR "pbap" -/** Standard folder browsing service UUID */ -#define OBEX_FTP_UUID \ - "\xF9\xEC\x7B\xC4\x95\x3C\x11\xD2\x98\x4E\x52\x54\x00\xDC\x9E\x09" -/** Length of OBEX_FTP_UUID */ -#define OBEX_FTP_UUID_LEN 16 - -/** Phone Book Access Profile UUID */ -#define OBEX_PBAP_UUID \ - "\x79\x61\x35\xF0\xF0\xC5\x11\xD8\x09\x66\x08\x00\x20\x0C\x9A\x66" -/** Length of OBEX_PBAP_UUID */ -#define OBEX_PBAP_UUID_LEN 16 - #define ODS_TYPE_MANAGER (ods_manager_get_type ()) #define ODS_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ODS_TYPE_MANAGER, OdsManager)) #define ODS_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), ODS_TYPE_MANAGER, OdsManagerClass))