diff options
Diffstat (limited to 'examples/csoap/soapclient.c')
-rw-r--r-- | examples/csoap/soapclient.c | 301 |
1 files changed, 180 insertions, 121 deletions
diff --git a/examples/csoap/soapclient.c b/examples/csoap/soapclient.c index 5603da1..826d518 100644 --- a/examples/csoap/soapclient.c +++ b/examples/csoap/soapclient.c @@ -10,185 +10,244 @@ #define MAX_LINE_LENGTH 65535 // stripcslashes - unescapes the string -void stripcslashes(char *str, int *len) { +void +stripcslashes (char *str, int *len) +{ char *source, *target, *end; - int nlen = *len, i; + int nlen = *len, i; char numtmp[4]; - for (source=str, end=str+nlen, target=str; source < end; source++) { - if (*source == '\\' && source+1 < end) { + for (source = str, end = str + nlen, target = str; source < end; source++) + { + if (*source == '\\' && source + 1 < end) + { source++; - switch (*source) { - case 'n': *target++='\n'; nlen--; break; - case 'r': *target++='\r'; nlen--; break; - case 'a': *target++='\a'; nlen--; break; - case 't': *target++='\t'; nlen--; break; - case 'v': *target++='\v'; nlen--; break; - case 'b': *target++='\b'; nlen--; break; - case 'f': *target++='\f'; nlen--; break; - case '\\': *target++='\\'; nlen--; break; + switch (*source) + { + case 'n': + *target++ = '\n'; + nlen--; + break; + case 'r': + *target++ = '\r'; + nlen--; + break; + case 'a': + *target++ = '\a'; + nlen--; + break; + case 't': + *target++ = '\t'; + nlen--; + break; + case 'v': + *target++ = '\v'; + nlen--; + break; + case 'b': + *target++ = '\b'; + nlen--; + break; + case 'f': + *target++ = '\f'; + nlen--; + break; + case '\\': + *target++ = '\\'; + nlen--; + break; case 'x': - if (source+1 < end && isxdigit((int)(*(source+1)))) { - numtmp[0] = *++source; - if (source+1 < end && isxdigit((int)(*(source+1)))) { - numtmp[1] = *++source; - numtmp[2] = '\0'; - nlen-=3; - } else { - numtmp[1] = '\0'; - nlen-=2; - } - *target++=(char)strtol(numtmp, NULL, 16); - break; - } - default: - i=0; - while (source < end && *source >= '0' && *source <= '7' && i<3) { - numtmp[i++] = *source++; - } - if (i) { - numtmp[i]='\0'; - *target++=(char)strtol(numtmp, NULL, 8); - nlen -= i; - source--; - } else { - *target++ = *source; - nlen--; - } + if (source + 1 < end && isxdigit ((int) (*(source + 1)))) + { + numtmp[0] = *++source; + if (source + 1 < end && isxdigit ((int) (*(source + 1)))) + { + numtmp[1] = *++source; + numtmp[2] = '\0'; + nlen -= 3; + } + else + { + numtmp[1] = '\0'; + nlen -= 2; + } + *target++ = (char) strtol (numtmp, NULL, 16); + break; + } + default: + i = 0; + while (source < end && *source >= '0' && *source <= '7' && i < 3) + { + numtmp[i++] = *source++; + } + if (i) + { + numtmp[i] = '\0'; + *target++ = (char) strtol (numtmp, NULL, 8); + nlen -= i; + source--; + } + else + { + *target++ = *source; + nlen--; + } } - } else { + } + else + { *target++ = *source; } } - if (nlen != 0) *target='\0'; + if (nlen != 0) + *target = '\0'; *len = nlen; -} +} // ParseLine - gets a line, finds the commas, unescapes the value and adds it // to the SOAP request -void ParseLine(SoapCtx *ctx, char * Buffer, int LineLen) { +void +ParseLine (SoapCtx * ctx, char *Buffer, int LineLen) +{ // if wrong line length, return - if (LineLen <= 0) return; - + if (LineLen <= 0) + return; + // alloc buffer for the line, copy it - char * Line = (char *)malloc(LineLen + 1); - memcpy(Line, Buffer, LineLen); + char *Line = (char *) malloc (LineLen + 1); + memcpy (Line, Buffer, LineLen); Line[LineLen] = '\0'; - + // find first comma - char * FirstCommaPos = strchr(Line, ','); - if (!FirstCommaPos) return; - + char *FirstCommaPos = strchr (Line, ','); + if (!FirstCommaPos) + return; + // find second comma - char * SecondCommaPos = strchr(FirstCommaPos + 1, ','); - if (!SecondCommaPos) return; - + char *SecondCommaPos = strchr (FirstCommaPos + 1, ','); + if (!SecondCommaPos) + return; + // separate the three strings FirstCommaPos[0] = '\0'; SecondCommaPos[0] = '\0'; - + // unescape - int len = strlen(SecondCommaPos + 1); - stripcslashes(SecondCommaPos + 1, &len); - + int len = strlen (SecondCommaPos + 1); + stripcslashes (SecondCommaPos + 1, &len); + // add to the request - soap_env_add_item(ctx->env, Line, FirstCommaPos + 1, SecondCommaPos - + 1); - + soap_env_add_item (ctx->env, Line, FirstCommaPos + 1, SecondCommaPos + 1); + // free the buffer - free(Line); + free (Line); } -void printusage(char *FileName) { - printf("Usage: %s [URL] [URN] [SOAPMETHOD]\n\n", FileName); - printf("- [URL] is the url of the SOAP server.\n"); - printf("- [URN] is the namespace for the method/webservice.\n"); - printf("- [SOAPMETHOD] is the method to call.\n\n"); - printf("All commandline paramaters are mandatory.\n\n"); - printf("%s reads the parameters for the SOAPMETHOD from STDIN as a comma-separated list\n\n", FileName); - printf("Each line is one parameter and has the following form:\n\n"); - printf("xsd:[TYPE],[PARAMETERNAME],[PARAMETERVALUE]\n\n"); - printf("- [TYPE] is a basic type for SOAP or a complex type defined by the WSDL.\n"); - printf("- [PARAMETERNAME] is the name for the parameter of the SOAPMETHOD on this line.\n"); - printf("- [PARAMETERVALUE] is the value for the parameter. N.B. \nand other escapes are recognized.\n"); +void +printusage (char *FileName) +{ + printf ("Usage: %s [URL] [URN] [SOAPMETHOD]\n\n", FileName); + printf ("- [URL] is the url of the SOAP server.\n"); + printf ("- [URN] is the namespace for the method/webservice.\n"); + printf ("- [SOAPMETHOD] is the method to call.\n\n"); + printf ("All commandline paramaters are mandatory.\n\n"); + printf + ("%s reads the parameters for the SOAPMETHOD from STDIN as a comma-separated list\n\n", + FileName); + printf ("Each line is one parameter and has the following form:\n\n"); + printf ("xsd:[TYPE],[PARAMETERNAME],[PARAMETERVALUE]\n\n"); + printf + ("- [TYPE] is a basic type for SOAP or a complex type defined by the WSDL.\n"); + printf + ("- [PARAMETERNAME] is the name for the parameter of the SOAPMETHOD on this line.\n"); + printf + ("- [PARAMETERVALUE] is the value for the parameter. N.B. \nand other escapes are recognized.\n"); } -int main(int argc, char *argv[]) { +int +main (int argc, char *argv[]) +{ SoapCtx *ctx, *ctx2; herror_t err; - + // check the parameter count - if (argc != 4) { - printusage(argv[0]); + if (argc != 4) + { + printusage (argv[0]); return 1; } - + // init cSOAP client - err = soap_client_init_args(argc, argv); - if (err != H_OK) { - log_error4("%s():%s [%d]", herror_func(err), - herror_message(err), herror_code(err)); - herror_release(err); + err = soap_client_init_args (argc, argv); + if (err != H_OK) + { + log_error4 ("%s():%s [%d]", herror_func (err), + herror_message (err), herror_code (err)); + herror_release (err); return 1; } // create a SoapCtx object - err = soap_ctx_new_with_method(argv[2], argv[3], &ctx); - if (err != H_OK) { - log_error4("%s():%s [%d]", herror_func(err), - herror_message(err), herror_code(err)); - herror_release(err); + err = soap_ctx_new_with_method (argv[2], argv[3], &ctx); + if (err != H_OK) + { + log_error4 ("%s():%s [%d]", herror_func (err), + herror_message (err), herror_code (err)); + herror_release (err); return 1; } - + // create buffer char Buffer[MAX_LINE_LENGTH]; int bytes_read, bytes_left; - + // read from stdin until EOF - while (!feof(stdin)) { - bytes_read = fread(Buffer, 1, MAX_LINE_LENGTH, stdin); + while (!feof (stdin)) + { + bytes_read = fread (Buffer, 1, MAX_LINE_LENGTH, stdin); // pass each line into ParseLine - char * EndLinePos; - while (EndLinePos = strchr(Buffer, '\n')) { - ParseLine(ctx, Buffer, EndLinePos - Buffer); - memmove(Buffer, EndLinePos + 1, bytes_read - (EndLinePos - - Buffer + 1)); + char *EndLinePos; + while (EndLinePos = strchr (Buffer, '\n')) + { + ParseLine (ctx, Buffer, EndLinePos - Buffer); + memmove (Buffer, EndLinePos + 1, bytes_read - (EndLinePos - + Buffer + 1)); Buffer[bytes_read - (EndLinePos - Buffer + 1)] = '\0'; } - + // no '\n' found in the whole Buffer, that means line's too -long - bytes_left = strlen(Buffer); - if (bytes_left == MAX_LINE_LENGTH) { - log_error1("The parameter line is too long."); - herror_release(err); - soap_ctx_free(ctx); - return 1; - } + long bytes_left = strlen (Buffer); + if (bytes_left == MAX_LINE_LENGTH) + { + log_error1 ("The parameter line is too long."); + herror_release (err); + soap_ctx_free (ctx); + return 1; + } } // invoke - err = soap_client_invoke(ctx, &ctx2, argv[1], ""); - if (err != H_OK) { - log_error4("[%d] %s(): %s ", herror_code(err), - herror_func(err), herror_message(err)); - herror_release(err); - soap_ctx_free(ctx); + err = soap_client_invoke (ctx, &ctx2, argv[1], ""); + if (err != H_OK) + { + log_error4 ("[%d] %s(): %s ", herror_code (err), + herror_func (err), herror_message (err)); + herror_release (err); + soap_ctx_free (ctx); return 1; } - + // print the result - soap_xml_doc_print(ctx2->env->root->doc); - + soap_xml_doc_print (ctx2->env->root->doc); + // free the objects - soap_ctx_free(ctx2); - soap_ctx_free(ctx); + soap_ctx_free (ctx2); + soap_ctx_free (ctx); // destroy the cSOAP client - soap_client_destroy(); - + soap_client_destroy (); + return 0; } |