From 2e96c3880c010e34363be9300ebbc7935de4a67a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Sch=C3=BCmann?= Date: Fri, 11 Apr 2014 17:22:27 +0000 Subject: SendSS: + CSend now handles image upload via HTTP, at least provides helper functions for POST requests (CSend) - CSendImageShack simplified and removed custom HTTP form stuff as it's now integrated and easier to use in CSend (CSendImageShack) * version bump and User-Agent fix (version.h) git-svn-id: http://svn.miranda-ng.org/main/trunk@8958 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/SendScreenshotPlus/src/CSend.cpp | 162 ++++++++++++++ plugins/SendScreenshotPlus/src/CSend.h | 15 ++ plugins/SendScreenshotPlus/src/CSendImageShack.cpp | 244 ++++----------------- plugins/SendScreenshotPlus/src/CSendImageShack.h | 13 -- plugins/SendScreenshotPlus/src/version.h | 6 +- 5 files changed, 221 insertions(+), 219 deletions(-) diff --git a/plugins/SendScreenshotPlus/src/CSend.cpp b/plugins/SendScreenshotPlus/src/CSend.cpp index b79fd340cd..a2b2e7e9b3 100644 --- a/plugins/SendScreenshotPlus/src/CSend.cpp +++ b/plugins/SendScreenshotPlus/src/CSend.cpp @@ -447,3 +447,165 @@ void CSend::Exit(unsigned int Result) { if(m_bAsync) delete this;/// deletes derived class since destructor is virtual (which also auto-calls base dtor) } + +/// helper functions used for HTTP uploads +//--------------------------------------------------------------------------- +const char* CSend::GetHTMLContent(char* str, const char* startTag, const char* endTag) { + char* begin=strstr(str,startTag); + if(!begin) return NULL; + begin+=strlen(startTag); + char* end=strstr(begin,endTag); + if(end) *end=0; + return begin; +} + +static void HTTPFormAppendData(NETLIBHTTPREQUEST* nlhr, size_t* dataMax, char** dataPos, const char* data,size_t len){ + nlhr->dataLength=(*dataPos-nlhr->pData); + if(nlhr->dataLength+len >= *dataMax){ + *dataPos=nlhr->pData; + *dataMax+=0x1000+0x1000*(len>>12); + nlhr->pData=(char*)mir_realloc(nlhr->pData,*dataMax); + if(!nlhr->pData) mir_free(*dataPos); + *dataPos=nlhr->pData; + if(!*dataPos) + return; + *dataPos+=nlhr->dataLength; + } + if(data){ + memcpy(*dataPos,data,sizeof(char)*len); *dataPos+=len; + nlhr->dataLength+=len; // not necessary + } +} +void CSend::HTTPFormDestroy(NETLIBHTTPREQUEST* nlhr) +{ + mir_free(nlhr->headers[0].szValue), nlhr->headers[0].szValue=NULL; + mir_free(nlhr->headers), nlhr->headers=NULL; + mir_free(nlhr->pData), nlhr->pData=NULL; +} +int CSend::HTTPFormCreate(NETLIBHTTPREQUEST* nlhr,int requestType,char* url,HTTPFormData* frm,size_t frmNum) +{ + char boundary[16]; + memcpy(boundary,"--M461C/",8); + { + union{ + DWORD num; + unsigned char cr[4]; + };num=GetTickCount()^0x8000; + for(int i=0; i<4; ++i){ + unsigned char chcode=cr[i]>>4; + boundary[8+i*2]=(chcode<0x0a ? '0' : 'a'-0x0a)+chcode; + chcode=cr[i]&0x0f; + boundary[9+i*2]=(chcode<0x0a ? '0' : 'a'-0x0a)+chcode; + } + } + nlhr->cbSize =sizeof(NETLIBHTTPREQUEST); + nlhr->requestType =requestType; + nlhr->flags =NLHRF_HTTP11; + nlhr->szUrl =url; + nlhr->headersCount =3; + nlhr->headers =(NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*nlhr->headersCount); + { + char* contenttype=(char*)mir_alloc(sizeof(char)*(30+1+sizeof(boundary))); + memcpy(contenttype,"multipart/form-data; boundary=",30); + memcpy(contenttype+30,boundary,sizeof(boundary)); + contenttype[30+sizeof(boundary)]='\0'; + nlhr->headers[0].szName ="Content-Type"; + nlhr->headers[0].szValue =contenttype; + nlhr->headers[1].szName ="User-Agent"; + nlhr->headers[1].szValue =__USER_AGENT_STRING; + nlhr->headers[2].szName ="Accept-Language"; + nlhr->headers[2].szValue ="en-us,en;q=0.8"; +// nlhr->headers[3].szName ="Referer"; +// nlhr->headers[3].szValue ="http://www.imageshack.us/upload_api.php"; + } + char* dataPos=nlhr->pData; + size_t dataMax=0; + for(HTTPFormData* iter=frm,* end=frm+frmNum; iter!=end; ++iter){ + HTTPFormAppendData(nlhr,&dataMax,&dataPos,NULL,2+sizeof(boundary)+40); + memset(dataPos,'-',2); dataPos+=2; + memcpy(dataPos,boundary,sizeof(boundary)); dataPos+=sizeof(boundary); + memcpy(dataPos,"\r\nContent-Disposition: form-data; name=\"",40); dataPos+=40; + size_t namelen=strlen(iter->name), valuelen=strlen(iter->value); + if(iter->flags&HTTPFORM_FILE){ + const char* filename =strrchr(iter->value,'\\'); + if(!filename) filename =strrchr(iter->value,'/'); + if(!filename) filename =iter->value; + else ++filename; + valuelen=strlen(filename); + HTTPFormAppendData(nlhr,&dataMax,&dataPos,NULL,namelen+13+valuelen+17); + memcpy(dataPos,iter->name,namelen); dataPos+=namelen; + memcpy(dataPos,"\"; filename=\"",13); dataPos+=13; + memcpy(dataPos,filename,valuelen); dataPos+=valuelen; + memcpy(dataPos,"\"\r\nContent-Type: ",17); dataPos+=17; + /// add mime type + const char* mime="application/octet-stream"; + const char* fileext=strrchr(filename,'.'); + if(fileext){ + if(!strcmp(fileext,".jpg") || !strcmp(fileext,".jpeg") || !strcmp(fileext,".jpe")) + mime="image/jpeg"; + else if(!strcmp(fileext,".bmp")) + mime="image/bmp"; + else if(!strcmp(fileext,".png")) + mime="image/png"; + else if(!strcmp(fileext,".gif")) + mime="image/gif"; + else if(!strcmp(fileext,".tif") || !strcmp(fileext,".tiff")) + mime="image/tiff"; + } + HTTPFormAppendData(nlhr,&dataMax,&dataPos,mime,strlen(mime)); + HTTPFormAppendData(nlhr,&dataMax,&dataPos,"\r\n\r\n",4); + /// add file content + size_t filesize=0; + FILE* fp=fopen(iter->value,"rb"); + if(fp){ + fseek(fp,0,SEEK_END); + filesize=ftell(fp); fseek(fp,0,SEEK_SET); + HTTPFormAppendData(nlhr,&dataMax,&dataPos,NULL,filesize+2); + if(fread(dataPos,1,filesize,fp)!=filesize){ + fclose(fp), fp=NULL; + } + } + if(!fp){ + HTTPFormDestroy(nlhr); + Error(_T("Error occurred when opening local file.\nAborting file upload...")); + Exit(ACKRESULT_FAILED); + return 1; + }else + fclose(fp); + dataPos+=filesize; + memcpy(dataPos,"\r\n",2); dataPos+=2; + }else if(iter->flags&HTTPFORM_8BIT){ + HTTPFormAppendData(nlhr,&dataMax,&dataPos,NULL,namelen+38+valuelen+2); + memcpy(dataPos,iter->name,namelen); dataPos+=namelen; + memcpy(dataPos,"\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n",38); dataPos+=38; + memcpy(dataPos,iter->value,valuelen); dataPos+=valuelen; + memcpy(dataPos,"\r\n",2); dataPos+=2; + }else{ + HTTPFormAppendData(nlhr,&dataMax,&dataPos,NULL,namelen+5+valuelen+2); + memcpy(dataPos,iter->name,namelen); dataPos+=namelen; + memcpy(dataPos,"\"\r\n\r\n",5); dataPos+=5; + memcpy(dataPos,iter->value,valuelen); dataPos+=valuelen; + memcpy(dataPos,"\r\n",2); dataPos+=2; + } + } + HTTPFormAppendData(nlhr,&dataMax,&dataPos,NULL,2+sizeof(boundary)+4); + memset(dataPos,'-',2); dataPos+=2; + memcpy(dataPos,boundary,sizeof(boundary)); dataPos+=sizeof(boundary); + memcpy(dataPos,"--\r\n",4); dataPos+=4; + nlhr->dataLength=dataPos-nlhr->pData; + #ifdef _DEBUG /// print request content to "_sendss_tmp" file for debugging + { + FILE* fp=fopen("_sendss_tmp","wb"); + if(fp){ + fprintf(fp,"--Target-- %s\n",nlhr->szUrl); + for(int i=0; iheadersCount; ++i){ + fprintf(fp,"%s: %s\n",nlhr->headers[i].szName,nlhr->headers[i].szValue); + } + fprintf(fp,"\n\n"); + fwrite(nlhr->pData,1,nlhr->dataLength,fp); + fclose(fp); + } + } + #endif // _DEBUG + return 0; +} diff --git a/plugins/SendScreenshotPlus/src/CSend.h b/plugins/SendScreenshotPlus/src/CSend.h index 77b0d677e9..fdf84d712b 100644 --- a/plugins/SendScreenshotPlus/src/CSend.h +++ b/plugins/SendScreenshotPlus/src/CSend.h @@ -99,6 +99,21 @@ class CSend { void DB_EventAdd(WORD EventType); static INT_PTR CALLBACK ResultDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); + + /// HTTP upload helper stuff + enum HTTPFormFlags{ + HTTPFORM_TEXT=0x00, + HTTPFORM_8BIT=0x01, + HTTPFORM_FILE=0x02, + }; + struct HTTPFormData{ + const char* name; + const char* value; + int flags; + }; + static const char* GetHTMLContent(char* str, const char* startTag, const char* endTag); /// changes "str", can be successfully used only once + void HTTPFormDestroy(NETLIBHTTPREQUEST* nlhr); /// use to free data inside "nlhr" created by HTTPFormCreate + int HTTPFormCreate(NETLIBHTTPREQUEST* nlhr,int requestType,char* url,HTTPFormData* frm,size_t frmNum); /// returns "0" on success, Exit() will be called on failure (stop processing) }; #endif diff --git a/plugins/SendScreenshotPlus/src/CSendImageShack.cpp b/plugins/SendScreenshotPlus/src/CSendImageShack.cpp index 84c57e0274..f6141651c2 100644 --- a/plugins/SendScreenshotPlus/src/CSendImageShack.cpp +++ b/plugins/SendScreenshotPlus/src/CSendImageShack.cpp @@ -34,19 +34,9 @@ CSendImageShack::CSendImageShack(HWND Owner, MCONTACT hContact, bool bAsync) : CSend(Owner, hContact, bAsync) { m_EnableItem = SS_DLG_DESCRIPTION | SS_DLG_AUTOSEND | SS_DLG_DELETEAFTERSSEND; m_pszSendTyp = LPGENT("Image upload"); - m_pszFileName = NULL; - m_pszContentType = NULL; - m_MFDRboundary = NULL; - m_nlreply = NULL; - m_Url = NULL; } CSendImageShack::~CSendImageShack(){ - mir_free(m_pszFileName); - mir_free(m_MFDRboundary); - // FREEHTTPREQUESTSTRUCT* - if (m_nlreply) CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM) m_nlreply); - mir_free(m_Url); }; //--------------------------------------------------------------------------- @@ -56,123 +46,19 @@ int CSendImageShack::Send() { Exit(ACKRESULT_FAILED); return !m_bAsync; } - if (!m_pszFileName) { - m_pszFileName = GetFileNameA(m_pszFile); - } - if (!m_pszContentType) GetContentType(); - - // create new boundary - MFDR_Reset(); - - // initialize the netlib request ZeroMemory(&m_nlhr, sizeof(m_nlhr)); - m_nlhr.cbSize = sizeof(m_nlhr); - m_nlhr.requestType = REQUEST_POST; - m_nlhr.flags = NLHRF_HTTP11; //NLHRF_DUMPASTEXT; - m_nlhr.szUrl = "http://www.imageshack.us/upload_api.php"; - m_nlhr.headersCount = 6; - { //NETLIBHTTPHEADER start - m_nlhr.headers=(NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*m_nlhr.headersCount); - m_nlhr.headers[0].szName = "Referer"; - m_nlhr.headers[0].szValue = "http://www.imageshack.us/upload_api.php"; - m_nlhr.headers[1].szName = "Connection"; - m_nlhr.headers[1].szValue = "Keep-alive"; - m_nlhr.headers[2].szName = "AcceptLanguage"; - m_nlhr.headers[2].szValue = "en-us, pt-br"; - m_nlhr.headers[3].szName = "Host"; - m_nlhr.headers[3].szValue = "imageshack.us"; - m_nlhr.headers[4].szName = "User-Agent"; - m_nlhr.headers[4].szValue = __USER_AGENT_STRING; //szAgent; /; - //nlhr.headers[x].szName = "Authorization"; - //nlhr.headers[x].szValue = auth; //Basic base-64-authorization - - //$header .= "Content-type: multipart/form-data; boundary=" . part::getBoundary() . "\r\n"; - mir_snprintf(m_nlheader_ContentType, SIZEOF(m_nlheader_ContentType), "multipart/form-data; boundary=%s", m_MFDRboundary); - m_nlhr.headers[m_nlhr.headersCount-1].szName = "Content-Type"; - m_nlhr.headers[m_nlhr.headersCount-1].szValue = m_nlheader_ContentType; - } //NETLIBHTTPHEADER end - -//POST DATA file-header, init DATA with MultipartFormDataRequest - //$params[] = new filepart('fileupload', $file, basename($file), $contentType, 'iso-8859-1'); - //($this->sendStart($h);) - AppendToData("--"); - AppendToData(m_MFDRboundary); - AppendToData("\r\n"); - //($this->sendDispositionHeader($h);) - AppendToData("Content-Disposition: form-data; name=\""); - AppendToData("fileupload"); - AppendToData("\"; filename=\""); - AppendToData(m_pszFileName); - AppendToData("\""); - AppendToData("\r\n"); - //($this->sendContentTypeHeader($h);) - AppendToData("Content-Type: "); - AppendToData(m_pszContentType); - AppendToData("; charset="); - AppendToData("iso-8859-1"); - //($this->sendEndOfHeader($h);) - AppendToData("\r\n"); - AppendToData("\r\n"); - //Now we add the file binary ($this->sendData($h)) - FILE * fileId = _tfsopen(m_pszFile, _T("rb"), _SH_DENYWR ); - if( !fileId) { - Error(SS_ERR_INIT, m_pszSendTyp); - Exit(ACKRESULT_FAILED); + char* tmp; tmp=mir_t2a(m_pszFile); + HTTPFormData frm[]={ + {"fileupload",tmp,HTTPFORM_FILE}, + //{"rembar","yes"},// no info bar on thumb + {"public","no"}, + {"key",DEVKEY_IMAGESHACK,HTTPFORM_8BIT}, + }; + int error=HTTPFormCreate(&m_nlhr,REQUEST_POST,"http://imageshack.us/upload_api.php",frm,sizeof(frm)/sizeof(HTTPFormData)); + mir_free(tmp); + if(error) return !m_bAsync; - } - fseek(fileId, NULL, SEEK_END); - size_t lenFile = ftell(fileId); - size_t sizeDest = sizeof(char)*(m_nlhr.dataLength + lenFile + 1); - m_nlhr.pData = (char *) mir_realloc(m_nlhr.pData, sizeDest); - fseek(fileId, NULL, SEEK_SET ); - int i; - int ch = fgetc( fileId ); - for( i=0; (i < (int)lenFile ) && ( feof( fileId ) == 0 ); i++ ) { - m_nlhr.pData[m_nlhr.dataLength+i] = (char)ch; - ch = fgetc( fileId ); - } - m_nlhr.pData[sizeDest-1] = 0; //NULL Termination for binary data - m_nlhr.dataLength = (int)sizeDest - 1; - fclose(fileId); - //($this->sendEnd($h);) - AppendToData("\r\n"); - -//POST DATA footer (for "optimage", 1) -//POST DATA footer (for "optsize", optsize) - -//POST DATA footer (for "tags", tags) -//POST DATA footer (for "rembar", "yes" : "no") -//POST DATA footer (for "public", "yes" : "no") -//POST DATA footer (for "cookie", cookie) - -//POST DATA footer (for "key", DEVKEY_IMAGESHACK) - //($this->sendStart($h);) - AppendToData("--"); - AppendToData(m_MFDRboundary); - AppendToData("\r\n"); - //($this->sendDispositionHeader($h);) - AppendToData("Content-Disposition: form-data; name=\""); - AppendToData("key"); - AppendToData("\""); - //($this->sendTransferEncodingHeader($h); ) - AppendToData("\r\n"); - AppendToData("Content-Transfer-Encoding: "); - AppendToData("8bit"); //??"binary" - //($this->sendEndOfHeader($h);) - AppendToData("\r\n"); - AppendToData("\r\n"); - //($this->sendData($h);) - AppendToData(DEVKEY_IMAGESHACK); - //($this->sendEnd($h);) - AppendToData("\r\n"); - -//POST DATA Exit - //$postdata = "--" . part::getBoundary() . "--\r\n"; - AppendToData("--"); - AppendToData(m_MFDRboundary); - AppendToData("--\r\n"); - -//start upload thread + /// start upload thread if(m_bAsync){ mir_forkthread(&CSendImageShack::SendThreadWrapper, this); return 0; @@ -183,24 +69,35 @@ int CSendImageShack::Send() { void CSendImageShack::SendThread() { //send DATA and wait for m_nlreply - m_nlreply = (NETLIBHTTPREQUEST *) CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM) hNetlibUser, (LPARAM) &m_nlhr); - mir_freeAndNil(m_nlhr.pData); - mir_freeAndNil(m_nlhr.headers); - if(m_nlreply){ - if( m_nlreply->resultCode >= 200 && m_nlreply->resultCode < 300 ){ - m_nlreply->pData[m_nlreply->dataLength] = 0;// make sure its null terminated - const char* URL = NULL; - URL = GetTagContent(m_nlreply->pData, "", ""); - if (URL && URL[0]!= NULL) { - m_Url = mir_strdup(URL); - if(m_bSilent) - return; - svcSendMsgExit(URL); return; - }else{//check error mess from server - TCHAR* err = mir_a2t(GetTagContent(m_nlreply->pData, "")); - if (!err || !*err){//fallback to server response mess - mir_freeAndNil(err); - err = mir_a2t(m_nlreply->pData); + NETLIBHTTPREQUEST* reply=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)hNetlibUser, (LPARAM)&m_nlhr); + HTTPFormDestroy(&m_nlhr); + if(reply){ + if(reply->resultCode>=200 && reply->resultCode<300){ + reply->pData[reply->dataLength]='\0';/// make sure its null terminated + const char* url=NULL; + url=GetHTMLContent(reply->pData,"",""); + if(url && *url){ + mir_free(m_URL), m_URL=mir_strdup(url); + mir_free(m_URLthumb), m_URLthumb=mir_strdup(m_URL); + int extlen; + char* pos=strrchr(m_URLthumb,'.'); + if(pos && (extlen=mir_strlen(pos))>2){ + char* tmp=mir_strdup(pos); + memcpy(pos,".th",3); + memcpy(pos+3,tmp,extlen-3); + mir_stradd(m_URLthumb,tmp+extlen-3); + mir_free(tmp); + }else{ + mir_freeAndNil(m_URLthumb); + } + svcSendMsgExit(url); return; + }else{/// check error mess from server + url=GetHTMLContent(reply->pData,""); + TCHAR* err=NULL; + if(url) err=mir_a2t(url); + if (!err || !*err){/// fallback to server response mess + mir_free(err); + err=mir_a2t(reply->pData); } Error(_T("%s"),err); mir_free(err); @@ -208,8 +105,7 @@ void CSendImageShack::SendThread() { }else{ Error(LPGENT("Upload server did not respond timely.")); } - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM) m_nlreply); - m_nlreply = NULL; + CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)reply); }else{ Error(SS_ERR_INIT, m_pszSendTyp); } @@ -219,61 +115,3 @@ void CSendImageShack::SendThread() { void CSendImageShack::SendThreadWrapper(void * Obj) { reinterpret_cast(Obj)->SendThread(); } - -//--------------------------------------------------------------------------- -void CSendImageShack::MFDR_Reset() { - char Temp[64]; - DWORD dwBoundaryRand1 = GetTickCount(); - DWORD dwBoundaryRand2 = rand(); - - mir_freeAndNil(m_MFDRboundary); - mir_snprintf(Temp, SIZEOF(Temp), "B-O-U-N-D-A-R-Y%u%u", dwBoundaryRand1, dwBoundaryRand2); - mir_stradd(m_MFDRboundary,Temp); -} - -void CSendImageShack::GetContentType() { - if (m_pszContentType) mir_freeAndNil(m_pszContentType); - char* FileExtension = GetFileExtA(m_pszFile); - - if ((strcmp(FileExtension, ".jpeg")==0) || (strcmp(FileExtension, ".jpe")==0) || (strcmp(FileExtension ,".jpg")==0)) - m_pszContentType="image/jpeg"; - else if (strcmp(FileExtension, ".bmp")==0) - m_pszContentType="image/bmp"; - else if (strcmp(FileExtension, ".png")==0) - m_pszContentType="image/png"; - else if (strcmp(FileExtension, ".gif")==0) - m_pszContentType="image/gif"; - else if ((strcmp(FileExtension, ".tif")==0) || (strcmp(FileExtension, ".tiff")==0)) - m_pszContentType="image/tiff"; - else - m_pszContentType="application/octet-stream"; - - mir_free(FileExtension); - return; -} - -void CSendImageShack::AppendToData(const char *pszVal) { - if (!m_nlhr.pData) { - m_nlhr.pData = mir_strdup(pszVal); - m_nlhr.dataLength = (int)strlen(pszVal); - } - else { - size_t lenVal = strlen(pszVal); - size_t sizeNew = sizeof(char)*(m_nlhr.dataLength + lenVal + 1); - m_nlhr.pData = (char*) mir_realloc(m_nlhr.pData, sizeNew); - - strcpy(m_nlhr.pData + sizeof(char)*m_nlhr.dataLength, pszVal); - m_nlhr.pData[sizeNew-1] = 0; - m_nlhr.dataLength = (int)sizeNew -1; - } -} - -//--------------------------------------------------------------------------- -const char * CSendImageShack::GetTagContent(char * pszSource, const char * pszTagStart, const char * pszTagEnd) { - char * b = strstr(pszSource, pszTagStart); - if (!b) return NULL; - b += strlen(pszTagStart); - char * e = strstr(b, pszTagEnd); - if (e) *e = 0; - return b; -} diff --git a/plugins/SendScreenshotPlus/src/CSendImageShack.h b/plugins/SendScreenshotPlus/src/CSendImageShack.h index 06642ff47e..f32e1cd0b0 100644 --- a/plugins/SendScreenshotPlus/src/CSendImageShack.h +++ b/plugins/SendScreenshotPlus/src/CSendImageShack.h @@ -37,22 +37,9 @@ class CSendImageShack : public CSend { ~CSendImageShack(); int Send(); - char* GetURL(){return m_Url;}; protected: - char* m_pszFileName; NETLIBHTTPREQUEST m_nlhr; - NETLIBHTTPREQUEST* m_nlreply; - char m_nlheader_ContentType[64]; - char* m_Url; - - void AppendToData(const char *pszVal); //append to netlib DATA - char* m_pszContentType; //hold mimeType (does not need free) - void GetContentType(); //get mimeType - const char * GetTagContent(char * pszSource, const char * pszTagStart, const char * pszTagEnd); - - char* m_MFDRboundary; - void MFDR_Reset(); void SendThread(); static void SendThreadWrapper(void * Obj); diff --git a/plugins/SendScreenshotPlus/src/version.h b/plugins/SendScreenshotPlus/src/version.h index 15d8b73bde..0726fb855e 100644 --- a/plugins/SendScreenshotPlus/src/version.h +++ b/plugins/SendScreenshotPlus/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 8 -#define __RELEASE_NUM 3 -#define __BUILD_NUM 1 +#define __RELEASE_NUM 4 +#define __BUILD_NUM 0 #include @@ -12,4 +12,4 @@ #define __AUTHOREMAIL "ing.u.horn@googlemail.com" #define __AUTHORWEB "http://miranda-ng.org/p/SendSS/" #define __COPYRIGHT "© 2010 Merlin, 2004-2006 Sergio Vieira Rolanski" -#define __USER_AGENT_STRING __PLUGIN_NAME##" v"##__VERSION_STRING +#define __USER_AGENT_STRING "SendSS/" __VERSION_STRING_DOTS -- cgit v1.2.3