static Image *ReadURLImage(const ImageInfo *image_info,ExceptionInfo *exception) { #define MaxBufferExtent 8192 char filename[MaxTextExtent]; FILE *file; Image *image; ImageInfo *read_info; int unique_file; image=(Image *) NULL; read_info=CloneImageInfo(image_info); SetImageInfoBlob(read_info,(void *) NULL,0); file=(FILE *) NULL; unique_file=AcquireUniqueFileResource(read_info->filename); if (unique_file != -1) file=fdopen(unique_file,"wb"); if ((unique_file == -1) || (file == (FILE *) NULL)) { read_info=DestroyImageInfo(read_info); (void) CopyMagickString(image->filename,read_info->filename, MaxTextExtent); ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile", image->filename); image=DestroyImageList(image); return((Image *) NULL); } (void) CopyMagickString(filename,image_info->magick,MaxTextExtent); (void) ConcatenateMagickString(filename,":",MaxTextExtent); LocaleLower(filename); (void) ConcatenateMagickString(filename,image_info->filename,MaxTextExtent); if (LocaleCompare(read_info->magick,"file") == 0) { (void) RelinquishUniqueFileResource(read_info->filename); unique_file=(-1); (void) CopyMagickString(read_info->filename,image_info->filename+2, MaxTextExtent); } #if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_FTP_ENABLED) if (LocaleCompare(read_info->magick,"ftp") == 0) { void *context; xmlNanoFTPInit(); context=xmlNanoFTPNewCtxt(filename); if (context != (void *) NULL) { if (xmlNanoFTPConnect(context) >= 0) (void) xmlNanoFTPGet(context,GetFTPData,(void *) file, (char *) NULL); (void) xmlNanoFTPClose(context); } } #endif #if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_HTTP_ENABLED) if (LocaleCompare(read_info->magick,"http") == 0) { char buffer[MaxBufferExtent], *type; int bytes; void *context; type=(char *) NULL; context=xmlNanoHTTPMethod(filename,(const char *) NULL, (const char *) NULL,&type,(const char *) NULL,0); if (context != (void *) NULL) { ssize_t count; while ((bytes=xmlNanoHTTPRead(context,buffer,MaxBufferExtent)) > 0) count=(ssize_t) fwrite(buffer,bytes,1,file); xmlNanoHTTPClose(context); xmlFree(type); xmlNanoHTTPCleanup(); } } #endif (void) fclose(file); *read_info->magick='\0'; image=ReadImage(read_info,exception); if (unique_file != -1) (void) RelinquishUniqueFileResource(read_info->filename); read_info=DestroyImageInfo(read_info); if (image == (Image *) NULL) (void) ThrowMagickException(exception,GetMagickModule(),CoderError, "NoDataReturned","`%s'",filename); return(GetFirstImageInList(image)); }
int raptor_www_libxml_fetch(raptor_www *www) { char* headers=NULL; if(www->proxy) xmlNanoHTTPScanProxy(www->proxy); if(www->http_accept || www->user_agent) { size_t accept_len=0; size_t ua_len=0; size_t cc_len=0; size_t len=0; char *p; if(www->http_accept) { accept_len=strlen(www->http_accept); len+=accept_len+2; /* \r\n */ } if(www->user_agent) { ua_len=strlen(www->user_agent); len+=12+ua_len+2; /* strlen("User-Agent: ") + \r\n */ } if(www->cache_control) { cc_len=strlen(www->cache_control); len+=cc_len+2; /* \r\n */ } headers=(char*)RAPTOR_MALLOC(cstring, len+1); if(!headers) return 1; p=headers; if(www->http_accept) { strncpy(p, www->http_accept, accept_len); p+= accept_len; *p++='\r'; *p++='\n'; } if(www->user_agent) { strncpy(p, "User-Agent: ", 12); p+=12; strncpy(p, www->user_agent, ua_len); p+= ua_len; *p++='\r'; *p++='\n'; } if(www->cache_control) { strncpy(p, www->cache_control, cc_len); p+= cc_len; *p++='\r'; *p++='\n'; } *p='\0'; } www->ctxt=xmlNanoHTTPMethod((const char*)raptor_uri_as_string_v2(www->world, www->uri), NULL, /* HTTP method (default GET) */ NULL, /* input string */ &www->type, headers, 0); /* input length - ilen */ if(headers) RAPTOR_FREE(cstring, headers); if(!www->ctxt) return 1; if(www->type) { if(www->content_type) { www->content_type(www, www->content_type_userdata, www->type); if(www->failed) { xmlNanoHTTPClose(www->ctxt); return 1; } } xmlFree(www->type); www->type=NULL; } www->status_code=xmlNanoHTTPReturnCode(www->ctxt); while(1) { int len=xmlNanoHTTPRead(www->ctxt, www->buffer, RAPTOR_WWW_BUFFER_SIZE); if(len<0) break; www->total_bytes += len; if(www->write_bytes) www->write_bytes(www, www->write_bytes_userdata, www->buffer, len, 1); if(len < RAPTOR_WWW_BUFFER_SIZE || www->failed) break; } xmlNanoHTTPClose(www->ctxt); return www->failed; }
void* xmlNanoHTTPOpen(const char *URL, char **contentType) { if (contentType != NULL) *contentType = NULL; return(xmlNanoHTTPMethod(URL, NULL, NULL, contentType, NULL, 0)); }
void CheckVersionNumber() { //==== Init Nano HTTP ====// xmlNanoHTTPInit(); xmlNanoHTTPScanProxy(NULL); //==== Compute Version Number ====// int ver_no = 10000*VSP_VERSION_MAJOR + 100*VSP_VERSION_MINOR + VSP_VERSION_CHANGE; char cCurrentPath[FILENAME_MAX]; GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)); int user_id = 0; int path_len = strlen(cCurrentPath); for ( int i = 0 ; i < path_len ; i++ ) { srand ( (unsigned int)cCurrentPath[i] ); user_id += rand() % 100000 + 1; } //==== Post User Info To Server ====// char poststr[256]; sprintf( poststr, "postvar1=%d&postvar2=%d\r\n", user_id, ver_no); int poststrlen = strlen(poststr); char* headers = "Content-Type: application/x-www-form-urlencoded \n"; void * ctx = 0; ctx = xmlNanoHTTPMethod("http://www.openvsp.org/vspuse_post.php", "POST", poststr, NULL, headers, poststrlen ); if ( ctx ) xmlNanoHTTPClose(ctx); ctx = 0; //==== Open Settings File ====// bool check_version_flag = true; FILE* vsptime_fp = fopen( ".vsptime", "r" ); if ( vsptime_fp ) { char str[256]; fgets( str, 256, vsptime_fp ); int vsp_time = atoi( str ); int del_time = (int)time(NULL) - vsp_time; if ( del_time < 60*60*24*7 ) // Check Every Week check_version_flag = false; fclose( vsptime_fp ); } //==== Enough Time Has Passed - Check For New Version ====// if ( check_version_flag ) { //==== Webpage with Version Info ====// char * pContentType = 0; ctx = xmlNanoHTTPOpen("http://www.openvsp.org/latest_version.html", &pContentType); int retCode = xmlNanoHTTPReturnCode(ctx); //==== Http Return Code 200 -> OK ====// string contentStr; if ( retCode == 200 ) { char buf[2048]; int len = 1; while (len > 0 && contentStr.size() < 10000 ) { len = xmlNanoHTTPRead(ctx, buf, sizeof(buf)); contentStr.append( buf, len ); } } //==== Pulled A String From Server =====// if ( contentStr.size() > 0 ) { int major_ver, minor_ver, change_ver; bool valid = ExtractVersionNumber( contentStr, &major_ver, &minor_ver, &change_ver ); if ( valid ) { if ( major_ver != VSP_VERSION_MAJOR ||minor_ver != VSP_VERSION_MINOR || change_ver != VSP_VERSION_CHANGE ) { if ( screenMgrPtr ) screenMgrPtr->MessageBox("A new version of OpenVSP is available at http://www.openvsp.org/"); } } } //===== Write Time =====// FILE* vsptime_fp = fopen( ".vsptime", "w" ); if ( vsptime_fp ) { fprintf( vsptime_fp, "%d", time(NULL) ); fclose( vsptime_fp ); } } if ( ctx ) xmlNanoHTTPClose(ctx); xmlNanoHTTPCleanup(); }