Changeset 111
- Timestamp:
- 03/04/06 03:02:57 (3 years ago)
- Files:
-
- branches/development-branch/libsyncml/objects/sml_auth.c (modified) (1 diff)
- branches/development-branch/libsyncml/sml_queue.c (modified) (2 diffs)
- branches/development-branch/libsyncml/sml_support.c (modified) (1 diff)
- branches/development-branch/libsyncml/sml_transport.c (modified) (4 diffs)
- branches/development-branch/libsyncml/sml_transport_internals.h (modified) (1 diff)
- branches/development-branch/libsyncml/transports/obex_client.c (modified) (13 diffs)
- branches/development-branch/libsyncml/transports/obex_client_internals.h (modified) (1 diff)
- branches/development-branch/libsyncml/transports/obex_server.c (modified) (18 diffs)
- branches/development-branch/libsyncml/transports/obex_server_internals.h (modified) (1 diff)
- branches/development-branch/tests/check_obex.c (modified) (10 diffs)
- branches/development-branch/tests/valgrind.supp (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/development-branch/libsyncml/objects/sml_auth.c
r104 r111 55 55 unsigned int buffersize = 0; 56 56 57 if (!cred && auth->enabled && auth->state != SML_AUTH_ACCEPTED) { 57 if (!cred && !auth->enabled) { 58 smlTrace(TRACE_INTERNAL, "Auth is disabled and no cred given"); 59 auth->state = SML_NO_ERROR; 60 } else if (!cred && auth->enabled && auth->state != SML_AUTH_ACCEPTED) { 61 smlTrace(TRACE_INTERNAL, "Auth is required"); 58 62 auth->state = SML_ERROR_AUTH_REQUIRED; 59 } else if (cred && !auth->enabled) { 63 } else if ((!cred && auth->enabled && auth->state == SML_AUTH_ACCEPTED) || \ 64 (cred && !auth->enabled)) { 65 smlTrace(TRACE_INTERNAL, "Auth is already accepted %i", auth->enabled); 60 66 auth->state = SML_AUTH_ACCEPTED; 61 } else if (!auth->enabled) {62 auth->state = SML_NO_ERROR;63 67 } else { 64 68 smlTrace(TRACE_INTERNAL, "Input is \"%s\"", cred->data); branches/development-branch/libsyncml/sml_queue.c
r108 r111 400 400 g_source_attach(source, context); 401 401 queue->context = context; 402 if (context) 403 g_main_context_ref(context); 402 404 403 405 smlTrace(TRACE_EXIT, "%s", __func__); … … 417 419 418 420 queue->source = NULL; 419 queue->context = NULL; 421 422 if (queue->context) { 423 g_main_context_unref(queue->context); 424 queue->context = NULL; 425 } 420 426 421 427 smlTrace(TRACE_EXIT, "%s", __func__); branches/development-branch/libsyncml/sml_support.c
r108 r111 179 179 if (!chan) { 180 180 printf("unable to open %s for writing: %s\n", logfile, error->message); 181 g_free(logfile); 182 g_free(logmessage); 181 183 return; 182 184 } branches/development-branch/libsyncml/sml_transport.c
r108 r111 188 188 tsp->thread = NULL; 189 189 190 g_main_context_unref(tsp->context);191 tsp->context = NULL;192 193 190 smlTrace(TRACE_EXIT, "%s", __func__); 194 191 } … … 226 223 227 224 cmd->type = SML_TRANSPORT_CMD_DISCONNECT; 228 229 //Call the connect function 225 if (link) { 226 cmd->link = link; 227 smlLinkRef(cmd->link); 228 } 229 230 //Call the disconnect function 230 231 smlQueueSend(tsp->command_queue, cmd); 231 232 … … 295 296 smlTrace(TRACE_EXIT, "%s: Freed", __func__); 296 297 } 297 298 void smlTransportSetState(SmlTransport *tsp, SmlTransportState state, SmlError **error)299 {300 smlTrace(TRACE_ENTRY, "%s(%p, %i, %p(%p))", __func__, tsp, state, error, error ? *error : NULL);301 smlAssert(tsp);302 303 tsp->state = state;304 if (error && *error) {305 tsp->error = *error;306 smlErrorRef(error);307 }308 309 smlTrace(TRACE_EXIT, "%s", __func__);310 }311 298 312 299 void smlTransportSetError(SmlTransport *tsp, SmlLink *link, SmlError **error) … … 339 326 SmlLink *smlLinkNew(SmlTransport *tsp, void *link_data, SmlError **error) 340 327 { 341 smlTrace(TRACE_ENTRY, "%s(%p, %p )", __func__, tsp, link_data, error);328 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, tsp, link_data, error); 342 329 343 330 SmlLink *link = smlTryMalloc0(sizeof(SmlLink), error); branches/development-branch/libsyncml/sml_transport_internals.h
r101 r111 51 51 52 52 SmlTransportState state; 53 SmlError *error;54 53 55 54 SmlTransportType type; branches/development-branch/libsyncml/transports/obex_client.c
r102 r111 68 68 69 69 if (obex_rsp != OBEX_RSP_SUCCESS) { 70 env->error = TRUE; 70 71 smlErrorSet(&error, SML_ERROR_GENERIC, "Request not successfull: %i", obex_rsp); 71 72 goto error; … … 98 99 if (!env->connection_id) { 99 100 smlErrorSet(&error, SML_ERROR_GENERIC, "Missing connection id"); 101 g_free(who); 100 102 goto error; 101 103 } … … 103 105 if (!who || strcmp(who, "SYNCML-SYNC")) { 104 106 smlErrorSet(&error, SML_ERROR_GENERIC, "Missing or wrong who response"); 107 g_free(who); 105 108 goto error; 106 109 } 110 g_free(who); 107 111 108 112 smlTransportReceiveEvent(env->tsp, NULL, SML_TRANSPORT_EVENT_CONNECT_DONE, NULL, NULL); … … 129 133 } 130 134 135 if (!length) { 136 smlErrorSet(&error, SML_ERROR_GENERIC, "Got zero length!"); 137 goto error; 138 } 139 131 140 body = smlTryMalloc0(length, &error); 132 141 if (!body) … … 244 253 OBEX_Cleanup(env->obexhandle); 245 254 error_free_env: 255 g_free(env->path); 246 256 g_free(env); 247 257 error: … … 257 267 258 268 smlAssert(env->tsp); 269 g_free(env->path); 270 g_free(env->stream_chunk); 271 272 OBEX_Cleanup(env->obexhandle); 259 273 260 274 g_free(env); … … 295 309 smlTrace(TRACE_INTERNAL, "socket %i", fd); 296 310 297 smlTrace(TRACE_INTERNAL, "peer addr = %d %s %i", hostinfo->h_addr_list[0], inet_ntoa(addr.sin_addr), env->port);298 //%d.%d.%d.%d", addr.sin_addr.s_addr[0], addr.sin_addr.addr[1], addr.sin_addr.addr[2], addr.sin_addr.addr[3]);299 311 const char *addrstr = inet_ntoa(addr.sin_addr); 312 smlTrace(TRACE_INTERNAL, "peer addr = %d %s %i", hostinfo->h_addr_list[0], addrstr, env->port); 313 300 314 if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { 301 315 smlErrorSet(&error, SML_ERROR_GENERIC, "Cannot connect socket: %s", strerror(errno)); … … 458 472 static void smlTransportObexClientSend(void *userdata, void *link, SmlTransportData *data, SmlError *error) 459 473 { 460 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, % d, %i, %p)", __func__, userdata, link, data, error);474 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, userdata, link, data, error); 461 475 smlAssert(data); 462 476 smlAssert(userdata); … … 467 481 goto error; 468 482 483 env->error = FALSE; 469 484 env->mimetype = data->type; 470 485 … … 503 518 504 519 /* Now convert to unicode. It requires 2 bytes per char + end*/ 505 unsigned char *unicode = g_malloc0(2 * strlen(target) + 2);520 /*unsigned char *unicode = g_malloc0(2 * strlen(target) + 2); 506 521 507 522 unsigned int unicodesize = OBEX_CharToUnicode(unicode, (const unsigned char *)target, 2 * strlen(target) + 2); … … 509 524 smlErrorSet(&error, SML_ERROR_GENERIC, "unable to convert to unicode"); 510 525 goto error_free_obj; 511 } 526 }*/ 512 527 513 528 /* Now add the target mime type */ … … 539 554 } 540 555 541 if (env-> tsp->error != NULL) {556 if (env->error) { 542 557 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to send put request. Bailing out"); 543 558 goto error; … … 566 581 567 582 /* Now add the target mime type */ 568 header.bs = (unsigned char *)unicode; 569 OBEX_ObjectAddHeader(env->obexhandle, obj, OBEX_HDR_TYPE, header, unicodesize, 0); 583 //header.bs = (unsigned char *)unicode; 584 //OBEX_ObjectAddHeader(env->obexhandle, obj, OBEX_HDR_TYPE, header, unicodesize, 0); 585 header.bs = (unsigned char *)target; 586 OBEX_ObjectAddHeader(env->obexhandle, obj, OBEX_HDR_TYPE, header, strlen(target) + 1, 0); 570 587 571 588 env->busy = TRUE; branches/development-branch/libsyncml/transports/obex_client_internals.h
r101 r111 36 36 37 37 SmlBool busy; 38 SmlBool error; 38 39 SmlMimeType mimetype; 39 40 } SmlTransportObexClientEnv; branches/development-branch/libsyncml/transports/obex_server.c
r101 r111 36 36 #include <netdb.h> 37 37 38 static uint32_t smlTransportObexServerGenerateId(SmlTransportObexServerEnv *env) 39 { 40 env->lastConId++; 41 return env->lastConId; 42 } 43 44 gboolean _dispatch_obex(gpointer data) 45 { 46 obex_t *obexhandle = data; 47 48 if (OBEX_HandleInput(obexhandle, 0) < 0) 49 smlTrace(TRACE_INTERNAL, "Unable to handle input"); 50 38 static gboolean _dispatch_obex(gpointer data) 39 { 40 SmlLinkObexServerEnv *linkenv = data; 41 42 if (OBEX_HandleInput(linkenv->handle, 0) < 0) { 43 SmlError *error = NULL; 44 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to handle input"); 45 smlTransportReceiveEvent(linkenv->env->tsp, linkenv->link, SML_TRANSPORT_EVENT_ERROR, NULL, error); 46 smlTrace(TRACE_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 47 smlErrorDeref(&error); 48 return FALSE; 49 } 50 51 if (linkenv->disconnect) { 52 smlTrace(TRACE_INTERNAL, "disconnecting link"); 53 OBEX_TransportDisconnect(linkenv->handle); 54 close(linkenv->fd); 55 linkenv->destroy = TRUE; 56 } 57 58 59 if (linkenv->destroy) { 60 smlTrace(TRACE_INTERNAL, "Destroying link %p %p", linkenv, linkenv->link); 61 smlTransportReceiveEvent(linkenv->env->tsp, linkenv->link, SML_TRANSPORT_EVENT_DISCONNECT_DONE, NULL, NULL); 62 smlLinkDeref(linkenv->link); 63 64 OBEX_Cleanup(linkenv->handle); 65 g_free(linkenv); 66 return FALSE; 67 } 51 68 return TRUE; 52 69 } 53 54 static gboolean _fd_prepare(GSource *source, gint *timeout_)55 {56 *timeout_ = 100;57 return FALSE;58 }59 60 static gboolean _fd_check(GSource *source)61 {62 SmlTransportObexServerEnv *env = *((SmlTransportObexServerEnv **)(source + 1));63 fd_set rfds;64 FD_ZERO(&rfds);65 FD_SET(env->fd, &rfds);66 67 struct timeval tv;68 tv.tv_sec = 0;69 tv.tv_usec = 1;70 71 int retval = select(env->fd + 1, &rfds, NULL, NULL, &tv);72 73 if (retval == -1)74 smlTrace(TRACE_ERROR, "%s: Unable to select()", __func__);75 else if (retval)76 return TRUE;77 78 return FALSE;79 }80 81 /**82 * @defgroup GroupIDPrivate Group Description Internals83 * @ingroup ParentGroupID84 * @brief The private part85 *86 */87 /*@{*/88 70 89 71 static void _smlObexEvent(obex_t *handle, obex_object_t *object, int mode, int event, int obex_cmd, int obex_rsp) … … 92 74 SmlLinkObexServerEnv *linkenv = OBEX_GetUserData(handle); 93 75 SmlError *error = NULL; 94 SmlLink *link = NULL;95 76 obex_headerdata_t header; 96 77 uint8_t headertype = 0; … … 99 80 SmlMimeType mimetype = SML_MIMETYPE_UNKNOWN; 100 81 82 if (linkenv->disconnect) { 83 OBEX_ObjectSetRsp(object, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); 84 smlTrace(TRACE_EXIT, "%s: This link was disconnected", __func__); 85 return; 86 } 87 101 88 switch (event) { 102 89 case OBEX_EV_PROGRESS: … … 105 92 case OBEX_EV_REQDONE: 106 93 smlTrace(TRACE_INTERNAL, "Done"); 94 if (obex_cmd == OBEX_CMD_DISCONNECT) { 95 linkenv->destroy = TRUE; 96 } 107 97 break; 108 98 case OBEX_EV_REQHINT: … … 111 101 switch (obex_cmd) { 112 102 case OBEX_CMD_GET: 113 while (!linkenv->send_data) { 114 smlQueueDispatch(linkenv->env->tsp->command_queue); 103 /* At this point we received a get request. If we dont have any data 104 * to send yet, we iterate the main context until the data arrived. */ 105 while (!linkenv->send_data && !linkenv->disconnect) { 106 if (!g_main_context_pending(linkenv->env->tsp->context)) { 107 usleep(100); 108 continue; 109 } 110 smlTrace(TRACE_INTERNAL, "Dispatching command queue since we dont have data to send"); 111 g_main_context_iteration(linkenv->env->tsp->context, TRUE); 112 } 113 114 /* We received a disconnect event so we reply with an error */ 115 if (linkenv->disconnect) { 116 OBEX_ObjectSetRsp(object, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); 117 smlTrace(TRACE_INTERNAL, "Get was aborted"); 118 break; 115 119 } 116 120 case OBEX_CMD_PUT: … … 143 147 break; 144 148 case OBEX_HDR_TYPE:; 145 char *mimetypestr = g_malloc0(len / 2 + 1); 149 char *mimetypestr = g_strndup((char *)header.bs, len); 150 /*char *mimetypestr = g_malloc0(len);// / 2 + 1); 146 151 if (OBEX_UnicodeToChar((unsigned char *)mimetypestr, header.bs, len / 2 + 1) == -1) { 147 152 g_free(mimetypestr); 148 153 smlErrorSet(&error, SML_ERROR_GENERIC, "unable to convert from unicode"); 149 154 goto error; 150 } 155 }*/ 151 156 152 157 smlTrace(TRACE_INTERNAL, "Found type: %s", mimetypestr); … … 212 217 } 213 218 214 link = smlLinkFind(linkenv->env->tsp, linkenv);215 if (!link) {216 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to find link");217 goto error;218 }219 220 smlLinkRef(link);221 222 219 SmlTransportData *tspdata = smlTransportDataNew(body, length, mimetype, TRUE, &error); 223 220 if (!tspdata) 224 221 goto error; 225 222 226 smlTransportReceiveEvent(linkenv->env->tsp, link, SML_TRANSPORT_EVENT_DATA, tspdata, NULL); 223 smlTransportReceiveEvent(linkenv->env->tsp, linkenv->link, SML_TRANSPORT_EVENT_DATA, tspdata, NULL); 224 225 smlTransportDataDeref(tspdata); 227 226 228 227 OBEX_ObjectSetRsp(object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); … … 239 238 break; 240 239 case OBEX_HDR_TYPE:; 241 char *mimetypestr = g_malloc0(len / 2 + 1); 240 char *mimetypestr = g_strndup((char *)header.bs, len); 241 /*char *mimetypestr = g_malloc0(len / 2 + 1); 242 242 if (OBEX_UnicodeToChar((unsigned char *)mimetypestr, header.bs, len / 2 + 1) == -1) { 243 243 g_free(mimetypestr); 244 244 smlErrorSet(&error, SML_ERROR_GENERIC, "unable to convert from unicode"); 245 245 goto error; 246 } 246 }*/ 247 247 248 248 smlTrace(TRACE_INTERNAL, "Found type: %s", mimetypestr); … … 282 282 } 283 283 284 link = smlLinkFind(linkenv->env->tsp, linkenv); 285 if (!link) { 286 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to find link"); 287 goto error; 288 } 289 290 smlLinkRef(link); 284 if (!linkenv->send_data) { 285 smlErrorSet(&error, SML_ERROR_GENERIC, "No data to send"); 286 goto error; 287 } 288 289 if (mimetype != linkenv->send_data->type) { 290 smlErrorSet(&error, SML_ERROR_GENERIC, "Wrong mimetype requested"); 291 goto error; 292 } 291 293 292 294 /* Now the data and size */ … … 332 334 333 335 334 link = smlLinkNew(linkenv->env->tsp, linkenv, &error);335 if (!link )336 goto error; 337 338 smlTransportReceiveEvent(linkenv->env->tsp, link , SML_TRANSPORT_EVENT_CONNECT_DONE, NULL, NULL);336 linkenv->link = smlLinkNew(linkenv->env->tsp, linkenv, &error); 337 if (!linkenv->link) 338 goto error; 339 340 smlTransportReceiveEvent(linkenv->env->tsp, linkenv->link, SML_TRANSPORT_EVENT_CONNECT_DONE, NULL, NULL); 339 341 340 342 OBEX_ObjectSetRsp(object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); … … 344 346 smlTrace(TRACE_INTERNAL, "Got DISCONNECT command"); 345 347 OBEX_ObjectSetRsp(object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); 346 347 link = smlLinkFind(linkenv->env->tsp, linkenv);348 if (!link)349 goto error;350 351 smlLinkRef(link);352 353 smlTransportReceiveEvent(linkenv->env->tsp, link, SML_TRANSPORT_EVENT_DISCONNECT_DONE, NULL, NULL);354 355 348 break; 356 349 default: … … 374 367 error: 375 368 OBEX_ObjectSetRsp(object, OBEX_RSP_BAD_REQUEST, OBEX_RSP_BAD_REQUEST); 376 if (link) 377 smlTransportReceiveEvent(linkenv->env->tsp, link, SML_TRANSPORT_EVENT_ERROR, NULL, error); 369 smlTransportReceiveEvent(linkenv->env->tsp, linkenv->link, SML_TRANSPORT_EVENT_ERROR, NULL, error); 378 370 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 379 371 smlErrorDeref(&error); 380 372 } 381 373 374 /* These function supervise the file descriptor where we are listening for incoming 375 * connections */ 376 static gboolean _fd_prepare(GSource *source, gint *timeout_) 377 { 378 /* There is not need to dispatch this too fast since 379 * it does not influence the transmission of data, only 380 * the connection */ 381 *timeout_ = 50; 382 return FALSE; 383 } 384 385 static gboolean _fd_check(GSource *source) 386 { 387 SmlTransportObexServerEnv *env = *((SmlTransportObexServerEnv **)(source + 1)); 388 fd_set rfds; 389 FD_ZERO(&rfds); 390 FD_SET(env->fd, &rfds); 391 392 struct timeval tv; 393 tv.tv_sec = 0; 394 tv.tv_usec = 1; 395 396 int retval = select(env->fd + 1, &rfds, NULL, NULL, &tv); 397 398 if (retval == -1) 399 smlTrace(TRACE_ERROR, "%s: Unable to select()", __func__); 400 else if (retval) 401 return TRUE; 402 403 return FALSE; 404 } 405 382 406 static gboolean _fd_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) 383 407 { 408 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, source, callback, user_data); 384 409 SmlTransportObexServerEnv *env = user_data; 385 410 SmlError *error = NULL; 386 obex_t *obexhandle = NULL;387 411 388 412 struct sockaddr_in addr; 389 413 memset(&addr, 0, sizeof(addr)); 390 414 socklen_t addrlen = sizeof(addr); 391 415 392 416 smlTrace(TRACE_INTERNAL, "dispatch %i", env->fd); 393 int fd = accept(env->fd, (struct sockaddr *)&addr, &addrlen); 394 smlTrace(TRACE_INTERNAL, "New fs %i", fd); 395 396 if (fd == -1) 397 smlTrace(TRACE_INTERNAL, "error: %s, %i %i", strerror(errno), errno, EINVAL); 398 else { 399 obexhandle = OBEX_Init(OBEX_TRANS_FD, _smlObexEvent, 0); 400 if (!obexhandle) { 401 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to create new handle"); 402 goto error_close_fd; 403 } 404 405 /* Start the obex transport */ 406 if (FdOBEX_TransportSetup(obexhandle, fd, fd, 4096) < 0) { 407 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to setup"); 408 goto error_clean_obex; 409 } 417 418 /* Create the env that handles this link */ 419 SmlLinkObexServerEnv *linkenv = smlTryMalloc0(sizeof(SmlLinkObexServerEnv), &error); 420 if (!linkenv) 421 goto error; 422 linkenv->env = env; 423 424 linkenv->fd = accept(env->fd, (struct sockaddr *)&addr, &addrlen); 425 if (linkenv->fd == -1) { 426 smlErrorSet(&error, SML_ERROR_GENERIC, "error: %s, %i", strerror(errno), errno); 427 goto error_free_env; 428 } 429 smlTrace(TRACE_INTERNAL, "New fs %i", linkenv->fd); 430 431 432 linkenv->handle = OBEX_Init(OBEX_TRANS_FD, _smlObexEvent, 0); 433 if (!linkenv->handle) { 434 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to create new handle"); 435 goto error_close_fd; 436 } 410 437 411 /* Now we create a source that watches the new obex connection */ 412 GSource *idle = g_idle_source_new(); 413 g_source_set_callback(idle, _dispatch_obex, obexhandle, NULL); 414 g_source_attach(idle, env->tsp->context); 415 416 SmlLinkObexServerEnv *linkenv = smlTryMalloc0(sizeof(SmlLinkObexServerEnv), &error); 417 if (!linkenv) 418 goto error_clean_obex; 419 420 /* We first have to add the connection id which we generate for this transport */ 421 linkenv->conid = smlTransportObexServerGenerateId(env); 422 linkenv->handle = obexhandle; 423 linkenv->env = env; 424 425 OBEX_SetUserData(obexhandle, linkenv); 426 427 // Create a buffer that will hold the stream chunks 428 /*env->stream_chunk = smlTryMalloc0(STREAM_CHUNK, error); 429 if (!env->stream_chunk) 430 goto error_close_handle;*/ 431 } 432 438 /* Start the obex transport */ 439 if (FdOBEX_TransportSetup(linkenv->handle, linkenv->fd, linkenv->fd, 4096) < 0) { 440 smlErrorSet(&error, SML_ERROR_GENERIC, "Unable to setup"); 441 goto error_clean_obex; 442 } 443 444 /* Now we create a source that watches the new obex connection */ 445 linkenv->source = g_idle_source_new(); 446 g_source_set_callback(linkenv->source, _dispatch_obex, linkenv, NULL); 447 g_source_attach(linkenv->source, env->tsp->context); 448 449 /* We first have to add the connection id which we generate for this transport */ 450 env->lastConId++; 451 linkenv->conid = env->lastConId; 452 453 OBEX_SetUserData(linkenv->handle, linkenv); 454 455 smlTrace(TRACE_EXIT, "%s", __func__); 433 456 return TRUE; 434 457 435 458 error_clean_obex: 436 OBEX_Cleanup( obexhandle);459 OBEX_Cleanup(linkenv->handle); 437 460 error_close_fd: 438 close(fd); 439 smlTrace(TRACE_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 440 smlErrorDeref(&error); 461 close(linkenv->fd); 462 error_free_env: 463 g_free(linkenv); 464 error: 465 smlTransportReceiveEvent(env->tsp, NULL, SML_TRANSPORT_EVENT_ERROR, NULL, error); 466 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 441 467 return TRUE; 442 468 } … … 516 542 517 543 /* Now we create a source that watches for incoming connection requests */ 518 GSourceFuncs *functions = g_malloc0(sizeof(GSourceFuncs)); 519 functions->prepare = _fd_prepare; 520 functions->check = _fd_check; 521 functions->dispatch = _fd_dispatch; 522 functions->finalize = NULL; 523 524 GSource *source = g_source_new(functions, sizeof(GSource) + sizeof(SmlTransportObexServerEnv *)); 525 SmlTransportObexServerEnv **envptr = (SmlTransportObexServerEnv **)(source + 1); 544 env->functions = smlTryMalloc0(sizeof(GSourceFuncs), error); 545 if (!env->functions) 546 goto error_close_handle; 547 env->functions->prepare = _fd_prepare; 548 env->functions->check = _fd_check; 549 env->functions->dispatch = _fd_dispatch; 550 env->functions->finalize = NULL; 551 552 env->source = g_source_new(env->functions, sizeof(GSource) + sizeof(SmlTransportObexServerEnv *)); 553 SmlTransportObexServerEnv **envptr = (SmlTransportObexServerEnv **)(env->source + 1); 526 554 *envptr = env; 527 g_source_set_callback(source, NULL, env, NULL); 528 env->source = source; 529 env->functions = functions; 530 g_source_attach(source, tsp->context); 555 g_source_set_callback(env->source, NULL, env, NULL); 556 g_source_attach(env->source, tsp->context); 531 557 532 558 … … 535 561 536 562 error_close_handle: 537 // OBEX_Cleanup(env->obexhandle);563 close(env->fd); 538 564 error_free_env: 565 g_free(env->path); 539 566 g_free(env); 540 567 error: … … 551 578 smlAssert(env->tsp); 552 579 580 close(env->fd); 581 g_free(env->functions); 582 g_source_destroy(env->source); 583 g_free(env->path); 584 553 585 g_free(env); 554 586 … … 559 591 static void smlTransportObexServerSend(void *userdata, void *link, SmlTransportData *data, SmlError *error) 560 592 { 561 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, % d, %i, %p)", __func__, userdata, link, data, error);593 smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, userdata, link, data, error); 562 594 smlAssert(data); 563 595 smlAssert(userdata); 564 SmlTransportObexServerEnv *env = userdata;565 596 SmlLinkObexServerEnv *linkenv = link; 566 smlAssert(env);567 smlAssert(linkenv);568 597 569 598 if (error) 570 599 goto error; 571 600 572 601 if (linkenv->send_data) { 573 602 smlErrorSet(&error, SML_ERROR_GENERIC, "We already have waiting data"); 574 603 goto error; 575 604 } 576 605 577 606 linkenv->send_data = data; 578 607 smlTransportDataRef(linkenv->send_data); 608 579 609 smlTrace(TRACE_EXIT, "%s", __func__); 580 610 return; … … 583 613 smlErrorDeref(&error); 584 614 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 615 return; 616 } 617 618 static void smlTransportObexServerDisconnect(void *data, void *linkdata) 619 { 620 smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, data, linkdata); 621 smlAssert(data); 622 smlAssert(linkdata); 623 SmlLinkObexServerEnv *linkenv = linkdata; 624 625 linkenv->disconnect = TRUE; 626 627 smlTrace(TRACE_EXIT, "%s", __func__); 585 628 return; 586 629 } … … 597 640 tsp->functions.finalize = smlTransportObexServerFinalize; 598 641 tsp->functions.send = smlTransportObexServerSend; 642 tsp->functions.disconnect = smlTransportObexServerDisconnect; 599 643 return TRUE; 600 644 } branches/development-branch/libsyncml/transports/obex_server_internals.h
r101 r111 39 39 40 40 typedef struct SmlLinkObexServerEnv { 41 SmlLink *link; 41 42 SmlTransportObexServerEnv *env; 42 43 uint32_t conid; 43 44 obex_t *handle; 44 45 uint8_t *stream_chunk; 45 46 SmlBool busy; 47 SmlErrorType result; 48 char *message; 49 46 int fd; 47 SmlBool destroy; 48 SmlBool disconnect; 50 49 GSource *source; 51 GSourceFuncs *functions;52 50 53 51 SmlTransportData *send_data; branches/development-branch/tests/check_obex.c
r101 r111 98 98 END_TEST 99 99 100 #if 0 100 int client_connect_done = 0; 101 int client_disconnect_done = 0; 102 int client_receives = 0; 103 int client_errors = 0; 104 105 void _recv_client_event(SmlTransport *tsp, SmlLink *link, SmlTransportEventType type, SmlTransportData *data, SmlError *error, void *userdata) 106 { 107 smlTrace(TRACE_ENTRY, "%s()", __func__); 108 109 fail_unless(GPOINTER_TO_INT(userdata) == 1); 110 111 switch (type) { 112 case SML_TRANSPORT_EVENT_CONNECT_DONE: 113
