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; } }
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; }