From: <svn...@op...> - 2009-08-10 09:28:59
|
Author: bellmich Date: Mon Aug 10 11:28:41 2009 New Revision: 1256 URL: http://libsyncml.opensync.org/changeset/1256 Log: fixed state handled of OBEX client transport Modified: branches/libsyncml-0.5.x/libsyncml/sml_transport_internals.h branches/libsyncml-0.5.x/libsyncml/transports/obex_client.c branches/libsyncml-0.5.x/libsyncml/transports/obex_client_internals.h Modified: branches/libsyncml-0.5.x/libsyncml/sml_transport_internals.h ============================================================================== --- branches/libsyncml-0.5.x/libsyncml/sml_transport_internals.h Mon Aug 10 11:28:03 2009 (r1255) +++ branches/libsyncml-0.5.x/libsyncml/sml_transport_internals.h Mon Aug 10 11:28:41 2009 (r1256) @@ -63,6 +63,8 @@ SML_TRANSPORT_UNINITIALIZED, SML_TRANSPORT_INITIALIZED, SML_TRANSPORT_CONNECTED, + SML_TRANSPORT_DATA_ERROR, + SML_TRANSPORT_DISCONNECTED, SML_TRANSPORT_ERROR } SmlTransportState; Modified: branches/libsyncml-0.5.x/libsyncml/transports/obex_client.c ============================================================================== --- branches/libsyncml-0.5.x/libsyncml/transports/obex_client.c Mon Aug 10 11:28:03 2009 (r1255) +++ branches/libsyncml-0.5.x/libsyncml/transports/obex_client.c Mon Aug 10 11:28:41 2009 (r1256) @@ -484,14 +484,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; @@ -560,11 +562,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 { @@ -787,6 +790,8 @@ break; } + env->state = SML_TRANSPORT_INITIALIZED; + smlTrace(TRACE_EXIT, "%s - TRUE", __func__); return TRUE; error: @@ -845,7 +850,6 @@ SmlError *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", @@ -1111,13 +1115,25 @@ SmlTransportObexClientEnv *env = data; SmlError *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; @@ -1167,7 +1183,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) { smlErrorSet(&error, SML_ERROR_GENERIC, "The disconnect request was timed out."); goto error; @@ -1182,11 +1198,11 @@ /* 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 (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); } @@ -1411,6 +1427,7 @@ return FALSE; tsp->transport_data = env; env->tsp = tsp; + env->state = SML_TRANSPORT_UNINITIALIZED; return TRUE; } Modified: branches/libsyncml-0.5.x/libsyncml/transports/obex_client_internals.h ============================================================================== --- branches/libsyncml-0.5.x/libsyncml/transports/obex_client_internals.h Mon Aug 10 11:28:03 2009 (r1255) +++ branches/libsyncml-0.5.x/libsyncml/transports/obex_client_internals.h Mon Aug 10 11:28:41 2009 (r1256) @@ -59,17 +59,15 @@ GList *datastores; int fd; - int state; char *databuf; int *databuflen; - int connected; #ifndef WIN32 struct termios oldtio; #endif SmlBool busy; SmlBool error; SmlMimeType mimetype; - SmlBool isDisconnected; + SmlTransportState state; } SmlTransportObexClientEnv; SmlBool smlTransportObexClientNew(SmlTransport *tsp, SmlError **error); |