char *soap_parser_encode(void *handle) { SoapParser *parser = (SoapParser *)handle; struct soap *soap; int fd[2]; char *xml = NULL; struct SOAP_ENV__Header *header = NULL; struct SOAP_ENV__Fault *fault = NULL; int tags_num = 0; char *src_tags[32]; char *dst_tags[32]; if (parser == NULL) { return NULL; } soap = parser->soap; header = _soap_header_create(parser->id, parser->hold_requests, parser->session_timeout, parser->supported_cwmp_versions, parser->use_cwmp_version); if (header == NULL) { LOGE(LOG_TAG, "create soap header failed"); return NULL; } pipe(fd); soap_init(soap); soap->socket = -1; soap->sendfd = fd[1]; if (parser->namespaces != NULL) { soap_set_namespaces(soap, parser->namespaces); if (parser->use_cwmp_version != 0) { _soap_namespaces_tags(parser->namespaces, parser->use_cwmp_version, &tags_num, src_tags, dst_tags); } else { _soap_namespaces_tags(parser->namespaces, parser->version, &tags_num, src_tags, dst_tags); } } else { soap_set_namespaces(soap, namespaces); } soap_set_version(soap, 1); soap->header = header; if (soap_begin_send(soap) != 0 || soap_envelope_begin_out(soap) != 0 || soap_putheader(soap) != 0 || soap_body_begin_out(soap) != 0) { LOGE(LOG_TAG, "begin encode failed, error=%d", soap->error); _soap_header_destroy(header); return NULL; } switch (parser->type) { case CWMP_MSG_FAULT: { fault = _soap_fault_create(parser->fault_code, parser->fault_string, parser->fault_body); if (fault == NULL) { LOGE(LOG_TAG, "create soap fault failed"); _soap_header_destroy(header); return NULL; } soap_put_SOAP_ENV__Fault(soap, fault, NULL, NULL); break; } case CWMP_MSG_GET_RPCMETHODS_REQ: soap_put__cwmp__GetRPCMethods(soap, (struct _cwmp__GetRPCMethods *)parser->body, "cwmp:GetRPCMethods", NULL); break; case CWMP_MSG_SET_PARAM_VALUES_REQ: soap_put__cwmp__SetParameterValues(soap, (struct _cwmp__SetParameterValues *)parser->body, "cwmp:SetParameterValues", NULL); break; case CWMP_MSG_GET_PARAM_VALUES_REQ: soap_put__cwmp__GetParameterValues(soap, (struct _cwmp__GetParameterValues *)parser->body, "cwmp:GetParameterValues", NULL); break; case CWMP_MSG_GET_PARAM_NAMES_REQ: soap_put__cwmp__GetParameterNames(soap, (struct _cwmp__GetParameterNames *)parser->body, "cwmp:GetParameterNames", NULL); break; case CWMP_MSG_SET_PARAM_ATTRIBUTES_REQ: soap_put__cwmp__SetParameterAttributes(soap, (struct _cwmp__SetParameterAttributes *)parser->body, "cwmp:SetParameterAttributes", NULL); break; case CWMP_MSG_GET_PARAM_ATTRIBUTES_REQ: soap_put__cwmp__GetParameterAttributes(soap, (struct _cwmp__GetParameterAttributes *)parser->body, "cwmp:GetParameterAttributes", NULL); break; case CWMP_MSG_ADD_OBJECT_REQ: soap_put__cwmp__AddObject(soap, (struct _cwmp__AddObject *)parser->body, "cwmp:AddObject", NULL); break; case CWMP_MSG_DELETE_OBJECT_REQ: soap_put__cwmp__DeleteObject(soap, (struct _cwmp__DeleteObject *)parser->body, "cwmp:DeleteObject", NULL); break; case CWMP_MSG_REBOOT_REQ: soap_put__cwmp__Reboot(soap, (struct _cwmp__Reboot *)parser->body, "cwmp:Reboot", NULL); break; case CWMP_MSG_DOWNLOAD_REQ: soap_put__cwmp__Download(soap, (struct _cwmp__Download *)parser->body, "cwmp:Download", NULL); break; case CWMP_MSG_SCHEDULE_DOWNLOAD_REQ: soap_put__cwmp__ScheduleDownload(soap, (struct _cwmp__ScheduleDownload *)parser->body, "cwmp:ScheduleDownload", NULL); break; case CWMP_MSG_UPLOAD_REQ: soap_put__cwmp__Upload(soap, (struct _cwmp__Upload *)parser->body, "cwmp:Upload", NULL); break; case CWMP_MSG_FACTORY_RESET_REQ: soap_put__cwmp__FactoryReset(soap, (struct _cwmp__FactoryReset *)parser->body, "cwmp:FactoryReset", NULL); break; case CWMP_MSG_GET_QUEUED_TRANSFERS_REQ: soap_put__cwmp__GetQueuedTransfers(soap, (struct _cwmp__GetQueuedTransfers *)parser->body, "cwmp:GetQueuedTransfers", NULL); break; case CWMP_MSG_GET_ALL_QUEUED_TRANSFERS_REQ: soap_put__cwmp__GetAllQueuedTransfers(soap, (struct _cwmp__GetAllQueuedTransfers *)parser->body, "cwmp:GetAllQueuedTransfers", NULL); break; case CWMP_MSG_CANCEL_TRANSFERS_REQ: soap_put__cwmp__CancelTransfer(soap, (struct _cwmp__CancelTransfer *)parser->body, "cwmp:CancelTransfer", NULL); break; case CWMP_MSG_SCHEDULE_INFORM_REQ: soap_put__cwmp__ScheduleInform(soap, (struct _cwmp__ScheduleInform *)parser->body, "cwmp:ScheduleInform", NULL); break; case CWMP_MSG_CHANGE_DUSTATE_REQ: soap_put__cwmp__ChangeDUState(soap, (struct _cwmp__ChangeDUState *)parser->body, "cwmp:ChangeDUState", NULL); break; case CWMP_MSG_GET_RPCMETHODS_RSP: soap_put__cwmp__GetRPCMethodsResponse(soap, (struct _cwmp__GetRPCMethodsResponse *)parser->body, "cwmp:GetRPCMethodsResponse", NULL); break; case CWMP_MSG_INFROM_RSP: soap_put__cwmp__InformResponse(soap, (struct _cwmp__InformResponse *)parser->body, "cwmp:InformResponse", NULL); break; case CWMP_MSG_TRANSFER_COMPLETE_RSP: soap_put__cwmp__TransferCompleteResponse(soap, (struct _cwmp__TransferCompleteResponse *)parser->body, "cwmp:TransferCompleteResponse", NULL); break; case CWMP_MSG_AUTONOMOUS_TRANSFER_COMPLETE_RSP: soap_put__cwmp__AutonomousTransferCompleteResponse(soap, (struct _cwmp__AutonomousTransferCompleteResponse *)parser->body, "cwmp:AutonomousTransferCompleteResponse", NULL); break; case CWMP_MSG_DUSTATE_CHANGE_COMPLETE_RSP: soap_put__cwmp__DUStateChangeCompleteResponse(soap, (struct _cwmp__DUStateChangeCompleteResponse *)parser->body, "cwmp:DUStateChangeCompleteResponse", NULL); break; case CWMP_MSG_AUTONOMOUS_DUSTATE_CHANGE_COMPLETE_RSP: soap_put__cwmp__AutonomousDUStateChangeCompleteResponse(soap, (struct _cwmp__AutonomousDUStateChangeCompleteResponse *)parser->body, "cwmp:AutonomousDUStateChangeCompleteResponse", NULL); break; case CWMP_MSG_REQUEST_DOWNLOAD_RSP: soap_put__cwmp__RequestDownloadResponse(soap, (struct _cwmp__RequestDownloadResponse *)parser->body, "cwmp:RequestDownloadResponse", NULL); break; default : LOGE(LOG_TAG, "unknow type, %s(%d)", CWMP_MSG_TYPE_STRING(parser->type), parser->type); break; } if (soap_body_end_out(soap) != 0 || soap_envelope_end_out(soap) != 0 || soap_end_send(soap) != 0) { LOGE(LOG_TAG, "end encode failed, error=%d", soap->error); _soap_header_destroy(header); return NULL; } close(fd[1]); xml = _slurpfd(fd[0]); if (tags_num > 0) { int i; for (i = 0; i < tags_num; i++) { char s[128]; char d[128]; char *_xml = xml; if (src_tags[i] == NULL || dst_tags[i] == NULL || strlen(src_tags[i]) <= 0 || strlen(dst_tags[i]) <= 0) { continue; } LOGV(LOG_TAG, "replace \"%s\" to \"%s\"", src_tags[i], dst_tags[i]); snprintf(s, 128, "%s:", src_tags[i]); snprintf(d, 128, "%s:", dst_tags[i]); xml = _string_replace(_xml, s, d); if (xml == NULL) { LOGE(LOG_TAG, "replace tag failed."); return _xml; } free(_xml); } } _soap_header_destroy(header); _soap_fault_destroy(fault); return xml; }
SOAP_FMAC3 int SOAP_FMAC4 soap_putfault(struct soap *soap) { if (soap->fault) return soap_put_SOAP_ENV__Fault(soap, soap->fault, "SOAP-ENV:Fault", NULL); return SOAP_OK; }
/** * body -> xml * @param[in] handle: soap_parser * @param[in] id: cpe id? * @param[in] hold_request: hold request * @param[in] type: SOAP/RPC type * @param[in] body: a kind of struct * @return: xml, the string get from body */ char *soap_parser_encode(void *handle, CpeRpcMsg* msg) { struct soap_parser *parser = (struct soap_parser *)handle; struct soap *soap = parser->soap; int fd[2]; char *xml = NULL; int type = msg->type; pipe(fd); soap_init(soap); soap->socket = -1; soap->sendfd = fd[1]; parser->soap_header = (struct SOAP_ENV__Header *)_soap_header_create(id, hold_requests); soap->header = parser->soap_header; if (soap->header != NULL) { if (soap->header->__ID != NULL) { LOGV(parser->tag, "soap header: ID=%s(%s)", soap->header->__ID->__item, soap->header->__ID->SOAP_ENV__mustUnderstand); } if (soap->header->__HoldRequests != NULL) { LOGV(parser->tag, "soap header: HoldRequests=%d(%s)", soap->header->__HoldRequests->__item, soap->header->__HoldRequests->SOAP_ENV__mustUnderstand); } } soap_begin_send(soap); soap_envelope_begin_out(soap); soap_putheader(soap); soap_body_begin_out(soap); switch (type) { case SOAP_TYPE__ns1__Fault: { if (parser->soap_fault != NULL) { _soap_fault_free(parser->soap_fault); parser->soap_fault = NULL; } parser->soap_fault = _soap_fault_create((struct _ns1__Fault *)body); if (parser->soap_fault != NULL) { soap_put_SOAP_ENV__Fault(soap, parser->soap_fault, NULL, NULL); } break; } case SOAP_TYPE__ns1__GetRPCMethods: soap_put__ns1__GetRPCMethods(soap, (struct _ns1__GetRPCMethods *)body, "ns1:GetRPCMethods", NULL); break; case SOAP_TYPE__ns1__SetParameterValues: soap_put__ns1__SetParameterValues(soap, (struct _ns1__SetParameterValues *)body, "ns1:SetParameterValues", NULL); break; case SOAP_TYPE__ns1__GetParameterValues: soap_put__ns1__GetParameterValues(soap, (struct _ns1__GetParameterValues *)body, "ns1:GetParameterValues", NULL); break; case SOAP_TYPE__ns1__GetParameterNames: soap_put__ns1__GetParameterNames(soap, (struct _ns1__GetParameterNames *)body, "ns1:GetParameterNames", NULL); break; case SOAP_TYPE__ns1__SetParameterAttributes: soap_put__ns1__SetParameterAttributes(soap, (struct _ns1__SetParameterAttributes *)body, "ns1:SetParameterAttributes", NULL); break; case SOAP_TYPE__ns1__GetParameterAttributes: soap_put__ns1__GetParameterAttributes(soap, (struct _ns1__GetParameterAttributes *)body, "ns1:GetParameterAttributes", NULL); break; case SOAP_TYPE__ns1__AddObject: soap_put__ns1__AddObject(soap, (struct _ns1__AddObject *)body, "ns1:AddObject", NULL); break; case SOAP_TYPE__ns1__DeleteObject: soap_put__ns1__DeleteObject(soap, (struct _ns1__DeleteObject *)body, "ns1:DeleteObject", NULL); break; case SOAP_TYPE__ns1__Reboot: soap_put__ns1__Reboot(soap, (struct _ns1__Reboot *)body, "ns1:Reboot", NULL); break; case SOAP_TYPE__ns1__Download: soap_put__ns1__Download(soap, (struct _ns1__Download *)body, "ns1:Download", NULL); break; case SOAP_TYPE__ns1__ScheduleDownload: soap_put__ns1__ScheduleDownload(soap, (struct _ns1__ScheduleDownload *)body, "ns1:ScheduleDownload", NULL); break; case SOAP_TYPE__ns1__Upload: soap_put__ns1__Upload(soap, (struct _ns1__Upload *)body, "ns1:Upload", NULL); break; case SOAP_TYPE__ns1__FactoryReset: soap_put__ns1__FactoryReset(soap, (struct _ns1__FactoryReset *)body, "ns1:FactoryReset", NULL); break; case SOAP_TYPE__ns1__GetQueuedTransfers: soap_put__ns1__GetQueuedTransfers(soap, (struct _ns1__GetQueuedTransfers *)body, "ns1:GetQueuedTransfers", NULL); break; case SOAP_TYPE__ns1__GetAllQueuedTransfers: soap_put__ns1__GetAllQueuedTransfers(soap, (struct _ns1__GetAllQueuedTransfers *)body, "ns1:GetAllQueuedTransfers", NULL); break; case SOAP_TYPE__ns1__CancelTransfer: soap_put__ns1__CancelTransfer(soap, (struct _ns1__CancelTransfer *)body, "ns1:CancelTransfer", NULL); break; case SOAP_TYPE__ns1__ScheduleInform: soap_put__ns1__ScheduleInform(soap, (struct _ns1__ScheduleInform *)body, "ns1:ScheduleInform", NULL); break; case SOAP_TYPE__ns1__ChangeDUState: soap_put__ns1__ChangeDUState(soap, (struct _ns1__ChangeDUState *)body, "ns1:ChangeDUState", NULL); break; case SOAP_TYPE__ns1__GetRPCMethodsResponse: soap_put__ns1__GetRPCMethodsResponse(soap, (struct _ns1__GetRPCMethodsResponse *)body, "ns1:GetRPCMethodsResponse", NULL); break; case SOAP_TYPE__ns1__InformResponse: soap_put__ns1__InformResponse(soap, (struct _ns1__InformResponse *)body, "ns1:InformResponse", NULL); break; case SOAP_TYPE__ns1__TransferCompleteResponse: soap_put__ns1__TransferCompleteResponse(soap, (struct _ns1__TransferCompleteResponse *)body, "ns1:TransferCompleteResponse", NULL); break; case SOAP_TYPE__ns1__AutonomousTransferCompleteResponse: soap_put__ns1__AutonomousTransferCompleteResponse(soap, (struct _ns1__AutonomousTransferCompleteResponse *)body, "ns1:AutonomousTransferCompleteResponse", NULL); break; case SOAP_TYPE__ns1__DUStateChangeCompleteResponse: soap_put__ns1__DUStateChangeCompleteResponse(soap, (struct _ns1__DUStateChangeCompleteResponse *)body, "ns1:DUStateChangeCompleteResponse", NULL); break; case SOAP_TYPE__ns1__AutonomousDUStateChangeCompleteResponse: soap_put__ns1__AutonomousDUStateChangeCompleteResponse(soap, (struct _ns1__AutonomousDUStateChangeCompleteResponse *)body, "ns1:AutonomousDUStateChangeCompleteResponse", NULL); break; case SOAP_TYPE__ns1__RequestDownloadResponse: soap_put__ns1__RequestDownloadResponse(soap, (struct _ns1__RequestDownloadResponse *)body, "ns1:RequestDownloadResponse", NULL); break; default : LOGE(PARSER_TAG, "unknow SOAP_TYPE, %d", type); break; } soap_body_end_out(soap); soap_envelope_end_out(soap); soap_end_send(soap); /*soap_end(soap);*/ close(fd[1]); xml = slurpfd(fd[0]); //soap_free(soap); return xml; }