HRESULT MAPIContact::GetContactImage(wstring &wstrImagePath) { HRESULT hr = S_OK; Zimbra::Util::ScopedInterface<IStream> pSrcStream; { Zimbra::Util::ScopedRowSet pAttachRows; Zimbra::Util::ScopedInterface<IMAPITable> pAttachTable; SizedSPropTagArray(3, attachProps) = { 3, { PR_ATTACH_NUM, PR_ATTACH_SIZE, PR_ATTACH_LONG_FILENAME } }; hr = m_pMessage->GetAttachmentTable(MAPI_UNICODE, pAttachTable.getptr()); if (SUCCEEDED(hr)) { if (FAILED(hr = pAttachTable->SetColumns((LPSPropTagArray) & attachProps, 0))) return hr; ULONG ulRowCount = 0; if (FAILED(hr = pAttachTable->GetRowCount(0, &ulRowCount))) return hr; if (FAILED(hr = pAttachTable->QueryRows(ulRowCount, 0, pAttachRows.getptr()))) return hr; if (SUCCEEDED(hr)) { hr = MAPI_E_NOT_FOUND; for (unsigned int i = 0; i < pAttachRows->cRows; i++) { // if property couldn't be found or returns error, skip it if ((pAttachRows->aRow[i].lpProps[2].ulPropTag == PT_ERROR) || (pAttachRows->aRow[i].lpProps[2].Value.err == MAPI_E_NOT_FOUND)) continue; // Discard the attachmetnt if its not contact picture if (_tcscmp(pAttachRows->aRow[i].lpProps[2].Value.LPSZ, _T( "ContactPicture.jpg"))) continue; Zimbra::Util::ScopedInterface<IAttach> pAttach; if (FAILED(hr = m_pMessage->OpenAttach( pAttachRows->aRow[i].lpProps[0].Value.l, NULL, 0, pAttach.getptr()))) continue; if (FAILED(hr = pAttach->OpenProperty(PR_ATTACH_DATA_BIN, &IID_IStream, STGM_READ, 0, (LPUNKNOWN FAR *)pSrcStream.getptr()))) return hr; break; } } } } if (hr != S_OK) return hr; // copy image to file wstring wstrTempAppDirPath; char *lpszDirName = NULL; char *lpszUniqueName = NULL; Zimbra::Util::ScopedInterface<IStream> pDestStream; if (!Zimbra::MAPI::Util::GetAppTemporaryDirectory(wstrTempAppDirPath)) return MAPI_E_ACCESS_DENIED; WtoA((LPWSTR)wstrTempAppDirPath.c_str(), lpszDirName); string strFQFileName = lpszDirName; WtoA((LPWSTR)Zimbra::MAPI::Util::GetUniqueName().c_str(), lpszUniqueName); strFQFileName += "\\ZmContact_"; strFQFileName += lpszUniqueName; strFQFileName += ".jpg"; SafeDelete(lpszDirName); SafeDelete(lpszUniqueName); // Open stream on file if (FAILED(hr = OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer, STGM_CREATE | STGM_READWRITE, (LPTSTR)strFQFileName.c_str(), NULL, pDestStream.getptr()))) return hr; ULARGE_INTEGER liAll = { 0 }; liAll.QuadPart = (ULONGLONG)-1; if (FAILED(hr = pSrcStream->CopyTo(pDestStream.get(), liAll, NULL, NULL))) return hr; if (FAILED(hr = pDestStream->Commit(0))) { return hr; ; } // mime file path LPWSTR lpwstrFQFileName = NULL; AtoW((LPSTR)strFQFileName.c_str(), lpwstrFQFileName); wstrImagePath = lpwstrFQFileName; SafeDelete(lpwstrFQFileName); return hr; }
HRESULT MAPIContact::GetContactImage(wstring &wstrImagePath,wstring &wstrContentType,wstring &wstrContentDisposition) { HRESULT hr = S_OK; LPSTR strExtension=".jpg"; Zimbra::Util::ScopedInterface<IStream> pSrcStream; { Zimbra::Util::ScopedRowSet pAttachRows; Zimbra::Util::ScopedInterface<IMAPITable> pAttachTable; SizedSPropTagArray(4, attachProps) = { 4, { PR_ATTACH_NUM, PR_ATTACH_SIZE, PR_ATTACH_LONG_FILENAME,PR_ATTACH_EXTENSION } }; hr = m_pMessage->GetAttachmentTable(MAPI_UNICODE, pAttachTable.getptr()); if (SUCCEEDED(hr)) { if (FAILED(hr = pAttachTable->SetColumns((LPSPropTagArray) & attachProps, 0))) return hr; ULONG ulRowCount = 0; if (FAILED(hr = pAttachTable->GetRowCount(0, &ulRowCount))) return hr; if (FAILED(hr = pAttachTable->QueryRows(ulRowCount, 0, pAttachRows.getptr()))) return hr; if (SUCCEEDED(hr)) { hr = MAPI_E_NOT_FOUND; for (unsigned int i = 0; i < pAttachRows->cRows; i++) { // if property couldn't be found or returns error, skip it if ((pAttachRows->aRow[i].lpProps[2].ulPropTag == PT_ERROR) || (pAttachRows->aRow[i].lpProps[2].Value.err == MAPI_E_NOT_FOUND)) continue; // Discard the attachmetnt if its not contact picture if (_tcscmp(pAttachRows->aRow[i].lpProps[2].Value.LPSZ, _T( "ContactPicture.jpg"))) continue; Zimbra::Util::ScopedInterface<IAttach> pAttach; if (FAILED(hr = m_pMessage->OpenAttach( pAttachRows->aRow[i].lpProps[0].Value.l, NULL, 0, pAttach.getptr()))) continue; if (FAILED(hr = pAttach->OpenProperty(PR_ATTACH_DATA_BIN, &IID_IStream, STGM_READ, 0, (LPUNKNOWN FAR *)pSrcStream.getptr()))) return hr; // LPSPropValue pProps = NULL; // ULONG cProps = 0; // hr = pAttach->GetProps((LPSPropTagArray) & attachProps, 0, &cProps, &pProps); if(pAttachRows->aRow[i].lpProps[3].ulPropTag == PR_ATTACH_EXTENSION_A) //if (pProps[PR_ATTACH_EXTENSION].ulPropTag == PR_ATTACH_EXTENSION_A) { // add a custom header for content location to support rfc2557 LPSTR pContentType = NULL; strExtension = pAttachRows->aRow[i].lpProps[3].Value.lpszA; Zimbra::MAPI::Util::GetContentTypeFromExtension(pAttachRows->aRow[i].lpProps[3].Value.lpszA, pContentType); LPWSTR lpwstrContentType = NULL; AtoW((LPSTR)pContentType, lpwstrContentType); wstrContentType = lpwstrContentType; } break; } } } } if (hr != S_OK) return hr; // copy image to file wstring wstrTempAppDirPath; char *lpszDirName = NULL; char *lpszUniqueName = NULL; Zimbra::Util::ScopedInterface<IStream> pDestStream; if (!Zimbra::MAPI::Util::GetAppTemporaryDirectory(wstrTempAppDirPath)) return MAPI_E_ACCESS_DENIED; WtoA((LPWSTR)wstrTempAppDirPath.c_str(), lpszDirName); string strFQFileName = lpszDirName; WtoA((LPWSTR)Zimbra::MAPI::Util::GetUniqueName().c_str(), lpszUniqueName); strFQFileName += "\\ZmContact_"; strFQFileName += lpszUniqueName; //strFQFileName += ".jpg"; strFQFileName += strExtension; SafeDelete(lpszDirName); SafeDelete(lpszUniqueName); // Open stream on file if (FAILED(hr = OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer, STGM_CREATE | STGM_READWRITE, (LPTSTR)strFQFileName.c_str(), NULL, pDestStream.getptr()))) return hr; ULARGE_INTEGER liAll = { 0 }; liAll.QuadPart = (ULONGLONG)-1; if (FAILED(hr = pSrcStream->CopyTo(pDestStream.get(), liAll, NULL, NULL))) return hr; if (FAILED(hr = pDestStream->Commit(0))) { return hr; ; } // mime file path LPWSTR lpwstrFQFileName = NULL; AtoW((LPSTR)strFQFileName.c_str(), lpwstrFQFileName); wstrImagePath = lpwstrFQFileName; LPSTR ppszCD; mimepp::String theCD; theCD.append("Content-Disposition: form-data; name=\""); theCD.append(strFQFileName.c_str()); theCD.append("\"; filename=\""); theCD.append(strFQFileName.c_str()); theCD.append("\""); const char *pFinal = theCD.c_str(); Zimbra::Util::CopyString(ppszCD, (LPSTR)pFinal); LPWSTR lpwstrContentDisp = NULL; AtoW((LPSTR)theCD.c_str(), lpwstrContentDisp); wstrContentDisposition = lpwstrContentDisp; /* LPSTR pContentType = NULL; Zimbra::MAPI::Util::GetContentTypeFromExtension(".jpg", pContentType); LPWSTR lpwstrContentType = NULL; AtoW((LPSTR)pContentType, lpwstrContentType); wstrContentType = lpwstrContentType;*/ SafeDelete(lpwstrFQFileName); return hr; }