#ifndef __MAPIFOLDER_H__
#define __MAPIFOLDER_H__

////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: MAPIFolder.h
// Description: MAPI Folder class wrapper
//
// Copyright (C) 2005-2011, Noel Dillabough
//
// This source code is free to use and modify provided this notice remains intact and that any enhancements
// or bug fixes are posted to the CodeProject page hosting this class for the community to benefit.
//
// Usage: see the CodeProject article at http://www.codeproject.com/internet/CMapiEx.asp
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef _WIN32_WCE
#include "POOM.h"
#define DEFAULT_FOLDER_BUFFER_SIZE 128
#else
#define DEFAULT_FOLDER_BUFFER_SIZE 512
#endif

/////////////////////////////////////////////////////////////
// CMAPIFolder

class AFX_EXT_CLASS CMAPIFolder : public CMAPIObject
{
public:
	CMAPIFolder();
	CMAPIFolder(CMAPIEx* pMAPI, LPMAPIFOLDER pFolder, LPCTSTR szName=NULL);
	~CMAPIFolder();

	enum { PROP_MESSAGE_FLAGS, PROP_ENTRYID, MESSAGE_COLS };

// Attributes
protected:
	LPMAPITABLE m_pHierarchy;
	LPMAPITABLE m_pContents;
	int m_nMaxRowsSize;
	ULONG m_nRowsIndex;
	LPSRowSet m_pRows;
	CString m_strName;

#ifdef _WIN32_WCE
	CPOOM m_poom;
#endif

// Operations
public:
	inline LPMAPIFOLDER Folder() { return (LPMAPIFOLDER)m_pItem; }
	void Attach(CMAPIEx* pMAPI, LPMAPIFOLDER pFolder, LPCTSTR szName);
	LPMAPIFOLDER Detach();

#ifdef _WIN32_WCE
	CPOOM* GetPOOM() { return &m_poom; }
#endif

	virtual void Close();
	void SetBufferSize(int nSize);
	void ClearBuffer();

	LPCTSTR GetName();
	LPMAPITABLE GetHierarchy();
	CMAPIFolder* OpenSubFolder(LPCTSTR szSubFolder);
	CMAPIFolder* CreateSubFolder(LPCTSTR szSubFolder);
	BOOL DeleteSubFolder(LPCTSTR szSubFolder);
	BOOL DeleteSubFolder(CMAPIFolder* pFolder);

	LPMAPITABLE GetContents();
	int GetRowCount();
	BOOL SortContents(ULONG ulSortParam=TABLE_SORT_ASCEND, ULONG ulSortField=PR_MESSAGE_DELIVERY_TIME);
	BOOL SetUnreadOnly(BOOL bUnreadOnly=TRUE);
	BOOL SetRestriction(SRestriction* pRestriction);
	BOOL GetNextMessage(CMAPIMessage& message);
	BOOL GetNextContact(CMAPIContact& contact);
	BOOL GetNextAppointment(CMAPIAppointment& appointment);
	BOOL GetNextSubFolder(CMAPIFolder& folder, CString& strFolder);

	BOOL DeleteMessage(CMAPIMessage& message);
	BOOL CopyMessage(CMAPIMessage& message, CMAPIFolder* pFolderDest);
	BOOL MoveMessage(CMAPIMessage& message, CMAPIFolder* pFolderDest);

	BOOL DeleteContact(CMAPIContact& contact);
	BOOL DeleteAppointment(CMAPIAppointment& appointment);

protected:
	void Init();
	BOOL DeleteObject(CMAPIObject& object);
	BOOL QueryRows();
	SRow* GetNextRow();
};

#endif
