windows-nt/Source/XPSP1/NT/enduser/stuff/itircl/svmgr/gpbuild/wfumain.cpp
2020-09-26 16:20:57 +08:00

296 lines
7 KiB
C++

// wfumain.CPP: Implementation of wordwheel update interface
#include <mvopsys.h>
#ifdef _DEBUG
static char s_aszModule[] = __FILE__; /* For error report */
#endif
#include <windows.h>
#include <iterror.h>
#include <itpropl.h>
#include <ccfiles.h>
#include <atlinc.h>
#include <itdb.h>
#include <itgroup.h>
#include <itww.h>
#include <itrs.h>
#include <groups.h>
//#include "..\svutil.h"
#include "wfumain.h"
CITWWFilterUpdate::~CITWWFilterUpdate()
{
(void)Close();
}
STDMETHODIMP CITWWFilterUpdate::GetTypeString(LPWSTR pPrefix, DWORD *pLen)
{
DWORD dwLen = (DWORD) WSTRLEN (SZ_GP_STORAGE) + 1;
if (NULL == pPrefix)
{
*pLen = dwLen;
return S_OK;
}
if (pLen && *pLen < dwLen)
{
*pLen = dwLen;
return S_OK;
}
if (pLen)
*pLen = dwLen;
WSTRCPY (pPrefix, SZ_GP_STORAGE);
return S_OK;
} /* GetTypeString */
STDMETHODIMP CITWWFilterUpdate::SetConfigInfo
(IITDatabase *piitdb, VARARG vaParams)
{
if(m_fConfigured == TRUE)
return SetErrReturn(E_ALREADYINIT);
if (FALSE == m_fInitialized)
return SetErrReturn(E_NOTINIT);
if(vaParams.dwArgc < 2 || NULL == piitdb)
return SetErrReturn(E_INVALIDARG);
(m_piitdb = piitdb)->AddRef();
WSTRCPY(m_wstrSrcWheel, (LPWSTR)vaParams.Argv[0]);
WSTRCPY(m_wstrSrcGroup, (LPWSTR)vaParams.Argv[1]);
if(vaParams.dwArgc == 3)
m_fGroupNot = !WSTRICMP(L"GROUP_NOT", (LPWSTR)vaParams.Argv[2]);
else
m_fGroupNot = FALSE;
m_fConfigured = TRUE;
return S_OK;
} /* SetConfigInfo */
/********************************************************************
* @method HRESULT WINAPI | CITWWFilterUpdate | InitiateUpdate |
* Creates and initiates a structure to allow for the creation of word wheels.
* This method must be called before any others in this object.
*
* @rvalue E_FAIL | The object is already initialized or file create failed
*
* @xref <om.CancelUpdate>
* @xref <om.CompleteUpdate>
* @xref <om.SetEntry>
*
* @comm
********************************************************************/
STDMETHODIMP CITWWFilterUpdate::InitHelperInstance(
DWORD dwHelperObjInstance,
IITDatabase *pITDatabase, DWORD dwCodePage,
LCID lcid, VARARG vaDword, VARARG vaString
)
{
if (FALSE == m_fInitialized)
return SetErrReturn(E_NOTINIT);
return S_OK;
} /* InitHelperInstance */
STDMETHODIMP CITWWFilterUpdate::SetEntry(LPCWSTR szDest, IITPropList *pPropList)
{
if (FALSE == m_fInitialized)
return SetErrReturn(E_NOTINIT);
return S_OK;
} /* SetEntry */
STDMETHODIMP CITWWFilterUpdate::Close(void)
{
if(!m_fInitialized)
return S_OK;
if(TRUE == m_fConfigured)
m_piitdb->Release();
m_fConfigured = FALSE;
m_fInitialized = FALSE;
return S_OK;
} /* Close */
STDMETHODIMP CITWWFilterUpdate::InitNew(IStorage *pStg)
{
m_fIsDirty = FALSE;
m_fInitialized = TRUE;
m_fConfigured = FALSE;
return S_OK;
} /* InitNew */
STDMETHODIMP CITWWFilterUpdate::Save(IStorage *pStgSave, BOOL fSameAsLoad)
{
HRESULT hr;
LONG lMaxItems;
IITGroup *pSrcGroup = NULL, *pGroup = NULL;
IITWordWheel *pSrcWheel = NULL;
IITResultSet *pResultSet= NULL;
_LPGROUP lpGroup;
if (FALSE == m_fInitialized || FALSE == m_fConfigured)
return SetErrReturn(E_NOTINIT);
// Open Source Group
if (FAILED (hr = CoCreateInstance (CLSID_IITGroupLocal, NULL,
CLSCTX_INPROC_SERVER, IID_IITGroup, (void**)&pSrcGroup)))
goto cleanup;
if (FAILED (hr = pSrcGroup->Open(m_piitdb, m_wstrSrcGroup)))
goto cleanup;
// Open Source Wheel
if (FAILED (hr = CoCreateInstance (CLSID_IITWordWheelLocal, NULL,
CLSCTX_INPROC_SERVER, IID_IITWordWheel, (void**)&pSrcWheel)))
goto cleanup;
if (FAILED (hr = pSrcWheel->Open (m_piitdb, m_wstrSrcWheel, 0)))
goto cleanup;
pSrcWheel->Count(&lMaxItems);
if (!lMaxItems)
{
SetErrCode(&hr, E_FAIL);
goto cleanup;
}
// Create destination group
if (FAILED (hr = CoCreateInstance (CLSID_IITGroupLocal, NULL,
CLSCTX_INPROC_SERVER, IID_IITGroup, (void**)&pGroup)))
goto cleanup;
pGroup->Initiate ((DWORD)lMaxItems);
lpGroup = (_LPGROUP)pGroup->GetLocalImageOfGroup();
// Create Result Set
if (FAILED (hr = CoCreateInstance (CLSID_IITResultSet, NULL,
CLSCTX_INPROC_SERVER, IID_IITResultSet, (void**)&pResultSet)))
goto cleanup;
if (FAILED (hr = pResultSet->Add (STDPROP_UID, (DWORD)0, PRIORITY_NORMAL)))
goto cleanup;
// This is the real work.
// The result group will have a bit set for every entry in the word wheel
// that has a UID that is set in the source group
do
{
DWORD dwOcc;
--lMaxItems;
// Get all occurence info for this entry
pSrcWheel->GetDataCount(lMaxItems, &dwOcc);
pResultSet->ClearRows();
//pResultSet->SetMaxRows (dwOcc);
pSrcWheel->GetData(lMaxItems, pResultSet);
for (LONG loop = 0; loop < (LONG)dwOcc; ++loop)
{
CProperty prop;
// Get UID
if (FAILED (hr = pResultSet->Get(loop, 0, prop)))
goto cleanup;
// Lookup UID is source group
// IsBitSet returns S_OK if bit is set or S_FALSE if not
if (S_OK == pSrcGroup->IsBitSet (prop.dwValue))
{
GroupAddItem (lpGroup, lMaxItems);
break;
}
}
} while (lMaxItems);
if (TRUE == m_fGroupNot)
pGroup->Not();
HFPB hfpb;
if (NULL == (hfpb = (HFPB)FpbFromHfs (pStgSave, &hr)))
goto cleanup;
hr = GroupFileBuild (hfpb, SZ_GROUP_MAIN_A, lpGroup);
pStgSave->Commit(STGC_DEFAULT);
FreeHfpb(hfpb);
cleanup:
if (pResultSet)
{
pResultSet->Free();
pResultSet->Release();
}
if (pSrcGroup)
{
pSrcGroup->Free();
pSrcGroup->Release();
}
if (pSrcWheel)
{
pSrcWheel->Close();
pSrcWheel->Release();
}
if (pGroup)
{
pGroup->Free();
pGroup->Release();
}
return hr;
} /* Save */
STDMETHODIMP CITWWFilterUpdate::GetClassID(CLSID *pClsID)
{
if (NULL == pClsID
|| IsBadWritePtr(pClsID, sizeof(CLSID)))
return SetErrReturn(E_INVALIDARG);
*pClsID = CLSID_IITWWFilterBuild;
return S_OK;
} /* GetClassID */
inline STDMETHODIMP CITWWFilterUpdate::IsDirty(void)
{
return m_fIsDirty ? S_OK : S_FALSE;
} /* IsDirty */
inline STDMETHODIMP CITWWFilterUpdate::Load(IStorage *pStg)
{
return SetErrReturn(E_NOTIMPL);
} /* Load */
STDMETHODIMP CITWWFilterUpdate::SaveCompleted(IStorage *pStgNew)
{
if (pStgNew)
{
if (!m_pStorage)
return SetErrReturn(E_UNEXPECTED);
m_pStorage->Release();
(m_pStorage = pStgNew)->AddRef();
}
m_fIsDirty = FALSE;
return S_OK;
} /* SaveCompleted */
inline STDMETHODIMP CITWWFilterUpdate::HandsOffStorage(void)
{
return S_OK;
} /* HandsOffStorage */