- Timestamp:
- 05/04/09 18:08:20 (4 years ago)
- git-parent:
- Files:
-
- src/noit_capabilities_listener.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
src/noit_capabilities_listener.c
rd074a94 rdb9d1c2 18 18 #include <errno.h> 19 19 20 #include <libxml/xmlsave.h> 20 21 #include <libxml/tree.h> 21 22 … … 28 29 void 29 30 noit_capabilities_listener_init() { 30 eventer_name_callback("capabilities_transit ", noit_capabilities_handler);31 eventer_name_callback("capabilities_transit/1.0", noit_capabilities_handler); 31 32 noit_control_dispatch_delegate(noit_control_dispatch, 32 33 NOIT_CAPABILITIES_SERVICE, … … 57 58 if(!ac->service_ctx) { 58 59 char vbuff[128]; 60 noit_hash_table *lc; 61 noit_hash_iter iter = NOIT_HASH_ITER_ZERO; 62 const char *k; 63 int klen; 64 void *data; 65 59 66 xmlDocPtr xmldoc; 60 xmlNodePtr head; 61 xmlOutputBufferPtr out; 67 xmlNodePtr root, cmds; 62 68 xmlBufferPtr xmlbuffer; 69 xmlSaveCtxtPtr savectx; 63 70 64 71 cl = ac->service_ctx = calloc(1, sizeof(*cl)); … … 68 75 /* Create an XML Document */ 69 76 xmldoc = xmlNewDoc((xmlChar *)"1.0"); 70 head = xmlNewDocNode(xmldoc, NULL, (xmlChar *)"noitd_capabilities", NULL); 77 root = xmlNewDocNode(xmldoc, NULL, (xmlChar *)"noitd_capabilities", NULL); 78 xmlDocSetRootElement(xmldoc, root); 71 79 72 80 /* Fill in the document */ 73 xmlNewTextChild(head, NULL, (xmlChar *)"version", (xmlChar *)vbuff); 81 xmlNewTextChild(root, NULL, (xmlChar *)"version", (xmlChar *)vbuff); 82 83 cmds = xmlNewNode(NULL, (xmlChar *)"services"); 84 xmlAddChild(root, cmds); 85 lc = noit_listener_commands(); 86 while(noit_hash_next(lc, &iter, &k, &klen, &data)) { 87 xmlNodePtr cnode; 88 char hexcode[10]; 89 const char *name; 90 eventer_func_t *f = (eventer_func_t *)k; 91 noit_hash_table *sc = (noit_hash_table *)data; 92 noit_hash_iter sc_iter = NOIT_HASH_ITER_ZERO; 93 const char *sc_k; 94 int sc_klen; 95 void *sc_data; 96 97 name = eventer_name_for_callback(*f); 98 cnode = xmlNewNode(NULL, (xmlChar *)"service"); 99 xmlSetProp(cnode, (xmlChar *)"name", name ? (xmlChar *)name : NULL); 100 if(*f == ac->dispatch) 101 xmlSetProp(cnode, (xmlChar *)"connected", (xmlChar *)"true"); 102 xmlAddChild(cmds, cnode); 103 while(noit_hash_next(sc, &sc_iter, &sc_k, &sc_klen, &sc_data)) { 104 xmlNodePtr scnode; 105 eventer_func_t *f = (eventer_func_t *)sc_data; 106 107 snprintf(hexcode, sizeof(hexcode), "0x%08x", *((u_int32_t *)sc_k)); 108 name = eventer_name_for_callback(*f); 109 scnode = xmlNewNode(NULL, (xmlChar *)"command"); 110 xmlSetProp(scnode, (xmlChar *)"name", name ? (xmlChar *)name : NULL); 111 xmlSetProp(scnode, (xmlChar *)"code", (xmlChar *)hexcode); 112 xmlAddChild(cnode, scnode); 113 } 114 } 74 115 75 116 /* Write it out to a buffer and copy it for writing */ 76 117 xmlbuffer = xmlBufferCreate(); 77 out = xmlOutputBufferCreateBuffer(xmlbuffer, NULL);78 xml OutputBufferFlush(out);79 xml OutputBufferClose(out);118 savectx = xmlSaveToBuffer(xmlbuffer, "utf8", 1); 119 xmlSaveDoc(savectx, xmldoc); 120 xmlSaveClose(savectx); 80 121 cl->buff = strdup((const char *)xmlBufferContent(xmlbuffer)); 81 122 cl->towrite = xmlBufferLength(xmlbuffer);
