Changeset 116

Show
Ignore:
Timestamp:
03/16/06 23:35:16 (3 years ago)
Author:
abauer
Message:

Lots of modification regarding memory handling

Optimised the speed

Optimised memory usage

Made libsoup, obex, wbxml optional for the build

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/development-branch/acinclude.m4

    r101 r116  
    3838                AC_SUBST(WBXML_LIBS) 
    3939        fi 
     40         
     41        AM_CONDITIONAL(ENABLE_WBXML, test x$LIBWBXML = xyes) 
    4042         
    4143    CFLAGS="$ac_save_CFLAGS" 
  • branches/development-branch/configure.ac

    r114 r116  
    2424AC_SUBST(LIBXML_LIBS) 
    2525 
    26 #### Check for fixed libsoup #### 
     26#### Check for libsoup #### 
    2727AC_ARG_ENABLE(http, 
    2828  AS_HELP_STRING([--enable-http], [enable http transports]), 
     
    4646        fi 
    4747fi 
    48          
     48AM_CONDITIONAL(ENABLE_HTTP, test x$HAVE_LIBSOUP = xyes) 
     49 
    4950#### Check for openobex #### 
    5051AC_ARG_ENABLE(obex, 
     
    7172        fi 
    7273fi 
     74AM_CONDITIONAL(ENABLE_OBEX, test x$HAVE_OPENOBEX = xyes) 
    7375 
    7476#### Ask if the tools are needed #### 
     
    99101        AC_SUBST(ENABLE_TRACE) 
    100102fi 
     103AM_CONDITIONAL(ENABLE_TRACE, test x$WITH_TRACE = xyes) 
    101104 
    102105#### Check for glib #### 
  • branches/development-branch/libsyncml/objects/sml_devinf_obj.c

    r115 r116  
    255255                goto error; 
    256256         
    257         if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, devinf10, _recv_devinf, NULL, agent, error)) 
    258                 goto error_free_loc; 
    259         if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, devinf11, _recv_devinf, NULL, agent, error)) 
    260                 goto error_free_loc; 
    261                  
    262         if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, devinf10, NULL, _request_devinf, NULL, agent, error)) 
    263                 goto error_free_loc; 
    264         if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, devinf11, NULL, _request_devinf, NULL, agent, error)) 
     257        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, NULL, devinf10, _recv_devinf, NULL, agent, error)) 
     258                goto error_free_loc; 
     259        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_PUT, NULL, NULL, devinf11, _recv_devinf, NULL, agent, error)) 
     260                goto error_free_loc; 
     261                 
     262        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, NULL, devinf10, NULL, _request_devinf, NULL, agent, error)) 
     263                goto error_free_loc; 
     264        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_GET, NULL, devinf11, NULL, _request_devinf, NULL, agent, error)) 
    265265                goto error_free_loc; 
    266266         
  • branches/development-branch/libsyncml/objects/sml_ds_server.c

    r115 r116  
    3636/*@{*/ 
    3737 
    38 typedef struct SmlWriteContext { 
    39         SmlDsSessionWriteCb callback; 
    40         char *uid; 
    41         char *newuid; 
    42         SmlStatus *status; 
    43         void *userdata; 
    44         SmlChangeType type; 
    45         SmlDsSession *session; 
    46 } SmlWriteContext; 
    47  
    48 static void _alert_reply(SmlSession *session, SmlStatus *status, void *userdata) 
    49 { 
    50         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata); 
    51         SmlDsSession *dsession = userdata; 
    52          
    53         if (dsession->sentAlertCallback) 
    54                 dsession->sentAlertCallback(session, status, dsession->sentAlertCallbackUserdata); 
    55          
    56         dsession->sentAlertCallback = NULL; 
    57         dsession->sentAlertCallbackUserdata = NULL; 
    58          
    59         smlTrace(TRACE_EXIT, "%s", __func__); 
    60 } 
    61  
    62 static void _sync_reply(SmlSession *session, SmlStatus *status, void *userdata) 
    63 { 
    64         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata); 
    65         SmlDsSession *dsession = userdata; 
    66          
    67         if (dsession->sentSyncCallback) 
    68                 dsession->sentSyncCallback(session, status, dsession->sentSyncCallbackUserdata); 
    69          
    70         dsession->sentSyncCallback = NULL; 
    71         dsession->sentSyncCallbackUserdata = NULL; 
    72          
    73         smlTrace(TRACE_EXIT, "%s", __func__); 
    74 } 
    75  
    76 void smlDsSessionRecvAlert(SmlSession *session, SmlCommand *cmd, void *userdata) 
    77 { 
    78         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 
    79         SmlDsSession *dsession = userdata; 
    80          
    81         dsession->alertCommand = cmd; 
    82          
    83         dsession->location = smlLocationClone(cmd->target, NULL); 
    84         dsession->target = smlLocationClone(cmd->source, NULL); 
    85          
    86         smlTrace(TRACE_EXIT, "%s", __func__); 
    87 } 
    88  
    8938static SmlWriteContext *_write_context_find(SmlDsSession *dsession, const char *uid, SmlChangeType type) 
    9039{ 
     
    10453} 
    10554 
     55static void _write_context_free(SmlWriteContext *ctx) 
     56{ 
     57        smlTrace(TRACE_ENTRY, "%s(%p)", __func__, ctx); 
     58 
     59        if (ctx->status) 
     60                smlStatusUnref(ctx->status); 
     61         
     62        if (ctx->uid) 
     63                g_free(ctx->uid); 
     64                 
     65        if (ctx->newuid) 
     66                g_free(ctx->newuid); 
     67         
     68        g_free(ctx); 
     69 
     70        smlTrace(TRACE_EXIT, "%s", __func__); 
     71} 
     72 
    10673static void _write_context_dispatch(SmlDsSession *dsession, SmlWriteContext *ctx) 
    10774{ 
     
    11784        if (((ctx->type != SML_CHANGE_ADD || smlStatusGetClass(ctx->status) != SML_ERRORCLASS_SUCCESS) && !ctx->newuid) || dsession->server->servertype == SML_DS_CLIENT) { 
    11885                ctx->callback(dsession, ctx->status, NULL, ctx->userdata); 
    119                 g_free(ctx->uid); 
    120                 g_free(ctx); 
     86                 
     87                _write_context_free(ctx); 
     88                 
    12189                dsession->pendingMaps = g_list_remove(dsession->pendingMaps, ctx); 
    12290                smlTrace(TRACE_EXIT, "%s", __func__); 
     
    13098         
    13199        ctx->callback(dsession, ctx->status, ctx->newuid, ctx->userdata); 
    132         g_free(ctx->uid); 
    133         g_free(ctx->newuid); 
    134         g_free(ctx); 
     100         
     101        _write_context_free(ctx); 
     102                
    135103        dsession->pendingMaps = g_list_remove(dsession->pendingMaps, ctx); 
    136104 
    137105        smlTrace(TRACE_EXIT, "%s: Dispatched add", __func__); 
    138106} 
    139 void smlDsSessionRecvSync(SmlSession *session, SmlCommand *cmd, void *userdata) 
    140 
    141         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 
     107 
     108static void _alert_reply(SmlSession *session, SmlStatus *status, void *userdata) 
     109
     110        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata); 
    142111        SmlDsSession *dsession = userdata; 
    143         SmlError *error = NULL; 
    144          
    145         if (dsession->syncReply == SML_ERROR_UNKNOWN) { 
    146                 smlTrace(TRACE_INTERNAL, "Storing sync command with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 
    147                 dsession->recvSync = g_list_append(dsession->recvSync, cmd); 
    148         } else { 
    149                 smlTrace(TRACE_INTERNAL, "Using stored sync reply on cmd with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 
    150                 SmlStatus *reply = smlCommandNewReply(cmd, dsession->syncReply, &error); 
    151                 if (!reply) 
    152                         goto error; 
    153                  
    154                 if (!smlSessionSendReply(dsession->session, reply, &error)) 
    155                         goto error; 
    156         } 
    157  
    158         smlTrace(TRACE_EXIT, "%s", __func__); 
    159         return; 
    160          
    161 error: 
    162         smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 
    163         smlErrorDeref(&error); 
    164 
    165  
    166 void smlDsSessionRecvChange(SmlSession *session, SmlCommand *cmd, void *userdata) 
    167 
    168         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, session, cmd, userdata); 
     112         
     113        if (dsession->sentAlertCallback) 
     114                dsession->sentAlertCallback(session, status, dsession->sentAlertCallbackUserdata); 
     115         
     116        dsession->sentAlertCallback = NULL; 
     117        dsession->sentAlertCallbackUserdata = NULL; 
     118         
     119        smlTrace(TRACE_EXIT, "%s", __func__); 
     120
     121 
     122static void _sync_reply(SmlSession *session, SmlStatus *status, void *userdata) 
     123
     124        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata); 
    169125        SmlDsSession *dsession = userdata; 
    170126         
    171         g_mutex_lock(dsession->lock); 
    172         dsession->recvChanges = g_list_append(dsession->recvChanges, cmd); 
    173         g_mutex_unlock(dsession->lock); 
     127        if (dsession->sentSyncCallback) 
     128                dsession->sentSyncCallback(session, status, dsession->sentSyncCallbackUserdata); 
     129         
     130        dsession->sentSyncCallback = NULL; 
     131        dsession->sentSyncCallbackUserdata = NULL; 
    174132         
    175133        smlTrace(TRACE_EXIT, "%s", __func__); 
     
    197155         
    198156        ctx->status = status; 
     157        smlStatusRef(status); 
    199158        _write_context_dispatch(dsession, ctx); 
    200159         
    201160        smlTrace(TRACE_EXIT, "%s", __func__); 
    202 } 
    203  
    204 void smlDsSessionRecvMap(SmlSession *session, SmlCommand *cmd, void *userdata) 
    205 { 
    206         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 
    207         SmlDsSession *dsession = userdata; 
    208         SmlError *error = NULL; 
    209          
    210         SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error); 
    211         if (!reply) 
    212                 goto error; 
    213          
    214         if (!smlSessionSendReply(session, reply, &error)) 
    215                 goto error; 
    216          
    217         GList *m = NULL; 
    218         for (m = cmd->private.map.items; m; m = m->next) { 
    219                 SmlMapItem *item = m->data; 
    220                 SmlWriteContext *ctx = _write_context_find(dsession, item->target->locURI, SML_CHANGE_ADD); 
    221                 if (ctx) { 
    222                         ctx->newuid = g_strdup(item->source->locURI); 
    223                         _write_context_dispatch(dsession, ctx); 
    224                 } 
    225         } 
    226          
    227         smlTrace(TRACE_EXIT, "%s", __func__); 
    228         return; 
    229          
    230 error: 
    231         smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 
    232         smlErrorDeref(&error); 
    233 } 
    234  
    235 SmlDsSession *smlDsServerRecvAlert(SmlDsServer *server, SmlSession *session, SmlCommand *cmd) 
    236 { 
    237         smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, server, session, cmd); 
    238         SmlError *error = NULL; 
    239          
    240         server->target = smlLocationClone(session->target, &error); 
    241         if (!server->target) 
    242                 goto error; 
    243          
    244         SmlDsSession *dsession = smlDsSessionNew(server, session, &error); 
    245         if (!dsession) 
    246                 goto error_free_target; 
    247          
    248         smlDsSessionRecvAlert(session, cmd, dsession); 
    249          
    250         if (server->connectCallback) 
    251                 server->connectCallback(dsession, server->connectCallbackUserdata); 
    252          
    253         server->target = smlLocationClone(cmd->source, &error); 
    254         if (!server->target) 
    255                 goto error_free_dsession; 
    256          
    257         smlTrace(TRACE_EXIT, "%s", __func__); 
    258         return dsession; 
    259  
    260 error_free_dsession: 
    261         g_free(dsession); 
    262 error_free_target: 
    263         smlLocationUnref(server->target); 
    264 error: 
    265         smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 
    266         smlErrorDeref(&error); 
    267         return NULL; 
    268161} 
    269162 
     
    287180                goto error; 
    288181 
    289         server->location = smlLocationClone(location, error); 
    290         if (!server->location) 
    291                 goto error_free_server; 
     182        server->location = location; 
     183        smlLocationRef(location); 
    292184 
    293185        server->contenttype = type; 
     
    297189        return server; 
    298190 
    299 error_free_server: 
    300         g_free(server); 
    301191error: 
    302192        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
     
    314204                goto error; 
    315205 
    316         server->location = smlLocationClone(location, error); 
    317         if (!server->location) 
    318                 goto error_free_server; 
    319  
    320         server->target = smlLocationClone(target, error); 
    321         if (!server->target) 
    322                 goto error_free_location; 
     206        server->location = location; 
     207        smlLocationRef(location); 
     208         
     209        server->target = target; 
     210        smlLocationRef(target); 
    323211 
    324212        server->contenttype = type; 
     
    328216        return server; 
    329217 
    330 error_free_location: 
    331         smlLocationUnref(server->location); 
    332 error_free_server: 
    333         g_free(server); 
    334218error: 
    335219        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error)); 
     
    344228        if (server->location) 
    345229                smlLocationUnref(server->location); 
     230                 
     231        if (server->target) 
     232                smlLocationUnref(server->target); 
    346233         
    347234        g_free(server); 
     
    401288} 
    402289 
     290SmlDsSession *smlDsServerRecvAlert(SmlDsServer *server, SmlSession *session, SmlCommand *cmd) 
     291{ 
     292        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, server, session, cmd); 
     293        SmlError *error = NULL; 
     294         
     295        SmlDsSession *dsession = smlDsSessionNew(server, session, &error); 
     296        if (!dsession) 
     297                goto error; 
     298         
     299        smlDsSessionRecvAlert(session, cmd, dsession); 
     300         
     301        if (server->connectCallback) 
     302                server->connectCallback(dsession, server->connectCallbackUserdata); 
     303         
     304        smlDsSessionUnref(dsession); 
     305         
     306        smlTrace(TRACE_EXIT, "%s", __func__); 
     307        return dsession; 
     308 
     309error: 
     310        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 
     311        smlErrorDeref(&error); 
     312        return NULL; 
     313} 
     314 
    403315SmlDsSession *smlDsServerSendAlert(SmlDsServer *server, SmlSession *session, SmlAlertType type, const char *last, const char *next, SmlStatusReplyCb callback, void *userdata, SmlError **error) 
    404316{ 
     
    411323                goto error; 
    412324         
    413         server->target = smlLocationClone(session->target, error); 
    414         if (!server->target) 
     325        if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, error)) 
    415326                goto error_free_session; 
    416327         
    417         if (!smlDsSessionSendAlert(dsession, type, last, next, callback, userdata, error)) 
    418                 goto error_free_target; 
    419          
    420328        smlTrace(TRACE_EXIT, "%s", __func__); 
    421329        return dsession; 
    422330 
    423 error_free_target: 
    424         smlLocationUnref(server->target); 
    425331error_free_session: 
    426332        g_free(dsession); 
     
    443349        dsession->lock = g_mutex_new(); 
    444350        dsession->syncReply = SML_ERROR_UNKNOWN; 
     351        dsession->refCount = 1; 
     352         
     353        if (server->servertype == SML_DS_CLIENT) { 
     354                dsession->target = server->target; 
     355                smlLocationRef(dsession->target); 
     356        } 
     357         
     358        dsession->location = server->location; 
     359        smlLocationRef(dsession->location); 
    445360         
    446361        smlTrace(TRACE_EXIT, "%s: %p", __func__, dsession); 
     
    452367} 
    453368 
    454 void smlDsSessionFree(SmlDsSession *dsession) 
     369void smlDsSessionRef(SmlDsSession *dsession) 
    455370{ 
    456371        smlTrace(TRACE_ENTRY, "%s(%p)", __func__, dsession); 
    457372        smlAssert(dsession); 
    458373         
    459         g_mutex_free(dsession->lock); 
    460         g_free(dsession); 
    461          
    462         smlTrace(TRACE_EXIT, "%s", __func__);    
     374        g_atomic_int_inc(&(dsession->refCount)); 
     375         
     376        smlTrace(TRACE_EXIT, "%s: New refcount: %i", __func__, dsession->refCount); 
     377
     378 
     379void smlDsSessionUnref(SmlDsSession *dsession) 
     380
     381        smlTrace(TRACE_ENTRY, "%s(%p)", __func__, dsession); 
     382        smlAssert(dsession); 
     383         
     384        if (g_atomic_int_dec_and_test(&(dsession->refCount))) { 
     385                smlTrace(TRACE_INTERNAL, "Refcount == 0!"); 
     386                 
     387                if (dsession->target) 
     388                        smlLocationUnref(dsession->target); 
     389                         
     390                if (dsession->location) 
     391                        smlLocationUnref(dsession->location); 
     392                 
     393                if (dsession->alertCommand) 
     394                        smlCommandUnref(dsession->alertCommand); 
     395                 
     396                while (dsession->recvSync) { 
     397                        SmlCommand *cmd = dsession->recvSync->data; 
     398                        smlCommandUnref(cmd); 
     399                        dsession->recvSync = g_list_delete_link(dsession->recvSync, dsession->recvSync); 
     400                } 
     401                 
     402                while (dsession->recvChanges) { 
     403                        SmlCommand *cmd = dsession->recvChanges->data; 
     404                        smlCommandUnref(cmd); 
     405                        dsession->recvChanges = g_list_delete_link(dsession->recvChanges, dsession->recvChanges); 
     406                } 
     407                 
     408                if (dsession->syncCommand) 
     409                        smlCommandUnref(dsession->syncCommand); 
     410                 
     411                while (dsession->pendingMaps) { 
     412                        SmlWriteContext *ctx = dsession->pendingMaps->data; 
     413                        _write_context_free(ctx); 
     414                        dsession->pendingMaps = g_list_delete_link(dsession->pendingMaps, dsession->pendingMaps); 
     415                } 
     416                 
     417                 
     418                while (dsession->mapItems) { 
     419                        SmlMapItem *item = dsession->mapItems->data; 
     420                        smlMapItemUnref(item); 
     421                        dsession->mapItems = g_list_delete_link(dsession->mapItems, dsession->mapItems); 
     422                } 
     423                 
     424                g_mutex_free(dsession->lock); 
     425                 
     426                g_free(dsession); 
     427        } 
     428         
     429        smlTrace(TRACE_EXIT, "%s", __func__); 
    463430} 
    464431 
     
    470437        if (dsession->alertCommand && dsession->recvAlertCallback) { 
    471438                smlTrace(TRACE_ENTRY, "%s(%p): Dispatching alert", __func__, dsession); 
     439                 
     440                g_mutex_lock(dsession->lock); 
    472441                SmlErrorType type = SML_NO_ERROR; 
    473442                if (!dsession->recvAlertCallback(dsession, dsession->alertCommand->private.alert.type, dsession->alertCommand->private.alert.anchor->last, dsession->alertCommand->private.alert.anchor->next, dsession->recvAlertCallbackUserdata)) 
     
    481450                if (!smlSessionSendReply(dsession->session, reply, &error)) 
    482451                        goto error; 
    483                          
     452                 
     453                 
     454                smlStatusUnref(reply); 
     455                 
     456                smlCommandUnref(dsession->alertCommand); 
    484457                dsession->alertCommand = NULL; 
    485458 
     459                g_mutex_unlock(dsession->lock); 
    486460                smlTrace(TRACE_EXIT, "%s", __func__); 
    487461        } else if (dsession->recvSync && dsession->recvSyncCallback) { 
    488462                smlTrace(TRACE_ENTRY, "%s(%p): Dispatching sync", __func__, dsession); 
    489463                 
     464                g_mutex_lock(dsession->lock); 
    490465                dsession->recvSyncCallback(dsession, ((SmlCommand *)(dsession->recvSync->data))->private.sync.numChanged, dsession->changesCallbackUserdata); 
    491466                dsession->recvSyncCallback = NULL; 
    492467                 
    493                 GList *c = NULL; 
    494                 for (c = dsession->recvSync; c; c = c->next) { 
    495                         SmlCommand *cmd = (SmlCommand *)(c->data); 
     468                while (dsession->recvSync) { 
     469                       SmlCommand *cmd = dsession->recvSync->data; 
     470                         
    496471                        smlTrace(TRACE_INTERNAL, "answering sync command with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 
    497472                        SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error); 
     
    501476                        if (!smlSessionSendReply(dsession->session, reply, &error)) 
    502477                                goto error; 
     478                                 
     479                        smlStatusUnref(reply); 
     480                         
     481                        smlCommandUnref(cmd); 
     482                        dsession->recvSync = g_list_delete_link(dsession->recvSync, dsession->recvSync); 
    503483                } 
    504484                 
    505485                dsession->syncReply = SML_NO_ERROR; 
    506486                 
    507                 g_list_free(dsession->recvSync); 
    508                 dsession->recvSync = NULL; 
    509                  
     487                g_mutex_unlock(dsession->lock); 
    510488                smlTrace(TRACE_EXIT, "%s", __func__); 
    511489        } else if (dsession->recvChanges && dsession->changesCallback) { 
     
    520498                                if (!item || (!item->source && !item->target)) { 
    521499                                        smlErrorSet(&error, SML_ERROR_GENERIC, "No item"); 
    522                                         goto error_unlock
     500                                        goto error
    523501                                } 
    524502                                 
     
    527505                                 * source uri. This has then to be translated by the sync engine of course */ 
    528506                                if (!dsession->changesCallback(dsession, cmd->private.change.type, item->target ? item->target->locURI : item->source->locURI, item->data, item->size, item->contenttype, dsession->changesCallbackUserdata, &error)) 
    529                                         goto error_unlock
     507                                        goto error
    530508                                                 
    531509                                if (cmd->private.change.type == SML_CHANGE_ADD) 
     
    535513                                 
    536514                                if (!reply) 
    537                                         goto error_unlock
     515                                        goto error
    538516                                 
    539517                                if (!smlSessionSendReply(dsession->session, reply, &error)) 
    540                                         goto error_unlock; 
     518                                        goto error; 
     519                                         
     520                                smlStatusUnref(reply); 
     521                         
     522                                smlCommandUnref(cmd); 
    541523                        } 
    542524                         
     525                         
    543526                        dsession->recvChanges = g_list_delete_link(dsession->recvChanges, dsession->recvChanges); 
    544527                } 
     
    550533        return; 
    551534 
    552 error_unlock: 
    553         g_mutex_unlock(dsession->lock); 
    554535error: 
    555536        if (reply) 
    556537                smlStatusUnref(reply); 
     538        g_mutex_unlock(dsession->lock); 
    557539        smlTrace(TRACE_EXIT_ERROR, "%s: Unable to dispatch: %s", __func__, smlErrorPrint(&error)); 
    558540        smlErrorDeref(&error); 
     
    566548                return TRUE; 
    567549        return FALSE; 
     550} 
     551 
     552void smlDsSessionRecvAlert(SmlSession *session, SmlCommand *cmd, void *userdata) 
     553{ 
     554        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 
     555        SmlDsSession *dsession = userdata; 
     556        SmlError *error = NULL; 
     557        smlAssert(dsession->location); 
     558         
     559        g_mutex_lock(dsession->lock); 
     560         
     561        if (!cmd->target || !cmd->source) { 
     562                SmlStatus *reply = smlCommandNewReply(cmd, SML_ERROR_BAD_REQUEST, &error); 
     563                if (!reply) 
     564                        goto error; 
     565                 
     566                if (!smlSessionSendReply(session, reply, &error)) { 
     567                        smlStatusUnref(reply); 
     568                        goto error; 
     569                } 
     570                 
     571                smlStatusUnref(reply); 
     572                         
     573                smlTrace(TRACE_EXIT, "%s: Alert had no target or source", __func__); 
     574                return; 
     575        } 
     576         
     577        if (!smlLocationCompare(NULL, dsession->location, NULL, cmd->target)) { 
     578                SmlStatus *reply = smlCommandNewReply(cmd, SML_ERROR_NOT_FOUND, &error); 
     579                if (!reply) 
     580                        goto error; 
     581                 
     582                if (!smlSessionSendReply(session, reply, &error)) { 
     583                        smlStatusUnref(reply); 
     584                        goto error; 
     585                } 
     586                 
     587                smlStatusUnref(reply); 
     588                 
     589                smlTrace(TRACE_EXIT, "%s: Alert does not match our location", __func__); 
     590                return; 
     591        } 
     592         
     593        smlCommandRef(cmd); 
     594         
     595        if (!dsession->target) { 
     596                dsession->target = cmd->source; 
     597                smlLocationRef(cmd->source); 
     598        } 
     599         
     600        dsession->alertCommand = cmd; 
     601         
     602        g_mutex_unlock(dsession->lock); 
     603         
     604        smlTrace(TRACE_EXIT, "%s", __func__); 
     605        return; 
     606 
     607error: 
     608        g_mutex_unlock(dsession->lock); 
     609        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 
     610        smlErrorDeref(&error); 
     611        return; 
     612} 
     613 
     614void smlDsSessionRecvSync(SmlSession *session, SmlCommand *cmd, void *userdata) 
     615{ 
     616        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 
     617        SmlDsSession *dsession = userdata; 
     618        SmlError *error = NULL; 
     619         
     620        g_mutex_lock(dsession->lock); 
     621        if (dsession->syncReply == SML_ERROR_UNKNOWN) { 
     622                smlTrace(TRACE_INTERNAL, "Storing sync command with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 
     623                smlCommandRef(cmd); 
     624                dsession->recvSync = g_list_append(dsession->recvSync, cmd); 
     625        } else { 
     626                smlTrace(TRACE_INTERNAL, "Using stored sync reply on cmd with cmdRef %i and msgRef %i", cmd->cmdID, cmd->msgID); 
     627                SmlStatus *reply = smlCommandNewReply(cmd, dsession->syncReply, &error); 
     628                if (!reply) 
     629                        goto error; 
     630                 
     631                if (!smlSessionSendReply(dsession->session, reply, &error)) 
     632                        goto error; 
     633                 
     634                smlStatusUnref(reply); 
     635        } 
     636        g_mutex_unlock(dsession->lock); 
     637 
     638        smlTrace(TRACE_EXIT, "%s", __func__); 
     639        return; 
     640         
     641error: 
     642        g_mutex_unlock(dsession->lock); 
     643        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 
     644        smlErrorDeref(&error); 
     645} 
     646 
     647void smlDsSessionRecvChange(SmlSession *session, SmlCommand *cmd, void *userdata) 
     648{ 
     649        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 
     650        SmlDsSession *dsession = userdata; 
     651         
     652        g_mutex_lock(dsession->lock); 
     653        dsession->recvChanges = g_list_append(dsession->recvChanges, cmd); 
     654        smlCommandRef(cmd); 
     655        g_mutex_unlock(dsession->lock); 
     656         
     657        smlTrace(TRACE_EXIT, "%s", __func__); 
     658} 
     659 
     660void smlDsSessionRecvMap(SmlSession *session, SmlCommand *cmd, void *userdata) 
     661{ 
     662        smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, cmd, userdata); 
     663        SmlDsSession *dsession = userdata; 
     664        SmlError *error = NULL; 
     665         
     666        g_mutex_lock(dsession->lock); 
     667         
     668        SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, &error); 
     669        if (!reply) 
     670                goto error; 
     671         
     672        if (!smlSessionSendReply(session, reply, &error)) 
     673                goto error; 
     674         
     675        smlStatusUnref(reply); 
     676         
     677        GList *m = NULL; 
     678        for (m = cmd->private.map.items; m; m = m->next) { 
     679                SmlMapItem *item = m->data; 
     680                SmlWriteContext *ctx = _write_context_find(dsession, item->target->locURI, SML_CHANGE_ADD); 
     681                if (ctx) { 
     682                        ctx->newuid = g_strdup(item->source->locURI); 
     683                        _write_context_dispatch(dsession, ctx); 
     684                } 
     685        } 
     686         
     687        g_mutex_unlock(dsession->lock); 
     688         
     689        smlTrace(TRACE_EXIT, "%s", __func__); 
     690        return; 
     691         
     692error: 
     693        g_mutex_unlock(dsession->lock); 
     694        smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(&error)); 
     695        smlErrorDeref(&error); 
    568696} 
    569697 
     
    620748        if (!smlSessionSendCommand(dsession->session, alert, NULL, _alert_reply, dsession, error)) 
    621749                goto error; 
     750         
     751        smlCommandUnref(alert); 
    622752         
    623753        smlTrace(TRACE_EXIT, "%s", __func__); 
     
    695825        dsession->sentSyncCallbackUserdata = userdata; 
    696826         
    697         dsession->syncCommand = smlCommandNewSync(dsession->server->target, dsession->server->location, num_changes, error); 
     827        dsession->syncCommand = smlCommandNewSync(dsession->target, dsession->location, num_changes, error); 
    698828        if (!dsession->syncCommand) 
    699829                goto error; 
     
    740870                goto error_free_ctx; 
    741871         
     872        smlCommandUnref(cmd); 
     873         
    742874        smlTrace(TRACE_EXIT, "%s", __func__); 
    743875        return TRUE; 
     
    772904                goto error; 
    773905         
     906        smlCommandUnref(dsession->syncCommand); 
    774907        dsession->syncCommand = NULL; 
    775908         
     
    828961                if (!smlCommandAddMapItem(cmd, item, error)) 
    829962                        goto error_free_cmd; 
     963                smlMapItemUnref(item); 
    830964                 
    831965                dsession->mapItems = g_list_remove(dsession->mapItems, item); 
     
    834968        if (!smlSessionSendCommand(dsession->session, cmd, NULL, callback, userdata, error)) 
    835969                goto error_free_cmd; 
     970         
     971        smlCommandUnref(cmd); 
    836972         
    837973        smlTrace(TRACE_EXIT, "%s", __func__); 
     
    8671003                goto error; 
    8681004         
    869         if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_SYNC, server->location, NULL, smlDsSessionRecvSync, smlDsSessionRecvChange, dsession, &error)) 
     1005        if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_SYNC, session, server->location, NULL, smlDsSessionRecvSync, smlDsSessionRecvChange, dsession, &error)) 
    8701006                goto error_free_dsession; 
    8711007         
    872         if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_MAP, server->location, NULL, smlDsSessionRecvMap, NULL, dsession, &error)) 
     1008        if (!smlManagerObjectRegister(server->manager, SML_COMMAND_TYPE_MAP, session, server->location, NULL, smlDsSessionRecvMap, NULL, dsession, &error)) 
    8731009                goto error_free_dsession; 
    8741010         
     
    8901026        smlAssert(manager); 
    8911027         
    892         if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_ALERT, server->location, NULL, _recv_manager_alert, NULL, server, error)) 
     1028        if (!smlManagerObjectRegister(manager, SML_COMMAND_TYPE_ALERT, NULL, server->location, NULL, _recv_manager_alert, NULL, server, error)) 
    8931029                goto error; 
    8941030         
  • branches/development-branch/libsyncml/objects/sml_ds_server.h

    r101