int WsManTest_EventPoll_EP(WsEventThreadContextH threadcntx) { int retval = 0; WsNotificationInfoH notificationinfo = u_malloc(sizeof(*notificationinfo)); if(notificationinfo == NULL) return -1; notificationinfo->headerOpaqueData = ws_xml_create_doc( XML_NS_OPENWSMAN"/test", "EventTopics"); WsXmlNodeH node = ws_xml_get_doc_root(notificationinfo->headerOpaqueData); if(node) { ws_xml_set_node_text(node, "openwsman.event.test"); } notificationinfo->EventAction = u_strdup(XML_NS_OPENWSMAN"/EventReport"); notificationinfo->EventContent = ws_xml_create_doc( XML_NS_OPENWSMAN"/test", "TestReport"); if(notificationinfo->EventContent == NULL) return retval; node = ws_xml_get_doc_root(notificationinfo->EventContent); time_t timest = time(0); struct tm tm; localtime_r(×t, &tm); ws_xml_add_child_format(node, XML_NS_OPENWSMAN"/test", "EventTime","%u-%u%u-%u%uT%u%u:%u%u:%u%u", tm.tm_year + 1900, (tm.tm_mon + 1)/10, (tm.tm_mon + 1)%10, tm.tm_mday/10, tm.tm_mday%10, tm.tm_hour/10, tm.tm_hour%10, tm.tm_min/10, tm.tm_min%10, tm.tm_sec/10, tm.tm_sec%10); EventPoolOpSetH opset = threadcntx->soap->eventpoolOpSet; if(threadcntx->subsInfo->deliveryMode == WS_EVENT_DELIVERY_MODE_PULL) retval = opset->addpull(threadcntx->subsInfo->subsId, notificationinfo); else retval = opset->add(threadcntx->subsInfo->subsId, notificationinfo); if(retval) { u_free(notificationinfo->EventAction); ws_xml_destroy_doc(notificationinfo->EventContent); ws_xml_destroy_doc(notificationinfo->headerOpaqueData); u_free(notificationinfo); } return 0; }
static void wsmc_set_put_prop(WsXmlDocH get_response, WsXmlDocH put_request, client_opt_t *options) { WsXmlNodeH resource_node; char *ns_uri; hscan_t hs; hnode_t *hn; WsXmlNodeH get_body = ws_xml_get_soap_body(get_response); WsXmlNodeH put_body = ws_xml_get_soap_body(put_request); ws_xml_copy_node(ws_xml_get_child(get_body, 0, NULL, NULL), put_body); resource_node = ws_xml_get_child(put_body, 0, NULL, NULL); ns_uri = ws_xml_get_node_name_ns_uri(resource_node); if (!options->properties) { return; } hash_scan_begin(&hs, options->properties); while ((hn = hash_scan_next(&hs))) { WsXmlNodeH n = ws_xml_get_child(resource_node, 0, ns_uri, (char *) hnode_getkey(hn)); ws_xml_set_node_text(n, (char *) hnode_get(hn)); } }
int ws_xml_set_node_real(WsXmlNodeH node, double Val) { int retVal = -1; if (node) { char buf[12]; sprintf(buf, "%E", Val); retVal = ws_xml_set_node_text(node, buf); } return retVal; }
int ws_xml_set_node_long(WsXmlNodeH node, long Val) { int retVal = -1; if (node) { char buf[12]; sprintf(buf, "%ld", Val); retVal = ws_xml_set_node_text(node, buf); } return retVal; }
int ws_xml_set_node_ulong(WsXmlNodeH node, unsigned long uVal) { int retVal = -1; if (node) { char buf[12]; sprintf(buf, "%lu", uVal); retVal = ws_xml_set_node_text(node, buf); } return retVal; }
// if ns is not defined at the node or at any of its parents, it will be defined at the root // if namespaces has been changed after this function is called, itis caller's // responsibility to update QName fields accordingly int ws_xml_set_node_qname_val(WsXmlNodeH node, const char *valNsUri, const char *valName) { int retVal = -1; if (node && valName && valNsUri) { char *buf = make_qname(node, valNsUri, valName); if (buf != NULL) { retVal = ws_xml_set_node_text(node, buf); u_free(buf); } } return retVal; }
/** * Duplication complete XML tree * @param dstNode Destination XML node * @param srcNode Source XML node */ void ws_xml_duplicate_tree(WsXmlNodeH dstNode, WsXmlNodeH srcNode) { WsXmlNodeH node; if (!srcNode || !dstNode) { error("NULL arguments: dst = %p; src = %p", dstNode, srcNode); return; } node = ws_xml_add_child(dstNode, ws_xml_get_node_name_ns(srcNode), ws_xml_get_node_local_name(srcNode), NULL); if (!node) { error("could not add node"); return; } ws_xml_duplicate_attr(node, srcNode); if (ws_xml_duplicate_children(node, srcNode) == 0) { // no children ws_xml_set_node_text(node, ws_xml_get_node_text(srcNode)); } }
/** * Create a Fault * @param rqstDoc Request document (Envelope) * @param code Fault code * @param subCodeNs Namespace of sub code * @param subCode Sub code * @param lang Language for Reason section * @param reason Fault Reason * @param addDetailProc Callback for details * @param addDetailProcData Pointer to callback data * @return XML document of the fault */ WsXmlDocH wsman_create_fault_envelope(WsXmlDocH rqstDoc, const char *code, const char *subCodeNs, const char *subCode, const char *fault_action, const char *lang, const char *reason, const char *faultDetail) { WsXmlDocH doc = NULL; WsXmlNodeH header, body, fault, codeNode, node; char uuidBuf[50]; char *soapNs; if (rqstDoc) { doc = wsman_create_response_envelope(rqstDoc, fault_action); } else { /* FIXME */ doc = ws_xml_create_envelope(); } if (doc == NULL) { return NULL; } header = ws_xml_get_soap_header(doc); body = ws_xml_get_soap_body(doc); soapNs = ws_xml_get_node_name_ns(body); fault = ws_xml_add_child(body, soapNs, SOAP_FAULT, NULL); codeNode = ws_xml_add_child(fault, soapNs, SOAP_CODE, NULL); node = ws_xml_add_child(codeNode, soapNs, SOAP_VALUE, NULL); ws_xml_set_node_qname_val(node, soapNs, code); if (subCode && subCode[0] != 0 ) { node = ws_xml_add_child(codeNode, soapNs, SOAP_SUBCODE, NULL); node = ws_xml_add_child(node, soapNs, SOAP_VALUE, NULL); if (subCodeNs) ws_xml_set_node_qname_val(node, subCodeNs, subCode); else ws_xml_set_node_text(node, subCode); } if (reason) { node = ws_xml_add_child(fault, soapNs, SOAP_REASON, NULL); node = ws_xml_add_child(node, soapNs, SOAP_TEXT, NULL); ws_xml_set_node_text(node, reason); ws_xml_set_node_lang(node, !lang ? "en" : lang); } if (faultDetail) { WsXmlNodeH d = ws_xml_add_child(fault, soapNs, SOAP_DETAIL, NULL); node = ws_xml_add_child_format(d, XML_NS_WS_MAN, SOAP_FAULT_DETAIL, "%s/%s", XML_NS_WSMAN_FAULT_DETAIL, faultDetail); } generate_uuid(uuidBuf, sizeof(uuidBuf), 0); ws_xml_add_child(header, XML_NS_ADDRESSING, WSA_MESSAGE_ID, uuidBuf); return doc; }