Saturday, May 26, 2012

Kile

If you get error of "package not found", these commands will solve it.

sudo apt-get install texlive-latex-extra

sudo texhash

Thursday, May 21, 2009

Outlook Converter

There may be a situation where you want conversions between MIME objects (i.e. eml files) and MAPI messages (i.e. msg files). Though Microsoft has provided an Interface i.e. IConverterSession for converting eml to msg and msg to eml , but still its quite difficult for beginner to use this Interface properly. Following code is written in VC++ (Win32 & COM development)

ConverterSession.h (Header File)


#pragma once
#include objbase.h
#include initguid.h
#include guiddef.h

// Interface Identifiers
// {4e3a7680-b77a-11d0-9da5-00c04fd65685}
DEFINE_GUID(CLSID_IConverterSession, 0x4e3a7680, 0xb77a, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);

// Interface Identifiers
// {4b401570-b77b-11d0-9da5-00c04fd65685}
DEFINE_GUID(IID_IConverterSession, 0x4b401570, 0xb77b, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);

typedef enum tagENCODINGTYPE {
IET_BINARY = 0,
IET_BASE64 = 1,
IET_UUENCODE = 2,
IET_QP = 3,
IET_7BIT = 4,
IET_8BIT = 5,
IET_INETCSET = 6,
IET_UNICODE = 7,
IET_RFC1522 = 8,
IET_ENCODED = 9,
IET_CURRENT = 10,
IET_UNKNOWN = 11,
IET_BINHEX40 = 12,
IET_LAST = 13
} ENCODINGTYPE;

typedef enum tagMIMESAVETYPE {
SAVE_RFC822 = 0,
SAVE_RFC1521 = 1
} MIMESAVETYPE;

typedef enum tagCCSF {
CCSF_SMTP = 0x0002,
CCSF_NOHEADERS = 0x0004,
CCSF_NO_MSGID = 0x4000,
CCSF_USE_RTF = 0x0080,
CCSF_INCLUDE_BCC = 0x0020
} CCSF;

class __declspec(uuid("4e3a7680-b77a-11d0-9da5-00c04fd65685"))
CConverterSession;

interface __declspec(uuid("4b401570-b77b-11d0-9da5-00c04fd65685"))
IConverterSession;
//Declaration
interface IConverterSession : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE SetAdrBook(LPADRBOOK pab);
virtual HRESULT STDMETHODCALLTYPE SetEncoding(ENCODINGTYPE et);
virtual HRESULT PlaceHolder1();
virtual HRESULT STDMETHODCALLTYPE MIMEToMAPI(LPSTREAM pstm,LPMESSAGE pmsg,LPCSTR zSrcSrv,ULONG ulFlags);
virtual HRESULT STDMETHODCALLTYPE MAPIToMIMEStm(LPMESSAGE pmsg,LPSTREAM pstm,ULONG lFlags);
virtual HRESULT PlaceHolder2();
virtual HRESULT PlaceHolder3();
virtual HRESULT PlaceHolder4();
virtual HRESULT STDMETHODCALLTYPE SetTextWrapping(BOOL fWrapText,ULONG ulWrapWidth);
virtual HRESULT STDMETHODCALLTYPE SetSaveFormat(MIMESAVETYPE mstSaveFormat);
virtual HRESULT PlaceHolder5();
};

typedef IConverterSession FAR * LPCONVERTERSESSION;
//methods for conversion
void ConvertEmlToMsg(CString sEmlFilePath,CString sMsgFilePath);
void ConvertMsgToEml(CString sMsgFilePath,CString sEmlFilePath);



ConverterSession.cpp (cpp File)


#include "StdAfx.h"
#include "ConverterSession.h"
void ConvertEmlToMsg(CString sEmlFilePath,CString sMsgFilePath)
{
IConverterSession* pConvSess = NULL;
HRESULT hr;
LPSTREAM pStream;
MAPIINIT_0 MAPIINIT= { 0, MAPI_MULTITHREAD_NOTIFICATIONS} ;
if(MAPIInitialize (&MAPIINIT) != S_OK)
return;

if(OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer,STGM_READ, (char*)(LPCSTR) sEmlFilePath,NULL,&pStream)!= S_OK)
return;

