BSTR ConvertStringToBSTREx(const char* pSrc) { return ConvertStringToUnicode(pSrc).AllocSysString(); }
WCHAR *ParseMultipartBody(char *src, char *bond) { char *srcback = _strdup(src); size_t sizebond = strlen(bond); int numparts = 1; int i; char *courbond = srcback; WCHAR *dest; for (;(courbond=strstr(courbond,bond));numparts++,courbond+=sizebond); APartDataType *partData = new APartDataType[numparts]; memset(partData, 0, sizeof(APartDataType)*numparts); partData[0].Src = courbond = srcback; for (i=1;(courbond=strstr(courbond,bond));i++,courbond+=sizebond){ *(courbond-2) = 0; partData[i].Src = courbond+sizebond; while (ENDLINE(partData[i].Src)) partData[i].Src++; } size_t resultSize=0; for (i=0;i<numparts;i++){ ParseAPart(&partData[i]); if (partData[i].body){ if (partData[i].TransEnc){ if (!_stricmp(partData[i].TransEnc,"base64")) partData[i].TransEncType=TE_BASE64; else if (!_stricmp(partData[i].TransEnc,"quoted-printable"))partData[i].TransEncType=TE_QUOTEDPRINTABLE; } if (partData[i].ContType){ char *CharSetStr; if(NULL!=(CharSetStr=ExtractFromContentType(partData[i].ContType,"charset="))) { partData[i].CodePage=GetCharsetFromString(CharSetStr,strlen(CharSetStr)); delete[] CharSetStr; } } if (partData[i].ContType && !_strnicmp(partData[i].ContType,"text",4)) { char *localBody=0; switch (partData[i].TransEncType){ case TE_BASE64: { int size =partData[i].bodyLen*3/4+5; localBody = new char[size+1]; DecodeBase64(partData[i].body,localBody,size); }break; case TE_QUOTEDPRINTABLE: { int size = partData[i].bodyLen+2; localBody = new char[size+1]; DecodeQuotedPrintable(partData[i].body,localBody,size,FALSE); }break; } ConvertStringToUnicode(localBody?localBody:partData[i].body,partData[i].CodePage,&partData[i].wBody); if (localBody) delete[] localBody; } else if(partData[i].ContType && !_strnicmp(partData[i].ContType,"multipart/",10)){ //Multipart in mulitipart recursive? should be SPAM. Ah well char *bondary=NULL; if(NULL!=(bondary=ExtractFromContentType(partData[i].ContType,"boundary="))) { partData[i].wBody = ParseMultipartBody(partData[i].body,bondary); delete[] bondary; } else goto FailBackRaw; //multipart with no boundary? badly formatted messages. } else { FailBackRaw: ConvertStringToUnicode(partData[i].body,partData[i].CodePage,&partData[i].wBody); } resultSize += wcslen(partData[i].wBody); }// if (partData[i].body) resultSize += 100+4+3; //cr+nl+100+ 3*bullet } dest = new WCHAR[resultSize+1]; size_t destpos = 0; for (i=0;i<numparts;i++){ if (i){ // part before first boudary should not have headers char infoline[104]; size_t linesize = 0; _snprintf(infoline,100,"%s %d",Translate("Part"),i); linesize = strlen(infoline); if (partData[i].TransEnc){ _snprintf(infoline+linesize,100-linesize,"; %s",partData[i].TransEnc); linesize = strlen(infoline); } if (partData[i].ContType){ char *CharSetStr=strchr(partData[i].ContType,';'); if (CharSetStr){ CharSetStr[0]=0; _snprintf(infoline+linesize,100-linesize,"; %s",partData[i].ContType); linesize = strlen(infoline); partData[i].ContType=CharSetStr+1; if(NULL!=(CharSetStr=ExtractFromContentType(partData[i].ContType,"charset="))) { _snprintf(infoline+linesize,100-linesize,"; %s",CharSetStr); linesize = strlen(infoline); delete[] CharSetStr; } if(NULL!=(CharSetStr=ExtractFromContentType(partData[i].ContType,"name="))) { _snprintf(infoline+linesize,100-linesize,"; \"%s\"",CharSetStr); linesize = strlen(infoline); delete[] CharSetStr; } } else { _snprintf(infoline+linesize,100-linesize,"; %s",partData[i].ContType); linesize = strlen(infoline); } } sprintf(infoline+linesize,".\r\n"); {WCHAR *temp=0; dest[destpos] = dest[destpos+1] = dest[destpos+2] = 0x2022; // bullet; destpos+=3; ConvertStringToUnicode(infoline,CP_ACP,&temp); size_t wsize = wcslen(temp); wcscpy(&dest[destpos],temp); destpos += wsize; delete[] temp; } } // if (i) if (partData[i].wBody){ size_t wsize = wcslen(partData[i].wBody); wcscpy(&dest[destpos],partData[i].wBody); destpos += wsize; delete[] partData[i].wBody; } } free (srcback); delete[] partData; dest[resultSize] = 0;//just in case return dest; }
object __unicode__() { return ConvertStringToUnicode(__str__()); }
U32 PInvoke_Call(tJITCallPInvoke *pCall, PTR pParams, PTR pReturnValue) { U32 _args[MAX_ARGS]; double _argsd[MAX_ARGS]; void* _pTempMem[MAX_ARGS]; U32 numParams, param, paramTypeNum; tMD_MethodDef *pMethod = pCall->pMethod; tMD_TypeDef *pReturnType = pMethod->pReturnType; tMD_ImplMap *pImplMap = pCall->pImplMap; void *pFn = pCall->fn; U32 _argOfs = 0, _argdOfs = 0, paramOfs = 0; U32 _tempMemOfs = 0; U32 i; U32 funcParams = DEFAULT; U64 u64Ret; float fRet; double dRet; if (pReturnType != NULL) { if (pReturnType == types[TYPE_SYSTEM_SINGLE]) { funcParams = SINGLE; } else if (pReturnType == types[TYPE_SYSTEM_DOUBLE]) { funcParams = DOUBLE; } } numParams = pMethod->numberOfParameters; for (param = 0, paramTypeNum = 0; param<numParams; param++, paramTypeNum++) { tParameter *pParam = &(pMethod->pParams[param]); tMD_TypeDef *pParamType = pParam->pTypeDef; U32 paramType = DEFAULT; if (pParamType->stackType == EVALSTACK_INT32) { _args[_argOfs] = *(U32*)(pParams + paramOfs); _argOfs++; paramOfs += 4; } else if (pParamType == types[TYPE_SYSTEM_STRING]) { // Allocate a temp bit of memory for the string that's been converted. void *pString; if (IMPLMAP_ISCHARSET_ANSI(pImplMap) || IMPLMAP_ISCHARSET_AUTO(pImplMap) || IMPLMAP_ISCHARSET_NOTSPEC(pImplMap)) { pString = ConvertStringToANSI(*(HEAP_PTR*)(pParams + paramOfs)); } else if (IMPLMAP_ISCHARSET_UNICODE(pImplMap)) { pString = ConvertStringToUnicode(*(HEAP_PTR*)(pParams + paramOfs)); } else { Crash("PInvoke_Call() Cannot handle string marshalling of given type"); } _pTempMem[_tempMemOfs] = pString; _tempMemOfs++; _args[_argOfs] = (U32)pString; _argOfs++; paramOfs += 4; } else if (pParamType == types[TYPE_SYSTEM_INTPTR]) { // Only works for 32-bit _args[_argOfs] = *(U32*)(pParams + paramOfs); _argOfs++; paramOfs += 4; } else if (pParamType == types[TYPE_SYSTEM_SINGLE]) { _argsd[_argdOfs] = *(float*)(pParams + paramOfs); _argdOfs++; paramOfs += 4; paramType = SINGLE; } else if (pParamType == types[TYPE_SYSTEM_DOUBLE]) { _argsd[_argdOfs] = *(double*)(pParams + paramOfs); _argdOfs++; paramOfs += 8; paramType = DOUBLE; } else { Crash("PInvoke_Call() Cannot handle parameter of type: %s", pParamType->name); } SET_ARG_TYPE(paramTypeNum, paramType); } switch (funcParams) { #include "PInvoke_CaseCode.h" case CALL5(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): u64Ret = ((_uCuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4]); break; case CALL6(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): u64Ret = ((_uCuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5]); break; case CALL7(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): u64Ret = ((_uCuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6]); break; case CALL8(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): u64Ret = ((_uCuuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7]); break; case CALL9(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): u64Ret = ((_uCuuuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8]); break; case CALL10(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): u64Ret = ((_uCuuuuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9]); break; default: Crash("PInvoke_Call() Cannot handle the function parameters: 0x%08x", funcParams); } for (i=0; i<_tempMemOfs; i++) { free(_pTempMem[i]); } if (pReturnType == NULL) { return 0; } if (pReturnType->stackType == EVALSTACK_INT32) { *(U32*)pReturnValue = (U32)u64Ret; return 4; } if (pReturnType == types[TYPE_SYSTEM_STRING]) { if (IMPLMAP_ISCHARSET_ANSI(pImplMap) || IMPLMAP_ISCHARSET_AUTO(pImplMap) || IMPLMAP_ISCHARSET_NOTSPEC(pImplMap)) { *(HEAP_PTR*)pReturnValue = SystemString_FromCharPtrASCII((U8*)(U32)u64Ret); } else if (IMPLMAP_ISCHARSET_UNICODE(pImplMap)) { *(HEAP_PTR*)pReturnValue = SystemString_FromCharPtrUTF16((U16*)(U32)u64Ret); } else { Crash("PInvoke_Call() Cannot handle return string in specified format"); } return sizeof(void*); } if (pReturnType == types[TYPE_SYSTEM_INTPTR]) { *(void**)pReturnValue = (void*)(U32)u64Ret; return sizeof(void*); } if (pReturnType == types[TYPE_SYSTEM_SINGLE]) { *(double*)pReturnValue = (double)fRet; return 8; } if (pReturnType == types[TYPE_SYSTEM_DOUBLE]) { *(double*)pReturnValue = dRet; return 8; } Crash("PInvoke_Call() Cannot handle return type: %s", pReturnType->name); FAKE_RETURN; }