Windows2003-3790/inetcore/outlookexpress/mailnews/store/enumsync.cpp
2020-09-30 16:53:55 +02:00

192 lines
4.9 KiB
C++

#include "pch.hxx"
#include "syncop.h"
#include "sync.h"
#include "enumsync.h"
//--------------------------------------------------------------------------
// CEnumerateSyncOps::CEnumerateSyncOps
//--------------------------------------------------------------------------
CEnumerateSyncOps::CEnumerateSyncOps(void)
{
m_cRef = 1;
m_pid = NULL;
m_iid = 0;
m_cid = 0;
m_cidBuf = 0;
m_pDB = NULL;
m_idServer = FOLDERID_INVALID;
}
//--------------------------------------------------------------------------
// CEnumerateSyncOps::~CEnumerateSyncOps
//--------------------------------------------------------------------------
CEnumerateSyncOps::~CEnumerateSyncOps(void)
{
SafeMemFree(m_pid);
SafeRelease(m_pDB);
}
//--------------------------------------------------------------------------
// CEnumerateSyncOps::QueryInterface
//--------------------------------------------------------------------------
STDMETHODIMP CEnumerateSyncOps::QueryInterface(REFIID riid, LPVOID *ppv)
{
if (IID_IUnknown == riid)
*ppv = (IUnknown *)this;
else
{
*ppv = NULL;
return(E_NOINTERFACE);
}
((IUnknown *)*ppv)->AddRef();
return(S_OK);
}
//--------------------------------------------------------------------------
// CEnumerateSyncOps::AddRef
//--------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CEnumerateSyncOps::AddRef(void)
{
return InterlockedIncrement(&m_cRef);
}
//--------------------------------------------------------------------------
// CEnumerateSyncOps::Release
//--------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CEnumerateSyncOps::Release(void)
{
LONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
delete this;
return (ULONG)cRef;
}
//--------------------------------------------------------------------------
// CEnumerateSyncOps::Initialize
//--------------------------------------------------------------------------
HRESULT CEnumerateSyncOps::Initialize(IDatabase *pDB, FOLDERID idServer)
{
SYNCOPINFO info;
HROWSET hRowset;
DWORD cBuf;
HRESULT hr;
ROWORDINAL iRow;
Assert(pDB);
Assert(idServer != m_idServer);
// Save parent
m_idServer = idServer;
// Save pStore
if (m_pDB != NULL)
m_pDB->Release();
m_pDB = pDB;
m_pDB->AddRef();
m_iid = 0;
m_cid = 0;
ZeroMemory(&info, sizeof(SYNCOPINFO));
info.idServer = idServer;
hr = m_pDB->FindRecord(IINDEX_ALL, 1, &info, &iRow);
if (hr != DB_S_FOUND)
return(S_OK);
m_pDB->FreeRecord(&info);
hr = m_pDB->CreateRowset(IINDEX_ALL, NOFLAGS, &hRowset);
if (FAILED(hr))
return(hr);
hr = m_pDB->SeekRowset(hRowset, SEEK_ROWSET_BEGIN, iRow - 1, NULL);
if (SUCCEEDED(hr))
{
while (S_OK == m_pDB->QueryRowset(hRowset, 1, (LPVOID *)&info, NULL))
{
if (info.idServer != idServer)
{
m_pDB->FreeRecord(&info);
break;
}
if (m_cid == m_cidBuf)
{
cBuf = m_cidBuf + 256;
if (!MemRealloc((void **)&m_pid, cBuf * sizeof(SYNCOPID)))
{
m_pDB->FreeRecord(&info);
hr = E_OUTOFMEMORY;
break;
}
m_cidBuf = cBuf;
}
m_pid[m_cid] = info.idOperation;
m_cid++;
m_pDB->FreeRecord(&info);
}
}
m_pDB->CloseRowset(&hRowset);
return(hr);
}
//--------------------------------------------------------------------------
// CEnumerateSyncOps::Next
//--------------------------------------------------------------------------
STDMETHODIMP CEnumerateSyncOps::Next(LPSYNCOPINFO pInfo)
{
HRESULT hr;
// Validate
Assert(m_pDB != NULL);
Assert(pInfo != NULL);
if (m_iid >= m_cid)
return(S_FALSE);
ZeroMemory(pInfo, sizeof(SYNCOPINFO));
pInfo->idOperation = m_pid[m_iid++];
// Locate where the first record with idParent
hr = m_pDB->FindRecord(IINDEX_PRIMARY, 1, pInfo, NULL);
// Not Found
if (DB_S_NOTFOUND == hr)
hr = E_FAIL;
else if (SUCCEEDED(hr))
hr = S_OK;
return(hr);
}
//--------------------------------------------------------------------------
// CEnumerateSyncOps::Release
//--------------------------------------------------------------------------
STDMETHODIMP CEnumerateSyncOps::Count(ULONG *pcItems)
{
Assert(pcItems != NULL);
*pcItems = m_cid;
return(S_OK);
}
STDMETHODIMP CEnumerateSyncOps::Reset()
{
m_iid = 0;
return(S_OK);
}
STDMETHODIMP CEnumerateSyncOps::Skip(ULONG cItems)
{
m_iid += cItems;
return(S_OK);
}