302 lines
8 KiB
C++
302 lines
8 KiB
C++
// wwumain.cpp: Implementation of wordwheel update interface
|
|
#ifdef _DEBUG
|
|
static char s_aszModule[] = __FILE__; /* For error report */
|
|
#endif
|
|
|
|
|
|
#include <windows.h>
|
|
#include <itcc.h>
|
|
#include <iterror.h>
|
|
#include <ccfiles.h>
|
|
#include <atlinc.h>
|
|
#include <mvopsys.h>
|
|
#include <_mvutil.h>
|
|
#include <itdb.h>
|
|
#include <itsortid.h>
|
|
#include "wwumain.h"
|
|
|
|
CITWordWheelUpdate::CITWordWheelUpdate()
|
|
{
|
|
m_fInitialized = FALSE;
|
|
m_piitskSortKey = NULL;
|
|
m_pStorage = NULL;
|
|
}
|
|
|
|
CITWordWheelUpdate::~CITWordWheelUpdate()
|
|
{
|
|
(void)Close();
|
|
} /* Destructor */
|
|
|
|
|
|
HRESULT CITWordWheelUpdate::Close(void)
|
|
{
|
|
if (FALSE == m_fInitialized)
|
|
return S_OK;
|
|
|
|
if (m_hTempFile)
|
|
{
|
|
CloseHandle(m_hTempFile);
|
|
DeleteFile(m_szTempFile);
|
|
m_hTempFile = NULL;
|
|
}
|
|
|
|
if (m_hGlobalPropTempFile)
|
|
{
|
|
CloseHandle(m_hGlobalPropTempFile);
|
|
DeleteFile(m_szGlobalPropTempFile);
|
|
m_hGlobalPropTempFile = NULL;
|
|
}
|
|
|
|
if (m_lpbOccHeader)
|
|
delete m_lpbOccHeader;
|
|
if (m_lpbKeyHeader)
|
|
delete m_lpbKeyHeader;
|
|
|
|
if (m_pStorage)
|
|
{
|
|
m_pStorage->Release();
|
|
m_pStorage = NULL;
|
|
}
|
|
|
|
if(m_piitskSortKey)
|
|
{
|
|
m_piitskSortKey->Release();
|
|
m_piitskSortKey = NULL;
|
|
}
|
|
|
|
m_fInitialized = FALSE;
|
|
|
|
return S_OK;
|
|
} /* Close */
|
|
|
|
|
|
STDMETHODIMP CITWordWheelUpdate::GetTypeString(LPWSTR pPrefix, DWORD *pLen)
|
|
{
|
|
DWORD dwLen = (DWORD) WSTRLEN (SZ_WW_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_WW_STORAGE);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CITWordWheelUpdate::SetConfigInfo
|
|
(IITDatabase *piitdb, VARARG vaParams)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
/********************************************************************
|
|
* @method HRESULT WINAPI | CITWordWheelUpdate | InitHelperInstance |
|
|
* 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 CITWordWheelUpdate::InitHelperInstance
|
|
(DWORD dwHelperObjInstance,
|
|
IITDatabase *pITDatabase,
|
|
DWORD dwCodePage,
|
|
LCID lcid,
|
|
VARARG vaDword,
|
|
VARARG vaString)
|
|
{
|
|
if (FALSE == m_fInitialized)
|
|
return SetErrReturn(E_NOTINIT);
|
|
|
|
HRESULT hr;
|
|
|
|
// Get the Sorter Object
|
|
if (FAILED(hr = pITDatabase->GetObject
|
|
(dwHelperObjInstance, IID_IITSortKey, (void **)&m_piitskSortKey)))
|
|
return hr;
|
|
|
|
IITSortKeyConfig *pSortKeyConfig;
|
|
if (FAILED(hr = pITDatabase->GetObject (dwHelperObjInstance,
|
|
IID_IITSortKeyConfig, (void **)&pSortKeyConfig)))
|
|
// This object doesn't support IITSortKeyConfig.
|
|
return S_OK;
|
|
|
|
// We should have at least 1 param (key type) specified
|
|
if (!vaDword.dwArgc)
|
|
SetErrCode(&hr, E_INVALIDARG);
|
|
|
|
// Configure the sort key object
|
|
if(SUCCEEDED(hr))
|
|
hr = pSortKeyConfig->SetLocaleInfo(dwCodePage, lcid);
|
|
|
|
if (SUCCEEDED(hr) || hr == E_NOTIMPL)
|
|
hr = pSortKeyConfig->SetKeyType(*(LPDWORD)vaDword.Argv);
|
|
|
|
if ((SUCCEEDED(hr) || hr == E_NOTIMPL)
|
|
&& vaDword.dwArgc >= 2)
|
|
hr = pSortKeyConfig->SetControlInfo(*(LPDWORD)(vaDword.Argv + 1), 0);
|
|
|
|
pSortKeyConfig->Release();
|
|
|
|
if (SUCCEEDED(hr) || hr == E_NOTIMPL)
|
|
{
|
|
// Fill out BTREE structure
|
|
MEMSET(&m_btParams, 0, sizeof (BTREE_PARAMS));
|
|
m_btParams.cbBlock = CBKWBLOCKSIZE;
|
|
m_btParams.bFlags = fFSReadWrite;
|
|
|
|
m_btParams.dwCodePageID = dwCodePage;
|
|
m_btParams.lcid = lcid;
|
|
m_btParams.dwExtSortInstID = dwHelperObjInstance;
|
|
m_btParams.dwExtSortKeyType = *(LPDWORD)(vaDword.Argv);
|
|
|
|
m_btParams.rgchFormat[0] = KT_EXTSORT;
|
|
m_btParams.rgchFormat[1] = '4';
|
|
m_btParams.rgchFormat[2] = '4';
|
|
m_btParams.rgchFormat[3] = '\0';
|
|
}
|
|
|
|
return (hr == E_NOTIMPL ? S_OK : hr);
|
|
} /* InitHelperInstance */
|
|
|
|
|
|
STDMETHODIMP CITWordWheelUpdate::SetEntry
|
|
(LPCWSTR szDest, IITPropList *pPropList)
|
|
{
|
|
|
|
HRESULT hr;
|
|
CProperty KeyProp;
|
|
DWORD dwWritten, dwSize;
|
|
LPBYTE pHeader;
|
|
DWORD cbHeader, *pMaxPropData;
|
|
// UNDONE: fix this!!!!!!!!!!!!!!
|
|
char pUserBuffer[4*1024]; // see COUNT_WWDATASIZE in wwbuild
|
|
|
|
if (FALSE == m_fInitialized || NULL == m_piitskSortKey)
|
|
return SetErrReturn(E_NOTINIT);
|
|
|
|
m_fIsDirty = TRUE;
|
|
|
|
if (NULL == szDest)
|
|
szDest = SZ_WWDEST_OCC;
|
|
|
|
// Is this a global property list?
|
|
if (!WSTRICMP(szDest, SZ_WWDEST_GLOBAL))
|
|
{
|
|
ULARGE_INTEGER ulSize;
|
|
|
|
// Write to global temp file
|
|
pPropList->GetSizeMax(&ulSize);
|
|
if (ulSize.QuadPart > 4*1024)
|
|
return SetErrReturn(E_OUTOFMEMORY);
|
|
|
|
// Write property list
|
|
pPropList->SaveToMem(pUserBuffer, ulSize.LowPart);
|
|
WriteFile(m_hGlobalPropTempFile,
|
|
pUserBuffer, ulSize.LowPart, &dwWritten, NULL);
|
|
if (ulSize.LowPart != dwWritten)
|
|
return SetErrReturn(E_FILEWRITE);
|
|
|
|
m_dwGlobalPropSize += ulSize.LowPart;
|
|
return S_OK;
|
|
}
|
|
|
|
if (FAILED(hr = pPropList->Get(STDPROP_SORTKEY, KeyProp)))
|
|
return SetErrReturn(E_NOKEYPROP);
|
|
|
|
// Don't save the KEY in the property list
|
|
pPropList->SetPersist(STDPROP_SORTKEY, FALSE);
|
|
|
|
// Determine property destination
|
|
char wcType;
|
|
if (!WSTRICMP(szDest, SZ_WWDEST_KEY))
|
|
{
|
|
wcType = C_PROPDEST_KEY;
|
|
// Is this the first entry?
|
|
if (NULL == m_lpbKeyHeader)
|
|
{
|
|
pPropList->GetHeaderSize (m_cbKeyHeader);
|
|
m_lpbKeyHeader = new BYTE[m_cbKeyHeader];
|
|
pPropList->SaveHeader (m_lpbKeyHeader, m_cbKeyHeader);
|
|
}
|
|
pHeader = m_lpbKeyHeader;
|
|
cbHeader = m_cbKeyHeader;
|
|
pMaxPropData = &m_cbMaxKeyData;
|
|
}
|
|
else
|
|
{
|
|
wcType = C_PROPDEST_OCC;
|
|
// Is this the first entry?
|
|
if (NULL == m_lpbOccHeader)
|
|
{
|
|
pPropList->GetHeaderSize (m_cbOccHeader);
|
|
m_lpbOccHeader = new BYTE[m_cbOccHeader];
|
|
pPropList->SaveHeader (m_lpbOccHeader, m_cbOccHeader);
|
|
}
|
|
pHeader = m_lpbOccHeader;
|
|
cbHeader = m_cbOccHeader;
|
|
pMaxPropData = &m_cbMaxOccData;
|
|
}
|
|
|
|
pPropList->GetDataSize(pHeader, cbHeader, dwSize);
|
|
if (dwSize > 4 * 1024)
|
|
return SetErrReturn(E_OUTOFMEMORY);
|
|
|
|
// Write key
|
|
WriteFile(m_hTempFile, &KeyProp.cbData, sizeof (DWORD), &dwWritten, NULL);
|
|
if (dwWritten != sizeof (DWORD))
|
|
return SetErrReturn(E_FILEWRITE);
|
|
WriteFile(m_hTempFile, KeyProp.lpvData, KeyProp.cbData, &dwWritten, NULL);
|
|
if (dwWritten != KeyProp.cbData)
|
|
return SetErrReturn(E_FILEWRITE);
|
|
|
|
// Write Type char
|
|
WriteFile(m_hTempFile, &wcType, sizeof (char), &dwWritten, NULL);
|
|
if (dwWritten != sizeof (char))
|
|
return SetErrReturn(E_FILEWRITE);
|
|
|
|
// Write (tertiary) sort order value
|
|
++m_dwEntryCount;
|
|
WriteFile(m_hTempFile, &m_dwEntryCount, sizeof (DWORD), &dwWritten, NULL);
|
|
if (dwWritten != sizeof (DWORD))
|
|
return SetErrReturn(E_FILEWRITE);
|
|
|
|
// Write property list size
|
|
WriteFile(m_hTempFile, &dwSize, sizeof (DWORD), &dwWritten, NULL);
|
|
if (dwWritten != sizeof (DWORD))
|
|
return SetErrReturn(E_FILEWRITE);
|
|
|
|
// Write property list if it exists
|
|
if (dwSize)
|
|
{
|
|
if (dwSize > *pMaxPropData)
|
|
*pMaxPropData = dwSize;
|
|
// Write out custom properties
|
|
pPropList->SaveData(pHeader, cbHeader, pUserBuffer, dwSize);
|
|
WriteFile(m_hTempFile, pUserBuffer, dwSize, &dwWritten, NULL);
|
|
if (dwSize != dwWritten)
|
|
return SetErrReturn(E_FILEWRITE);
|
|
}
|
|
#if 0
|
|
WriteFile(m_hTempFile, "\n", strlen("\n"), &dwWritten, NULL);
|
|
if (STRLEN("\n") != dwWritten)
|
|
return SetErrReturn(E_FILEWRITE);
|
|
#endif
|
|
return S_OK;
|
|
} /* SetEntry */ |