/* * f o l d e r s . c p p * * Purpose: * Implements the OE-MOM 'Folder' object and 'FolderCollection' * * History * * Copyright (C) Microsoft Corp. 1995, 1996. */ #include #include "msoeobj.h" #include "folders.h" #include "instance.h" //+--------------------------------------------------------------- // // Member: Constructor // // Synopsis: // // //--------------------------------------------------------------- COEFolderCollection::COEFolderCollection() : CBaseDisp() { Assert (g_pInstance); m_pEnumChildren = 0; CoIncrementInit("COEFolderCollection::COEFolderCollection", MSOEAPI_START_SHOWERRORS, NULL, NULL); } //+--------------------------------------------------------------- // // Member: Destructor // // Synopsis: // // //--------------------------------------------------------------- COEFolderCollection::~COEFolderCollection() { Assert (g_pInstance); CoDecrementInit("COEFolderCollection::COEFolderCollection", NULL); } //+--------------------------------------------------------------- // // Member: Init // // Synopsis: // Constructor that can fail // //--------------------------------------------------------------- HRESULT COEFolderCollection::Init(FOLDERID idFolder) { m_idFolder = idFolder; return CBaseDisp::EnsureTypeLibrary((LPVOID *)(IOEFolderCollection *)this, IID_IOEFolderCollection); } //+--------------------------------------------------------------- // // Member: PrivateQueryInterface // // Synopsis: // Exposes supported interfaces // //--------------------------------------------------------------- HRESULT COEFolderCollection::PrivateQueryInterface(REFIID riid, LPVOID *lplpObj) { if(!lplpObj) return E_INVALIDARG; *lplpObj = NULL; if (IsEqualIID(riid, IID_IUnknown)) *lplpObj = (LPVOID)(IOEFolderCollection *)this; else if (IsEqualIID(riid, IID_IOEFolderCollection)) *lplpObj = (LPVOID)(IOEFolderCollection *)this; else return CBaseDisp::PrivateQueryInterface(riid, lplpObj); AddRef(); return NOERROR; } //+--------------------------------------------------------------- // // Member: get_folders // // Synopsis: // Returns the a folder collection, representing // the child folders of the current folder collection. // //--------------------------------------------------------------- HRESULT COEFolderCollection::get_folders(IOEFolderCollection **p) { return CreateFolderCollection(m_idFolder, p); } //+--------------------------------------------------------------- // // Member: get_length // // Synopsis: // returns the number of elements in the collection // //--------------------------------------------------------------- HRESULT COEFolderCollection::get_length(long *p) { HRESULT hr; hr = _EnsureInit(); if (FAILED(hr)) { TraceResult(hr); goto exit; } hr = m_pEnumChildren->Count((ULONG *)p); exit: return hr; } //+--------------------------------------------------------------- // // Member: get__newEnum // // Synopsis: // Returns a folder enumerator // //--------------------------------------------------------------- HRESULT COEFolderCollection::get__newEnum(IUnknown **p) { HRESULT hr; hr = _EnsureInit(); if (FAILED(hr)) { TraceResult(hr); goto exit; } hr = E_NOTIMPL; exit: return hr; } //+--------------------------------------------------------------- // // Member: item // // Synopsis: // // //--------------------------------------------------------------- HRESULT COEFolderCollection::item(VARIANT name, VARIANT index, IDispatch **ppdisp) { HRESULT hr; FOLDERID idFolder; IOEFolder *pFolder=NULL; if (!ppdisp) return E_INVALIDARG; *ppdisp = NULL; hr = _EnsureInit(); if (FAILED(hr)) { TraceResult(hr); goto exit; } switch(name.vt) { case VT_BSTR: hr = _FindFolder(name.bstrVal, NULL, &idFolder); break; case VT_I4: hr = _FindFolder(NULL, name.lVal, &idFolder); break; } if (FAILED(hr)) { TraceResult(hr); goto exit; } hr = CreateOEFolder(idFolder, &pFolder); if (FAILED(hr)) { TraceResult(hr); goto exit; } hr = pFolder->QueryInterface(IID_IDispatch, (LPVOID *)ppdisp); if (FAILED(hr)) { TraceResult(hr); goto exit; } exit: ReleaseObj(pFolder); return hr; } //+--------------------------------------------------------------- // // Member: add // // Synopsis: // // //--------------------------------------------------------------- HRESULT COEFolderCollection::add(BSTR bstrName, IDispatch **ppDisp) { HRESULT hr; hr = _EnsureInit(); if (FAILED(hr)) { TraceResult(hr); goto exit; } hr = E_NOTIMPL; exit: return hr; } //+--------------------------------------------------------------- // // Member: InterfaceSupportsErrorInfo // // Synopsis: // Override CBaseDisp's method to provide error // information // //--------------------------------------------------------------- HRESULT COEFolderCollection::InterfaceSupportsErrorInfo(REFIID riid) { if (IsEqualIID(riid, IID_IOEFolderCollection)) return S_OK; return CBaseDisp::InterfaceSupportsErrorInfo(riid); } //+--------------------------------------------------------------- // // Member: _EnsureInit // // Synopsis: // Make sure the folder enumerator is up and running // //--------------------------------------------------------------- HRESULT COEFolderCollection::_EnsureInit() { if (g_pStore == NULL) return E_UNEXPECTED; SafeRelease(m_pEnumChildren); return g_pStore->EnumChildren(m_idFolder, TRUE, &m_pEnumChildren); } //+--------------------------------------------------------------- // // Member: _FindFolder // // Synopsis: // find a folder by name or index // //--------------------------------------------------------------- HRESULT COEFolderCollection::_FindFolder(BSTR bstr, LONG lIndex, FOLDERID *pidFolder) { HRESULT hr=E_FAIL; LONG c=0; FOLDERINFO fi; LPSTR pszFolder=0; *pidFolder = NULL; if (bstr) pszFolder = PszToANSI(CP_ACP, bstr); m_pEnumChildren->Reset(); hr = m_pEnumChildren->Next(1, &fi, NULL); while (hr == S_OK) { // walk immediate children if (bstr) { if (lstrcmpi(fi.pszName, pszFolder)==0) { *pidFolder = fi.idFolder; break; } } else { if (lIndex == c++) { *pidFolder = fi.idFolder; break; } } hr = m_pEnumChildren->Next(1, &fi, NULL); } SafeMemFree(pszFolder); return *pidFolder ? S_OK : E_FAIL; } //+--------------------------------------------------------------- // // Member: CreateFolderCollection // // Synopsis: // helper function to create an OE Folder Collection // //--------------------------------------------------------------- HRESULT CreateFolderCollection(FOLDERID idFolder, IOEFolderCollection **ppFolderCollection) { // Locals COEFolderCollection *pNew=NULL; HRESULT hr=S_OK; if (ppFolderCollection == NULL) return E_INVALIDARG; *ppFolderCollection=NULL; pNew = new COEFolderCollection(); if (!pNew) return E_OUTOFMEMORY; hr = pNew->Init(idFolder); if (FAILED(hr)) goto error; hr = pNew->QueryInterface(IID_IOEFolderCollection, (LPVOID *)ppFolderCollection); error: ReleaseObj(pNew); return hr; } HRESULT CreateOEFolder(FOLDERID idFolder, IOEFolder **ppFolder) { COEFolder *pNew; HRESULT hr; if (!ppFolder) return E_INVALIDARG; *ppFolder =NULL; pNew = new COEFolder(); if (!pNew) return E_OUTOFMEMORY; hr = pNew->Init(idFolder); if (FAILED(hr)) goto error; *ppFolder = pNew; pNew = NULL; error: ReleaseObj(pNew); return hr; } COEFolder::COEFolder() : CBaseDisp() { m_idFolder = FOLDERID_INVALID; CoIncrementInit("COEFolder::COEFolder", MSOEAPI_START_SHOWERRORS, NULL, NULL); } COEFolder::~COEFolder() { CoDecrementInit("COEFolder::COEFolder", NULL); } HRESULT COEFolder::PrivateQueryInterface(REFIID riid, LPVOID *lplpObj) { if(!lplpObj) return E_INVALIDARG; *lplpObj = NULL; if (IsEqualIID(riid, IID_IUnknown)) *lplpObj = (LPVOID)(IOEFolder *)this; else if (IsEqualIID(riid, IID_IDispatch)) *lplpObj = (LPVOID)(IDispatch *)(CBaseDisp *)this; else if (IsEqualIID(riid, IID_IOEFolder)) *lplpObj = (LPVOID)(IOEFolder *)this; else return E_NOINTERFACE; AddRef(); return NOERROR; } HRESULT COEFolder::Init(FOLDERID idFolder) { HRESULT hr; m_idFolder = idFolder; hr = _EnsureInit(); if (FAILED(hr)) { TraceResult(hr); goto exit; } hr = CBaseDisp::EnsureTypeLibrary((LPVOID *)(IOEFolder *)this, IID_IOEFolder); exit: return hr; } HRESULT COEFolder::get_folders(IOEFolderCollection **p) { return CreateFolderCollection(m_idFolder, p); } // *** COEFolder** HRESULT COEFolder::get_messages(IOEMessageCollection **p) { return E_NOTIMPL; } HRESULT COEFolder::get_name(BSTR *pbstr) { if (pbstr == NULL) return E_INVALIDARG; *pbstr = NULL; return HrLPSZToBSTR(m_fi.pszName, pbstr); } HRESULT COEFolder::put_name(BSTR bstr) { return E_NOTIMPL; } HRESULT COEFolder::get_size(LONG *pl) { *pl = 1000; return S_OK; } HRESULT COEFolder::get_unread(LONG *pl) { *pl = m_fi.cUnread; return S_OK; } HRESULT COEFolder::get_id(LONG *pl) { *pl = (LONG)m_fi.idFolder; return S_OK; } HRESULT COEFolder::get_count(LONG *pl) { *pl = m_fi.cMessages; return S_OK; } HRESULT COEFolder::_EnsureInit() { return g_pStore->GetFolderInfo(m_idFolder, &m_fi); }