2 * This file implements 'moveable' memory block.
4 * Copyright 2000 Hidenori Takeshima
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(imm);
32 #include "imm_private.h"
34 #define IMM32_MOVEABLEMEM_LOCK_MAX ((DWORD)0xffffffff)
36 struct IMM32_tagMOVEABLEMEM
43 IMM32_MOVEABLEMEM* IMM32_MoveableAlloc( DWORD dwHeapFlags, DWORD dwHeapSize )
45 IMM32_MOVEABLEMEM* lpMoveable;
47 lpMoveable = (IMM32_MOVEABLEMEM*)
48 IMM32_HeapAlloc( 0, sizeof( IMM32_MOVEABLEMEM ) );
49 if ( lpMoveable != NULL )
51 lpMoveable->dwLockCount = 0;
52 lpMoveable->dwSize = dwHeapSize;
53 lpMoveable->lpvMem = NULL;
58 IMM32_HeapAlloc( dwHeapFlags, dwHeapSize );
59 if ( lpMoveable->lpvMem == NULL )
61 IMM32_HeapFree( lpMoveable );
70 void IMM32_MoveableFree( IMM32_MOVEABLEMEM* lpMoveable )
72 IMM32_HeapFree( lpMoveable->lpvMem );
73 IMM32_HeapFree( lpMoveable );
76 BOOL IMM32_MoveableReAlloc( IMM32_MOVEABLEMEM* lpMoveable,
77 DWORD dwHeapFlags, DWORD dwHeapSize )
83 if ( lpMoveable->dwLockCount > 0 )
84 dwHeapFlags |= HEAP_REALLOC_IN_PLACE_ONLY;
85 lpv = IMM32_HeapReAlloc( dwHeapFlags,
86 lpMoveable->lpvMem, dwHeapSize );
92 IMM32_HeapFree( lpMoveable->lpvMem );
96 lpMoveable->dwSize = dwHeapSize;
97 lpMoveable->lpvMem = lpv;
102 LPVOID IMM32_MoveableLock( IMM32_MOVEABLEMEM* lpMoveable )
104 if ( lpMoveable->dwLockCount == IMM32_MOVEABLEMEM_LOCK_MAX )
106 ERR( "lock count is 0xffffffff\n" );
110 lpMoveable->dwLockCount ++;
113 return lpMoveable->lpvMem;
116 BOOL IMM32_MoveableUnlock( IMM32_MOVEABLEMEM* lpMoveable )
118 if ( lpMoveable->dwLockCount == 0 )
121 if ( --lpMoveable->dwLockCount > 0 )
127 DWORD IMM32_MoveableGetLockCount( IMM32_MOVEABLEMEM* lpMoveable )
129 return lpMoveable->dwLockCount;
132 DWORD IMM32_MoveableGetSize( IMM32_MOVEABLEMEM* lpMoveable )
134 return lpMoveable->dwSize;
139 /***********************************************************************
140 * ImmCreateIMCC (IMM32.@)
142 * Create IMCC(IMC Component).
144 HIMCC WINAPI ImmCreateIMCC(DWORD dwSize)
146 IMM32_MOVEABLEMEM* lpMoveable;
148 TRACE("(%lu)\n", dwSize);
150 lpMoveable = IMM32_MoveableAlloc( HEAP_ZERO_MEMORY, dwSize );
151 if ( lpMoveable == NULL )
153 SetLastError(ERROR_OUTOFMEMORY);
157 return (HIMCC)lpMoveable;
160 /***********************************************************************
161 * ImmDestroyIMCC (IMM32.@)
163 * Destroy IMCC(IMC Component).
165 HIMCC WINAPI ImmDestroyIMCC(HIMCC hIMCC)
167 TRACE("(0x%08x)\n", (unsigned)hIMCC);
169 IMM32_MoveableFree( (IMM32_MOVEABLEMEM*)hIMCC );
173 /***********************************************************************
174 * ImmLockIMCC (IMM32.@)
176 LPVOID WINAPI ImmLockIMCC(HIMCC hIMCC)
178 TRACE("(0x%08x)\n", (unsigned)hIMCC);
180 return IMM32_MoveableLock( (IMM32_MOVEABLEMEM*)hIMCC );
183 /***********************************************************************
184 * ImmUnlockIMCC (IMM32.@)
186 BOOL WINAPI ImmUnlockIMCC(HIMCC hIMCC)
188 TRACE("(0x%08x)\n", (unsigned)hIMCC);
190 return IMM32_MoveableUnlock( (IMM32_MOVEABLEMEM*)hIMCC );
193 /***********************************************************************
194 * ImmGetIMCCLockCount (IMM32.@)
196 DWORD WINAPI ImmGetIMCCLockCount(HIMCC hIMCC)
198 TRACE("(0x%08x)\n", (unsigned)hIMCC);
200 return IMM32_MoveableGetLockCount( (IMM32_MOVEABLEMEM*)hIMCC );
203 /***********************************************************************
204 * ImmReSizeIMCC (IMM32.@)
206 HIMCC WINAPI ImmReSizeIMCC(HIMCC hIMCC, DWORD dwSize)
208 TRACE("(0x%08x,%lu)\n", (unsigned)hIMCC, dwSize);
210 if ( !IMM32_MoveableReAlloc( (IMM32_MOVEABLEMEM*)hIMCC,
211 HEAP_ZERO_MEMORY, dwSize ) )
213 SetLastError(ERROR_OUTOFMEMORY);
220 /***********************************************************************
221 * ImmGetIMCCSize (IMM32.@)
223 DWORD WINAPI ImmGetIMCCSize(HIMCC hIMCC)
225 TRACE("(0x%08x)\n", (unsigned)hIMCC);
227 return IMM32_MoveableGetSize( (IMM32_MOVEABLEMEM*)hIMCC );