2 * This file implements 'moveable' memory block.
4 * Copyright 2000 Hidenori Takeshima
15 #include "debugtools.h"
16 DEFAULT_DEBUG_CHANNEL(imm
);
18 #include "imm_private.h"
20 #define IMM32_MOVEABLEMEM_LOCK_MAX ((DWORD)0xffffffff)
22 struct IMM32_tagMOVEABLEMEM
29 IMM32_MOVEABLEMEM
* IMM32_MoveableAlloc( DWORD dwHeapFlags
, DWORD dwHeapSize
)
31 IMM32_MOVEABLEMEM
* lpMoveable
;
33 lpMoveable
= (IMM32_MOVEABLEMEM
*)
34 IMM32_HeapAlloc( 0, sizeof( IMM32_MOVEABLEMEM
) );
35 if ( lpMoveable
!= NULL
)
37 lpMoveable
->dwLockCount
= 0;
38 lpMoveable
->dwSize
= dwHeapSize
;
39 lpMoveable
->lpvMem
= NULL
;
44 IMM32_HeapAlloc( dwHeapFlags
, dwHeapSize
);
45 if ( lpMoveable
->lpvMem
== NULL
)
47 IMM32_HeapFree( lpMoveable
);
56 void IMM32_MoveableFree( IMM32_MOVEABLEMEM
* lpMoveable
)
58 IMM32_HeapFree( lpMoveable
->lpvMem
);
59 IMM32_HeapFree( lpMoveable
);
62 BOOL
IMM32_MoveableReAlloc( IMM32_MOVEABLEMEM
* lpMoveable
,
63 DWORD dwHeapFlags
, DWORD dwHeapSize
)
69 if ( lpMoveable
->dwLockCount
> 0 )
70 dwHeapFlags
|= HEAP_REALLOC_IN_PLACE_ONLY
;
71 lpv
= IMM32_HeapReAlloc( dwHeapFlags
,
72 lpMoveable
->lpvMem
, dwHeapSize
);
78 IMM32_HeapFree( lpMoveable
->lpvMem
);
82 lpMoveable
->dwSize
= dwHeapSize
;
83 lpMoveable
->lpvMem
= lpv
;
88 LPVOID
IMM32_MoveableLock( IMM32_MOVEABLEMEM
* lpMoveable
)
90 if ( lpMoveable
->dwLockCount
== IMM32_MOVEABLEMEM_LOCK_MAX
)
92 ERR( "lock count is 0xffffffff." );
96 lpMoveable
->dwLockCount
++;
99 return lpMoveable
->lpvMem
;
102 BOOL
IMM32_MoveableUnlock( IMM32_MOVEABLEMEM
* lpMoveable
)
104 if ( lpMoveable
->dwLockCount
== 0 )
107 if ( --lpMoveable
->dwLockCount
> 0 )
113 DWORD
IMM32_MoveableGetLockCount( IMM32_MOVEABLEMEM
* lpMoveable
)
115 return lpMoveable
->dwLockCount
;
118 DWORD
IMM32_MoveableGetSize( IMM32_MOVEABLEMEM
* lpMoveable
)
120 return lpMoveable
->dwSize
;
125 /***********************************************************************
126 * ImmCreateIMCC (IMM32.@)
128 * Create IMCC(IMC Component).
130 HIMCC WINAPI
ImmCreateIMCC(DWORD dwSize
)
132 IMM32_MOVEABLEMEM
* lpMoveable
;
134 TRACE("(%lu)\n", dwSize
);
136 lpMoveable
= IMM32_MoveableAlloc( HEAP_ZERO_MEMORY
, dwSize
);
137 if ( lpMoveable
== NULL
)
139 SetLastError(ERROR_OUTOFMEMORY
);
143 return (HIMCC
)lpMoveable
;
146 /***********************************************************************
147 * ImmDestroyIMCC (IMM32.@)
149 * Destroy IMCC(IMC Component).
151 HIMCC WINAPI
ImmDestroyIMCC(HIMCC hIMCC
)
153 TRACE("(0x%08x)\n", (unsigned)hIMCC
);
155 IMM32_MoveableFree( (IMM32_MOVEABLEMEM
*)hIMCC
);
159 /***********************************************************************
160 * ImmLockIMCC (IMM32.@)
162 LPVOID WINAPI
ImmLockIMCC(HIMCC hIMCC
)
164 TRACE("(0x%08x)\n", (unsigned)hIMCC
);
166 return IMM32_MoveableLock( (IMM32_MOVEABLEMEM
*)hIMCC
);
169 /***********************************************************************
170 * ImmUnlockIMCC (IMM32.@)
172 BOOL WINAPI
ImmUnlockIMCC(HIMCC hIMCC
)
174 TRACE("(0x%08x)\n", (unsigned)hIMCC
);
176 return IMM32_MoveableUnlock( (IMM32_MOVEABLEMEM
*)hIMCC
);
179 /***********************************************************************
180 * ImmGetIMCCLockCount (IMM32.@)
182 DWORD WINAPI
ImmGetIMCCLockCount(HIMCC hIMCC
)
184 TRACE("(0x%08x)\n", (unsigned)hIMCC
);
186 return IMM32_MoveableGetLockCount( (IMM32_MOVEABLEMEM
*)hIMCC
);
189 /***********************************************************************
190 * ImmReSizeIMCC (IMM32.@)
192 HIMCC WINAPI
ImmReSizeIMCC(HIMCC hIMCC
, DWORD dwSize
)
194 TRACE("(0x%08x,%lu)\n", (unsigned)hIMCC
, dwSize
);
196 if ( !IMM32_MoveableReAlloc( (IMM32_MOVEABLEMEM
*)hIMCC
,
197 HEAP_ZERO_MEMORY
, dwSize
) )
199 SetLastError(ERROR_OUTOFMEMORY
);
206 /***********************************************************************
207 * ImmGetIMCCSize (IMM32.@)
209 DWORD WINAPI
ImmGetIMCCSize(HIMCC hIMCC
)
211 TRACE("(0x%08x)\n", (unsigned)hIMCC
);
213 return IMM32_MoveableGetSize( (IMM32_MOVEABLEMEM
*)hIMCC
);