/*++ Copyright (c) 2001, Microsoft Corporation Module Name: compstr.cpp Abstract: This file implements the CCompStrFactory Class. Author: Revision History: Notes: --*/ #include "private.h" #include "compstr.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::ClearCompositionString() { return _CreateCompositionString(0); } HRESULT CCompStrFactory::_CreateCompositionString( DWORD dwCompSize ) /*+++ Return Value: Returns S_FALSE, dwCompSize is zero. Returns S_OK, dwCompSize is valid size. ---*/ { HRESULT hr = (dwCompSize != 0 ? S_OK : S_FALSE); dwCompSize += sizeof(COMPOSITIONSTRING) + sizeof(GUIDMAPATTRIBUTE); if (m_himcc == NULL) { // // First creation. Let's initialize it now // m_himcc = ImmCreateIMCC(dwCompSize); if (m_himcc != NULL) { m_hr = _LockIMCC(m_himcc, (void**)&m_pcomp); } } else if (ImmGetIMCCSize(m_himcc) != dwCompSize) { // // If already have m_himcc, then recreate it. // if (m_pcomp) { _UnlockIMCC(m_himcc); } HIMCC hMem; if ((hMem = ImmReSizeIMCC(m_himcc, dwCompSize)) != NULL) { m_himcc = hMem; } else { ImmDestroyIMCC(m_himcc); m_himcc = ImmCreateIMCC(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->dwSize = dwCompSize; // set buffer size. m_pEndOfData = (BYTE*)m_pcomp + sizeof(COMPOSITIONSTRING); // set end of the data pointer. return hr; } HRESULT CCompStrFactory::MakeGuidMapAttribute( CWCompTfGuidAtom* CompGuid, CWCompAttribute* CompAttr) { HRESULT hr; GUIDMAPATTRIBUTE* guid_map; hr = InitData(&GetBuffer()->dwPrivateSize, &GetBuffer()->dwPrivateOffset); if (SUCCEEDED(hr) && (guid_map = (GUIDMAPATTRIBUTE*)GetOffsetPointer(GetBuffer()->dwPrivateOffset)) != NULL) { hr = WriteData(*CompGuid, &guid_map->dwTfGuidAtomLen, &guid_map->dwTfGuidAtomOffset, GetBuffer()->dwPrivateOffset); if (SUCCEEDED(hr)) { // temporary make a buffer of dwGuidMapAttr if (CompAttr && CompAttr->GetSize()) { hr = WriteData(*CompAttr, &guid_map->dwGuidMapAttrLen, &guid_map->dwGuidMapAttrOffset, GetBuffer()->dwPrivateOffset); } } } return hr; }