Beispiel #1
0
BSTR ConvertStringToBSTREx(const char* pSrc)
{
	return ConvertStringToUnicode(pSrc).AllocSysString();
}
Beispiel #2
0
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__());
 }
Beispiel #4
0
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;
}