summaryrefslogtreecommitdiff
path: root/src/agent/service-adapter/sa_elements.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/agent/service-adapter/sa_elements.c')
-rwxr-xr-xsrc/agent/service-adapter/sa_elements.c834
1 files changed, 834 insertions, 0 deletions
diff --git a/src/agent/service-adapter/sa_elements.c b/src/agent/service-adapter/sa_elements.c
new file mode 100755
index 0000000..7d64963
--- /dev/null
+++ b/src/agent/service-adapter/sa_elements.c
@@ -0,0 +1,834 @@
+/*
+ * oma-ds-agent
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @SA_Elements.c
+ * @version 0.1
+ * @brief This file is the source file of implementation of functions for structures which is used in Service Adapter
+ */
+
+#include <sync_agent.h>
+
+#include "service-adapter/sa_elements.h"
+#include "service-adapter/sa_elements_internal.h"
+#include "service-adapter/sa_session_internal.h"
+#include "service-adapter/sa_command.h"
+
+#ifndef OMADS_AGENT_LOG
+#undef LOG_TAG
+#define LOG_TAG "OMA_DS_SA"
+#endif
+
+sa_error_type_e create_anchor(char *last, char *next, anchor_s ** anchor)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (next == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ *anchor = (anchor_s *) calloc(1, sizeof(anchor_s));
+ if (*anchor == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ if (last != NULL)
+ (*anchor)->last_anchor = strdup(last);
+
+ (*anchor)->next_anchor = strdup(next);
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+}
+
+sa_error_type_e set_item_anchor(item_s * item, anchor_s * anchor)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (item == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (anchor == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (item->anchor != NULL) {
+ free_anchor(item->anchor);
+ item->anchor = NULL;
+ }
+
+ anchor_s *temp_anchor = NULL;
+ errorType = create_anchor(anchor->last_anchor, anchor->next_anchor, &temp_anchor);
+ if (errorType != SA_INTERNAL_OK)
+ goto error;
+ item->anchor = temp_anchor;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+}
+
+sa_error_type_e set_last_anchor(anchor_s * anchor, char *last_anchor)
+{
+ _EXTERN_FUNC_ENTER;
+ _DEBUG_INFO("lastAnchor = %s\n", last_anchor);
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (anchor == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (last_anchor == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ anchor->last_anchor = last_anchor;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+}
+
+sa_error_type_e set_next_anchor(anchor_s * anchor, char *next_anchor)
+{
+ _EXTERN_FUNC_ENTER;
+ _DEBUG_INFO("nextAnchor = %s\n", next_anchor);
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (anchor == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (next_anchor == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ anchor->next_anchor = next_anchor;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+}
+
+void free_anchor(anchor_s * anchor)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(anchor == NULL, "anchor is NULL");
+
+ if (anchor->last_anchor != NULL) {
+ free(anchor->last_anchor);
+ anchor->last_anchor = NULL;
+ }
+
+ if (anchor->next_anchor != NULL) {
+ free(anchor->next_anchor);
+ anchor->next_anchor = NULL;
+ }
+
+ free(anchor);
+ anchor = NULL;
+
+ _EXTERN_FUNC_EXIT;
+ return;
+}
+
+sa_error_type_e create_location(char *loc_uri, char *loc_name, location_s ** location)
+{
+ _EXTERN_FUNC_ENTER;
+ _DEBUG_INFO("locURI = %s, locName = %s\n", loc_uri, loc_name);
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (loc_uri == NULL) {
+ _DEBUG_ERROR("locURI is NULL");
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ *location = (location_s *) calloc(1, sizeof(location_s));
+ if (*location == NULL) {
+ _DEBUG_ERROR("location is NULL");
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ (*location)->loc_uri = strdup(loc_uri);
+
+ if (loc_name != NULL)
+ (*location)->loc_name = strdup(loc_name);
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+}
+
+location_s *dup_location(location_s * location)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+ location_s *temp_location = NULL;
+
+ if (location == NULL) {
+ _DEBUG_ERROR("location is NULL");
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ errorType = create_location(location->loc_uri, location->loc_name, &temp_location);
+ if (errorType != SA_INTERNAL_OK) {
+ _DEBUG_ERROR("create_location is failed");
+ goto error;
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return temp_location;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+
+}
+
+char *get_location_loc_name(location_s * location)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retvm_if(location == NULL, NULL, "location is NULL");
+
+ _EXTERN_FUNC_EXIT;
+ return location->loc_name;
+}
+
+char *get_location_loc_uri(location_s * location)
+{
+ _EXTERN_FUNC_ENTER;
+ retvm_if(location == NULL, NULL, "location is NULL");
+
+ _EXTERN_FUNC_EXIT;
+ return location->loc_uri;
+}
+
+void free_location(location_s * loc)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(loc == NULL, "loc is NULL");
+
+ _DEBUG_INFO("loc->locURI = %s", loc->loc_uri);
+ if (loc->loc_uri != NULL)
+ free(loc->loc_uri);
+
+ _DEBUG_INFO("loc->locName = %s", loc->loc_name);
+ if (loc->loc_name != NULL)
+ free(loc->loc_name);
+
+ free(loc);
+ loc = NULL;
+
+ _EXTERN_FUNC_EXIT;
+ return;
+}
+
+sa_error_type_e create_cred(char *user_name, char *pwd, auth_type_e auth_type, format_type_e format_type, char *data, cred_s ** cred)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (user_name == NULL || !strlen(user_name)) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+ if (pwd == NULL || !strlen(pwd)) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+ if (data == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ *cred = (cred_s *) calloc(1, sizeof(cred_s));
+ if (*cred == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ (*cred)->type = auth_type;
+ (*cred)->format = format_type;
+ (*cred)->user_name = strdup(user_name);
+ (*cred)->password = strdup(pwd);
+
+ (*cred)->data = strdup(data);
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+
+}
+
+void free_cred(cred_s * cred)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(cred == NULL, "cred is NULL");
+
+ if (cred->data != NULL) {
+ free(cred->data);
+ cred->data = NULL;
+ }
+
+ if (cred->user_name != NULL) {
+ free(cred->user_name);
+ cred->user_name = NULL;
+ }
+
+ if (cred->password != NULL) {
+ free(cred->password);
+ cred->password = NULL;
+ }
+
+ free(cred);
+ cred = NULL;
+
+ _EXTERN_FUNC_EXIT;
+ return;
+}
+
+void free_chal(chal_s * chal)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(chal == NULL, "chal is NULL");
+
+ if (chal->nonce_plain != NULL) {
+ free(chal->nonce_plain);
+ chal->nonce_plain = NULL;
+ }
+
+ if (chal->nonce_b64 != NULL) {
+ free(chal->nonce_b64);
+ chal->nonce_b64 = NULL;
+ }
+
+ free(chal);
+
+ _EXTERN_FUNC_EXIT;
+ return;
+}
+
+cred_s *create_cred_with_data(auth_type_e auth_type, char *data)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ cred_s *cred = (cred_s *) calloc(1, sizeof(cred_s));
+ if (cred == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ cred->type = auth_type;
+ if (data != NULL)
+ cred->data = strdup(data);
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return cred;
+
+}
+
+void set_cred_format_type(cred_s * cred, format_type_e format_type)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(cred == NULL, "cred is NULL");
+
+ cred->format = format_type;
+
+ _EXTERN_FUNC_EXIT;
+}
+
+sa_error_type_e create_syncml(sync_hdr_s * sync_hdr, GList * status, GList * commands, int is_final, syncml_s ** syncml)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (sync_hdr == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ *syncml = (syncml_s *) calloc(1, sizeof(syncml_s));
+ if (*syncml == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ (*syncml)->hdr = sync_hdr;
+ (*syncml)->status = status;
+ (*syncml)->commands = commands;
+ (*syncml)->final = is_final;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+
+}
+
+void free_syncml(syncml_s * syncml)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(syncml == NULL, "syncML is NULL");
+
+ free_sync_hdr(syncml->hdr);
+ syncml->hdr = NULL;
+
+ free_statuses(syncml->status);
+ syncml->status = NULL;
+
+ free_commands(syncml->commands);
+ syncml->commands = NULL;
+
+ free(syncml);
+
+ _EXTERN_FUNC_EXIT;
+
+ return;
+}
+
+sa_error_type_e create_sync_hdr(session_s * session, sync_hdr_s ** sync_hdr)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (!session->protocol_version) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (!session->protocol_type) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (session->source == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (session->target == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ *sync_hdr = (sync_hdr_s *) calloc(1, sizeof(sync_hdr_s));
+ if (*sync_hdr == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ (*sync_hdr)->version = session->protocol_version;
+ (*sync_hdr)->protocol = session->protocol_type;
+ (*sync_hdr)->target = dup_location(session->target);
+ (*sync_hdr)->source = dup_location(session->source);
+
+ if (session->cred != NULL)
+ (*sync_hdr)->cred = dup_cred(session->cred);
+
+ if (session->session_id != NULL)
+ (*sync_hdr)->session_id = strdup(session->session_id); /*free */
+
+ (*sync_hdr)->message_id = ++session->msg_id;
+
+ (*sync_hdr)->max_msg_size = session->source_max_msg_size;
+ (*sync_hdr)->max_obj_size = session->source_max_obj_size;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+}
+
+void free_sync_hdr(sync_hdr_s * sync_hdr)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(sync_hdr == NULL, "sync_hdr is NULL");
+
+ if (sync_hdr->session_id != NULL) {
+ free(sync_hdr->session_id);
+ sync_hdr->session_id = NULL;
+ }
+
+ if (sync_hdr->response_uri != NULL) {
+ free(sync_hdr->response_uri);
+ sync_hdr->response_uri = NULL;
+ }
+
+ if (sync_hdr->source != NULL) {
+ free_location(sync_hdr->source);
+ sync_hdr->source = NULL;
+ }
+
+ if (sync_hdr->target != NULL) {
+ free_location(sync_hdr->target);
+ sync_hdr->target = NULL;
+ }
+
+ if (sync_hdr->cred != NULL) {
+ free_cred(sync_hdr->cred);
+ sync_hdr->cred = NULL;
+ }
+
+ free(sync_hdr);
+
+ _EXTERN_FUNC_EXIT;
+ return;
+}
+
+item_s *create_item()
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ item_s *item = (item_s *) calloc(1, sizeof(item_s));
+ if (item == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ item->data_type = ITEM_UNKNOWN;
+
+ _EXTERN_FUNC_EXIT;
+ return item;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+}
+
+item_s *create_item_for_data(const char *data, unsigned int size)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ item_s *item = create_item();
+ if (item == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ item->data_type = ITEM_DATA;
+ if (data != NULL)
+ item->private.data = strdup(data);
+
+ item->size = size;
+
+ _EXTERN_FUNC_EXIT;
+ return item;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+}
+
+item_s *create_item_for_devinf(devinf_s * devinf)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (devinf == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ item_s *item = create_item();
+ if (item == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ item->data_type = ITEM_DEVINF;
+ item->private.devinf = devinf;
+
+ _EXTERN_FUNC_EXIT;
+ return item;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+}
+
+void set_item_target(item_s * item, location_s * target)
+{
+ _EXTERN_FUNC_ENTER;
+ if (item != NULL)
+ item->target = target;
+
+ _EXTERN_FUNC_EXIT;
+}
+
+void set_item_source(item_s * item, location_s * source)
+{
+ _EXTERN_FUNC_ENTER;
+ if (item != NULL)
+ item->source = source;
+
+ _EXTERN_FUNC_EXIT;
+}
+
+void free_item(item_s * item)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(item == NULL, "item is NULL");
+
+ if (item->source != NULL) {
+ free_location(item->source);
+ item->source = NULL;
+ }
+
+ if (item->target != NULL) {
+ free_location(item->target);
+ item->target = NULL;
+ }
+
+ if (item->anchor != NULL) {
+ free_anchor(item->anchor);
+ item->anchor = NULL;
+ }
+
+ switch (item->data_type) {
+ case ITEM_DATA:
+ free(item->private.data);
+ break;
+ case ITEM_DEVINF:
+ /*devinf is pointed from session. so doesnot need to free here */
+ item->private.devinf = NULL;
+ break;
+ case ITEM_UNKNOWN:
+ /*noting to free */
+ break;
+ }
+
+ if (item->content_type != NULL) {
+ free(item->content_type);
+ item->content_type = NULL;
+ }
+
+ free(item);
+ item = NULL;
+
+ _EXTERN_FUNC_EXIT;
+ return;
+}
+
+chal_s *dup_chal(chal_s * chal)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retvm_if(chal == NULL, NULL, "chal is NULL");
+
+ chal_s *temp = (chal_s *) calloc(1, sizeof(chal_s));
+ retvm_if(temp == NULL, NULL, "temp is NULL");
+
+ if (chal->nonce_b64 != NULL)
+ temp->nonce_b64 = strdup(chal->nonce_b64);
+
+ if (chal->nonce_plain != NULL)
+ temp->nonce_plain = strdup(chal->nonce_plain);
+
+ temp->type = chal->type;
+ temp->format = chal->format;
+ temp->nonce_length = chal->nonce_length;
+
+ _EXTERN_FUNC_EXIT;
+ return temp;
+}
+
+cred_s *dup_cred(cred_s * cred)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retvm_if(cred == NULL, NULL, "cred is NULL");
+
+ cred_s *temp = (cred_s *) calloc(1, sizeof(cred_s));
+ retvm_if(temp == NULL, NULL, "temp is NULL");
+
+ temp->type = cred->type;
+ temp->format = cred->format;
+
+ if (cred->user_name != NULL)
+ temp->user_name = strdup(cred->user_name);
+
+ if (cred->password != NULL)
+ temp->password = strdup(cred->password);
+
+ if (cred->data != NULL)
+ temp->data = strdup(cred->data);
+
+ _EXTERN_FUNC_EXIT;
+ return temp;
+}
+
+sa_error_type_e compare_cred(cred_s * hdr_cred, cred_s * session_cred)
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ if (hdr_cred == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (session_cred == NULL) {
+ errorType = SA_INTERNAL_NOT_DEFINED;
+ goto error;
+ }
+
+ if (strcmp(hdr_cred->data, session_cred->data) == 0)
+ errorType = SA_INTERNAL_OK;
+ else
+ errorType = SA_INTERNAL_AUTHENTICATION_ERROR;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return errorType;
+}
+
+auth_type_e convert_auth_type(char *auth_type)
+{
+ _EXTERN_FUNC_ENTER;
+ retvm_if(auth_type == NULL, AUTH_TYPE_UNKNOWN, "authType is NULL");
+
+ if (!strcmp(auth_type, ELEMENT_AUTH_BASIC)) {
+ return AUTH_TYPE_BASIC;
+ } else if (!strcmp(auth_type, ELEMENT_AUTH_MD5)) {
+ return AUTH_TYPE_MD5;
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return AUTH_TYPE_UNKNOWN;
+}
+
+format_type_e convert_format_type(char *format_type)
+{
+ _EXTERN_FUNC_ENTER;
+ if (format_type == NULL)
+ return FORMAT_TYPE_UNKNOWN;
+
+ if (!strcmp(format_type, ELEMENT_FORMAT_BASE64)) {
+ return FORMAT_TYPE_BASE64;
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return FORMAT_TYPE_UNKNOWN;
+}
+
+mem_s *create_mem()
+{
+ _EXTERN_FUNC_ENTER;
+
+ sa_error_type_e errorType = SA_INTERNAL_OK;
+
+ mem_s *mem = (mem_s *) calloc(1, sizeof(mem_s));
+ if (mem == NULL) {
+ errorType = SA_INTERNAL_NO_MEMORY;
+ goto error;
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return mem;
+
+ error:
+
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+}
+
+void set_mem_shared_mem(mem_s * mem, int shared_mem)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(mem == NULL, "mem is NULL");
+
+ mem->sharedmem = shared_mem;
+
+ _EXTERN_FUNC_EXIT;
+}
+
+void set_mem_free_mem(mem_s * mem, unsigned int free_mem)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(mem == NULL, "mem is NULL");
+
+ mem->free_mem = free_mem;
+
+ _EXTERN_FUNC_EXIT;
+}
+
+void set_mem_free_id(mem_s * mem, unsigned int free_id)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retm_if(mem == NULL, "mem is NULL");
+
+ mem->free_id = free_id;
+
+ _EXTERN_FUNC_EXIT;
+}