From: <svn...@op...> - 2009-08-10 09:14:32
|
Author: bellmich Date: Mon Aug 10 11:14:18 2009 New Revision: 1252 URL: http://libsyncml.opensync.org/changeset/1252 Log: fixed the state handling of OBEX client transport Modified: trunk/libsyncml/sml_transport_internals.h trunk/libsyncml/transports/obex_client.c trunk/libsyncml/transports/obex_client_internals.h Modified: trunk/libsyncml/sml_transport_internals.h ============================================================================== --- trunk/libsyncml/sml_transport_internals.h Mon Aug 10 11:13:47 2009 (r1251) +++ trunk/libsyncml/sml_transport_internals.h Mon Aug 10 11:14:18 2009 (r1252) @@ -65,7 +65,9 @@ SML_TRANSPORT_UNINITIALIZED = 0, SML_TRANSPORT_INITIALIZED = 1, SML_TRANSPORT_CONNECTED = 2, - SML_TRANSPORT_ERROR = 3 + SML_TRANSPORT_DATA_ERROR = 3, + SML_TRANSPORT_DISCONNECTED = 4, + SML_TRANSPORT_ERROR = 5 } SmlTransportState; struct SmlTransport { Modified: trunk/libsyncml/transports/obex_client.c ============================================================================== --- trunk/libsyncml/transports/obex_client.c Mon Aug 10 11:13:47 2009 (r1251) +++ trunk/libsyncml/transports/obex_client.c Mon Aug 10 11:14:18 2009 (r1252) @@ -486,14 +486,16 @@ } smlSafeCFree(&who); + env->state = SML_TRANSPORT_CONNECTED; smlTransportReceiveEvent(env->tsp, NULL, SML_TRANSPORT_EVENT_CONNECT_DONE, NULL, NULL); break; case OBEX_CMD_DISCONNECT:; - if (!env->isDisconnected) + if (SML_TRANSPORT_CONNECTED <= env->state && + env->state < SML_TRANSPORT_DISCONNECTED) { env->busy = FALSE; - env->isDisconnected = TRUE; OBEX_TransportDisconnect(env->obexhandle); + env->state = SML_TRANSPORT_DISCONNECTED; smlTransportReceiveEvent(env->tsp, NULL, SML_TRANSPORT_EVENT_DISCONNECT_DONE, NULL, NULL); } break; @@ -562,11 +564,12 @@ if (obex_rsp == 0) { /* This is a disconnect. */ - if (!env->isDisconnected) + if (SML_TRANSPORT_CONNECTED <= env->state && + env->state < SML_TRANSPORT_DISCONNECTED) { env->busy = FALSE; - env->isDisconnected = TRUE; OBEX_TransportDisconnect(env->obexhandle); + env->state = SML_TRANSPORT_DISCONNECTED; smlTransportReceiveEvent(env->tsp, NULL, SML_TRANSPORT_EVENT_DISCONNECT_DONE, NULL, NULL); } } else { @@ -793,6 +796,8 @@ break; } + env->state = SML_TRANSPORT_INITIALIZED; + smlTrace(TRACE_EXIT, "%s - TRUE", __func__); return TRUE; error: @@ -853,7 +858,6 @@ GError *error = NULL; unsigned int obex_intf_cnt; obex_interface_t *obex_intf; - env->isDisconnected = FALSE; if (env->type == SML_TRANSPORT_CONNECTION_TYPE_NET) { smlTrace(TRACE_INTERNAL, "%s: connecting to inet address %s:%d", @@ -1119,13 +1123,25 @@ SmlTransportObexClientEnv *env = data; GError *error = NULL; - if (env->isDisconnected) { + if (env->state < SML_TRANSPORT_CONNECTED) { + /* This is a bug. If the transport is not connected + * then there is no reason for a disconnect. + * Nevertheless this mistake should not be fatal. + */ + smlTrace(TRACE_EXIT_ERROR, + "%s - disconnect called on a never connected transport", + __func__); + g_warning("%s called on never connected OBEX connection.", __func__); + return; + } + + if (env->state == SML_TRANSPORT_DISCONNECTED) { /* This is a bug. If the transport is disconnected * then there is no reason for a second disconnect. * Nevertheless this mistake should not be fatal. */ smlTrace(TRACE_EXIT_ERROR, - "%s - disconnect called on already disconnected transport", + "%s - disconnect called on an already disconnected transport", __func__); g_warning("%s called on disconnected OBEX connection.", __func__); return; @@ -1175,7 +1191,7 @@ "The disconnect request was not accepted (%i).", result); goto error; - } else if (result == 0 && !env->busy && !env->isDisconnected) { + } else if (result == 0 && !env->busy && env->state < SML_TRANSPORT_DISCONNECTED) { g_set_error(&error, SML_ERROR, SML_ERROR_GENERIC, "The disconnect request was timed out."); goto error; @@ -1190,11 +1206,12 @@ /* Note: The disconnect is signaled by OBEX_EV_LINKERR or OBEX_CMD_DISCONNECT. * We only signal disconnect here if a phone does not answer. */ - if (!env->isDisconnected) + if (SML_TRANSPORT_CONNECTED <= env->state && + env->state < SML_TRANSPORT_DISCONNECTED) { env->busy = FALSE; - env->isDisconnected = TRUE; OBEX_TransportDisconnect(env->obexhandle); + env->state = SML_TRANSPORT_DISCONNECTED; smlTransportReceiveEvent(env->tsp, NULL, SML_TRANSPORT_EVENT_DISCONNECT_DONE, NULL, NULL); } @@ -1426,6 +1443,7 @@ return FALSE; tsp->transport_data = env; env->tsp = tsp; + env->state = SML_TRANSPORT_UNINITIALIZED; return TRUE; } Modified: trunk/libsyncml/transports/obex_client_internals.h ============================================================================== --- trunk/libsyncml/transports/obex_client_internals.h Mon Aug 10 11:13:47 2009 (r1251) +++ trunk/libsyncml/transports/obex_client_internals.h Mon Aug 10 11:14:18 2009 (r1252) @@ -59,7 +59,6 @@ GList *datastores; gint fd; - gint state; gchar *databuf; gint *databuflen; gint connected; @@ -69,7 +68,7 @@ gboolean busy; gboolean error; SmlMimeType mimetype; - gboolean isDisconnected; + SmlTransportState state; } SmlTransportObexClientEnv; gboolean smlTransportObexClientNew (SmlTransport *tsp, GError **error); |