⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dimeclient.cpp

📁 linux下简单对象应用协议的开发库
💻 CPP
字号:
/*	dimeclient.cpp	Example DIME client for simple image server. This DIME client	demonstrates the new gSOAP DIME streaming feature.	Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved.	Run from command line. The first optional argument is the image file	name. The second optional argument is the service endpoint URL. The	third optional argument is the file name to save the image file to.*/#include "soapH.h"#include "dime.nsmap"#include <sys/stat.h>	// use fstat() for streaming DIME
// streaming DIME callbacksstatic void *dime_write_open(struct soap*, const char*, const char*, const char*);static void dime_write_close(struct soap*, void*);static int dime_write(struct soap*, void*, const char*, size_t);
static void *dime_read_open(struct soap*, void*, const char*, const char*, const char*);
static void dime_read_close(struct soap*, void*);
static size_t dime_read(struct soap*, void*, char*, size_t);


static int getImage(const char *name, const char *url, const char *outputfile) {
	struct soap soap;
	xsd__base64Binary image;
	soap_init(&soap);
    soap.user = (void*)outputfile;
    soap.fdimewriteopen = dime_write_open;
    soap.fdimewriteclose = dime_write_close;
    soap.fdimewrite = dime_write;
	soap.connect_timeout = 10;
	int nRet = soap_call_ns__getImage(&soap, url, "", (char *)name, image);
	if (nRet != SOAP_OK) {
		soap_print_fault(&soap, stderr);
	} else {
		printf("got an image, I suppose\n");
	}
	soap_destroy(&soap);
	soap_end(&soap);
	return nRet;
}
static int putImage(const char *name, const char *url, const char *inputfile) {
	FILE *fd = fopen(inputfile, "rb");
	if (NULL == fd) {
		printf("failed to open %s\n", inputfile);
		return 3;
	}
	struct stat sb;
	if (0 != fstat(fileno(fd), &sb) || sb.st_size <= 0) {
		printf("cannot find the length of file %s\n", inputfile);
		return 4;

	}
	struct soap soap;
	soap_init(&soap);
	xsd__base64Binary *pimage = soap_new_xsd__base64Binary(&soap, -1);
    soap.user = (void *)inputfile;
	soap.fdimereadopen = dime_read_open;
	soap.fdimereadclose = dime_read_close;
	soap.fdimeread = dime_read;
	pimage->__ptr = (unsigned char*)fd; 
	pimage->__size = sb.st_size; // must set size
    pimage->type = "image/jpeg";
	pimage->options = soap_dime_option(&soap, 0, "My sent picture");
	soap.connect_timeout = 10;

	int nStatus = 0;
	int nRet = soap_call_ns__putImage(&soap, url, "", (char *)name, pimage, nStatus);
	if (nRet != SOAP_OK) {
		soap_print_fault(&soap, stderr);
	} else {
		printf("sent an image, I suppose");
	}
	soap_destroy(&soap);
	soap_end(&soap);
	return nRet;
}
int main(const int argc, const char *const *const argv) { 
	if (4 != argc) {
		printf("usage: %s imagename outputfilename\n", argv[0]);
		return 1;
	}
	int nRet = 0;
	nRet = getImage(argv[1], argv[2], argv[3]);
	if (0 == nRet) {
		nRet = putImage(argv[1], argv[2], argv[3]);
	}
	return nRet;}static void *dime_write_open(struct soap *soap, const char *id, const char *type, const char *options){ FILE *handle = NULL;  // we can return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment  handle = fopen((char*)soap->user, "wb");  if (handle)    printf("Streaming image id=%s type=%s into file %s\n", id, type, (char*)soap->user);  else  { soap->error = SOAP_EOF; // could not open file for writing    soap->errnum = errno; // get reason  }  return (void*)handle;}static void dime_write_close(struct soap *soap, void *handle){ fclose((FILE*)handle);}static int dime_write(struct soap *soap, void *handle, const char *buf, size_t len){ size_t nwritten;  while (len)  { nwritten = fwrite(buf, 1, len, (FILE*)handle);    if (!nwritten)    { soap->errnum = errno; // get reason      return SOAP_EOF;    }    len -= nwritten;    buf += nwritten;  }  return SOAP_OK;}//// reading routines for putImage:
/** save a file sent by the client to our server */
static void *dime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *options) {
  // we should return NULL without setting soap->error if we don't want to use the streaming callback for this DIME attachment. The handle contains the non-NULL __ptr field value which should have been set in the application.
  // the value of the handle can be changed and will be passed on to the fdimeread and fdimereadclose callbacks. The value will not affect the __ptr field.
  return handle;
}

static void dime_read_close(struct soap *soap, void *handle) {
	fclose((FILE*)handle);
}
static size_t dime_read(struct soap *soap, void *handle, char *buf, size_t len) {
	return fread(buf, 1, len, (FILE*)handle);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -