479 lines
13 KiB
C++
479 lines
13 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
||
|
//
|
||
|
// File: coldata.cpp
|
||
|
//
|
||
|
// Contents: Access Column Persistence data.
|
||
|
//
|
||
|
// History: 25-Jan-99 AnandhaG Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "columninfo.h"
|
||
|
#include "colwidth.h"
|
||
|
|
||
|
CColumnData::CColumnData()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CColumnData::~CColumnData()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: GetColumnData
|
||
|
//
|
||
|
// Synopsis: Helper function to retrieve the column data for a
|
||
|
// given column-id.
|
||
|
//
|
||
|
// Arguments: [pColID] - Column-Set identifier.
|
||
|
// [columnSetData] - CColumnSetData, used to return the
|
||
|
// persisted column information.
|
||
|
//
|
||
|
// Returns: S_OK - if data found else S_FALSE.
|
||
|
//
|
||
|
// History: 01-25-1999 AnandhaG Created
|
||
|
// 05-04-1999 AnandhaG Changed first param to SColumnSetID.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
HRESULT CColumnData::GetColumnData(SColumnSetID* pColID, CColumnSetData& columnSetData)
|
||
|
{
|
||
|
MMC_TRY
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
CNodeInitObject* pNodeInit = dynamic_cast<CNodeInitObject*>(this);
|
||
|
if (! pNodeInit)
|
||
|
break;
|
||
|
|
||
|
CViewData* pCV = pNodeInit->m_pNode->GetViewData();
|
||
|
if (! pCV)
|
||
|
break;
|
||
|
|
||
|
CLSID clsidSnapin;
|
||
|
hr = pNodeInit->GetSnapinCLSID(clsidSnapin);
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
hr = E_FAIL;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Get the persisted column data.
|
||
|
BOOL bRet = pCV->RetrieveColumnData( clsidSnapin, *pColID, columnSetData);
|
||
|
|
||
|
// No data.
|
||
|
if (! bRet)
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
hr = S_OK;
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
MMC_CATCH
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: SetColumnData
|
||
|
//
|
||
|
// Synopsis: Helper function to set the column data for a
|
||
|
// given column-id.
|
||
|
//
|
||
|
// Arguments: [pColID] - Column-Set identifier.
|
||
|
// [columnSetData] - CColumnSetData, that should be
|
||
|
// persisted.
|
||
|
//
|
||
|
// Returns: S_OK - if data is persisted else S_FALSE.
|
||
|
//
|
||
|
// History: 01-25-1999 AnandhaG Created
|
||
|
// 05-04-1999 AnandhaG Changed first param to SColumnSetID.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
HRESULT CColumnData::SetColumnData(SColumnSetID* pColID, CColumnSetData& columnSetData)
|
||
|
{
|
||
|
MMC_TRY
|
||
|
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
CNodeInitObject* pNodeInit = dynamic_cast<CNodeInitObject*>(this);
|
||
|
if (! pNodeInit)
|
||
|
break;
|
||
|
|
||
|
CViewData* pCV = pNodeInit->m_pNode->GetViewData();
|
||
|
if (! pCV)
|
||
|
break;
|
||
|
|
||
|
CLSID clsidSnapin;
|
||
|
hr = pNodeInit->GetSnapinCLSID(clsidSnapin);
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
hr = E_FAIL;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Copy the data into the internal data structures.
|
||
|
BOOL bRet = pCV->SaveColumnData( clsidSnapin, *pColID, columnSetData);
|
||
|
|
||
|
if (! bRet)
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
hr = S_OK;
|
||
|
|
||
|
} while ( FALSE );
|
||
|
|
||
|
return hr;
|
||
|
|
||
|
MMC_CATCH
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: SetColumnConfigData
|
||
|
//
|
||
|
// Synopsis: Method snapin can call to set the column data for a
|
||
|
// given column-id.
|
||
|
// Any sort data that was persisted will be cleared by
|
||
|
// this call.
|
||
|
//
|
||
|
// Arguments: [pColID] - Column-Set identifier.
|
||
|
// [pcolSetData] - Column data that should be persisted.
|
||
|
//
|
||
|
// Returns: S_OK - if data is persisted else S_FALSE.
|
||
|
//
|
||
|
// History: 01-25-1999 AnandhaG Created
|
||
|
// 05-04-1999 AnandhaG Changed first param to SColumnSetID.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
STDMETHODIMP CColumnData::SetColumnConfigData(SColumnSetID* pColID,
|
||
|
MMC_COLUMN_SET_DATA* pColSetData)
|
||
|
{
|
||
|
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IColumnData::SetColumnConfigData"));
|
||
|
|
||
|
if (NULL == pColID)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL SColumnSetID ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
if (NULL == pColSetData)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL MMC_COLUMN_SET_DATA ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
sc = S_FALSE;
|
||
|
|
||
|
CColumnInfoList colInfoList;
|
||
|
|
||
|
for (int i = 0; i < pColSetData->nNumCols; i++)
|
||
|
{
|
||
|
CColumnInfo colInfo;
|
||
|
MMC_COLUMN_DATA* pColData = &(pColSetData->pColData[i]);
|
||
|
colInfo.SetColWidth(pColData->nWidth);
|
||
|
colInfo.SetColHidden( HDI_HIDDEN & pColData->dwFlags);
|
||
|
colInfo.SetColIndex(pColData->nColIndex);
|
||
|
|
||
|
if ( (colInfo.GetColIndex() == 0) && colInfo.IsColHidden() )
|
||
|
return (sc = E_INVALIDARG).ToHr();
|
||
|
|
||
|
// Add the CColumnInfo to the list.
|
||
|
colInfoList.push_back(colInfo);
|
||
|
}
|
||
|
|
||
|
CColumnSetData columnSetData;
|
||
|
columnSetData.set_ColumnInfoList(colInfoList);
|
||
|
sc = SetColumnData(pColID, columnSetData);
|
||
|
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: GetColumnConfigData
|
||
|
//
|
||
|
// Synopsis: Method snapin can call to retrieve the column data for a
|
||
|
// given column-id.
|
||
|
//
|
||
|
// Arguments: [pColID] - Column-Set identifier.
|
||
|
// [ppcolSetData] - Persisted column-data that is returned.
|
||
|
//
|
||
|
// Returns: S_OK - if data is found else S_FALSE.
|
||
|
//
|
||
|
// History: 01-25-1999 AnandhaG Created
|
||
|
// 05-04-1999 AnandhaG Changed first param to SColumnSetID.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
STDMETHODIMP CColumnData::GetColumnConfigData(SColumnSetID* pColID,
|
||
|
MMC_COLUMN_SET_DATA** ppColSetData)
|
||
|
{
|
||
|
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IColumnData::GetColumnConfigData"));
|
||
|
|
||
|
if (NULL == pColID)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL SColumnSetID ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
if (NULL == ppColSetData)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL MMC_COLUMN_SET_DATA ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
sc = S_FALSE;
|
||
|
*ppColSetData = NULL;
|
||
|
|
||
|
CColumnSetData columnSetData;
|
||
|
sc = GetColumnData(pColID, columnSetData);
|
||
|
|
||
|
if (S_OK != sc.ToHr())
|
||
|
return sc.ToHr(); // data doesnt exist.
|
||
|
|
||
|
CColumnInfoList* pColInfoList = columnSetData.get_ColumnInfoList();
|
||
|
CColumnInfo colInfo;
|
||
|
|
||
|
int nNumCols = pColInfoList->size();
|
||
|
|
||
|
if (nNumCols <= 0)
|
||
|
{
|
||
|
sc = S_FALSE;
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
// Allocate memory, copy & return the data.
|
||
|
int cb = sizeof(MMC_COLUMN_SET_DATA) + sizeof(MMC_COLUMN_DATA) * nNumCols;
|
||
|
BYTE* pb = (BYTE*)::CoTaskMemAlloc(cb);
|
||
|
|
||
|
if (! pb)
|
||
|
{
|
||
|
sc = E_OUTOFMEMORY;
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
*ppColSetData = (MMC_COLUMN_SET_DATA*)pb;
|
||
|
(*ppColSetData)->cbSize = sizeof(MMC_COLUMN_SET_DATA);
|
||
|
(*ppColSetData)->nNumCols = nNumCols;
|
||
|
(*ppColSetData)->pColData = (MMC_COLUMN_DATA*)(pb + sizeof(MMC_COLUMN_SET_DATA));
|
||
|
|
||
|
CColumnInfoList::iterator itColInfo;
|
||
|
|
||
|
int i = 0;
|
||
|
MMC_COLUMN_DATA* pColData = (*ppColSetData)->pColData;
|
||
|
for (itColInfo = pColInfoList->begin();itColInfo != pColInfoList->end(); itColInfo++, i++)
|
||
|
{
|
||
|
pColData[i].nWidth = (*itColInfo).GetColWidth();
|
||
|
pColData[i].dwFlags = (*itColInfo).IsColHidden() ? HDI_HIDDEN : 0;
|
||
|
pColData[i].nColIndex = (*itColInfo).GetColIndex();
|
||
|
}
|
||
|
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: SetColumnSortData
|
||
|
//
|
||
|
// Synopsis: Method snapin can call to set the sort data for a
|
||
|
// given column-id.
|
||
|
// Any column config data (width, order...) that was
|
||
|
// persisted will not be affected by this call.
|
||
|
//
|
||
|
// Arguments: [pColID] - Column-Set identifier.
|
||
|
// [pcolSorData] - Sort data that should be persisted.
|
||
|
//
|
||
|
// Returns: S_OK - if data is persisted else S_FALSE.
|
||
|
//
|
||
|
// History: 01-25-1999 AnandhaG Created
|
||
|
// 05-04-1999 AnandhaG Changed first param to SColumnSetID.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
STDMETHODIMP CColumnData::SetColumnSortData(SColumnSetID* pColID,
|
||
|
MMC_SORT_SET_DATA* pColSortData)
|
||
|
{
|
||
|
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IColumnData::SetColumnSortData"));
|
||
|
|
||
|
if (NULL == pColID)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL SColumnSetID ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
if (NULL == pColSortData)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL MMC_COLUMN_SET_DATA ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
sc = S_FALSE;
|
||
|
|
||
|
// First get old data. We need to preserve the width, view info.
|
||
|
CColumnSetData columnSetData;
|
||
|
sc = GetColumnData(pColID, columnSetData);
|
||
|
|
||
|
if (sc)
|
||
|
return sc.ToHr();
|
||
|
|
||
|
CColumnSortList* pColSortList = columnSetData.get_ColumnSortList();
|
||
|
pColSortList->clear();
|
||
|
|
||
|
// For MMC version 1.2 we do only single column sorting.
|
||
|
if (pColSortData->nNumItems > 1)
|
||
|
{
|
||
|
sc = S_FALSE;
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
CColumnSortInfo colSortInfo;
|
||
|
|
||
|
for (int i = 0; i < pColSortData->nNumItems; i++)
|
||
|
{
|
||
|
MMC_SORT_DATA* pSortData = &(pColSortData->pSortData[i]);
|
||
|
::ZeroMemory(&colSortInfo, sizeof(colSortInfo));
|
||
|
colSortInfo.m_nCol = pSortData->nColIndex;
|
||
|
colSortInfo.m_dwSortOptions = pSortData->dwSortOptions;
|
||
|
colSortInfo.m_lpUserParam = pSortData->ulReserved;
|
||
|
|
||
|
// Add the CColumnSortInfo to the list.
|
||
|
pColSortList->push_back(colSortInfo);
|
||
|
}
|
||
|
|
||
|
sc = SetColumnData(pColID, columnSetData);
|
||
|
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: GetColumnSortData
|
||
|
//
|
||
|
// Synopsis: Method snapin can call to retrieve the column sort data
|
||
|
// for a given column-id.
|
||
|
//
|
||
|
// Arguments: [pColID] - Column-Set identifier.
|
||
|
// [ppcolSortData] - Persisted column-sort-data that is returned.
|
||
|
//
|
||
|
// Returns: S_OK - if data is found else S_FALSE.
|
||
|
//
|
||
|
// History: 01-25-1999 AnandhaG Created
|
||
|
// 05-04-1999 AnandhaG Changed first param to SColumnSetID.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
STDMETHODIMP CColumnData::GetColumnSortData(SColumnSetID* pColID,
|
||
|
MMC_SORT_SET_DATA** ppColSortData)
|
||
|
{
|
||
|
DECLARE_SC_FOR_PUBLIC_INTERFACE(sc, _T("IColumnData::SetColumnSortData"));
|
||
|
|
||
|
if (NULL == pColID)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL SColumnSetID ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
if (NULL == ppColSortData)
|
||
|
{
|
||
|
sc = E_INVALIDARG;
|
||
|
TraceSnapinError(_T("NULL MMC_COLUMN_SET_DATA ptr"), sc);
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
sc = S_FALSE;
|
||
|
*ppColSortData = NULL;
|
||
|
|
||
|
CColumnSetData columnSetData;
|
||
|
sc = GetColumnData(pColID, columnSetData);
|
||
|
|
||
|
if (S_OK != sc.ToHr())
|
||
|
return sc.ToHr();
|
||
|
|
||
|
CColumnSortList* pColSortList = columnSetData.get_ColumnSortList();
|
||
|
CColumnSortInfo colSortInfo;
|
||
|
|
||
|
int nNumItems = pColSortList->size();
|
||
|
|
||
|
if (nNumItems <= 0)
|
||
|
{
|
||
|
sc = S_FALSE;
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
// For MMC 1.2 we sort on only one column.
|
||
|
ASSERT(nNumItems == 1);
|
||
|
|
||
|
int cb = sizeof(MMC_SORT_SET_DATA) + sizeof(MMC_SORT_DATA) * nNumItems;
|
||
|
BYTE* pb = (BYTE*)::CoTaskMemAlloc(cb);
|
||
|
|
||
|
if (! pb)
|
||
|
{
|
||
|
sc = E_OUTOFMEMORY;
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
*ppColSortData = (MMC_SORT_SET_DATA*)pb;
|
||
|
(*ppColSortData)->cbSize = sizeof(MMC_SORT_SET_DATA);
|
||
|
(*ppColSortData)->nNumItems = nNumItems;
|
||
|
(*ppColSortData)->pSortData = (MMC_SORT_DATA*)(pb + sizeof(MMC_SORT_SET_DATA));
|
||
|
|
||
|
CColumnSortList::iterator itSortInfo;
|
||
|
|
||
|
int i = 0;
|
||
|
MMC_SORT_DATA* pSortData = (*ppColSortData)->pSortData;
|
||
|
for (itSortInfo = pColSortList->begin();itSortInfo != pColSortList->end(); itSortInfo++, i++)
|
||
|
{
|
||
|
pSortData[i].nColIndex = (*itSortInfo).m_nCol;
|
||
|
pSortData[i].dwSortOptions = (*itSortInfo).m_dwSortOptions;
|
||
|
pSortData[i].ulReserved = (*itSortInfo).m_lpUserParam;
|
||
|
}
|
||
|
|
||
|
sc = S_OK;
|
||
|
|
||
|
return sc.ToHr();
|
||
|
}
|
||
|
|
||
|
HRESULT WINAPI ColumnInterfaceFunc(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw)
|
||
|
{
|
||
|
*ppv = NULL;
|
||
|
|
||
|
ASSERT(IID_IColumnData == riid);
|
||
|
|
||
|
CColumnData* pColData = (CColumnData*)(pv);
|
||
|
CNodeInitObject* pNodeInit = dynamic_cast<CNodeInitObject*>(pColData);
|
||
|
|
||
|
if (pNodeInit && pNodeInit->GetComponent())
|
||
|
{
|
||
|
IColumnData* pIColData = dynamic_cast<IColumnData*>(pNodeInit);
|
||
|
pIColData->AddRef();
|
||
|
*ppv = static_cast<void*>(pIColData);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
|