summaryrefslogtreecommitdiff
path: root/src/agent/dm-engine/dl-manager/dd_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/agent/dm-engine/dl-manager/dd_parser.c')
-rw-r--r--src/agent/dm-engine/dl-manager/dd_parser.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/agent/dm-engine/dl-manager/dd_parser.c b/src/agent/dm-engine/dl-manager/dd_parser.c
new file mode 100644
index 0000000..d17eeb5
--- /dev/null
+++ b/src/agent/dm-engine/dl-manager/dd_parser.c
@@ -0,0 +1,220 @@
+/*
+ * oma-dm-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.
+ */
+
+/*lib*/
+#include <stdio.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+/*sync-agent*/
+#include <sync_agent.h>
+
+/*dm-agent*/
+#include "common/dm_common.h"
+#include "dm-engine/dl-manager/dd_parser.h"
+
+#ifndef OMADM_AGENT_LOG
+#undef LOG_TAG
+#define LOG_TAG "OMA_DM_DL"
+#endif
+
+typedef enum {
+ DD_NODE_NO_TYPE = 0,
+ DD_NODE_OBJECT_TYPE,
+ DD_NODE_DESCRIPTION,
+ DD_NODE_OBJECT_URI,
+ DD_NODE_SIZE,
+ DD_NODE_INSTALL_NOTIFY_URI
+} DD_NODE_TYPE;
+
+static DD_NODE_TYPE ___get_node_type(unsigned char *node_name);
+static DM_ERROR __set_value_to_dd_object(xmlNode * a_node, Download_Descriptor ** dd_object);
+static DM_ERROR _convert_doc_to_dd_object(xmlDocPtr doc, Download_Descriptor ** dd_object);
+
+DM_ERROR convert_xml_to_DD_object(const char *dd_xml, unsigned int dd_xml_length, Download_Descriptor ** dd_object)
+{
+ _EXTERN_FUNC_ENTER;
+
+ DM_ERROR ret = DM_OK;
+ /* parse the in memory document */
+ xmlDocPtr doc = NULL;
+
+ retvm_if((dd_xml) == NULL, COMMON_ERR_IS_NULL, "dd_xml is NULL!!");
+
+ if (dd_xml == NULL || dd_xml_length == 0 || *dd_object == NULL) {
+ _DEBUG_INFO("dd_xml == NULL || dd_xml_length == 0 || *dd_object == NULL");
+ ret = COMMON_ERR_IS_NULL;
+ goto error;
+ }
+ _DEBUG_INFO("xml: %s, size: %d", dd_xml, dd_xml_length);
+ doc = xmlReadMemory(dd_xml, dd_xml_length, 0, 0, 0);
+ if (doc == NULL) {
+ _DEBUG_INFO("xmlReadMemory() Fail\n");
+ ret = COMMON_ERR_IS_NULL;
+ goto error;
+ }
+ /* convert doc to dd_object */
+ ret = _convert_doc_to_dd_object(doc, dd_object);
+ _DEBUG_INFO("convert doc to dd object : %d", ret);
+
+ error:
+
+ if (doc != NULL)
+ xmlFreeDoc(doc);
+
+ _EXTERN_FUNC_EXIT;
+ return ret;
+}
+
+static DD_NODE_TYPE ___get_node_type(unsigned char *node_name)
+{
+ _INNER_FUNC_ENTER;
+
+ _DEBUG_VERBOSE("node_name: %s\n", node_name);
+
+ if (strcmp((const char *)node_name, "type") == 0) {
+ _INNER_FUNC_EXIT;
+ return DD_NODE_OBJECT_TYPE;
+ } else if (strcmp((const char *)node_name, "description") == 0) {
+ _INNER_FUNC_EXIT;
+ return DD_NODE_DESCRIPTION;
+ } else if (strcmp((const char *)node_name, "objectURI") == 0) {
+ _INNER_FUNC_EXIT;
+ return DD_NODE_OBJECT_URI;
+ } else if (strcmp((const char *)node_name, "size") == 0) {
+ _INNER_FUNC_EXIT;
+ return DD_NODE_SIZE;
+ } else if (strcmp((const char *)node_name, "installNotifyURI") == 0) {
+ _INNER_FUNC_EXIT;
+ return DD_NODE_INSTALL_NOTIFY_URI;
+ }
+
+ _INNER_FUNC_EXIT;
+ return DD_NODE_NO_TYPE;
+}
+
+static DM_ERROR __set_value_to_dd_object(xmlNode * a_node, Download_Descriptor ** dd_object)
+{
+ _INNER_FUNC_ENTER;
+ DM_ERROR ret = DM_OK;
+ xmlNode *cur_node = 0;
+ DD_NODE_TYPE node_type = DD_NODE_NO_TYPE;
+
+ retvm_if((a_node) == NULL, COMMON_ERR_IS_NULL, "a_node is NULL!!");
+
+ unsigned char *content = NULL;
+ for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
+ if (cur_node->type == XML_ELEMENT_NODE) {
+ content = xmlNodeGetContent(cur_node);
+
+ _DEBUG_VERBOSE("node type: Element, name: %s\n", cur_node->name);
+ _DEBUG_VERBOSE("node type: Element, content: %s\n", content);
+
+ node_type = ___get_node_type((unsigned char *)(cur_node->name));
+ switch (node_type) {
+ case DD_NODE_OBJECT_TYPE:
+ {
+ if (content != NULL) {
+ (*dd_object)->object_type = strdup((const char *)content);
+ }
+ }
+ break;
+ case DD_NODE_DESCRIPTION:
+ {
+ if (content != NULL) {
+ (*dd_object)->object_description = strdup((const char *)content);
+ }
+ }
+ break;
+ case DD_NODE_OBJECT_URI:
+ {
+#ifdef _DM_BUNDANG_TEST
+ if (content != NULL) {
+ (*dd_object)->object_uri = get_new_uri((char *)content);
+ }
+#else
+ if (content != NULL) {
+ (*dd_object)->object_uri = strdup((const char *)content);
+ }
+#endif
+ if ((*dd_object)->object_uri != NULL) {
+ _DEBUG_VERBOSE("object_uri = %s\n", (*dd_object)->object_uri);
+ } else {
+ _DEBUG_VERBOSE("object uri null");
+ }
+ }
+ break;
+ case DD_NODE_SIZE:
+ {
+ if (content != NULL) {
+ (*dd_object)->object_size = atoi((const char *)content);
+ }
+ }
+ break;
+ case DD_NODE_INSTALL_NOTIFY_URI:
+ {
+#ifdef _DM_BUNDANG_TEST
+ if (content != NULL) {
+ (*dd_object)->install_notify_uri = get_new_uri((char *)content);
+ }
+#else
+ if (content != NULL) {
+ (*dd_object)->install_notify_uri = strdup((const char *)content);
+ }
+#endif
+ if ((*dd_object)->install_notify_uri != NULL) {
+ _DEBUG_VERBOSE("install_notify_uri = %s\n", (*dd_object)->install_notify_uri);
+ } else {
+ _DEBUG_VERBOSE("install notify uri null");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ ret = __set_value_to_dd_object(cur_node->children, dd_object);
+ _DEBUG_VERBOSE("set value to dd object : %d", ret);
+ }
+
+ _INNER_FUNC_EXIT;
+ return DM_OK;
+}
+
+static DM_ERROR _convert_doc_to_dd_object(xmlDocPtr doc, Download_Descriptor ** dd_object)
+{
+ _INNER_FUNC_ENTER;
+
+ DM_ERROR ret = DM_OK;
+
+ xmlNode *root_element = 0;
+
+ /* get the root element node */
+ root_element = xmlDocGetRootElement(doc);
+ if (root_element == NULL) {
+ _INNER_FUNC_EXIT;
+ return COMMON_ERR_IS_NULL;
+ }
+
+ /*DD_NODE_TYPE node_type = DD_NODE_NO_TYPE; */
+ ret = __set_value_to_dd_object(root_element, dd_object);
+ _DEBUG_TRACE("set value dd object : %d", ret);
+
+ _INNER_FUNC_EXIT;
+ return ret;
+}