コード例 #1
0
PyObject *PyObject_FromPROPVARIANT( PROPVARIANT *pVar )
{
	switch (pVar->vt) {
		case VT_EMPTY:
		case VT_NULL:
		case VT_ILLEGAL:
			Py_INCREF(Py_None);
			return Py_None;
		case VT_I1:
			return PyInt_FromLong(pVar->cVal);
		case VT_I1|VT_VECTOR:
			return VectorToSeq(pVar->cac.pElems, pVar->cac.cElems, PyWinObject_FromCHAR);
		case VT_UI1:
			return PyInt_FromLong(pVar->bVal);
		case VT_UI1|VT_VECTOR:
			return VectorToSeq(pVar->caub.pElems, pVar->caub.cElems, PyWinObject_FromUCHAR);
		case VT_I2:
			return PyInt_FromLong(pVar->iVal);
		case VT_I2|VT_VECTOR:
			return VectorToSeq(pVar->cai.pElems, pVar->cai.cElems, PyWinObject_FromSHORT);
		case VT_UI2:
			return PyInt_FromLong(pVar->uiVal);
		case VT_UI2|VT_VECTOR:
			return VectorToSeq(pVar->caui.pElems, pVar->caui.cElems, PyWinObject_FromUSHORT);
		case VT_I4:
			return PyInt_FromLong(pVar->lVal);
		case VT_I4|VT_VECTOR:
			return VectorToSeq(pVar->cal.pElems, pVar->cal.cElems, PyInt_FromLong);
		case VT_INT:
			return PyInt_FromLong(pVar->intVal);
		case VT_UI4:
			return PyLong_FromUnsignedLong(pVar->ulVal);
		case VT_UI4|VT_VECTOR:
			return VectorToSeq(pVar->caul.pElems, pVar->caul.cElems, PyLong_FromUnsignedLong);
		case VT_UINT:
			return PyLong_FromUnsignedLong(pVar->uintVal);
		case VT_I8:
			return PyWinObject_FromLARGE_INTEGER(pVar->hVal);
		case VT_I8|VT_VECTOR:
			return VectorToSeq<LARGE_INTEGER>(pVar->cah.pElems, pVar->cah.cElems, PyWinObject_FromLARGE_INTEGER);
		case VT_UI8:
			return PyWinObject_FromULARGE_INTEGER(pVar->uhVal);
		case VT_UI8|VT_VECTOR:
			return VectorToSeq<ULARGE_INTEGER>(pVar->cauh.pElems, pVar->cauh.cElems, PyWinObject_FromULARGE_INTEGER);
		case VT_R4:
			return PyFloat_FromDouble(pVar->fltVal);
		case VT_R4|VT_VECTOR:
			return VectorToSeq(pVar->caflt.pElems, pVar->caflt.cElems, PyWinObject_FromFLOAT);
		case VT_R8:
			return PyFloat_FromDouble(pVar->dblVal);
		case VT_R8|VT_VECTOR:
			return VectorToSeq(pVar->cadbl.pElems, pVar->cadbl.cElems, PyFloat_FromDouble);
		case VT_CY:
			return PyObject_FromCurrency(pVar->cyVal);
		case VT_CY|VT_VECTOR:
			return VectorToSeq<CY>(pVar->cacy.pElems, pVar->cacy.cElems, PyObject_FromCurrency);
		case VT_DATE:
			return PyWinObject_FromDATE(pVar->date);
		case VT_DATE|VT_VECTOR:
			return VectorToSeq(pVar->cadate.pElems, pVar->cadate.cElems, PyWinObject_FromDATE);
		case VT_BSTR:
			return PyWinObject_FromBstr(pVar->bstrVal);
		case VT_BSTR|VT_VECTOR:
			return VectorToSeq(pVar->cabstr.pElems, pVar->cabstr.cElems, PyWinObject_FromVT_BSTR);
		case VT_BOOL:
			return PyWinObject_FromVARIANT_BOOL(pVar->boolVal);
		case VT_BOOL|VT_VECTOR:
			return VectorToSeq(pVar->cabool.pElems, pVar->cabool.cElems, PyWinObject_FromVARIANT_BOOL);
		case VT_ERROR:
			return PyInt_FromLong(pVar->scode);
		case VT_ERROR|VT_VECTOR:
			return VectorToSeq(pVar->cascode.pElems, pVar->cascode.cElems, PyInt_FromLong);
		case VT_FILETIME:
			return PyWinObject_FromFILETIME(pVar->filetime);
		case VT_FILETIME|VT_VECTOR:
			return VectorToSeq<FILETIME>(pVar->cafiletime.pElems, pVar->cafiletime.cElems, PyWinObject_FromFILETIME);
		case VT_LPSTR:
			if (pVar->pszVal == NULL) {
				Py_INCREF(Py_None);
				return Py_None;
			}
			return PyWinCoreString_FromString(pVar->pszVal);
		case VT_LPSTR|VT_VECTOR:
			{
				PyObject *ret = PyList_New(pVar->calpstr.cElems);
				if (ret==NULL) return NULL;
				for (ULONG i=0; i<pVar->calpstr.cElems;i++){
					PyObject *elem=PyWinCoreString_FromString(pVar->calpstr.pElems[i]);
					if (elem==NULL){
						Py_DECREF(ret);
						return NULL;
						}
					PyList_SET_ITEM(ret, i, elem);
					}
				return ret;
			}
		case VT_LPWSTR:
			return PyWinObject_FromOLECHAR(pVar->pwszVal);
		case VT_LPWSTR|VT_VECTOR:
			{
				PyObject *ret = PyList_New(pVar->calpwstr.cElems);
				if (ret==NULL) return NULL;
				for (ULONG i=0; i<pVar->calpwstr.cElems;i++){
					PyObject *elem=PyWinObject_FromWCHAR(pVar->calpwstr.pElems[i]);
					if (elem==NULL){
						Py_DECREF(ret);
						return NULL;
						}
					PyList_SET_ITEM(ret, i, elem);
					}
				return ret;
			}
		case VT_CLSID:
			return PyWinObject_FromIID(*pVar->puuid);
		case VT_CLSID|VT_VECTOR:
			return VectorToSeq<CLSID>(pVar->cauuid.pElems, pVar->cauuid.cElems, PyWinObject_FromIID);
		case VT_STREAM:
		case VT_STREAMED_OBJECT:
			return PyCom_PyObjectFromIUnknown(pVar->pStream, IID_IStream, TRUE);
		case VT_STORAGE:
		case VT_STORED_OBJECT:
			return PyCom_PyObjectFromIUnknown(pVar->pStorage, IID_IStorage, TRUE);
		case VT_VECTOR | VT_VARIANT:
			return PyObject_FromPROPVARIANTs(pVar->capropvar.pElems, pVar->capropvar.cElems);
		case VT_BLOB:
		case VT_BLOB_OBJECT:
			return PyString_FromStringAndSize((const char *)pVar->blob.pBlobData,
			                                  pVar->blob.cbSize);
//		case VT_UNKNOWN:
//			return PyCom_PyObjectFromIUnknown(pVar->punkVal, IID_IUnknown, TRUE);
//		case VT_DISPATCH:
//			return PyCom_PyObjectFromIUnknown(pVar->pdispVal, IID_IDispatch, TRUE);

/*
// Want to get VT_CF and VT_BLOB working with a test case first!
		case VT_CF: { // special "clipboard format"
			// cbSize is the size of the buffer pointed to 
			// by pClipData, plus sizeof(ulClipFmt)
			// XXX - in that case, shouldn't we pass
			// pClipData + sizeof(DWORD) to Py_BuildValue??
			ULONG cb = CBPCLIPDATA(*pVar->pclipdata);
			return Py_BuildValue("is#",
			                     pVar->pclipdata->ulClipFmt,
			                     pVar->pclipdata->pClipData,
			                     (int)cb);
			}
*/
		default:
			PyErr_Format(PyExc_TypeError, "Unsupported property type 0x%x", pVar->vt);
			return NULL;
	}
}
コード例 #2
0
ファイル: mapiutil.cpp プロジェクト: mcg1969/pywin32
PyObject *PyMAPIObject_FromSPropValue(SPropValue *pv)
{
    PyObject *val;
    ULONG i;
    switch (PROP_TYPE(pv->ulPropTag)) {
    case PT_I2:	//		case PT_SHORT:
        val = PyInt_FromLong(pv->Value.i);
        break;
    case PT_I4:	//		case PT_LONG:
        val = PyInt_FromLong(pv->Value.l);
        break;
    case PT_R4:	//		case PT_FLOAT:
        val = PyFloat_FromDouble(pv->Value.flt);
        break;
    case PT_R8:	//		case PT_DOUBLE:
        val = PyFloat_FromDouble(pv->Value.dbl);
        break;
    case PT_BOOLEAN:
        val = pv->Value.b ? Py_True : Py_False;
        Py_INCREF(val);
        break;
    /*
    		case PT_CURRENCY:
    			pv->Value.cur??
    			break;
    */
    case PT_APPTIME :
        val = PyWinObject_FromDATE(pv->Value.at);
        break;
    case PT_SYSTIME:
        val = PyWinObject_FromFILETIME(pv->Value.ft);
        break;
    case PT_STRING8:
        val = PyString_FromString(pv->Value.lpszA);
        break;
    case PT_UNICODE:
        val = PyWinObject_FromWCHAR(pv->Value.lpszW);
        break;
    case PT_BINARY:
        val = PyString_FromStringAndSize((char *)pv->Value.bin.lpb, pv->Value.bin.cb);
        break;

    case PT_CLSID:
        val = PyWinObject_FromIID(*pv->Value.lpguid);
        break;
    case PT_I8:
//		case PT_LONGLONG:
        val = PyWinObject_FromLARGE_INTEGER(pv->Value.li);
        break;
    case PT_ERROR:
        val = PyInt_FromLong(pv->Value.err);
        break;

    case PT_NULL:
        val = Py_None;
        Py_INCREF(Py_None);
        break;

    case PT_MV_I2:
        val = PyTuple_New(pv->Value.MVi.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVi.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyInt_FromLong(pv->Value.MVi.lpi[i]));
        }
        break;
    case PT_MV_LONG:
        val = PyTuple_New(pv->Value.MVi.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVl.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyInt_FromLong(pv->Value.MVl.lpl[i]));
        }
        break;
    case PT_MV_R4:
        val = PyTuple_New(pv->Value.MVflt.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVflt.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyFloat_FromDouble(pv->Value.MVflt.lpflt[i]));
        }
        break;
    case PT_MV_DOUBLE :
        val = PyTuple_New(pv->Value.MVdbl.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVdbl.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyFloat_FromDouble(pv->Value.MVdbl.lpdbl[i]));
        }
        break;
    /*
    		case PT_MV_CURRENCY:
    			MVcur
    			SCurrencyArray
    */

    case PT_MV_APPTIME :
        val = PyTuple_New(pv->Value.MVat.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVat.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyWinObject_FromDATE(pv->Value.MVat.lpat[i]));
        }
        break;
    case PT_MV_SYSTIME:
        val = PyTuple_New(pv->Value.MVft.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVft.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyWinObject_FromFILETIME(pv->Value.MVft.lpft[i]));
        }
        break;

    case PT_MV_BINARY:
        val = PyTuple_New(pv->Value.MVbin.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVbin.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyString_FromStringAndSize((char *)pv->Value.MVbin.lpbin[i].lpb, pv->Value.MVbin.lpbin[i].cb));
        }
        break;
    case PT_MV_STRING8:
        val = PyTuple_New(pv->Value.MVszA.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVszA.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyString_FromString(pv->Value.MVszA.lppszA[i]));
        }
        break;
    case PT_MV_UNICODE:
        val = PyTuple_New(pv->Value.MVszW.cValues);
        if (val) {
            for (i=0; i<pv->Value.MVszW.cValues; i++)
                PyTuple_SET_ITEM(val, i, PyWinObject_FromWCHAR(pv->Value.MVszW.lppszW[i]));
        }
        break;
    /*
    		case PT_MV_CLSID:
    			MVguid
    			SGuidArray
    		case PT_MV_I8:
    			MVli
    			SLargeIntegerArray
    */
    case PT_OBJECT:
        val = PyInt_FromLong(pv->Value.x);
        break;

    default:
        printf("File %s: Unsupported MAPI property type 0x%X", __FILE__, PROP_TYPE(pv->ulPropTag));
        /* Dont set exception, as this prevents otherwise valid props from
           being returned
        */
        val = Py_None;
        Py_INCREF(Py_None);
        break;
    }

    PyObject *rc = PyTuple_New(2);
    if (rc==NULL) {
        Py_DECREF(val);
        PyErr_SetString(PyExc_MemoryError, "Tuple(2) for PROP result");
        return NULL;
    }
    PyTuple_SET_ITEM(rc, 0, PyInt_FromLong(pv->ulPropTag));
    PyTuple_SET_ITEM(rc, 1, val);
    return rc;
}