// wfumain.CPP: Implementation of wordwheel update interface #include #ifdef _DEBUG static char s_aszModule[] = __FILE__; /* For error report */ #endif #include #include #include #include #include #include #include #include #include #include //#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 * @xref * @xref * * @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 */