24 #include "syncml_internals.h"
25 #include "sml_error_internals.h"
26 #include "sml_manager_internals.h"
27 #include "sml_transport_internals.h"
28 #include "sml_command_internals.h"
29 #include "sml_elements_internals.h"
30 #include "sml_session_internals.h"
35 unsigned int finalLock;
48 const char* contentType);
56 for (s = manager->sessions; s; s = s->next) {
58 if (sess->session == session)
68 smlSessionUnref(sess->session);
71 smlLinkDeref(sess->link);
73 while (sess->objects) {
75 smlManagerObjectFree(
object);
76 sess->objects = g_list_delete_link(sess->objects, sess->objects);
79 smlSafeFree((gpointer *)&sess);
82 static gboolean _manager_prepare_internal(GSource *source, gint *timeout_)
84 smlTrace(TRACE_INTERNAL,
"%s(%p, %p)", __func__, source, timeout_);
89 static gboolean _manager_check_internal(GSource *source)
93 for (s = manager->sessions; s; s = s->next) {
95 if (smlSessionCheck(session->session))
101 static gboolean _manager_dispatch_internal(GSource *source, GSourceFunc callback, gpointer user_data)
103 smlTrace(TRACE_INTERNAL,
"%s(%p, %p, %p)", __func__, source, callback, user_data);
108 for (s = manager->sessions; s; s = s->next) {
110 while (smlSessionCheck(session->session) && max) {
117 if (smlSessionTryLock(session->session))
119 smlSessionDispatch(session->session);
120 smlSessionUnlock(session->session);
131 smlTrace(TRACE_ENTRY,
"%s(%p, %i, %p, %p, %p, %p)", __func__, manager, type, session, command, parent, error);
139 event->session = session;
140 smlSessionRef(session);
142 event->session = NULL;
146 event->command = command;
147 smlCommandRef(command);
149 event->command = NULL;
153 event->parent = parent;
154 smlCommandRef(parent);
156 event->parent = NULL;
160 event->error = error;
168 smlErrorDeref(&lerr);
171 smlTrace(TRACE_EXIT,
"%s", __func__);
176 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__, event);
180 smlSessionUnref(event->session);
183 smlCommandUnref(event->command);
186 smlCommandUnref(event->parent);
189 smlErrorDeref(&(event->error));
191 smlSafeFree((gpointer *)&event);
193 smlTrace(TRACE_EXIT,
"%s", __func__);
200 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %i, %p, %p, %p)", __func__, tsp, link_, type, data, error, userdata);
210 case SML_TRANSPORT_EVENT_CONNECT_DONE:
212 _smlManagerSendEvent(manager, SML_MANAGER_CONNECT_DONE, NULL, NULL, NULL, NULL);
214 case SML_TRANSPORT_EVENT_DISCONNECT_DONE:
216 _smlManagerSendEvent(manager, SML_MANAGER_DISCONNECT_DONE, NULL, NULL, NULL, NULL);
218 case SML_TRANSPORT_EVENT_DATA:
224 smlParserSetManager(parser, manager);
228 goto error_free_parser;
234 goto error_free_parser;
237 session = smlManagerSessionFind(manager, header->sessionID);
241 SmlSessionType sessionType;
242 switch(smlTransportGetType(tsp))
244 case SML_TRANSPORT_OBEX_CLIENT:
248 sessionType = SML_SESSION_TYPE_SERVER;
250 case SML_TRANSPORT_OBEX_SERVER:
251 sessionType = SML_SESSION_TYPE_CLIENT;
253 case SML_TRANSPORT_HTTP_SERVER:
254 sessionType = SML_SESSION_TYPE_SERVER;
258 SML_ERROR_NOT_IMPLEMENTED,
259 "New session was unexpectedly received for transport %d.",
260 smlTransportGetType(tsp));
261 goto error_free_header;
265 sessionType, data->type,
266 header->version, header->protocol,
267 header->source, header->target,
268 header->sessionID, 1, &locerror)))
269 goto error_free_header;
272 char *responseURI = smlTransportGetResponseURI(link_, session, &locerror);
273 if (!responseURI && locerror)
274 goto error_free_header;
277 if (!smlSessionSetResponseURI(session, responseURI, &locerror))
279 smlSafeCFree(&responseURI);
280 goto error_free_header;
282 smlSafeCFree(&responseURI);
285 if (!smlManagerSessionAdd(manager, session, link_, &locerror))
286 goto error_free_header;
287 smlSessionUnref(session);
293 char *responseUri = smlTransportGetResponseURI(link_, session, &locerror);
294 if (!responseUri && locerror) {
295 goto error_free_header;
298 smlSafeCFree(&responseUri);
308 smlSessionLock(session);
316 for (s = manager->sessions; s; s = s->next) {
318 if (sess->session == session) {
320 smlLinkDeref(sess->link);
323 smlLinkRef(sess->link);
329 if (!smlSessionReceiveHeader(session, header, &locerror))
330 goto error_free_header;
333 if (!smlManagerDispatchHeader(manager, session, header, cred, &locerror))
334 goto error_free_header;
336 smlHeaderFree(header);
341 if (!smlSessionReceiveBody(session, parser, &locerror))
342 goto error_free_parser;
348 smlSessionUnlock(session);
351 case SML_TRANSPORT_EVENT_ERROR:
354 goto transport_error;
358 smlTrace(TRACE_EXIT,
"%s", __func__);
363 smlHeaderFree(header);
369 smlSessionUnlock(session);
371 if (session == NULL && link_ && type == SML_TRANSPORT_EVENT_DATA) {
379 if (!smlTransportDisconnect(manager->transport, link_, &herror)) {
380 smlTrace(TRACE_ERROR,
"%s: Disconnect on error failed. %s",
382 smlErrorDeref(&herror);
385 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_ERROR, session, NULL, NULL, locerror);
387 smlErrorDeref(&locerror);
391 _smlManagerSendEvent(manager, SML_MANAGER_TRANSPORT_ERROR, NULL, NULL, NULL, locerror);
393 smlErrorDeref(&locerror);
399 smlTrace(TRACE_ENTRY,
"%s(%p, %p)", __func__, tsp, error);
407 smlTransportSetEventCallback(tsp, _smlManagerDataHandler, manager);
408 manager->transport = tsp;
410 manager->running_mutex = g_mutex_new();
411 manager->running = g_cond_new();
414 if (!manager->userEventQueue)
415 goto error_free_manager;
417 smlTrace(TRACE_EXIT,
"%s", __func__);
421 smlSafeFree((gpointer *)&manager);
429 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__, manager);
433 if (manager->context)
440 if (manager->transport)
441 smlTransportSetEventCallback(manager->transport, NULL, NULL);
443 while (manager->sessions) {
446 _manager_session_free(sess);
448 manager->sessions = g_list_delete_link(manager->sessions, manager->sessions);
451 while (manager->objects) {
452 SmlObject *
object = manager->objects->data;
454 smlManagerObjectFree(
object);
455 manager->objects = g_list_remove(manager->objects,
object);
458 if (manager->userEventQueue) {
460 while ((event = smlQueueTryPop(manager->userEventQueue)))
461 _smlManagerEventFree(event);
463 smlQueueFree(manager->userEventQueue);
464 manager->userEventQueue = NULL;
467 g_cond_free(manager->running);
468 g_mutex_free(manager->running_mutex);
470 smlSafeFree((gpointer *)&manager);
472 smlTrace(TRACE_EXIT,
"%s", __func__);
475 void smlManagerSetEventCallback(
SmlManager *manager, SmlManagerEventCb callback,
void *userdata)
480 manager->eventCallback = callback;
481 manager->eventCallbackUserdata = userdata;
486 smlTrace(TRACE_ENTRY,
"%s(%p, %p)", __func__, manager, error);
490 manager->context = g_main_context_new();
491 if (!manager->context) {
493 "Cannot create new main context.");
497 manager->functions =
smlTryMalloc0(
sizeof(GSourceFuncs), error);
498 if (!manager->functions)
501 manager->functions->prepare = _manager_prepare_internal;
502 manager->functions->check = _manager_check_internal;
503 manager->functions->dispatch = _manager_dispatch_internal;
504 manager->functions->finalize = NULL;
506 manager->thread = smlThreadNew(manager->context, error);
507 if (!manager->thread)
509 smlThreadStart(manager->thread);
511 manager->source = g_source_new(manager->functions,
sizeof(GSource) +
sizeof(
SmlManager *));
513 *managerptr = manager;
514 g_source_set_callback(manager->source, NULL, manager, NULL);
515 g_source_attach(manager->source, manager->context);
517 smlTrace(TRACE_EXIT,
"%s", __func__);
521 if (manager->context) {
522 g_main_context_unref(manager->context);
523 manager->context = NULL;
525 if (manager->functions)
526 smlSafeFree((gpointer *)&(manager->functions));
567 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__, manager);
569 smlAssert(manager->thread);
576 smlThreadStop(manager->thread);
577 smlThreadFree(manager->thread);
578 manager->thread = NULL;
580 g_source_unref(manager->source);
581 manager->source = NULL;
583 g_main_context_unref(manager->context);
584 manager->context = NULL;
586 smlSafeFree((gpointer *)&(manager->functions));
587 manager->functions = NULL;
591 GList *sessionItem = manager->sessions;
592 while (sessionItem) {
605 if (manager->transport->connected &&
606 (!sess->link || sess->link->link_data) &&
607 !smlTransportDisconnect(manager->transport, sess->link, &error)) {
608 g_warning(
"Errors from the transport layer " \
609 "cannot be handled while freeing the manager. %s",
611 smlErrorDeref(&error);
614 sessionItem = g_list_next(sessionItem);
617 smlTrace(TRACE_EXIT,
"%s", __func__);
623 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__, manager);
626 g_mutex_lock(manager->running_mutex);
627 g_cond_wait(manager->running, manager->running_mutex);
628 g_mutex_unlock(manager->running_mutex);
630 smlTrace(TRACE_EXIT,
"%s", __func__);
635 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__, manager);
638 g_mutex_lock(manager->running_mutex);
639 g_cond_signal(manager->running);
640 g_mutex_unlock(manager->running_mutex);
642 smlTrace(TRACE_EXIT,
"%s", __func__);
647 smlTrace(TRACE_ENTRY,
"%s(%p, %s)", __func__, manager, VA_STRING(sessionID));
649 for (s = manager->sessions; s; s = s->next) {
651 if (!strcmp(smlSessionGetSessionID(session->session), sessionID)) {
652 smlTrace(TRACE_EXIT,
"%s: FOUND %p", __func__, session);
653 return session->session;
657 smlTrace(TRACE_EXIT,
"%s: NOT FOUND", __func__);
663 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__, manager);
666 while ((event = smlQueueTryPop(manager->userEventQueue))) {
667 smlTrace(TRACE_INTERNAL,
"%s: type ::= %d", __func__, event->type);
669 if (event->session != NULL &&
670 event->type == SML_MANAGER_SESSION_FINAL)
672 managerSession *sess = _smlManagerGetManagerSession(manager, event->session);
673 if (sess && sess->finalLock)
675 smlTrace(TRACE_INTERNAL,
"%s - locked final (%i)",
676 __func__, sess->finalLock);
677 smlQueuePushHead(manager->userEventQueue, event);
688 smlAssert(manager->eventCallback);
689 manager->eventCallback(manager, event->type, event->session, event->error, manager->eventCallbackUserdata);
690 _smlManagerEventFree(event);
692 smlTrace(TRACE_EXIT,
"%s", __func__);
697 return smlQueueCheck(manager->userEventQueue);
702 smlTrace(TRACE_ENTRY,
"%s(%p, %i, %p, %p, %p, %p, %p)", __func__, session, type, command, parent, reply, error, userdata);
707 case SML_SESSION_EVENT_ESTABLISHED:
709 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_ESTABLISHED, session, NULL, NULL, NULL);
711 case SML_SESSION_EVENT_HEADER_REPLY:
713 case SML_SESSION_EVENT_RESPONSE_URI:
716 smlLocationGetURI(smlSessionGetTarget(session)),
719 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_ERROR, session, NULL, NULL, locerror);
723 case SML_SESSION_EVENT_COMMAND_START:
724 case SML_SESSION_EVENT_COMMAND_END:
725 if (!smlManagerDispatchCommand(manager, session, command, &locerror)) {
726 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_WARNING, session, NULL, NULL, locerror);
730 case SML_SESSION_EVENT_CHILD_COMMAND:
731 if (!smlManagerDispatchChildCommand(manager, session, parent, command, &locerror)) {
732 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_WARNING, session, NULL, NULL, locerror);
736 case SML_SESSION_EVENT_FINAL:
738 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_FINAL, session, NULL, NULL, NULL);
740 case SML_SESSION_EVENT_END:
742 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_END, session, NULL, NULL, NULL);
744 case SML_SESSION_EVENT_FLUSH:
746 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_FLUSH, session, NULL, NULL, NULL);
748 case SML_SESSION_EVENT_ERROR:
751 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_ERROR, session, NULL, NULL, locerror);
756 smlTrace(TRACE_EXIT,
"%s", __func__);
761 smlErrorDeref(&locerror);
766 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %p)", __func__, session, data, userdata);
771 if (!smlTransportSend(sess->transport, sess->link, data, &error))
774 smlErrorDeref(&error);
777 smlTrace(TRACE_EXIT,
"%s", __func__);
782 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %p, %p)", __func__, manager, session, link_, error);
785 smlSessionRef(session);
787 if (smlSessionGetSessionID(session)) {
789 smlTrace(TRACE_INTERNAL,
"Checking if session ID %s already exists", smlSessionGetSessionID(session));
791 if (smlManagerSessionFind(manager, smlSessionGetSessionID(session))) {
792 smlErrorSet(error, SML_ERROR_GENERIC,
"Session ID already exists");
796 char *lastid = smlManagerGetNewSessionID(manager);
797 smlSessionSetSessionID(session, lastid);
798 smlSafeCFree(&lastid);
805 sess->session = session;
813 sess->transport = manager->transport;
815 manager->sessions = g_list_append(manager->sessions, sess);
818 if (0 < manager->localMaxMsgSize &&
820 manager->localMaxMsgSize < smlSessionGetLocalMaxMsgSize(session) ||
821 smlSessionGetLocalMaxMsgSize(session) <= 0
823 smlSessionSetLocalMaxMsgSize(session, manager->localMaxMsgSize);
824 if (0 < manager->localMaxObjSize &&
826 manager->localMaxObjSize < smlSessionGetLocalMaxObjSize(session) ||
827 smlSessionGetLocalMaxObjSize(session) <= 0
830 if (smlSessionGetLocalMaxObjSize(session) &&
831 smlSessionGetLocalMaxMsgSize(session))
832 smlSessionUseLargeObjects(session, TRUE);
834 smlSessionUseLargeObjects(session, FALSE);
836 smlSessionSetEventCallback(session, _event_callback, manager);
837 smlSessionSetDataCallback(session, _data_send_callback, sess);
839 _smlManagerSendEvent(manager, SML_MANAGER_SESSION_NEW, session, NULL, NULL, NULL);
841 smlTrace(TRACE_EXIT,
"%s", __func__);
845 smlSessionUnref(session);
852 smlTrace(TRACE_ENTRY,
"%s(%p, %p)", __func__, manager, session);
855 for (s = manager->sessions; s; s = s->next) {
857 if (sess->session == session) {
858 smlTrace(TRACE_EXIT,
"%s - %p", __func__, sess);
863 smlTrace(TRACE_EXIT,
"%s: Not Found", __func__);
869 smlTrace(TRACE_ENTRY,
"%s(%p, %p)", __func__, manager, session);
871 managerSession *sess = _smlManagerGetManagerSession(manager, session);
873 manager->sessions = g_list_remove(manager->sessions, sess);
874 _manager_session_free(sess);
875 smlTrace(TRACE_EXIT,
"%s", __func__);
877 smlTrace(TRACE_EXIT,
"%s: Not Found", __func__);
883 smlTrace(TRACE_ENTRY,
"%s(%p, %p)", __func__, manager, session);
885 managerSession *sess = _smlManagerGetManagerSession(manager, session);
888 smlTrace(TRACE_EXIT,
"%s", __func__);
890 smlTrace(TRACE_EXIT,
"%s: Not Found", __func__);
896 smlTrace(TRACE_ENTRY,
"%s(%p, %p)", __func__, manager, session);
898 managerSession *sess = _smlManagerGetManagerSession(manager, session);
901 smlTrace(TRACE_EXIT,
"%s - %i", __func__, sess->finalLock);
903 smlTrace(TRACE_EXIT,
"%s: Not Found", __func__);
928 smlTrace(TRACE_ENTRY,
"%s(%p, %i, %p, %p, %p, %s, %p, %p, %p, %p)", __func__, manager, type, session, location, source, VA_STRING(contentType), callback, childCallback, userdata, error);
936 SmlObject *
object = smlManagerObjectFindInternal(
937 manager, session, type,
938 location, source, contentType);
939 if (
object != NULL && session != NULL)
942 SmlObject *hObject = smlManagerObjectFindInternal(
944 location, source, contentType);
945 if (hObject != NULL && hObject ==
object)
955 smlTrace(TRACE_INTERNAL,
"%s: prepare a reusable object", __func__);
957 if (object->location)
958 smlLocationUnref(object->location);
960 smlLocationUnref(object->source);
961 if (object->contentType)
962 smlSafeCFree(&(object->contentType));
967 smlTrace(TRACE_INTERNAL,
"%s: create and register a new object", __func__);
976 smlErrorSet(error, SML_ERROR_GENERIC,
"Session not found");
977 goto error_free_object;
980 sess->objects = g_list_append(sess->objects,
object);
982 manager->objects = g_list_append(manager->objects,
object);
986 smlTrace(TRACE_INTERNAL,
"%s: configure registered object", __func__);
991 object->location = location;
992 smlLocationRef(location);
996 object->source = source;
997 smlLocationRef(source);
1001 object->contentType = g_strdup(contentType);
1004 object->commandCallback = callback;
1005 object->childCallback = childCallback;
1006 object->commandCallbackUserdata = userdata;
1008 smlTrace(TRACE_EXIT,
"%s", __func__);
1012 smlManagerObjectFree(
object);
1020 smlTrace(TRACE_ENTRY,
"%s(%p, %i, %p, %p)", __func__, manager, type, location, source);
1023 GList *o2 = g_list_copy(manager->objects);
1025 for (o = o2; o; o = o->next) {
1029 if (object->type != type)
1032 if (!smlLocationCompare(NULL, object->location, NULL, location))
1035 if (!smlLocationCompare(NULL, object->source, NULL, source))
1038 smlManagerObjectFree(
object);
1039 manager->objects = g_list_remove(manager->objects,
object);
1043 smlTrace(TRACE_EXIT,
"%s", __func__);
1046 void smlManagerObjectFree(
SmlObject *
object)
1048 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__,
object);
1051 if (object->location)
1052 smlLocationUnref(object->location);
1055 smlLocationUnref(object->source);
1057 if (object->contentType)
1058 smlSafeCFree(&(object->contentType));
1060 smlSafeFree((gpointer *)&
object);
1062 smlTrace(TRACE_EXIT,
"%s", __func__);
1067 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %p)", __func__, manager, session, cmd);
1071 SmlObject *
object = smlManagerObjectFindInternal(
1075 cmd->target, cmd->source,
1076 cmd->private.alert.contentType);
1077 smlTrace(TRACE_EXIT,
"%s(%p)", __func__,
object);
1081 SmlObject *smlManagerObjectFindInternal(
1084 SmlCommandType type,
1087 const char* contentType)
1089 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %d, %p, %p)", __func__, manager, session, type, target, source);
1098 for (o = sess->objects; o; o = o->next) {
1101 if (object->type != SML_COMMAND_TYPE_UNKNOWN && type != object->type)
1104 if (!smlLocationCompare(NULL, object->location, NULL, target))
1107 if (!smlLocationCompare(NULL, object->source, NULL, source))
1110 smlTrace(TRACE_EXIT,
"%s: FOUND (session): %p", __func__,
object);
1116 for (o = manager->objects; o; o = o->next) {
1119 if (object->type != SML_COMMAND_TYPE_UNKNOWN && type != object->type)
1122 if (type == SML_COMMAND_TYPE_ALERT && contentType) {
1123 if (object->contentType) {
1125 if (!strcmp(contentType, object->contentType)) {
1126 smlTrace(TRACE_EXIT,
"%s: FOUND SAN TARGET: %p", __func__,
object);
1134 if (!smlLocationCompare(NULL, object->location, NULL, target))
1137 if (!smlLocationCompare(NULL, object->source, NULL, source))
1141 if (object->contentType)
1144 smlTrace(TRACE_EXIT,
"%s: FOUND: %p", __func__,
object);
1148 smlTrace(TRACE_EXIT,
"%s: NOT FOUND", __func__);
1154 smlTrace(TRACE_ENTRY,
"%s(%p, %p)", __func__, manager);
1159 smlTrace(TRACE_EXIT,
"%s: %p", __func__, tsp);
1165 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %p, %p, %p)", __func__, manager, session, header, cred, error);
1171 if (manager->headerCallback &&
1172 session->sessionType == SML_SESSION_TYPE_SERVER) {
1174 manager->headerCallback(session, header, cred, manager->headerCallbackUserdata);
1176 smlTrace(TRACE_INTERNAL,
"%s: Header not handled!", __func__);
1177 if (session->sessionType == SML_SESSION_TYPE_SERVER &&
1178 !session->established) {
1184 g_warning(
"%s: This is an OMA DS server. " \
1185 "The header callback is missing. " \
1186 "All requests will be accepted without authentication.",
1188 session->established = TRUE;
1189 smlSessionDispatchEvent(
1190 session, SML_SESSION_EVENT_ESTABLISHED,
1191 NULL, NULL, NULL, NULL);
1196 header->source, header->target,
1197 SML_COMMAND_TYPE_HEADER, error);
1202 smlStatusUnref(status);
1206 smlStatusUnref(status);
1209 smlTrace(TRACE_EXIT,
"%s", __func__);
1219 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %p, %p, %p)", __func__, manager, session, parent, cmd, error);
1226 SmlObject *
object = smlManagerObjectFind(manager, session, parent);
1229 if (!object->childCallback) {
1230 smlErrorSet(error, SML_ERROR_GENERIC,
"No handler for the child was installed");
1234 object->childCallback(session, cmd, object->commandCallbackUserdata);
1236 SmlStatus *reply = smlCommandNewReply(cmd, SML_ERROR_NOT_FOUND, error);
1241 smlStatusUnref(reply);
1245 smlStatusUnref(reply);
1247 smlErrorSet(error, SML_ERROR_GENERIC,
"Unable to find child command handler");
1252 smlTrace(TRACE_EXIT,
"%s", __func__);
1262 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %p, %p)", __func__, manager, session, cmd, error);
1269 SmlObject *
object = smlManagerObjectFind(manager, session, cmd);
1272 if (!object->commandCallback) {
1273 smlErrorSet(error, SML_ERROR_GENERIC,
"No handler for the child was installed");
1277 object->commandCallback(session, cmd, object->commandCallbackUserdata);
1279 const char *type = smlCommandTypeToString(cmd->type, error);
1281 smlErrorDeref(error);
1282 const char *srcuri = (cmd->source && cmd->source->locURI) ? cmd->source->locURI :
"NULL";
1283 const char *dsturi = (cmd->target && cmd->target->locURI) ? cmd->target->locURI :
"NULL";
1284 smlErrorSet(error, SML_ERROR_NOT_FOUND,
"Unable to find command handler (%s: %s -> %s)", (type) ? type :
"UNKNOWN", srcuri, dsturi);
1287 SmlStatus *reply = smlCommandNewReply(cmd, SML_ERROR_NOT_FOUND, &locerror);
1296 smlStatusUnref(reply);
1303 smlStatusUnref(reply);
1308 smlTrace(TRACE_EXIT,
"%s", __func__);
1316 void smlManagerRegisterHeaderHandler(
SmlManager *manager, SmlHeaderCb callback, SmlStatusReplyCb statuscb,
void *userdata)
1320 manager->headerCallback = callback;
1321 manager->headerStatusCallback = statuscb;
1322 manager->headerCallbackUserdata = userdata;
1325 void smlManagerSetLocalMaxMsgSize(
SmlManager *manager,
unsigned int size)
1328 manager->localMaxMsgSize = size;
1331 void smlManagerSetLocalMaxObjSize(
SmlManager *manager,
unsigned int size)
1334 manager->localMaxObjSize = size;
1337 char *smlManagerGetNewSessionID(
SmlManager *manager)
1339 smlTrace(TRACE_ENTRY,
"%s(%p)", __func__, manager);
1340 smlAssertMsg(manager,
"The manager is required to avoid duplicated session IDs.");
1342 char *sessionString = NULL;
1343 while (sessionString == NULL)
1347 unsigned int sessionID = (
unsigned int) g_random_int_range (0, 0xFFFF);
1348 sessionString = g_strdup_printf(
"%u", sessionID);
1349 smlTrace(TRACE_INTERNAL,
"%s: new potential session ID is %lu.", __func__, sessionID);
1350 if (smlManagerSessionFind(manager, sessionString))
1351 smlSafeCFree(&sessionString);
1353 smlTrace(TRACE_EXIT,
"%s - %s", __func__, VA_STRING(sessionString));
1354 return sessionString;
1357 SmlLink *smlManagerSessionGetLink(
1362 smlTrace(TRACE_ENTRY,
"%s(%p, %p, %p)", __func__, manager, session, error);
1365 managerSession *_msession = _manager_session_find(manager, session);
1369 "The session %d is not registered at the manager.",
1370 smlSessionGetSessionID(session));
1374 if (_msession->link)
1375 smlLinkRef(_msession->link);
1377 smlTrace(TRACE_EXIT,
"%s - %p", __func__, _msession->link);
1378 return _msession->link;