示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
文件: soap_parser.c 项目: bazz2/cpe
/**
 * 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;
}