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

401 lines
9.5 KiB
C++

/*
* t a b l e . c p p
*
* Purpose:
* Implements the OE-MOM DataBinding Table object
*
* History
*
* Copyright (C) Microsoft Corp. 1995, 1996.
*/
#include <pch.hxx>
#include "msoeobj.h"
#include "mshtmdid.h"
#include "table.h"
#include "instance.h"
COEMsgTable::COEMsgTable() : CBaseDisp()
{
m_pTable=0;
m_pDSListen=0;
m_fAsc=TRUE;
m_col=COLUMN_RECEIVED;
m_pDataSrcListener=0;
CoIncrementInit("COEMsgTable::COEMsgTable", MSOEAPI_START_SHOWERRORS, NULL, NULL);
}
COEMsgTable::~COEMsgTable()
{
ReleaseObj(m_pTable);
ReleaseObj(m_pDSListen);
ReleaseObj(m_pDataSrcListener);
CoDecrementInit("COEMsgTable::COEMsgTable", NULL);
}
HRESULT COEMsgTable::PrivateQueryInterface(REFIID riid, LPVOID *lplpObj)
{
if(!lplpObj)
return E_INVALIDARG;
*lplpObj = NULL;
if (IsEqualIID(riid, IID_IUnknown))
*lplpObj = (LPVOID)(OLEDBSimpleProvider *)this;
else if (IsEqualIID(riid, IID_OLEDBSimpleProvider))
*lplpObj = (LPVOID)(OLEDBSimpleProvider *)this;
else if (IsEqualIID(riid, IID_IDispatch))
*lplpObj = (LPVOID)(IDispatch *)(CBaseDisp *)this;
else if (IsEqualIID(riid, IID_IDispatchEx))
*lplpObj = (LPVOID)(IDispatchEx *)this;
else if (IsEqualIID(riid, IID_IOEMsgList))
*lplpObj = (LPVOID)(IOEMsgList *)this;
else
{
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
HRESULT COEMsgTable::Init()
{
FOLDERINFO fi;
HRESULT hr;
g_pStore->GetSpecialFolderInfo(FOLDERID_LOCAL_STORE, FOLDER_INBOX, &fi);
hr = CoCreateInstance(CLSID_MessageTable, NULL, CLSCTX_INPROC_SERVER,
IID_IMessageTable, (LPVOID *)&m_pTable);
if (FAILED(hr))
goto error;
// Tell the table which folder to look at
hr = m_pTable->Initialize(fi.idFolder, NULL, FALSE, NULL);
if (FAILED(hr))
goto error;
hr = CBaseDisp::EnsureTypeLibrary((LPVOID *)(IOEMsgList *)this, IID_IOEMsgList);
if (FAILED(hr))
goto error;
error:
return hr;
}
HRESULT COEMsgTable::getRowCount(long *pcRows)
{
*pcRows = 0;
if (m_pTable)
m_pTable->GetCount(MESSAGE_COUNT_VISIBLE, (ULONG *)pcRows);
return S_OK;
}
HRESULT COEMsgTable::getColumnCount(long *pcColumns)
{
*pcColumns=COLUMN_MAX;
return S_OK;
}
HRESULT COEMsgTable::getRWStatus(long iRow, long iColumn, OSPRW *prwStatus)
{
*prwStatus = OSPRW_READONLY;
return S_OK;
}
HRESULT COEMsgTable::getVariant(long iRow, long iColumn, OSPFORMAT format, VARIANT __RPC_FAR *pVar)
{
LPMESSAGEINFO pmsginfo;
LPSTR pszData = NULL;
TCHAR rgch[MAX_PATH];
pVar->vt = VT_NULL;
if (iRow == 0)
{
// return headings if row==0
pVar->vt = VT_BSTR;
pVar->bstrVal = SysAllocString(_PszFromColIndex(iColumn-1));
return S_OK;
}
if (m_pTable->GetRow(iRow-1, &pmsginfo)==S_OK)
{
switch (iColumn-1)
{
case COLUMN_MSGID:
wnsprintf(rgch,ARRAYSIZE(rgch), "%d", pmsginfo->idMessage);
pszData = rgch;
break;
case COLUMN_SUBJECT:
pszData = pmsginfo->pszSubject;
break;
case COLUMN_TO:
pszData = pmsginfo->pszDisplayTo;
break;
case COLUMN_FROM:
pszData = pmsginfo->pszDisplayFrom;
break;
case COLUMN_RECEIVED:
pszData = rgch;
*rgch=0;
CchFileTimeToDateTimeSz(&pmsginfo->ftReceived, rgch, sizeof(rgch)/sizeof(TCHAR), DTM_NOSECONDS);
break;
default:
pVar->vt = VT_NULL;
pVar->lVal = NULL;
return S_OK;
}
}
if (pszData)
{
pVar->vt = VT_BSTR;
HrLPSZToBSTR(pszData, &pVar->bstrVal);
}
else
AssertSz(0, "bad");
return S_OK;
}
HRESULT COEMsgTable::setVariant(long iRow, long iColumn, OSPFORMAT format, VARIANT Var)
{
AssertSz(0, "READONLY Table");
return E_NOTIMPL;
}
HRESULT COEMsgTable::getLocale(BSTR *pbstrLocale)
{
nyi("DATABINDING::getLocale");
return E_NOTIMPL;
}
HRESULT COEMsgTable::deleteRows(long iRow, long cRows, long *pcRowsDeleted)
{
AssertSz(0, "READONLY Table");
return E_NOTIMPL;
}
HRESULT COEMsgTable::insertRows(long iRow, long cRows, long *pcRowsInserted)
{
AssertSz(0, "READONLY Table");
return E_NOTIMPL;
}
HRESULT COEMsgTable::find(long iRowStart, long iColumn, VARIANT val, OSPFIND findFlags, OSPCOMP compType, long *piRowFound)
{
nyi("DATABINDING::find");
return E_NOTIMPL;
}
HRESULT COEMsgTable::addOLEDBSimpleProviderListener(OLEDBSimpleProviderListener *pospIListener)
{
ReplaceInterface(m_pDSListen, pospIListener);
if (pospIListener)
pospIListener->transferComplete(OSPXFER_COMPLETE);
return S_OK;
}
HRESULT COEMsgTable::removeOLEDBSimpleProviderListener(OLEDBSimpleProviderListener *pospIListener)
{
SafeRelease(m_pDSListen);
return S_OK;
}
HRESULT COEMsgTable::isAsync(BOOL *pbAsynch)
{
*pbAsynch = FALSE;
return S_OK;
}
HRESULT COEMsgTable::getEstimatedRows(long *piRows)
{
return getRowCount(piRows);
}
HRESULT COEMsgTable::stopTransfer()
{
return S_OK;
}
HRESULT CreateInstance_OEMsgTable(IUnknown *pUnkOuter, IUnknown **ppUnknown)
{
// Locals
COEMsgTable *pMsgTable=NULL;
HRESULT hr;
if (NULL != pUnkOuter)
return CLASS_E_NOAGGREGATION;
pMsgTable = new COEMsgTable();
if (!pMsgTable)
return E_OUTOFMEMORY;
hr = pMsgTable->Init();
if (FAILED(hr))
goto error;
hr = pMsgTable->QueryInterface(IID_IUnknown, (LPVOID *)ppUnknown);
error:
ReleaseObj(pMsgTable);
return hr;
}
HRESULT COEMsgTable::GetDispID(BSTR bstrName, DWORD grfdex, DISPID *pid)
{
return DispGetIDsOfNames(m_pTypeInfo, &bstrName, 1, pid);
}
HRESULT COEMsgTable::InvokeEx(DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{
switch (id)
{
case DISPID_MSDATASRCINTERFACE:
pvarRes->vt = VT_UNKNOWN;
pvarRes->punkVal = (OLEDBSimpleProvider *)this;
AddRef();
return S_OK;
case DISPID_ADVISEDATASRCCHANGEEVENT:
if (pdp->cArgs == 1 && pdp->rgvarg[0].vt == VT_UNKNOWN)
{
ReplaceInterface(m_pDataSrcListener, (DataSourceListener *)pdp->rgvarg[0].punkVal);
return S_OK;
}
else
return E_INVALIDARG;
default:
return DispInvoke(m_pUnkInvoke, m_pTypeInfo, id, wFlags, pdp, pvarRes, pei, NULL);
}
return E_NOTIMPL;
}
HRESULT COEMsgTable::DeleteMemberByName(BSTR bstrName, DWORD grfdex)
{
return E_NOTIMPL;
}
HRESULT COEMsgTable::DeleteMemberByDispID(DISPID id)
{
return E_NOTIMPL;
}
HRESULT COEMsgTable::GetMemberProperties(DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
{
return E_NOTIMPL;
}
HRESULT COEMsgTable::GetMemberName(DISPID id, BSTR *pbstrName)
{
return E_NOTIMPL;
}
HRESULT COEMsgTable::GetNextDispID(DWORD grfdex, DISPID id, DISPID *pid)
{
return E_NOTIMPL;
}
HRESULT COEMsgTable::GetNameSpaceParent(IUnknown **ppunk)
{
return E_NOTIMPL;
}
HRESULT COEMsgTable::put_sortColumn(BSTR bstr)
{
return S_OK;
}
HRESULT COEMsgTable::get_sortColumn(BSTR *pbstr)
{
*pbstr = SysAllocString(_PszFromColIndex(m_col));
return S_OK;
}
HRESULT COEMsgTable::put_sortDirection(VARIANT_BOOL v)
{
return S_OK;
}
HRESULT COEMsgTable::get_sortDirection(VARIANT_BOOL *pv)
{
*pv = m_fAsc ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
HRESULT COEMsgTable::test()
{
if (m_pDataSrcListener)
m_pDataSrcListener->dataMemberChanged(NULL);
return S_OK;
}
static const WCHAR c_szOESubjW[] = L"oeSubj",
c_szOEToW[] = L"oeTo",
c_szOEFromW[] = L"oeFrom",
c_szOEMsgIdW[] = L"oeMsgId",
c_szOEReceivedW[] = L"oeDate";
DWORD COEMsgTable::_colIndexFromString(LPWSTR pszW)
{
if (StrCmpIW(c_szOESubjW, pszW)==0)
return COLUMN_SUBJECT;
else
if (StrCmpIW(c_szOEToW, pszW)==0)
return COLUMN_TO;
else
if (StrCmpIW(c_szOEReceivedW, pszW)==0)
return COLUMN_RECEIVED;
else
if (StrCmpIW(c_szOEFromW, pszW)==0)
return COLUMN_FROM;
else
if (StrCmpIW(c_szOEMsgIdW, pszW)==0)
return COLUMN_MSGID;
return (DWORD)-1;
}
LPWSTR COEMsgTable::_PszFromColIndex(DWORD dw)
{
switch (dw)
{
case COLUMN_MSGID:
return (LPWSTR)c_szOEMsgIdW;
case COLUMN_SUBJECT:
return (LPWSTR)c_szOESubjW;
case COLUMN_TO:
return (LPWSTR)c_szOEToW;
case COLUMN_FROM:
return (LPWSTR)c_szOEFromW;
case COLUMN_RECEIVED:
return (LPWSTR)c_szOEReceivedW;
}
return NULL;
}