323 lines
8 KiB
C++
323 lines
8 KiB
C++
|
/****************************************************************
|
||
|
* @doc SHROOM EXTERNAL API
|
||
|
*
|
||
|
* A Legsdin added autodoc headers for IITBuildCollect Interface
|
||
|
*
|
||
|
****************************************************************/
|
||
|
#include <mvopsys.h>
|
||
|
|
||
|
// wwbmain.CPP: Implementation of wordwheel update interface
|
||
|
#ifdef _DEBUG
|
||
|
static char s_aszModule[] = __FILE__; /* For error report */
|
||
|
#endif
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <iterror.h>
|
||
|
#include <itpropl.h>
|
||
|
#include <ccfiles.h>
|
||
|
#include <orkin.h>
|
||
|
#include <atlinc.h>
|
||
|
|
||
|
#include "..\svutil.h"
|
||
|
#include "gpumain.h"
|
||
|
|
||
|
CITGroupUpdate::~CITGroupUpdate()
|
||
|
{
|
||
|
(void)Close();
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::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 CITGroupUpdate::SetConfigInfo
|
||
|
(IITDatabase *piitdb, VARARG vaParams)
|
||
|
{
|
||
|
if(vaParams.dwArgc)
|
||
|
m_fGroupNot = !WSTRICMP(L"GROUP_NOT", (LPWSTR)vaParams.Argv[0]);
|
||
|
|
||
|
return S_OK;
|
||
|
} /* SetConfigInfo */
|
||
|
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::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 CITGroupUpdate::SetEntry(LPCWSTR szDest, IITPropList *pPropList)
|
||
|
{
|
||
|
|
||
|
if (FALSE == m_fInitialized)
|
||
|
return SetErrReturn(E_NOTINIT);
|
||
|
|
||
|
HRESULT hr;
|
||
|
|
||
|
// The only property we are interested in is STDPROP_UID
|
||
|
CProperty UidProp;
|
||
|
if (FAILED(hr = pPropList->Get(STDPROP_UID, UidProp))
|
||
|
|| TYPE_STRING == UidProp.dwType)
|
||
|
return SetErrReturn(E_INVALIDARG);
|
||
|
|
||
|
// This could be a pointer to a UID or a DWORD UID
|
||
|
DWORD dwUID;
|
||
|
if (TYPE_VALUE == UidProp.dwType)
|
||
|
dwUID = UidProp.dwValue;
|
||
|
else if (TYPE_POINTER == UidProp.dwType)
|
||
|
dwUID = *((LPDWORD&)UidProp.lpvData);
|
||
|
|
||
|
// Save highest UID
|
||
|
if (dwUID > m_dwMaxUID)
|
||
|
m_dwMaxUID = dwUID;
|
||
|
|
||
|
DWORD dwWritten;
|
||
|
WriteFile (m_hTempFile, &dwUID, sizeof (dwUID), &dwWritten, NULL);
|
||
|
if (dwWritten != sizeof (dwUID))
|
||
|
return SetErrReturn(E_FILEWRITE);
|
||
|
|
||
|
m_fIsDirty = TRUE;
|
||
|
|
||
|
return S_OK;
|
||
|
} /* SetEntry */
|
||
|
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::Close(void)
|
||
|
{
|
||
|
if (m_pStorage)
|
||
|
{
|
||
|
m_pStorage->Release();
|
||
|
m_pStorage = NULL;
|
||
|
}
|
||
|
|
||
|
DeleteFile (m_szTempFile);
|
||
|
|
||
|
m_dwMaxTitleUID = 0;
|
||
|
m_fInitialized = FALSE;
|
||
|
|
||
|
return S_OK;
|
||
|
} /* Close */
|
||
|
|
||
|
/************************************************************************
|
||
|
* @method STDMETHODIMP | IITBuildCollect | SetBuildStats |
|
||
|
* Gives the build object information about the title.
|
||
|
*
|
||
|
* @parm ITBuildObjectControlInfo | &itboci| A structure consisting of
|
||
|
* a DWORD dwSize set to the size of the structure, and a DWORD dwMaxUID that
|
||
|
* represents the highest UID authored for the title.
|
||
|
*
|
||
|
* @rvalue S_OK | The operation completed successfully
|
||
|
* @rvalue E_NOTINIT | The object has not been initialized
|
||
|
* @rvalue E_INVALIDARG | dwSize cannot be zero
|
||
|
*
|
||
|
* @comm Call this method at the end of the build process before the object
|
||
|
* is persisted.
|
||
|
************************************************************************/
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::SetBuildStats(ITBuildObjectControlInfo &itboci)
|
||
|
{
|
||
|
if (FALSE == m_fInitialized)
|
||
|
return SetErrReturn(E_NOTINIT);
|
||
|
|
||
|
if (0 == itboci.dwSize)
|
||
|
return SetErrReturn(E_INVALIDARG);
|
||
|
|
||
|
#ifdef _DEBUG // {
|
||
|
if(itboci.dwSize != 8)
|
||
|
ITASSERT(0);
|
||
|
#endif // _DEBUG }
|
||
|
|
||
|
m_dwMaxTitleUID = itboci.dwMaxUID;
|
||
|
return S_OK;
|
||
|
} /* SetControlInfo */
|
||
|
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::InitNew(IStorage *pStg)
|
||
|
{
|
||
|
if (NULL == pStg)
|
||
|
return SetErrReturn(E_INVALIDARG);
|
||
|
if (m_fInitialized)
|
||
|
return SetErrReturn(CO_E_ALREADYINITIALIZED);
|
||
|
|
||
|
// Create the temp file
|
||
|
char szTempPath [_MAX_PATH + 1];
|
||
|
if (0 == GetTempPath(_MAX_PATH, szTempPath))
|
||
|
return SetErrReturn(E_FILECREATE);
|
||
|
if (0 == GetTempFileName(szTempPath, "GPU", 0, m_szTempFile))
|
||
|
return SetErrReturn(E_FILECREATE);
|
||
|
m_hTempFile = CreateFile
|
||
|
(m_szTempFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
|
||
|
FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||
|
if (INVALID_HANDLE_VALUE == m_hTempFile)
|
||
|
return SetErrReturn(E_FILECREATE);
|
||
|
|
||
|
m_fGroupNot = FALSE;
|
||
|
m_dwMaxUID = 0;
|
||
|
m_pStorage = pStg;
|
||
|
pStg->AddRef();
|
||
|
m_fIsDirty = FALSE;
|
||
|
|
||
|
m_fInitialized = TRUE;
|
||
|
return S_OK;
|
||
|
} /* InitNew */
|
||
|
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::Save(IStorage *pStgSave, BOOL fSameAsLoad)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
LPDWORD pInput, pCur;
|
||
|
_LPGROUP pGroup = NULL;
|
||
|
|
||
|
if (FALSE == m_fInitialized)
|
||
|
return SetErrReturn(E_NOTINIT);
|
||
|
|
||
|
if (NULL == pStgSave)
|
||
|
return SetErrReturn(E_INVALIDARG);
|
||
|
|
||
|
DWORD dwSize = GetFileSize(m_hTempFile, NULL);
|
||
|
if (0 == dwSize)
|
||
|
{
|
||
|
HFPB hfpb = NULL;
|
||
|
pGroup = GroupInitiate (m_dwMaxUID + 1, &hr);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
// Group code only works if you add at least one item,
|
||
|
// so we add one and remove it
|
||
|
GroupAddItem(pGroup, 0);
|
||
|
GroupRemoveItem(pGroup, 0);
|
||
|
hfpb = (HFPB)FpbFromHfs (pStgSave, &hr);
|
||
|
}
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = GroupFileBuild (hfpb, SZ_GROUP_MAIN_A, pGroup);
|
||
|
|
||
|
if (hfpb != NULL)
|
||
|
FreeHfpb(hfpb);
|
||
|
GroupFree(pGroup);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
CloseHandle (m_hTempFile);
|
||
|
pCur = pInput = (LPDWORD)MapSequentialReadFile(m_szTempFile, &dwSize);
|
||
|
if (NULL == pInput)
|
||
|
{
|
||
|
SetErrCode(&hr, E_FILEREAD);
|
||
|
exit0:
|
||
|
UnmapViewOfFile (pInput);
|
||
|
// Open a handle to the temp file in case we want to add more
|
||
|
// items later
|
||
|
m_hTempFile = CreateFile
|
||
|
(m_szTempFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||
|
SetFilePointer(m_hTempFile, 0, NULL, FILE_END);
|
||
|
|
||
|
if (pGroup)
|
||
|
GroupFree (pGroup);
|
||
|
return hr;
|
||
|
}
|
||
|
LPDWORD pEnd = pInput + (dwSize / sizeof (DWORD));
|
||
|
|
||
|
// Initialize the group info structure for this group
|
||
|
if (m_fGroupNot && m_dwMaxTitleUID > m_dwMaxUID)
|
||
|
// If the group is to be inverted we must grow the size to match
|
||
|
// the maximum UID for the title not just for this group.
|
||
|
pGroup = GroupInitiate (m_dwMaxTitleUID + 1, &hr);
|
||
|
else
|
||
|
pGroup = GroupInitiate (m_dwMaxUID + 1, &hr);
|
||
|
|
||
|
if (NULL == pGroup)
|
||
|
goto exit0;
|
||
|
|
||
|
while (pEnd != pCur)
|
||
|
{
|
||
|
if (FAILED(hr = GroupAddItem (pGroup, *pCur++)))
|
||
|
goto exit0;
|
||
|
}
|
||
|
|
||
|
if (m_fGroupNot)
|
||
|
{
|
||
|
_LPGROUP pOldGroup = pGroup;
|
||
|
pGroup = GroupNot (pGroup, &hr);
|
||
|
GroupFree (pOldGroup);
|
||
|
}
|
||
|
|
||
|
HFPB hfpb;
|
||
|
if (NULL == (hfpb = (HFPB)FpbFromHfs (pStgSave, &hr)))
|
||
|
goto exit0;
|
||
|
|
||
|
hr = GroupFileBuild (hfpb, SZ_GROUP_MAIN_A, pGroup);
|
||
|
FreeHfpb(hfpb);
|
||
|
|
||
|
goto exit0;
|
||
|
} /* Save */
|
||
|
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::GetClassID(CLSID *pClsID)
|
||
|
{
|
||
|
if (NULL == pClsID
|
||
|
|| IsBadWritePtr(pClsID, sizeof(CLSID)))
|
||
|
return SetErrReturn(E_INVALIDARG);
|
||
|
|
||
|
*pClsID = CLSID_IITGroupUpdate;
|
||
|
return S_OK;
|
||
|
} /* GetClassID */
|
||
|
|
||
|
|
||
|
inline STDMETHODIMP CITGroupUpdate::IsDirty(void)
|
||
|
{
|
||
|
return m_fIsDirty ? S_OK : S_FALSE;
|
||
|
} /* IsDirty */
|
||
|
|
||
|
|
||
|
inline STDMETHODIMP CITGroupUpdate::Load(IStorage *pStg)
|
||
|
{
|
||
|
return SetErrReturn(E_NOTIMPL);
|
||
|
} /* Load */
|
||
|
|
||
|
|
||
|
STDMETHODIMP CITGroupUpdate::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 CITGroupUpdate::HandsOffStorage(void)
|
||
|
{
|
||
|
return S_OK;
|
||
|
} /* HandsOffStorage */
|