Listings zu Web Service mit Linux PDAs
Listing 1 Den Request generieren
/**
* Create the request document and return it
*
*/
xmlDocPtr getRequest(xmlChar* term, xmlChar* srcLang, xmlChar* trgLang) {
xmlDocPtr doc;
xmlNodePtr tree, subtree, subsubtree;
xmlNsPtr SOAP, xsd, xsi, ns1;
doc = xmlNewDoc((xmlChar*)"1.0");
doc->children = xmlNewDocNode(doc,NULL,(xmlChar*)"Envelope",NULL);
SOAP = xmlNewNs(doc->children
,(xmlChar*)"http://schemas.xmlsoap.org/soap/envelope/",
(xmlChar*)"SOAP-ENV");
xsi = xmlNewNs(doc->children
,(xmlChar*)"http://www.w3.org/1999/XMLSchema-instance"
,(xmlChar*)"xsi");
xsd = xmlNewNs(doc->children
,(xmlChar*)"http://www.w3.org/1999/XMLSchema"
,(xmlChar*)"xsd");
xmlSetNs(doc->children,SOAP);
tree = xmlNewChild(doc->children, SOAP, (xmlChar*)"Body", NULL);
subtree = xmlNewChild(tree,NULL,(xmlChar*)"getTranslations",NULL);
ns1 = xmlNewNs(subtree
,(xmlChar*)"urn:demo1:translate"
,(xmlChar*)"ns1");
xmlSetNs(subtree,ns1);
xmlSetNsProp(subtree,SOAP,(xmlChar*)"encoding-style",
(xmlChar*)"http://schemas.xmlsoap.org/soap/encoding/");
subsubtree = xmlNewChild(subtree,NULL,(xmlChar*)"term",term);
xmlSetNs(subsubtree,NULL);
xmlSetNsProp(subsubtree,xsi,(xmlChar*)"type"
,(xmlChar*)"xsd:string");
subsubtree = xmlNewChild(subtree,NULL,(xmlChar*)"srcLanguage",srcLang);
xmlSetNs(subsubtree,NULL);
xmlSetNsProp(subsubtree,xsi,(xmlChar*)"type"
,(xmlChar*)"xsd:string");
subsubtree = xmlNewChild(subtree,NULL,(xmlChar*)"targetLanguage",trgLang);
xmlSetNs(subsubtree,NULL);
xmlSetNsProp(subsubtree,xsi,(xmlChar*)"type"
,(xmlChar*)"xsd:string");
return doc;
}
Listing 2: Reply senden und Request parsen
xmlDocPtr performRequest(xmlDocPtr doc, char* endPoint) {
xmlDocPtr result;
char* headers = "Content-Type: text/xml; charset=utf-8\nSOAPAction: \"\"\n";
char* input;
char* docbuffer;
char temp[2];
int size;
xmlChar* doctxt;
int doclen;
xmlNanoHTTPInit();
int x;
int bytesRead;
size = 0;
xmlDocDumpFormatMemoryEnc(doc,&doctxt,&doclen,"utf-8",1);
void* ctx = xmlNanoHTTPMethod (endPoint,
"POST",
(char*)doctxt,
NULL,
headers);
char output[5096];
bytesRead = xmlNanoHTTPRead(ctx,&output,1024);
xmlParserCtxtPtr pushCtx;
pushCtx = xmlCreatePushParserCtxt(NULL, NULL,
output, bytesRead, NULL);
while (bytesRead) {
xmlParseChunk(pushCtx, output, bytesRead, 0);
bytesRead = xmlNanoHTTPRead(ctx,&output,1024);
}
output[0]='\0';
xmlParseChunk(pushCtx, output, 0, 1);
result = pushCtx->myDoc;
xmlFreeParserCtxt(pushCtx);
xmlNanoHTTPClose(ctx);
return result;
}
Listing 3: Die Benutzeroberfläche
Fl_Input *inputfield;
Fl_Browser *browser;
void translateCallback(Fl_Widget *,void *) {
// cerr << "In translate Callback" << "\n";
// cerr << "Value is " << inputfield->value();
list translations = performTranslation(inputfield->value(),
"de","en");
browser->clear();
list::iterator i = translations.begin();
while (i!=translations.end()) {
browser->add(*i);
i++;
}
}
int startGui() {
Fl_Window *window = new Fl_Window(140,130);
inputfield = new Fl_Input(30,5,60,15,"Term:");
inputfield->labelsize(8);
inputfield->textsize(8);
Fl_Button *button = new Fl_Button(95,5,40,15,"Translate");
//button->labelfont(FL_BOLD);
button->labelsize(8);
button->callback(translateCallback);
browser = new Fl_Browser(5,25,130,100);
browser->textsize(8);
window->end();
window->show();
return Fl::run();
}
Karl Banke
2004-01-06