diff options
Diffstat (limited to 'src/agent/serviceadapter/protocolbinder/syncml_protocol_binder.c')
-rwxr-xr-x | src/agent/serviceadapter/protocolbinder/syncml_protocol_binder.c | 3062 |
1 files changed, 3062 insertions, 0 deletions
diff --git a/src/agent/serviceadapter/protocolbinder/syncml_protocol_binder.c b/src/agent/serviceadapter/protocolbinder/syncml_protocol_binder.c new file mode 100755 index 0000000..91e5217 --- /dev/null +++ b/src/agent/serviceadapter/protocolbinder/syncml_protocol_binder.c @@ -0,0 +1,3062 @@ +/* + * 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 <glib.h> +#include <assert.h> + +/*sync-agent*/ +#include <sync_agent.h> + +/*dm-agent*/ +#include "common/dm_common.h" +#include "common/util/util.h" +#include "serviceadapter/protocolbinder/syncml_def.h" +#include "serviceadapter/protocolbinder/syncml_protocol_binder.h" +#include "serviceadapter/sa_command_internal.h" +#include "serviceadapter/sa_command.h" +#include "serviceadapter/sa_elements_internal.h" +#include "serviceadapter/sa_elements.h" +#include "serviceadapter/sa_define.h" + +#ifndef OMADM_AGENT_LOG +#undef LOG_TAG +#define LOG_TAG "OMA_DM_BINDER" +#endif + +#define SYNC_AGENT_INIT_ESTIMATE_DOC_SIZE 10 /* TODO : remove */ + +static ProtocolVersion __get_oma_dm_protocol_version(char *verdtd); +static Location *__get_location(WBXMLTreeNode * node); +static Cred *__get_cred(WBXMLTreeNode * node); +static Chal *__get_chal(WBXMLTreeNode * node); + +static sync_agent_pb_error_e __append_location_to_wbxml_node(Location * pLocation, sync_agent_pb_protocol_binder_info_s * pBinder, WBXMLTreeNode * parent_node); +static sync_agent_pb_error_e __append_cred_to_wbxml_node(Cred * pCred, sync_agent_pb_protocol_binder_info_s * pBinder, WBXMLTreeNode * parent_node); +static sync_agent_pb_error_e __append_chal_to_wbxml_node(Chal * pChal, sync_agent_pb_protocol_binder_info_s * pBinder, WBXMLTreeNode * parent_node); + +static sync_agent_pb_error_e _syncml_binder_syncml_start_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); +static sync_agent_pb_error_e _syncml_binder_header_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); +static sync_agent_pb_error_e _syncml_binder_final_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); +static sync_agent_pb_error_e _syncml_binder_body_start_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); +static sync_agent_pb_error_e _syncml_binder_status_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); +static sync_agent_pb_error_e _syncml_binder_alert_command_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); +static sync_agent_pb_error_e _syncml_binder_results_command_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); +static sync_agent_pb_error_e _syncml_binder_replace_command_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node); + +static sync_agent_pb_error_e _syncml_binder_header_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_results_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_get_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_alert_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_add_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_replace_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_delete_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_atomic_end_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_atomic_start_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_sequence_end_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_sequence_start_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_exec_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_final_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_status_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); +static sync_agent_pb_error_e _syncml_binder_copy_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent); + +const sync_agent_pb_function_info_s oma_dm_binder_function_info[] = { + {PE_SYNCML_START, "SyncML", _syncml_binder_syncml_start_converter_function, NULL, false}, + {PE_SYNCML_END, "/SyncML", NULL, NULL, false}, + {PE_HEADER, "SyncHdr", _syncml_binder_header_converter_function, _syncml_binder_header_reverse_converter_function, true}, + {PE_BODY_START, "SyncBody", _syncml_binder_body_start_converter_function, NULL, false}, + {PE_BODY_END, "/SyncBody", NULL, NULL, false}, + {PE_FINAL, "Final", _syncml_binder_final_converter_function, _syncml_binder_final_reverse_converter_function, true}, + {PE_ALERT, "Alert", _syncml_binder_alert_command_converter_function, _syncml_binder_alert_command_reverse_converter_function, true}, + {PE_STATUS, "Status", _syncml_binder_status_converter_function, _syncml_binder_status_reverse_converter_function, true}, + {PE_RESULTS_START, "Results", _syncml_binder_results_command_converter_function, _syncml_binder_results_command_reverse_converter_function, false}, + {PE_RESULTS_END, "/Results", NULL, NULL, false}, + {PE_GET, "Get", NULL, _syncml_binder_get_command_reverse_converter_function, true}, + {PE_ADD, "Add", NULL, _syncml_binder_add_command_reverse_converter_function, true}, + {PE_REPLACE, "Replace", _syncml_binder_replace_command_converter_function, _syncml_binder_replace_command_reverse_converter_function, true}, + {PE_DELETE, "Delete", NULL, _syncml_binder_delete_command_reverse_converter_function, true}, + {PE_EXEC, "Exec", NULL, _syncml_binder_exec_command_reverse_converter_function, true}, + {PE_SEQUENCE_START, "Sequence", NULL, _syncml_binder_sequence_start_command_reverse_converter_function, false}, + {PE_SEQUENCE_END, "/Sequence", NULL, _syncml_binder_sequence_end_command_reverse_converter_function, false}, + {PE_ATOMIC_START, "Atomic", NULL, _syncml_binder_atomic_start_command_reverse_converter_function, false}, + {PE_ATOMIC_END, "/Atomic", NULL, _syncml_binder_atomic_end_command_reverse_converter_function, false}, + {PE_COPY, "Copy", NULL, _syncml_binder_copy_command_reverse_converter_function, true} +}; + +static sync_agent_pb_error_e __append_location_to_wbxml_node(Location * pLocation, sync_agent_pb_protocol_binder_info_s * pBinder, WBXMLTreeNode * parent_node) +{ + _INNER_FUNC_ENTER; + _DEBUG_VERBOSE("start"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + if (pLocation->locURI != NULL) { + WBXMLTreeNode *LocURI = sync_agent_add_child_text_node(pBinder, parent_node, ELEMENT_LOCURI, pLocation->locURI, strlen(pLocation->locURI)); + if (LocURI == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } else { + /* error case */ + } + + if (pLocation->locName != NULL) { + WBXMLTreeNode *locName = sync_agent_add_child_text_node(pBinder, parent_node, ELEMENT_LOCNAME, pLocation->locName, strlen(pLocation->locName)); + if (locName == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + _INNER_FUNC_EXIT; + return err; + error: + _DEBUG_VERBOSE("error : %d", err); + _INNER_FUNC_EXIT; + return err; + +} + +static sync_agent_pb_error_e __append_cred_to_wbxml_node(Cred * pCred, sync_agent_pb_protocol_binder_info_s * pBinder, WBXMLTreeNode * parent_node) +{ + _INNER_FUNC_ENTER; + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + retvm_if((pCred) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pCred is NULL!!"); + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + /* check validity */ + WBXMLTreeNode *cred_node = sync_agent_add_child_node(pBinder, parent_node, ELEMENT_CRED); + if (cred_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *meta_node = sync_agent_add_child_node(pBinder, cred_node, ELEMENT_META); + if (meta_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *type_node = NULL; + + switch (pCred->type) { + case AUTH_TYPE_BASIC: + + if (pCred->format == FORMAT_TYPE_BASE64) { + WBXMLTreeNode *format_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, ELEMENT_FORMAT_BASE64, strlen(ELEMENT_FORMAT_BASE64)); + if (format_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, ELEMENT_AUTH_BASIC, strlen(ELEMENT_AUTH_BASIC)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + if (pCred->data != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, cred_node, ELEMENT_DATA, pCred->data, strlen(pCred->data)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + break; + case AUTH_TYPE_MD5: + { + if (pCred->format == FORMAT_TYPE_BASE64) { + WBXMLTreeNode *format_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, ELEMENT_FORMAT_BASE64, strlen(ELEMENT_FORMAT_BASE64)); + if (format_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, ELEMENT_AUTH_MD5, strlen(ELEMENT_AUTH_MD5)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + if (pCred->data != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, cred_node, ELEMENT_DATA, pCred->data, strlen(pCred->data)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + break; + case AUTH_TYPE_HMAC: + { + /*do not use cred element */ + } + break; + default: + break; + } + + _INNER_FUNC_EXIT; + return err; + + error: + _DEBUG_VERBOSE("error : %d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e __append_chal_to_wbxml_node(Chal * pChal, sync_agent_pb_protocol_binder_info_s * pBinder, WBXMLTreeNode * parent_node) +{ + _INNER_FUNC_ENTER; + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + retvm_if((pChal) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pChal is NULL!!"); + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + /* check validity */ + WBXMLTreeNode *chal_node = sync_agent_add_child_node(pBinder, parent_node, ELEMENT_CHAL); + if (chal_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + WBXMLTreeNode *meta_node = sync_agent_add_child_node(pBinder, chal_node, ELEMENT_META); + if (meta_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *type_node = NULL; + + switch (pChal->type) { + case AUTH_TYPE_BASIC: + + if (pChal->format == FORMAT_TYPE_BASE64) { + WBXMLTreeNode *format_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, ELEMENT_FORMAT_BASE64, strlen(ELEMENT_FORMAT_BASE64)); + if (format_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, ELEMENT_AUTH_BASIC, strlen(ELEMENT_AUTH_BASIC)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + break; + case AUTH_TYPE_MD5: + { + if (pChal->format == FORMAT_TYPE_BASE64) { + WBXMLTreeNode *format_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, ELEMENT_FORMAT_BASE64, strlen(ELEMENT_FORMAT_BASE64)); + if (format_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, ELEMENT_AUTH_MD5, strlen(ELEMENT_AUTH_MD5)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *nextnonce_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_NEXTNONCE, pChal->nonce_plain, strlen(pChal->nonce_plain)); + if (nextnonce_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + break; + case AUTH_TYPE_HMAC: + { + if (pChal->format == FORMAT_TYPE_BASE64) { + WBXMLTreeNode *format_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, ELEMENT_FORMAT_BASE64, strlen(ELEMENT_FORMAT_BASE64)); + if (format_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, ELEMENT_AUTH_HMAC, strlen(ELEMENT_AUTH_HMAC)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *nextnonce_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_NEXTNONCE, pChal->nonce_plain, strlen(pChal->nonce_plain)); + if (nextnonce_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + break; + default: + break; + } + + _INNER_FUNC_EXIT; + return err; + + error: + _DEBUG_VERBOSE("error : %d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_syncml_start_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + WBXMLTreeNode *syncml_node = sync_agent_create_node(pBinder, ELEMENT_SYNCML); + if (syncml_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + *ppWbxml_dom_node = syncml_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(syncml_node); + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_header_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + SyncHdr *pSyncHdr = (SyncHdr *) pContent; + + /* add SyncHdr, VerDTD, VerProto node */ + WBXMLTreeNode *synchdr_node = NULL; + synchdr_node = sync_agent_create_node(pBinder, ELEMENT_SYNCHDR); + if (synchdr_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + char *verDTD = ELEMENT_VERDTD; + char *verProto = ELEMENT_VERPROTO; + + char *verDTD_data = NULL; + char *verProto_data = NULL; + if (pSyncHdr->version == VERSION_10) { + verDTD_data = ELEMENT_VERDTD_10; + verProto_data = ELEMENT_VERPROTO_10; + } else if (pSyncHdr->version == VERSION_11) { + verDTD_data = ELEMENT_VERDTD_11; + verProto_data = ELEMENT_VERPROTO_11; + } else if (pSyncHdr->version == VERSION_12) { + verDTD_data = ELEMENT_VERDTD_12; + verProto_data = ELEMENT_VERPROTO_12; + } + + if (verDTD_data == NULL || verProto_data == NULL) { + err = SYNC_AGENT_PB_RETURN_NOT_DEFINED; + goto error; + } + + WBXMLTreeNode *verdtd_node = sync_agent_add_child_text_node(pBinder, synchdr_node, verDTD, verDTD_data, strlen(verDTD_data)); + if (verdtd_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *verProto_node = sync_agent_add_child_text_node(pBinder, synchdr_node, verProto, verProto_data, strlen(verProto_data)); + if (verProto_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + /* session ID */ + WBXMLTreeNode *sessionID_node = NULL; + if (pSyncHdr->sessionID != NULL) { + sessionID_node = sync_agent_add_child_text_node(pBinder, synchdr_node, ELEMENT_SESSIONID, pSyncHdr->sessionID, strlen(pSyncHdr->sessionID)); + } else { + sessionID_node = sync_agent_add_child_node(pBinder, synchdr_node, ELEMENT_SESSIONID); + } + + if (sessionID_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + /* msgID */ + char *msgID_data = g_strdup_printf("%u", pSyncHdr->messageID); + if (msgID_data == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + WBXMLTreeNode *msgID_node = sync_agent_add_child_text_node(pBinder, synchdr_node, ELEMENT_MSGID, msgID_data, strlen(msgID_data)); + str_free(&msgID_data); + if (msgID_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *target_node = sync_agent_add_child_node(pBinder, synchdr_node, ELEMENT_TARGET); + if (target_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + err = __append_location_to_wbxml_node(pSyncHdr->target, pBinder, target_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + + WBXMLTreeNode *source_node = sync_agent_add_child_node(pBinder, synchdr_node, ELEMENT_SOURCE); + if (source_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + err = __append_location_to_wbxml_node(pSyncHdr->source, pBinder, source_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + + if (pSyncHdr->responseURI) { + WBXMLTreeNode *respuri_node = sync_agent_add_child_text_node(pBinder, synchdr_node, ELEMENT_RESPURI, pSyncHdr->responseURI, strlen(pSyncHdr->responseURI)); + if (respuri_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + if (pSyncHdr->cred != NULL) { + err = __append_cred_to_wbxml_node(pSyncHdr->cred, pBinder, synchdr_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + } + + char *meta = ELEMENT_META; + if (pSyncHdr->maxmsgsize != 0 || pSyncHdr->maxobjsize != 0) { + WBXMLTreeNode *meta_node = sync_agent_add_child_node(pBinder, synchdr_node, meta); + if (meta_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + unsigned int maxmsgsize = pSyncHdr->maxmsgsize; + unsigned int maxobjsize = pSyncHdr->maxobjsize; + + if (maxmsgsize != 0) { + char *str_maxmsgsize = g_strdup_printf("%u", maxmsgsize); + if (str_maxmsgsize == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *maxmsgsize_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_MAXMSGSIZE, str_maxmsgsize, strlen(str_maxmsgsize)); + str_free(&str_maxmsgsize); + if (maxmsgsize_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + if (maxobjsize != 0) { + char *str_maxobjsize = g_strdup_printf("%u", maxobjsize); + if (str_maxobjsize == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *maxmsgsize_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_MAXOBJSIZE, str_maxobjsize, strlen(str_maxobjsize)); + str_free(&str_maxobjsize); + if (maxmsgsize_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + + *ppWbxml_dom_node = synchdr_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(synchdr_node); + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_final_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + WBXMLTreeNode *final_node = sync_agent_create_node(pBinder, ELEMENT_FINAL); + if (final_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + *ppWbxml_dom_node = final_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(final_node); + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_body_start_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + WBXMLTreeNode *syncbody_node = sync_agent_create_node(pBinder, ELEMENT_SYNCBODY); + if (syncbody_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + *ppWbxml_dom_node = syncbody_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(syncbody_node); + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_status_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + Status *pStatus = (Status *) pContent; + assert(pStatus != NULL); + + CommandType type = pStatus->type; + + WBXMLTreeNode *status_node = NULL; + status_node = sync_agent_create_node(pBinder, ELEMENT_STATUS); + if (status_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + unsigned int cmdID = pStatus->cmdID; + char *str_cmdID = g_strdup_printf("%u", cmdID); + if (str_cmdID == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *cmdid_node = sync_agent_add_child_text_node(pBinder, status_node, ELEMENT_CMDID, str_cmdID, strlen(str_cmdID)); + str_free(&str_cmdID); + if (cmdid_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + unsigned int msgRef = pStatus->msgRef; + char *str_msgRef = g_strdup_printf("%u", msgRef); + if (str_msgRef == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *msgref_node = sync_agent_add_child_text_node(pBinder, status_node, ELEMENT_MSGREF, str_msgRef, strlen(str_msgRef)); + str_free(&str_msgRef); + if (msgref_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + unsigned int cmdRef = pStatus->cmdRef; + char *str_cmdRef = g_strdup_printf("%u", cmdRef); + if (str_cmdRef == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *cmdref_node = sync_agent_add_child_text_node(pBinder, status_node, ELEMENT_CMDREF, str_cmdRef, strlen(str_cmdRef)); + str_free(&str_cmdRef); + if (cmdref_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + char *str_command = NULL; + switch (type) { + case COMMAND_TYPE_ALERT: + { + str_command = ELEMENT_ALERT; + } + break; + case COMMAND_TYPE_HEADER: + { + str_command = ELEMENT_SYNCHDR; + } + break; + case COMMAND_TYPE_ADD: + { + str_command = ELEMENT_ADD; + } + break; + case COMMAND_TYPE_REPLACE: + { + str_command = ELEMENT_REPLACE; + } + break; + case COMMAND_TYPE_DELETE: + { + str_command = ELEMENT_DELETE; + } + break; + case COMMAND_TYPE_GET: + { + str_command = ELEMENT_GET; + } + break; + case COMMAND_TYPE_RESULTS: + { + str_command = ELEMENT_RESULTS; + } + break; + case COMMAND_TYPE_EXEC: + { + str_command = ELEMENT_EXEC; + } + break; + case COMMAND_TYPE_SEQUENCE: + { + str_command = ELEMENT_SEQUENCE; + } + break; + case COMMAND_TYPE_ATOMIC: + { + str_command = ELEMENT_ATOMIC; + } + break; + default: + break; + } + + if (str_command == NULL) { + err = SYNC_AGENT_PB_RETURN_NOT_DEFINED; + goto error; + } + + WBXMLTreeNode *command_node = sync_agent_add_child_text_node(pBinder, status_node, ELEMENT_CMD, str_command, strlen(str_command)); + if (command_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + if (pStatus->targetRef != NULL) { + WBXMLTreeNode *targetref_node = sync_agent_add_child_text_node(pBinder, status_node, ELEMENT_TARGETREF, pStatus->targetRef->locURI, strlen(pStatus->targetRef->locURI)); + if (targetref_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + if (pStatus->sourceRef != NULL) { + WBXMLTreeNode *sourceref_node = sync_agent_add_child_text_node(pBinder, status_node, ELEMENT_SOURCEREF, pStatus->sourceRef->locURI, strlen(pStatus->sourceRef->locURI)); + if (sourceref_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + if (pStatus->cred != NULL) { + /*err = append_cred_to_wbxml_node(pStatus->cred, pBinder, status_node); + * if(err != SYNC_AGENT_PB_RETURN_OK) + goto error; + */ + } + + if (pStatus->chal != NULL) { + err = __append_chal_to_wbxml_node(pStatus->chal, pBinder, status_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + + } + + WBXMLTreeNode *data_node = sync_agent_add_child_text_node(pBinder, status_node, ELEMENT_DATA, pStatus->data, strlen(pStatus->data)); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + if (type == COMMAND_TYPE_ALERT) { + GList *Iter = NULL; + Item *item = NULL; + if (pStatus->items != NULL) { + for (Iter = pStatus->items; Iter != NULL; Iter = g_list_next(Iter)) { + item = (Iter->data); + if (item != NULL) { + WBXMLTreeNode *item_node = sync_agent_add_child_node(pBinder, status_node, ELEMENT_ITEM); + if (item_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + char *data = NULL; + data = item->private.data; + if (data != NULL) { + WBXMLTreeNode *item_data_node = sync_agent_add_child_text_node(pBinder, item_node, ELEMENT_DATA, data, strlen(data)); + if (item_data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + } + } + } + + *ppWbxml_dom_node = status_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(status_node); + + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_alert_command_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + Command *pCommand = (Command *) pContent; + CommandAlertPrivate *pAlert = (CommandAlertPrivate *) (&(pCommand->private)); + WBXMLTreeNode *alert_node = NULL; + + if (pAlert == NULL) { + err = SYNC_AGENT_PB_RETURN_NOT_DEFINED; + _DEBUG_TRACE("pAlert is not defined"); + goto error; + } + + if (pAlert->type == ALERT_UNKNOWN) { + /* error case */ + err = SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR; + _DEBUG_TRACE("type is unknown"); + goto error; + } + + alert_node = sync_agent_create_node(pBinder, ELEMENT_ALERT); + if (alert_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + char *str_cmdID = g_strdup_printf("%u", pCommand->cmdID); + if (str_cmdID == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *cmdid_node = sync_agent_add_child_text_node(pBinder, alert_node, ELEMENT_CMDID, str_cmdID, strlen(str_cmdID)); + str_free(&str_cmdID); + if (cmdid_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + +/* if(pCommand->cred){ + err = __append_cred_to_wbxml_node(pCommand->cred, pBinder, alert_node); + if(err != SYNC_AGENT_PB_RETURN_OK) + goto error; + }*/ + + char *str_alert_type = g_strdup_printf("%d", pAlert->type); + if (str_alert_type == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *data_node = sync_agent_add_child_text_node(pBinder, alert_node, ELEMENT_DATA, str_alert_type, strlen(str_alert_type)); + str_free(&str_alert_type); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + if (pAlert->Correlator != NULL) { + char *pCorrelator = g_strdup(pAlert->Correlator); + if (pCorrelator == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + WBXMLTreeNode *correlator_node = sync_agent_add_child_text_node(pBinder, alert_node, ELEMENT_CORRELATOR, pCorrelator, strlen(pCorrelator)); + str_free(&pCorrelator); + if (correlator_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + GList *Iter = NULL; + Item *item = NULL; + for (Iter = pAlert->items; Iter != NULL; Iter = g_list_next(Iter)) { + item = (Iter->data); + WBXMLTreeNode *item_node = sync_agent_add_child_node(pBinder, alert_node, ELEMENT_ITEM); + if (item_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + if (item->source != NULL) { + WBXMLTreeNode *source_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_SOURCE); + if (source_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + err = __append_location_to_wbxml_node(item->source, pBinder, source_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + } + if (item->target != NULL) { + WBXMLTreeNode *target_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_TARGET); + if (target_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + err = __append_location_to_wbxml_node(item->target, pBinder, target_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + } + + if (item->format != NULL || item->contenttype != NULL) { + WBXMLTreeNode *meta_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_META); + if (meta_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->format != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, item->format, strlen(item->format)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + if (item->contenttype != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, item->contenttype, strlen(item->contenttype)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->moreData != 0) { + if (item->size > 0) { + char *str_size = g_strdup_printf("%u", item->size); + if (str_size == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + WBXMLTreeNode *size_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_SIZE, str_size, strlen(str_size)); + str_free(&str_size); + if (size_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + } + } + } + } + + if (item->dataType == ITEM_DATA) { + if (item->private.data != NULL) { + WBXMLTreeNode *data_node = sync_agent_add_child_text_node(pBinder, item_node, ELEMENT_DATA, item->private.data, strlen(item->private.data)); + //WBXMLTreeNode* data_node = sync_agent_add_child_cdata_node(pBinder, item_node, ELEMENT_DATA, item->private.data, strlen(item->private.data)); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + + if (item->moreData != 0) { + WBXMLTreeNode *data_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_MOREDATA); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + + *ppWbxml_dom_node = alert_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(alert_node); + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_results_command_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + Command *pCommand = (Command *) pContent; + CommandResultsPrivate *pResults = (CommandResultsPrivate *) (&(pCommand->private)); + WBXMLTreeNode *results_node = NULL; + if (pResults == NULL) { + err = SYNC_AGENT_PB_RETURN_NOT_DEFINED; + _DEBUG_TRACE("pResults is not defined"); + goto error; + } + + results_node = sync_agent_create_node(pBinder, ELEMENT_RESULTS); + if (results_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + char *str_cmdID = g_strdup_printf("%u", pCommand->cmdID); + if (str_cmdID == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + WBXMLTreeNode *cmdid_node = sync_agent_add_child_text_node(pBinder, results_node, ELEMENT_CMDID, str_cmdID, strlen(str_cmdID)); + str_free(&str_cmdID); + if (cmdid_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + if (pResults->msgRef != 0) { + char *str_msgRef = g_strdup_printf("%u", pResults->msgRef); + if (str_msgRef == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + WBXMLTreeNode *msgref_node = sync_agent_add_child_text_node(pBinder, results_node, ELEMENT_MSGREF, str_msgRef, strlen(str_msgRef)); + str_free(&str_msgRef); + if (msgref_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + char *str_cmdRef = g_strdup_printf("%u", pResults->cmdRef); + if (str_cmdRef == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + WBXMLTreeNode *msgref_node = sync_agent_add_child_text_node(pBinder, results_node, ELEMENT_CMDREF, str_cmdRef, strlen(str_cmdRef)); + str_free(&str_cmdRef); + if (msgref_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + /* if(content_type){ + WBXMLTreeNode * meta_node = sync_agent_add_child_node(pBinder, results_node, ELEMENT_META); + sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, content_type, strlen(content_type)); + } */ + + if (pResults->targetRef != NULL) { + WBXMLTreeNode *targetref_node = sync_agent_add_child_text_node(pBinder, results_node, ELEMENT_TARGETREF, pResults->targetRef->locURI, strlen(pResults->targetRef->locURI)); + if (targetref_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + + GList *Iter = NULL; + Item *item = NULL; + for (Iter = pResults->items; Iter != NULL; Iter = g_list_next(Iter)) { + item = (Iter->data); + WBXMLTreeNode *item_node = sync_agent_add_child_node(pBinder, results_node, ELEMENT_ITEM); + if (item_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->source != NULL) { + WBXMLTreeNode *source_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_SOURCE); + if (source_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + err = __append_location_to_wbxml_node(item->source, pBinder, source_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + } + if (item->target != NULL) { + WBXMLTreeNode *target_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_TARGET); + if (target_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + err = __append_location_to_wbxml_node(item->target, pBinder, target_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + } + + if (item->format != NULL || item->contenttype != NULL) { + WBXMLTreeNode *meta_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_META); + if (meta_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->format != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, item->format, strlen(item->format)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + if (item->contenttype != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, item->contenttype, strlen(item->contenttype)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->moreData != 0) { + if (item->size > 0) { + char *str_size = g_strdup_printf("%u", item->size); + WBXMLTreeNode *size_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_SIZE, str_size, strlen(str_size)); + str_free(&str_size); + if (size_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + } + } + if (item->dataType == ITEM_DATA) { + if (item->private.data != NULL) { + WBXMLTreeNode *data_node = sync_agent_add_child_text_node(pBinder, item_node, ELEMENT_DATA, item->private.data, strlen(item->private.data)); + //WBXMLTreeNode* data_node = sync_agent_add_child_cdata_node(pBinder, item_node, ELEMENT_DATA, item->private.data, strlen(item->private.data)); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + + if (item->moreData != 0) { + WBXMLTreeNode *data_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_MOREDATA); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + + *ppWbxml_dom_node = results_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(results_node); + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_replace_command_converter_function(sync_agent_pb_protocol_binder_info_s * pBinder, Content_Ptr pContent, WBXMLTreeNode ** ppWbxml_dom_node) +{ + _INNER_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + Command *pCommand = (Command *) pContent; + CommandChangePrivate *pChange = (CommandChangePrivate *) (&(pCommand->private)); + + if (pChange == NULL) { + err = SYNC_AGENT_PB_RETURN_NOT_DEFINED; + _DEBUG_TRACE("pChange is not defined"); + _INNER_FUNC_EXIT; + return err; + } + + WBXMLTreeNode *replace_node = NULL; + replace_node = sync_agent_create_node(pBinder, ELEMENT_REPLACE); + if (replace_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + char *str_cmdID = g_strdup_printf("%u", pCommand->cmdID); + if (str_cmdID == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + WBXMLTreeNode *cmdid_node = sync_agent_add_child_text_node(pBinder, replace_node, ELEMENT_CMDID, str_cmdID, strlen(str_cmdID)); + str_free(&str_cmdID); + if (cmdid_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + + GList *Iter = NULL; + Item *item = NULL; + for (Iter = pChange->items; Iter != NULL; Iter = g_list_next(Iter)) { + item = (Iter->data); + WBXMLTreeNode *item_node = sync_agent_add_child_node(pBinder, replace_node, ELEMENT_ITEM); + if (item_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->source != NULL) { + WBXMLTreeNode *source_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_SOURCE); + if (source_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + err = __append_location_to_wbxml_node(item->source, pBinder, source_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + } + if (item->target != NULL) { + WBXMLTreeNode *target_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_TARGET); + if (target_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + err = __append_location_to_wbxml_node(item->target, pBinder, target_node); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto error; + } + if (item->format != NULL || item->contenttype != NULL) { + WBXMLTreeNode *meta_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_META); + if (meta_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->format != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_FORMAT, item->format, strlen(item->format)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + if (item->contenttype != NULL) { + WBXMLTreeNode *type_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_TYPE, item->contenttype, strlen(item->contenttype)); + if (type_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + if (item->moreData != 0) { + if (item->size > 0) { + char *str_size = g_strdup_printf("%u", item->size); + WBXMLTreeNode *size_node = sync_agent_add_child_text_node(pBinder, meta_node, ELEMENT_SIZE, str_size, strlen(str_size)); + str_free(&str_size); + if (size_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + } + } + if (item->dataType == ITEM_DATA) { + if (item->private.data != NULL) { + //WBXMLTreeNode* data_node = sync_agent_add_child_cdata_node(pBinder, item_node, ELEMENT_DATA, item->private.data, strlen(item->private.data)); + WBXMLTreeNode *data_node = sync_agent_add_child_text_node(pBinder, item_node, ELEMENT_DATA, item->private.data, strlen(item->private.data)); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + + if (item->moreData != 0) { + WBXMLTreeNode *data_node = sync_agent_add_child_node(pBinder, item_node, ELEMENT_MOREDATA); + if (data_node == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto error; + } + } + } + + *ppWbxml_dom_node = replace_node; + + _INNER_FUNC_EXIT; + return err; + + error: + sync_agent_destroy_wbxml_node(replace_node); + _DEBUG_TRACE("error :%d", err); + _INNER_FUNC_EXIT; + return err; +} + +static ProtocolVersion __get_oma_dm_protocol_version(char *verdtd) +{ + _INNER_FUNC_ENTER; + + retvm_if((verdtd) == NULL, VERSION_12, "verdtd is NULL!!"); + + ProtocolVersion protocol_version = VERSION_UNKNOWN; + if (strcmp(verdtd, ELEMENT_VERDTD_12) == 0) { + protocol_version = VERSION_12; + } else if (strcmp(verdtd, ELEMENT_VERDTD_11) == 0) { + protocol_version = VERSION_11; + } else if (strcmp(verdtd, ELEMENT_VERDTD_10) == 0) { + protocol_version = VERSION_10; + } + + _INNER_FUNC_EXIT; + return protocol_version; +} + +static Location *__get_location(WBXMLTreeNode * node) +{ + + _INNER_FUNC_ENTER; + + retvm_if((node) == NULL, NULL, "node is NULL!!"); + DM_ERROR ret = DM_OK; + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + Location *pLocation = NULL; + + WBXMLTreeNode *child = NULL; + const char *child_name = NULL; + + char *locURI = NULL; + char *locName = NULL; + /* get first child : required LocURI */ + child = node->children; + + child_name = (const char *)wbxml_tag_get_xml_name(child->name); + if (strcmp(child_name, ELEMENT_LOCURI) == 0) { + err = sync_agent_get_text_from_node(child, &locURI); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + } else { + /* error */ + goto return_part; + } + + /* get second child : optional LocName */ + child = child->next; + if (child != NULL) { + child_name = (const char *)wbxml_tag_get_xml_name(child->name); + if (strcmp(child_name, ELEMENT_LOCNAME) == 0) { + err = sync_agent_get_text_from_node(child, &locName); + if (err != SYNC_AGENT_PB_RETURN_OK) + goto return_part; + } else { + /* error */ + goto return_part; + } + } + + ret = create_location(locURI, locName, &pLocation); + if (ret != DM_OK) { + goto return_part; + } + + _INNER_FUNC_EXIT; + return pLocation; + + return_part: + _DEBUG_VERBOSE("error : %d", ret); + if (pLocation != NULL) { + free_location(pLocation); + pLocation = NULL; + } + + _INNER_FUNC_EXIT; + return NULL; +} + +static Cred *__get_cred(WBXMLTreeNode * node) +{ + _INNER_FUNC_ENTER; + + retvm_if((node) == NULL, NULL, "node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + Cred *cred = NULL; + + char *data = NULL; + char *type = NULL; + char *format = NULL; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grand_child = child->children; + const char *grand_child_xml_name = NULL; + grand_child_xml_name = (const char *)wbxml_tag_get_xml_name(grand_child->name); + + if (strcmp(grand_child_xml_name, ELEMENT_TYPE) == 0) { + err = sync_agent_get_text_from_node(grand_child, &type); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_VERBOSE("Type = [%s]", type); + } else if (strcmp(grand_child_xml_name, ELEMENT_FORMAT) == 0) { + err = sync_agent_get_text_from_node(grand_child, &format); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_VERBOSE("Type = [%s]", format); + } + } else if (strcmp(child_xml_name, ELEMENT_DATA) == 0) { + err = sync_agent_get_text_from_node(child, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_VERBOSE("Data = [%s]", data); + } + } + + cred = create_credwithdata(converttoauthtype(type), data); + if (cred == NULL) { + return NULL; + } + + /*all auth type base 64 */ + set_credformattype(cred, FORMAT_TYPE_BASE64); + _DEBUG_VERBOSE("base 64 format"); + + _INNER_FUNC_EXIT; + return cred; + + return_part: + _DEBUG_VERBOSE("error"); + free_cred(cred); + + _INNER_FUNC_EXIT; + return NULL; +} + +static Chal *__get_chal(WBXMLTreeNode * node) +{ + _INNER_FUNC_ENTER; + + retvm_if((node) == NULL, NULL, "node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + Chal *chal = (Chal *) calloc(1, sizeof(Chal)); + if (chal == NULL) { + _DEBUG_VERBOSE("alloc fail"); + _INNER_FUNC_EXIT; + return NULL; + } + WBXMLTreeNode *chal_child = node->children; + + WBXMLTreeNode *meta_child = NULL; + const char *meta_child_xml_name = NULL; + for (meta_child = chal_child->children; meta_child != NULL; meta_child = meta_child->next) { + meta_child_xml_name = (const char *)wbxml_tag_get_xml_name(meta_child->name); + + if (strcmp(meta_child_xml_name, ELEMENT_TYPE) == 0) { + char *type = NULL; + err = sync_agent_get_text_from_node(meta_child, &type); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_VERBOSE("Type = [%s]", type); + + chal->type = converttoauthtype(type); + } else if (strcmp(meta_child_xml_name, ELEMENT_FORMAT) == 0) { + char *format = NULL; + err = sync_agent_get_text_from_node(meta_child, &format); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_VERBOSE("Format = [%s]", format); + + chal->format = converttoformattype(format); + } else if (strcmp(meta_child_xml_name, "NextNonce") == 0) { + char *nextnonce = NULL; + unsigned int nonce_len = 0; + err = sync_agent_get_binary_from_node(meta_child, &nextnonce, &nonce_len); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_VERBOSE("NextNonce =[%s] ", nextnonce); + if (chal->format == FORMAT_TYPE_BASE64 && chal->type == AUTH_TYPE_BASIC) { + chal->nonce_b64 = strdup(nextnonce); + } else if (chal->format == FORMAT_TYPE_BASE64 && (chal->type == AUTH_TYPE_MD5 || chal->type == AUTH_TYPE_HMAC)) { + chal->nonce_plain = (char *)calloc(1, nonce_len + 1); + if (chal->nonce_plain == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + memcpy(chal->nonce_plain, nextnonce, nonce_len); + chal->nonce_plain[nonce_len] = '\0'; + } + chal->nonce_length = nonce_len; + } + } + + _INNER_FUNC_EXIT; + return chal; + + return_part: + _DEBUG_VERBOSE("error "); + free_chal(chal); + _INNER_FUNC_EXIT; + return NULL; +} + +static sync_agent_pb_error_e _syncml_binder_header_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + /* get data from dom tree */ + SyncHdr *pSyncHdr = (SyncHdr *) calloc(1, sizeof(SyncHdr)); + if (pSyncHdr == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pSyncHdr is null"); + goto return_part; + } + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_VERDTD) == 0) { + char *verdtd = NULL; + err = sync_agent_get_text_from_node(child, &verdtd); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_TRACE("VerDTD = [%s]", verdtd); + + pSyncHdr->version = __get_oma_dm_protocol_version(verdtd); + } else if (strcmp(child_xml_name, ELEMENT_SESSIONID) == 0) { + char *sessionID = NULL; + err = sync_agent_get_text_from_node(child, &sessionID); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_TRACE("SessionID = [%s]", sessionID); + + if (sessionID != NULL) { + pSyncHdr->sessionID = strdup(sessionID); + } else { + pSyncHdr->sessionID = NULL; + } + } else if (strcmp(child_xml_name, ELEMENT_MSGID) == 0) { + char *msgID = NULL; + err = sync_agent_get_text_from_node(child, &msgID); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + _DEBUG_TRACE("MsgID = [%s]", msgID); + if (msgID != NULL) + pSyncHdr->messageID = atoi(msgID); + } else if (strcmp(child_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(child); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + pSyncHdr->target = pTargetLocation; + } else if (strcmp(child_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(child); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + pSyncHdr->source = pSourceLocation; + } else if (strcmp(child_xml_name, ELEMENT_RESPURI) == 0) { + char *resp_uri = NULL; + err = sync_agent_get_text_from_node(child, &resp_uri); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (resp_uri != NULL) { + _DEBUG_TRACE("resp_uri =[%s] ", resp_uri); + pSyncHdr->responseURI = strdup(resp_uri); + } + } else if (strcmp(child_xml_name, ELEMENT_CRED) == 0) { + Cred *pCred = NULL; + pCred = __get_cred(child); + if (pCred == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + _DEBUG_TRACE("Cred\n"); + pSyncHdr->cred = pCred; + } else if (strcmp(child_xml_name, ELEMENT_META) == 0) { + + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pSyncHdr; + } else { + _DEBUG_TRACE("error"); + free_synchdr(pSyncHdr); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_results_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Item *item = NULL; + + /* get data from dom tree */ + Command *pResults = (Command *) calloc(1, sizeof(Command)); + if (pResults == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pResults is null"); + goto return_part; + } + + pResults->type = COMMAND_TYPE_RESULTS; + pResults->msgID = pSyncHdr->messageID; + pResults->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID = [%s]", cmd_id); + pResults->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_MSGREF) == 0) { + char *msg_ref = NULL; + err = sync_agent_get_text_from_node(child, &msg_ref); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (msg_ref != NULL) { + _DEBUG_TRACE("MsgRef = [%s]", msg_ref); + pResults->private.results.msgRef = atoi(msg_ref); + } + } else if (strcmp(child_xml_name, ELEMENT_CMDREF) == 0) { + char *cmd_ref = NULL; + err = sync_agent_get_text_from_node(child, &cmd_ref); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_ref != NULL) { + _DEBUG_TRACE("MsgRef = [%s]", cmd_ref); + pResults->private.results.cmdRef = atoi(cmd_ref); + } + } else if (strcmp(child_xml_name, ELEMENT_META) == 0) { + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_TYPE) == 0) { + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandchild, &contentType); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + pResults->private.results.type = strdup(contentType); + } + } + } + } else if (strcmp(child_xml_name, ELEMENT_TARGETREF) == 0) { + //TODO targetRef + } else if (strcmp(child_xml_name, ELEMENT_SOURCEREF) == 0) { + //TODO sourceRef + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + /*create item in results command */ + if (item == NULL) + item = create_Item(); + if (item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + item->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + item->target = pTargetLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grandgrandchild = NULL; + const char *grandgrandchild_xml_name = NULL; + + for (grandgrandchild = grandchild->children; grandgrandchild != NULL; grandgrandchild = grandgrandchild->next) { + grandgrandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandgrandchild->name); + + if (strcmp(grandgrandchild_xml_name, ELEMENT_TYPE) == 0) { + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &contentType); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + item->contenttype = strdup(contentType); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_SIZE) == 0) { + char *size = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &size); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (size != NULL) { + _DEBUG_TRACE("Size = [%s]", size); + item->size = atoi(size); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_FORMAT) == 0) { + char *format = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &format); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (format != NULL) { + _DEBUG_TRACE("Content Type = [%s]", format); + item->format = strdup(format); + } + } + } + } else if (strcmp(grandchild_xml_name, ELEMENT_DATA) == 0) { + char *data = NULL; + err = sync_agent_get_text_from_cdata_node(grandchild, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (data != NULL) { + _DEBUG_TRACE("Data =[%s] ", data); + item->private.data = g_strdup(data); + item->dataType = ITEM_DATA; + } + } else if (strcmp(grandchild_xml_name, ELEMENT_MOREDATA) == 0) { + _DEBUG_TRACE(ELEMENT_MOREDATA); + item->moreData = 1; + } + } + pResults->private.results.items = g_list_append(pResults->private.results.items, item); + item = NULL; + } + } + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pResults; + } else { + _DEBUG_TRACE("error"); + free_command(pResults); + free_Item(item); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_get_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Item *item = NULL; + + /* get data from dom tree */ + Command *pGet = (Command *) calloc(1, sizeof(Command)); + if (pGet == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pGet is null"); + goto return_part; + } + + pGet->type = COMMAND_TYPE_GET; + pGet->msgID = pSyncHdr->messageID; + pGet->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID = [%s]", cmd_id); + pGet->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_META) == 0) { + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_TYPE) == 0) { + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandchild, &contentType); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + pGet->private.access.type = strdup(contentType); + } + } + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + + if (item == NULL) + item = create_Item(); + if (item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + item->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + item->target = pTargetLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grandgrandchild = NULL; + const char *grandgrandchild_xml_name = NULL; + + for (grandgrandchild = grandchild->children; grandgrandchild != NULL; grandgrandchild = grandgrandchild->next) { + grandgrandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandgrandchild->name); + + if (strcmp(grandgrandchild_xml_name, ELEMENT_TYPE) == 0) { + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &contentType); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + item->contenttype = strdup(contentType); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_SIZE) == 0) { + char *size = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &size); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (size != NULL) { + _DEBUG_TRACE("Size = [%s]", size); + item->size = atoi(size); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_FORMAT) == 0) { + char *format = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &format); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (format != NULL) { + _DEBUG_TRACE("Content Type =[%s] ", format); + item->format = strdup(format); + } + } + } + } else if (strcmp(grandchild_xml_name, ELEMENT_DATA) == 0) { + char *data = NULL; + err = sync_agent_get_text_from_cdata_node(grandchild, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (data != NULL) { + _DEBUG_TRACE("Data = [%s]", data); + item->private.data = strdup(data); + item->dataType = ITEM_DATA; + } + } else if (strcmp(grandchild_xml_name, ELEMENT_MOREDATA) == 0) { + _DEBUG_TRACE(ELEMENT_MOREDATA); + item->moreData = 1; + } + } + + pGet->private.access.items = g_list_append(pGet->private.access.items, item); + item = NULL; + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pGet; + } else { + _DEBUG_TRACE("error"); + free_command(pGet); + free_Item(item); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_alert_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Item *item = NULL; + + /* get data from dom tree */ + Command *pAlert = (Command *) calloc(1, sizeof(Command)); + if (pAlert == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pAlert is null"); + goto return_part; + } + + pAlert->type = COMMAND_TYPE_ALERT; + pAlert->msgID = pSyncHdr->messageID; + pAlert->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID = [%s]", cmd_id); + pAlert->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_DATA) == 0) { + char *data = NULL; + err = sync_agent_get_text_from_node(child, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (data != NULL) { + _DEBUG_TRACE("Data = [%s]", data); + pAlert->private.alert.type = atoi(data); + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + _DEBUG_TRACE("alert item"); + if (item == NULL) { + item = create_Item(); + } + if (item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + pAlert->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + item->target = pTargetLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grandgrandchild = NULL; + const char *grandgrandchild_xml_name = NULL; + + for (grandgrandchild = grandchild->children; grandgrandchild != NULL; grandgrandchild = grandgrandchild->next) { + grandgrandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandgrandchild->name); + + if (strcmp(grandgrandchild_xml_name, ELEMENT_MAXOBJSIZE) == 0) { + char *maxObjSize = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &maxObjSize); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (maxObjSize != NULL) { + _DEBUG_TRACE("MaxObjSize = [%s]", maxObjSize); + pAlert->private.alert.maxObjSize = atoi(maxObjSize); + } + } + } + } else if (strcmp(grandchild_xml_name, ELEMENT_DATA) == 0) { + char *data = NULL; + /*err = sync_agent_get_text_from_cdata_node(grandchild, &data); */ + err = sync_agent_get_text_from_node(grandchild, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (data != NULL) { + _DEBUG_TRACE("item Data =[%s] ", data); + item->private.data = g_strdup(data); + item->dataType = ITEM_DATA; + } + } + } + pAlert->private.alert.items = g_list_append(pAlert->private.alert.items, item); + item = NULL; + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pAlert; + } else { + _DEBUG_TRACE("error"); + free_command(pAlert); + free_Item(item); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_add_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Item *item = NULL; + + /* get data from dom tree */ + Command *pAdd = (Command *) calloc(1, sizeof(Command)); + if (pAdd == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pAdd is null"); + goto return_part; + } + + pAdd->type = COMMAND_TYPE_ADD;; + pAdd->msgID = pSyncHdr->messageID; + pAdd->private.change.type = CHANGE_ADD; + pAdd->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID =[%s] ", cmd_id); + pAdd->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + + if (item == NULL) + item = create_Item(); + if (item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + item->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + item->target = pTargetLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grandgrandchild = NULL; + const char *grandgrandchild_xml_name = NULL; + + for (grandgrandchild = grandchild->children; grandgrandchild != NULL; grandgrandchild = grandgrandchild->next) { + grandgrandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandgrandchild->name); + + if (strcmp(grandgrandchild_xml_name, ELEMENT_TYPE) == 0) { + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &contentType); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + item->contenttype = strdup(contentType); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_SIZE) == 0) { + char *size = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &size); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (size != NULL) { + _DEBUG_TRACE("Size =[%s] ", size); + item->size = atoi(size); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_FORMAT) == 0) { + char *format = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &format); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (format != NULL) { + _DEBUG_TRACE("format =[%s] ", format); + item->format = strdup(format); + } + } + } + } else if (strcmp(grandchild_xml_name, ELEMENT_DATA) == 0) { + char *data = NULL; + err = sync_agent_get_text_from_cdata_node(grandchild, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (data != NULL) { + _DEBUG_TRACE("Data =[%s] ", data); + item->private.data = g_strdup(data); + item->dataType = ITEM_DATA; + } + } else if (strcmp(grandchild_xml_name, ELEMENT_MOREDATA) == 0) { + _DEBUG_TRACE(ELEMENT_MOREDATA); + item->moreData = 1; + } + } + pAdd->private.change.items = g_list_append(pAdd->private.change.items, item); + item = NULL; + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pAdd; + } else { + _DEBUG_TRACE("error"); + free_command(pAdd); + free_Item(item); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_replace_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Item *item = NULL; + + /* get data from dom tree */ + Command *pReplace = (Command *) calloc(1, sizeof(Command)); + if (pReplace == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pReplace is null"); + goto return_part; + } + + pReplace->type = COMMAND_TYPE_REPLACE;; + pReplace->msgID = pSyncHdr->messageID; + pReplace->private.change.type = CHANGE_REPLACE; + pReplace->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id) { + _DEBUG_TRACE("CmdID =[%s] ", cmd_id); + pReplace->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + + if (item == NULL) + item = create_Item(); + if (item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + item->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + item->target = pTargetLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grandgrandchild = NULL; + const char *grandgrandchild_xml_name = NULL; + + for (grandgrandchild = grandchild->children; grandgrandchild != NULL; grandgrandchild = grandgrandchild->next) { + grandgrandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandgrandchild->name); + if (strcmp(grandgrandchild_xml_name, ELEMENT_TYPE) == 0) { + + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &contentType); + _DEBUG_TRACE("%d\n", err); + + /* if (err != SYNC_AGENT_PB_RETURN_OK || err != SYNC_AGENT_PB_RETURN_UTIL_NO_TEXT_VALUE) { + goto return_part; + } */ + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + item->contenttype = strdup(contentType); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_SIZE) == 0) { + + char *size = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &size); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (size != NULL) { + _DEBUG_TRACE("Size =[%s] ", size); + item->size = atoi(size); + } + } else if (strcmp(grandgrandchild_xml_name, ELEMENT_FORMAT) == 0) { + char *format = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &format); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (format != NULL) { + _DEBUG_TRACE("Content Type = [%s]", format); + item->format = strdup(format); + } + } + } + + } else if (strcmp(grandchild_xml_name, ELEMENT_DATA) == 0) { + char *data = NULL; + err = sync_agent_get_text_from_cdata_node(grandchild, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (data != NULL) { + _DEBUG_TRACE("Data = [%s]", data); + item->private.data = g_strdup(data); + item->dataType = ITEM_DATA; + } + } + } + pReplace->private.change.items = g_list_append(pReplace->private.change.items, item); + item = NULL; + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pReplace; + } else { + _DEBUG_TRACE("error"); + free_command(pReplace); + free_Item(item); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_delete_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Item *item = NULL; + + /* get data from dom tree */ + Command *pDelete = (Command *) calloc(1, sizeof(Command)); + if (pDelete == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pDelete is null"); + goto return_part; + } + + pDelete->type = COMMAND_TYPE_DELETE; + pDelete->msgID = pSyncHdr->messageID; + pDelete->private.change.type = CHANGE_DELETE; + pDelete->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID = [%s]", cmd_id); + pDelete->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + /* create Item */ + if (item == NULL) + item = create_Item(); + if (item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + item->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + item->target = pTargetLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grandgrandchild = NULL; + const char *grandgrandchild_xml_name = NULL; + + for (grandgrandchild = grandchild->children; grandgrandchild != NULL; grandgrandchild = grandgrandchild->next) { + grandgrandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandgrandchild->name); + + if (strcmp(grandgrandchild_xml_name, ELEMENT_TYPE) == 0) { + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &contentType); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + item->contenttype = strdup(contentType); + } + } + } + } else if (strcmp(grandchild_xml_name, ELEMENT_DATA) == 0) { + + } + } + pDelete->private.change.items = g_list_append(pDelete->private.change.items, item); + item = NULL; + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pDelete; + } else { + _DEBUG_TRACE("error"); + free_command(pDelete); + free_Item(item); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_exec_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + + /* get data from dom tree */ + Command *pExec = (Command *) calloc(1, sizeof(Command)); + if (pExec == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pExec is null"); + goto return_part; + } + + pExec->type = COMMAND_TYPE_EXEC; + pExec->msgID = pSyncHdr->messageID; + pExec->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID =[%s] ", cmd_id); + pExec->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_CORRELATOR) == 0) { + char *pCorrelator = NULL; + err = sync_agent_get_text_from_node(child, &pCorrelator); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (pCorrelator != NULL) { + _DEBUG_TRACE("pCorrelator = [%s]", pCorrelator); + pExec->private.exec.correlator = strdup(pCorrelator); + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + /* create Item */ + pExec->private.exec.item = create_Item(); + if (pExec->private.exec.item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + pExec->private.exec.item->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + pExec->private.exec.item->target = pTargetLocation; + } + } + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pExec; + } else { + _DEBUG_TRACE("error"); + free_command(pExec); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_sequence_start_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + + /* get data from dom tree */ + Command *pSequence = (Command *) calloc(1, sizeof(Command)); + + if (pSequence == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pSequence is null"); + goto return_part; + } + + pSequence->type = COMMAND_TYPE_SEQUENCE; + pSequence->msgID = pSyncHdr->messageID; + pSequence->refCount = 1; + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pSequence; + } else { + _DEBUG_TRACE("error"); + free_command(pSequence); + } + + _INNER_FUNC_EXIT; + return err; + +} + +static sync_agent_pb_error_e _syncml_binder_sequence_end_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + + _INNER_FUNC_ENTER; + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + } else { + _DEBUG_TRACE("error"); + } + + _INNER_FUNC_EXIT; + return err; + +} + +static sync_agent_pb_error_e _syncml_binder_atomic_start_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Command *pAtomic = (Command *) calloc(1, sizeof(Command)); + + if (pAtomic == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pExec is null"); + goto return_part; + } + + pAtomic->type = COMMAND_TYPE_ATOMIC; + pAtomic->msgID = pSyncHdr->messageID; + pAtomic->refCount = 1; + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pAtomic; + } else { + _DEBUG_TRACE("error"); + free_command(pAtomic); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_atomic_end_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + + _INNER_FUNC_ENTER; + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + } else { + _DEBUG_TRACE("error"); + } + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_final_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + int *pFinal = (int *)1; + *pContent = pFinal; + + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_status_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + /* get data from dom tree */ + Status *pStatus = (Status *) calloc(1, sizeof(Status)); + if (pStatus == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pStatus is null"); + goto return_part; + } + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID =[%s] ", cmd_id); + pStatus->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_MSGREF) == 0) { + char *msgref = NULL; + err = sync_agent_get_text_from_node(child, &msgref); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (msgref != NULL) { + _DEBUG_TRACE("MsgRef = [%s]", msgref); + pStatus->msgRef = atoi(msgref); + } + } else if (strcmp(child_xml_name, ELEMENT_CMDREF) == 0) { + char *cmdref = NULL; + err = sync_agent_get_text_from_node(child, &cmdref); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmdref != NULL) { + _DEBUG_TRACE("CmdRef = [%s]", cmdref); + pStatus->cmdRef = atoi(cmdref); + } + } else if (strcmp(child_xml_name, ELEMENT_CMD) == 0) { + char *cmd = NULL; + err = sync_agent_get_text_from_node(child, &cmd); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd != NULL) { + _DEBUG_TRACE("Cmd =[%s] ", cmd); + pStatus->type = converttocommandtype(cmd); + } + } else if (strcmp(child_xml_name, ELEMENT_TARGETREF) == 0) { + char *targetref = NULL; + Location *pLocation = NULL; + err = sync_agent_get_text_from_node(child, &targetref); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (targetref != NULL) { + DM_ERROR ret = DM_OK; + _DEBUG_TRACE("TargetRef = [%s]", targetref); + ret = create_location(targetref, NULL, &pLocation); + if(ret != DM_OK) { + _DEBUG_VERBOSE("create_location failed"); + goto return_part; + } + pStatus->targetRef = pLocation; + } + } else if (strcmp(child_xml_name, ELEMENT_SOURCEREF) == 0) { + char *sourceref = NULL; + Location *pLocation = NULL; + err = sync_agent_get_text_from_node(child, &sourceref); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (sourceref != NULL) { + DM_ERROR ret = DM_OK; + _DEBUG_TRACE("SourceRef = [%s]", sourceref); + ret = create_location(sourceref, NULL, &pLocation); + if(ret != DM_OK) { + _DEBUG_VERBOSE("create_location failed"); + goto return_part; + } + pStatus->sourceRef = pLocation; + } + } else if (strcmp(child_xml_name, ELEMENT_CRED) == 0) { + _DEBUG_TRACE(ELEMENT_CRED); + pStatus->cred = __get_cred(child); + } else if (strcmp(child_xml_name, ELEMENT_CHAL) == 0) { + _DEBUG_TRACE("Chal\n"); + pStatus->chal = __get_chal(child); + } else if (strcmp(child_xml_name, ELEMENT_DATA) == 0) { + char *data = NULL; + err = sync_agent_get_text_from_node(child, &data); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (data != NULL) { + _DEBUG_TRACE("Data = [%s]\n", data); + pStatus->data = strdup(data); + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + /* TODO : item */ + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pStatus; + } else { + _DEBUG_TRACE("error"); + free_status(pStatus); + } + _INNER_FUNC_EXIT; + return err; +} + +static sync_agent_pb_error_e _syncml_binder_copy_command_reverse_converter_function(sync_agent_pb_protocol_binder_reverse_info_s * pReverse_binder, WBXMLTreeNode * wbxml_dom_node, Content_Ptr * pContent) +{ + _INNER_FUNC_ENTER; + + retvm_if((pReverse_binder) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "pReverse_binder is NULL!!"); + retvm_if((wbxml_dom_node) == NULL, SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY, "wbxml_dom_node is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + void *user_data = sync_agent_get_user_data_from_reverse_protocol_binder(pReverse_binder); + SyncHdr *pSyncHdr = (SyncHdr *) user_data; + Item *item = NULL; + /* get data from dom tree */ + Command *pCopy = (Command *) calloc(1, sizeof(Command)); + if (pCopy == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + _DEBUG_TRACE("pCopy is null"); + goto return_part; + } + + pCopy->type = COMMAND_TYPE_COPY; + pCopy->msgID = pSyncHdr->messageID; + pCopy->private.change.type = CHANGE_COPY; + pCopy->refCount = 1; + + WBXMLTreeNode *child = NULL; + const char *child_xml_name = NULL; + for (child = wbxml_dom_node->children; child != NULL; child = child->next) { + child_xml_name = (const char *)wbxml_tag_get_xml_name(child->name); + + if (strcmp(child_xml_name, ELEMENT_CMDID) == 0) { + char *cmd_id = NULL; + err = sync_agent_get_text_from_node(child, &cmd_id); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (cmd_id != NULL) { + _DEBUG_TRACE("CmdID = [%s]", cmd_id); + pCopy->cmdID = atoi(cmd_id); + } + } else if (strcmp(child_xml_name, ELEMENT_ITEM) == 0) { + /* create Item */ + + if (item == NULL) + item = create_Item(); + if (item == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + + WBXMLTreeNode *grandchild = NULL; + const char *grandchild_xml_name = NULL; + for (grandchild = child->children; grandchild != NULL; grandchild = grandchild->next) { + grandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandchild->name); + + if (strcmp(grandchild_xml_name, ELEMENT_SOURCE) == 0) { + Location *pSourceLocation = __get_location(grandchild); + if (pSourceLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pSourceLocation != NULL) + item->source = pSourceLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_TARGET) == 0) { + Location *pTargetLocation = __get_location(grandchild); + if (pTargetLocation == NULL) { + err = SYNC_AGENT_PB_RETURN_OUT_OF_MEMORY; + goto return_part; + } + if (pTargetLocation != NULL) + item->target = pTargetLocation; + } else if (strcmp(grandchild_xml_name, ELEMENT_META) == 0) { + WBXMLTreeNode *grandgrandchild = NULL; + const char *grandgrandchild_xml_name = NULL; + + for (grandgrandchild = grandchild->children; grandgrandchild != NULL; grandgrandchild = grandgrandchild->next) { + grandgrandchild_xml_name = (const char *)wbxml_tag_get_xml_name(grandgrandchild->name); + + if (strcmp(grandgrandchild_xml_name, ELEMENT_TYPE) == 0) { + char *contentType = NULL; + err = sync_agent_get_text_from_node(grandgrandchild, &contentType); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + if (contentType != NULL) { + _DEBUG_TRACE("Content Type = [%s]", contentType); + item->contenttype = strdup(contentType); + } + } + } + } else if (strcmp(grandchild_xml_name, ELEMENT_DATA) == 0) { + + } + } + pCopy->private.change.items = g_list_append(pCopy->private.change.items, item); + item = NULL; + } + } + + return_part: + if (err == SYNC_AGENT_PB_RETURN_OK) { + _DEBUG_TRACE("end"); + *pContent = pCopy; + } else { + _DEBUG_TRACE("error"); + free_command(pCopy); + free_Item(item); + } + + _INNER_FUNC_EXIT; + return err; +} + +sync_agent_pb_error_e init_syncml_binder_function_set(sync_agent_pb_protocol_binder_function_set_s ** pBinder_function_set) +{ + _EXTERN_FUNC_ENTER; + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + err = sync_agent_init_binder_function_set(sizeof(oma_dm_binder_function_info) / sizeof(sync_agent_pb_function_info_s), (sync_agent_pb_function_info_s *) oma_dm_binder_function_info, pBinder_function_set); + + _EXTERN_FUNC_EXIT; + return err; +} + +void free_syncml_binder_function_set(sync_agent_pb_protocol_binder_function_set_s * pBinder_function_set) +{ + _EXTERN_FUNC_ENTER; + + retm_if((pBinder_function_set) == NULL, "pBinder_function_set is NULL!!"); + + sync_agent_free_binder_function_set(pBinder_function_set); + + _EXTERN_FUNC_EXIT; +} + +sync_agent_pb_protocol_binder_info_s *syncml_binder_init(sync_agent_pb_protocol_binder_info_s * pBinder, sync_agent_pb_encoding_e enc, bool use_strtbl, bool use_flow_mode, sync_agent_pb_protocol_binder_function_set_s * pBinder_function_set) +{ + _EXTERN_FUNC_ENTER; + + sync_agent_pb_protocol_binder_info_s *pOutBinder = NULL; + + pOutBinder = sync_agent_init_protocol_binder(pBinder, SYNC_AGENT_PB_PROTOCOL_SYNCML_SYNCML12, NULL, enc, 1, use_strtbl, false, use_flow_mode, false, NULL, NULL, pBinder_function_set); + + if (pOutBinder == NULL) { + goto return_part; + } + //protocol_binder_set_estimate_doc_size(pOutBinder, SYNC_AGENT_INIT_ESTIMATE_DOC_SIZE); + + return_part: + _EXTERN_FUNC_EXIT; + return pOutBinder; +} + +sync_agent_pb_error_e syncml_binder_append(sync_agent_pb_protocol_binder_info_s * pBinder, OMA_DM_Protocol_Element protocol_element, Content_Ptr pContent) +{ + _EXTERN_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR, "pBinder is NULL!!"); + + _DEBUG_TRACE(" protocol_element = %d, pContent = %p\n", protocol_element, pContent); + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + err = sync_agent_append_element(pBinder, protocol_element, pContent); + + _EXTERN_FUNC_EXIT; + return err; +} + +void syncml_binder_terminate(sync_agent_pb_protocol_binder_info_s * pBinder) +{ + _EXTERN_FUNC_ENTER; + + retm_if((pBinder) == NULL, "pBinder is NULL!!"); + + sync_agent_destroy_protocol_binder(pBinder); + + _EXTERN_FUNC_EXIT; +} + +sync_agent_pb_error_e syncml_binder_get_stream(sync_agent_pb_protocol_binder_info_s * pBinder, char **byte_stream, unsigned int *byte_stream_size) +{ + _EXTERN_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + err = sync_agent_get_stream_from_protocol_binder(pBinder, byte_stream, byte_stream_size); + if (err != SYNC_AGENT_PB_RETURN_OK) { + goto return_part; + } + + return_part: + _EXTERN_FUNC_EXIT; + return err; +} + +sync_agent_pb_error_e syncml_binder_get_stream_size(sync_agent_pb_protocol_binder_info_s * pBinder, unsigned int *byte_stream_size) +{ + _EXTERN_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + err = sync_agent_get_stream_size_from_protocol_binder(pBinder, byte_stream_size); + + _EXTERN_FUNC_EXIT; + return err; +} + +sync_agent_pb_error_e syncml_binder_get_encoding(sync_agent_pb_protocol_binder_info_s * pBinder, sync_agent_pb_encoding_e * enc) +{ + _EXTERN_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = SYNC_AGENT_PB_RETURN_OK; + + err = sync_agent_get_encoding_from_protocol_binder(pBinder, enc); + + _EXTERN_FUNC_EXIT; + return err; +} + +sync_agent_pb_error_e reverse_syncml_binder_init(char *byte_stream, + unsigned int byte_stream_len, sync_agent_pb_decoding_e dec, sync_agent_pb_protocol_binder_function_set_s * pBinder_function_set, void *user_data, sync_agent_pb_protocol_binder_reverse_info_s ** ppBinder) +{ + _EXTERN_FUNC_ENTER; + + retvm_if((byte_stream) == NULL, SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR, "byte_stream is NULL!!"); + retvm_if((pBinder_function_set) == NULL, SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR, "pBinder_function_set is NULL!!"); + + sync_agent_pb_protocol_e protocol = SYNC_AGENT_PB_PROTOCOL_UNKNOWN; + sync_agent_pb_error_e err = sync_agent_init_reverse_protocol_binder(byte_stream, byte_stream_len, dec, + &protocol, pBinder_function_set, user_data, ppBinder); + + _EXTERN_FUNC_EXIT; + return err; +} + +sync_agent_pb_error_e reverse_syncml_binder_next(sync_agent_pb_protocol_binder_reverse_info_s * pBinder, OMA_DM_Protocol_Element * protocol_element, char **protocol_element_name, Content_Ptr * pContent) +{ + _EXTERN_FUNC_ENTER; + + retvm_if((pBinder) == NULL, SYNC_AGENT_PB_RETURN_UNKNOWN_ERROR, "pBinder is NULL!!"); + + sync_agent_pb_error_e err = sync_agent_next_element(pBinder, protocol_element, protocol_element_name, pContent); + + _EXTERN_FUNC_EXIT; + + return err; +} |