Mornella/Mornella_Mobile/MAPIAttachment.cpp
#include "MAPIAttachment.h"
MAPIAttachment::MAPIAttachment(LPATTACH pAttach, LPTSTR lpFilename)
: _pAttach(pAttach), _lpFilename(NULL), _lpBody(NULL), _cbRealSize(0), _lStatus(0), _cbTotalSize(0)
{
size_t len = _tcslen(lpFilename) + 1;
_lpFilename = new TCHAR[len];
ZeroMemory(_lpFilename, len * sizeof(TCHAR));
wcscpy(_lpFilename, lpFilename);
}
MAPIAttachment::~MAPIAttachment(void)
{
if (_lpBody)
LocalFree(_lpBody);
delete[] _lpFilename;
if (_pAttach)
_pAttach->Release();
}
LPBYTE MAPIAttachment::_GetBody(DWORD* cbSize)
{
ASSERT(_pAttach);
HRESULT hr = E_FAIL;
LPBYTE lpBody = NULL;
SPropTagArray tagArray;
tagArray.cValues = 1;
tagArray.aulPropTag[0] = PR_ATTACH_DATA_BIN;
LPSTREAM pStream = NULL;
hr = _pAttach->OpenProperty(PR_ATTACH_DATA_BIN, (LPIID)&IID_IStream, STGM_READ, 0, (LPUNKNOWN*)&pStream);
if (FAILED(hr))
{
return NULL;
}
STATSTG stsg;
hr = pStream->Stat(&stsg, STATFLAG_NONAME);
if (FAILED(hr))
{
pStream->Release();
return NULL;
}
(*cbSize) = (DWORD)stsg.cbSize.LowPart;
if (_cbRealSize > 0)
{
lpBody = (LPBYTE)LocalAlloc(LPTR, *cbSize);
ULONG cbRead = 0;
hr = pStream->Read(lpBody, *cbSize, &cbRead);
if (FAILED(hr))
{
LocalFree(lpBody);
pStream->Release();
return NULL;
}
}
pStream->Release();
return lpBody;
}