STGOPTIONS msgOpts = {0};
msgOpts.usVersion = 1,msgOpts.ulSectorSize = 4096;

LPSTORAGE pStorage = NULL;
LPMESSAGE pIMsg = NULL;
LPMALLOC pMalloc = MAPIGetDefaultMalloc();

_bstr_t bsMsgFilePath(sMsgFilePath);
if(StgCreateStorageEx(bsMsgFilePath, STGM_READWRITE STGM_TRANSACTED STGM_CREATE,STGFMT_DOCFILE, 0,&msgOpts,0,IID_IStorage,(LPVOID*)&pStorage) != S_OK)
return;


hr = OpenIMsgOnIStg(NULL,MAPIAllocateBuffer,MAPIAllocateMore,MAPIFreeBuffer, pMalloc,NULL,pStorage,NULL,0,0,&pIMsg);
if (hr != S_OK)
return;


hr = CoCreateInstance(CLSID_IConverterSession, NULL,CLSCTX_INPROC_SERVER, IID_IConverterSession, (void**)&pConvSess);
if (FAILED(hr))
return;


hr = pConvSess->SetEncoding(IET_QP);
if (FAILED(hr))
return;
hr = pConvSess->SetSaveFormat(SAVE_RFC1521);
if (FAILED(hr))
return;
hr = pConvSess->MIMEToMAPI(pStream,pIMsg,NULL,CCSF_SMTP);
if (hr != S_OK)
return;

pIMsg->SaveChanges(NULL);
pStorage->Commit(STGC_DEFAULT);

if (pStorage)
pStorage->Release();
if (pIMsg)
pIMsg->Release();
if (pStream)
pStream->Release();
if (pConvSess)
pConvSess->Release();

MAPIUninitialize();
}



void ConvertMsgToEml(CString sMsgFilePath,CString sEmlFilePath)
{
IConverterSession* pConvSess = NULL;
LPSTREAM pStr;
LPSTORAGE pStg;
LPMALLOC pMalloc;
LPMSGSESS pMsgSes;
LPMESSAGE pMsg;

_bstr_t bsMsgFilePath(sMsgFilePath);
_bstr_t bsEmlFilePath(sEmlFilePath);

MAPIINIT_0 MAPIINIT= { 0, MAPI_MULTITHREAD_NOTIFICATIONS} ;
if(MAPIInitialize (&MAPIINIT) != S_OK)
return;


HRESULT hr = CoCreateInstance(CLSID_IConverterSession, NULL,CLSCTX_INPROC_SERVER, IID_IConverterSession, (void**)&pConvSess);
if (FAILED(hr))
return;


hr = pConvSess->SetSaveFormat(SAVE_RFC1521);
if (FAILED(hr))
{
pConvSess->Release();
return;
}

hr = pConvSess->SetTextWrapping(true,72);
if (FAILED(hr))
{
pConvSess->Release();
return;
}

pMalloc = MAPIGetDefaultMalloc();

hr = OpenIMsgSession(pMalloc, 0, &pMsgSes);

if (SUCCEEDED(hr))
{
hr = StgOpenStorage(bsMsgFilePath, NULL,STGM_READWRITE STGM_TRANSACTED STGM_SHARE_DENY_NONE,NULL, 0, &pStg);

if (SUCCEEDED(hr))
{
hr = OpenIMsgOnIStg(NULL,MAPIAllocateBuffer,MAPIAllocateMore,MAPIFreeBuffer, pMalloc,NULL,pStg,NULL,0,0,&pMsg);

if (SUCCEEDED(hr))
{
hr = OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer, STGM_CREATE STGM_READWRITE, bsEmlFilePath, NULL, &pStr);

if (SUCCEEDED(hr))
{
hr = pConvSess->MAPIToMIMEStm(pMsg, pStr, 2);
if (SUCCEEDED(hr))
{
pStr->Commit(0);
}
}
}
}
}

if (pStg)
pStg->Release();
if (pStr)
pStr->Release();
if (pConvSess)
pConvSess->Release();

MAPIUninitialize();
}

// MAPI header files must be also included.