Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

142 lines
4.2 KiB

/*++
Copyright (c) 1985 - 1999, Microsoft Corporation
Module Name:
compstr.cpp
Abstract:
This file implements the CCompStrFactory Class.
Author:
Revision History:
Notes:
--*/
#include "private.h"
#include "compstr.h"
#include "a_wrappers.h"
HRESULT
CCompStrFactory::CreateCompositionString(
CWCompString* CompStr,
CWCompAttribute* CompAttr,
CWCompClause* CompClause,
CWCompTfGuidAtom* CompGuid,
CWCompString* CompReadStr,
CWCompAttribute* CompReadAttr,
CWCompClause* CompReadClause,
CWCompString* ResultStr,
CWCompClause* ResultClause,
CWCompString* ResultReadStr,
CWCompClause* ResultReadClause
)
{
DWORD dwCompSize = (CompStr ? Align(CompStr->GetSize() * sizeof(WCHAR)) : 0) +
(CompAttr ? Align(CompAttr->GetSize() * sizeof(BYTE)) : 0) +
(CompClause ? Align(CompClause->GetSize() * sizeof(DWORD)) : 0) +
(CompReadStr ? Align(CompReadStr->GetSize() * sizeof(WCHAR)) : 0) +
(CompReadAttr ? Align(CompReadAttr->GetSize() * sizeof(BYTE)) : 0) +
(CompReadClause ? Align(CompReadClause->GetSize() * sizeof(DWORD)) : 0) +
(ResultStr ? Align(ResultStr->GetSize() * sizeof(WCHAR)) : 0) +
(ResultClause ? Align(ResultClause->GetSize() * sizeof(DWORD)) : 0) +
(ResultReadStr ? Align(ResultReadStr->GetSize() * sizeof(WCHAR)) : 0) +
(ResultReadClause ? Align(ResultReadClause->GetSize() * sizeof(DWORD)) : 0) +
(CompGuid ? Align(CompGuid->GetSize() * sizeof(TfGuidAtom)) : 0) + // COMPSTRING_AIMM12->dwTfGuidAtom
(CompGuid && CompAttr
? Align(CompAttr->GetSize() * sizeof(BYTE)) : 0); // COMPSTRING_AIMM12->dwGuidMapAttr
#ifdef CICERO_4678
//
// This is another workaround instead of dimm\imewnd.cpp.
// Even subclass window hook off, AIMM won't resize hCompStr if dwCompSize is zero.
//
return (dwCompSize ? _CreateCompositionString(dwCompSize) : S_OK);
#else
return _CreateCompositionString(dwCompSize);
#endif
}
HRESULT
CCompStrFactory::CreateCompositionString(
CWInterimString* InterimStr
)
{
DWORD dwCompSize = (InterimStr ? Align(InterimStr->GetSize() * sizeof(WCHAR)) : 0) +
Align(sizeof(WCHAR)) + // Interim char
Align(sizeof(BYTE)); // Interim attr
return _CreateCompositionString(dwCompSize);
}
HRESULT
CCompStrFactory::_CreateCompositionString(
DWORD dwCompSize
)
/*+++
Return Value:
Returns S_FALSE, dwCompSize is zero.
Returns S_OK, dwCompSize is valid size.
---*/
{
IMTLS *ptls = IMTLS_GetOrAlloc();
HRESULT hr = (dwCompSize != 0 ? S_OK : S_FALSE);
dwCompSize += sizeof(COMPOSITIONSTRING_AIMM12);
if (m_himcc == NULL) {
//
// First creation. Let's initialize it now
//
m_himcc = ImmCreateIMCC(ptls, dwCompSize);
if (m_himcc != NULL) {
m_hr = _LockIMCC(m_himcc, (void**)&m_pcomp);
}
}
else if (ImmGetIMCCSize(ptls, m_himcc) != dwCompSize) {
//
// If already have m_himcc, then recreate it.
//
if (m_pcomp) {
_UnlockIMCC(m_himcc);
}
HIMCC hMem;
if ((hMem = ImmReSizeIMCC(ptls, m_himcc, dwCompSize)) != NULL) {
m_himcc = hMem;
}
else {
ImmDestroyIMCC(ptls, m_himcc);
m_himcc = ImmCreateIMCC(ptls, dwCompSize);
}
if (m_himcc != NULL) {
m_hr = _LockIMCC(m_himcc, (void**)&m_pcomp);
}
}
if (FAILED(m_hr))
return m_hr;
if (m_himcc == NULL)
return E_OUTOFMEMORY;
memset(m_pcomp, 0, dwCompSize); // clear buffer with zero.
m_pcomp->CompStr.dwSize = dwCompSize; // set buffer size.
m_pEndOfData = (BYTE*)m_pcomp + sizeof(COMPOSITIONSTRING_AIMM12); // set end of the data pointer.
return hr;
}