You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
400 lines
9.5 KiB
400 lines
9.5 KiB
/*
|
|
* 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;
|
|
}
|