| /* |
| * This file implements 'moveable' memory block. |
| * |
| * Copyright 2000 Hidenori Takeshima |
| */ |
| |
| #include "config.h" |
| |
| #include "winbase.h" |
| #include "windef.h" |
| #include "wingdi.h" |
| #include "winuser.h" |
| #include "winerror.h" |
| #include "immddk.h" |
| #include "debugtools.h" |
| DEFAULT_DEBUG_CHANNEL(imm); |
| |
| #include "imm_private.h" |
| |
| #define IMM32_MOVEABLEMEM_LOCK_MAX ((DWORD)0xffffffff) |
| |
| struct IMM32_tagMOVEABLEMEM |
| { |
| DWORD dwLockCount; |
| DWORD dwSize; |
| LPVOID lpvMem; |
| }; |
| |
| IMM32_MOVEABLEMEM* IMM32_MoveableAlloc( DWORD dwHeapFlags, DWORD dwHeapSize ) |
| { |
| IMM32_MOVEABLEMEM* lpMoveable; |
| |
| lpMoveable = (IMM32_MOVEABLEMEM*) |
| IMM32_HeapAlloc( 0, sizeof( IMM32_MOVEABLEMEM ) ); |
| if ( lpMoveable != NULL ) |
| { |
| lpMoveable->dwLockCount = 0; |
| lpMoveable->dwSize = dwHeapSize; |
| lpMoveable->lpvMem = NULL; |
| |
| if ( dwHeapSize > 0 ) |
| { |
| lpMoveable->lpvMem = |
| IMM32_HeapAlloc( dwHeapFlags, dwHeapSize ); |
| if ( lpMoveable->lpvMem == NULL ) |
| { |
| IMM32_HeapFree( lpMoveable ); |
| lpMoveable = NULL; |
| } |
| } |
| } |
| |
| return lpMoveable; |
| } |
| |
| void IMM32_MoveableFree( IMM32_MOVEABLEMEM* lpMoveable ) |
| { |
| IMM32_HeapFree( lpMoveable->lpvMem ); |
| IMM32_HeapFree( lpMoveable ); |
| } |
| |
| BOOL IMM32_MoveableReAlloc( IMM32_MOVEABLEMEM* lpMoveable, |
| DWORD dwHeapFlags, DWORD dwHeapSize ) |
| { |
| LPVOID lpv; |
| |
| if ( dwHeapSize > 0 ) |
| { |
| if ( lpMoveable->dwLockCount > 0 ) |
| dwHeapFlags |= HEAP_REALLOC_IN_PLACE_ONLY; |
| lpv = IMM32_HeapReAlloc( dwHeapFlags, |
| lpMoveable->lpvMem, dwHeapSize ); |
| if ( lpv == NULL ) |
| return FALSE; |
| } |
| else |
| { |
| IMM32_HeapFree( lpMoveable->lpvMem ); |
| lpv = NULL; |
| } |
| |
| lpMoveable->dwSize = dwHeapSize; |
| lpMoveable->lpvMem = lpv; |
| |
| return TRUE; |
| } |
| |
| LPVOID IMM32_MoveableLock( IMM32_MOVEABLEMEM* lpMoveable ) |
| { |
| if ( lpMoveable->dwLockCount == IMM32_MOVEABLEMEM_LOCK_MAX ) |
| { |
| ERR( "lock count is 0xffffffff." ); |
| } |
| else |
| { |
| lpMoveable->dwLockCount ++; |
| } |
| |
| return lpMoveable->lpvMem; |
| } |
| |
| BOOL IMM32_MoveableUnlock( IMM32_MOVEABLEMEM* lpMoveable ) |
| { |
| if ( lpMoveable->dwLockCount == 0 ) |
| return FALSE; |
| |
| if ( --lpMoveable->dwLockCount > 0 ) |
| return TRUE; |
| |
| return FALSE; |
| } |
| |
| DWORD IMM32_MoveableGetLockCount( IMM32_MOVEABLEMEM* lpMoveable ) |
| { |
| return lpMoveable->dwLockCount; |
| } |
| |
| DWORD IMM32_MoveableGetSize( IMM32_MOVEABLEMEM* lpMoveable ) |
| { |
| return lpMoveable->dwSize; |
| } |
| |
| |
| |
| /*********************************************************************** |
| * ImmCreateIMCC (IMM32.@) |
| * |
| * Create IMCC(IMC Component). |
| */ |
| HIMCC WINAPI ImmCreateIMCC(DWORD dwSize) |
| { |
| IMM32_MOVEABLEMEM* lpMoveable; |
| |
| TRACE("(%lu)\n", dwSize); |
| |
| lpMoveable = IMM32_MoveableAlloc( HEAP_ZERO_MEMORY, dwSize ); |
| if ( lpMoveable == NULL ) |
| { |
| SetLastError(ERROR_OUTOFMEMORY); |
| return (HIMCC)NULL; |
| } |
| |
| return (HIMCC)lpMoveable; |
| } |
| |
| /*********************************************************************** |
| * ImmDestroyIMCC (IMM32.@) |
| * |
| * Destroy IMCC(IMC Component). |
| */ |
| HIMCC WINAPI ImmDestroyIMCC(HIMCC hIMCC) |
| { |
| TRACE("(0x%08x)\n", (unsigned)hIMCC); |
| |
| IMM32_MoveableFree( (IMM32_MOVEABLEMEM*)hIMCC ); |
| return (HIMCC)NULL; |
| } |
| |
| /*********************************************************************** |
| * ImmLockIMCC (IMM32.@) |
| */ |
| LPVOID WINAPI ImmLockIMCC(HIMCC hIMCC) |
| { |
| TRACE("(0x%08x)\n", (unsigned)hIMCC); |
| |
| return IMM32_MoveableLock( (IMM32_MOVEABLEMEM*)hIMCC ); |
| } |
| |
| /*********************************************************************** |
| * ImmUnlockIMCC (IMM32.@) |
| */ |
| BOOL WINAPI ImmUnlockIMCC(HIMCC hIMCC) |
| { |
| TRACE("(0x%08x)\n", (unsigned)hIMCC); |
| |
| return IMM32_MoveableUnlock( (IMM32_MOVEABLEMEM*)hIMCC ); |
| } |
| |
| /*********************************************************************** |
| * ImmGetIMCCLockCount (IMM32.@) |
| */ |
| DWORD WINAPI ImmGetIMCCLockCount(HIMCC hIMCC) |
| { |
| TRACE("(0x%08x)\n", (unsigned)hIMCC); |
| |
| return IMM32_MoveableGetLockCount( (IMM32_MOVEABLEMEM*)hIMCC ); |
| } |
| |
| /*********************************************************************** |
| * ImmReSizeIMCC (IMM32.@) |
| */ |
| HIMCC WINAPI ImmReSizeIMCC(HIMCC hIMCC, DWORD dwSize) |
| { |
| TRACE("(0x%08x,%lu)\n", (unsigned)hIMCC, dwSize); |
| |
| if ( !IMM32_MoveableReAlloc( (IMM32_MOVEABLEMEM*)hIMCC, |
| HEAP_ZERO_MEMORY, dwSize ) ) |
| { |
| SetLastError(ERROR_OUTOFMEMORY); |
| return (HIMCC)NULL; |
| } |
| |
| return hIMCC; |
| } |
| |
| /*********************************************************************** |
| * ImmGetIMCCSize (IMM32.@) |
| */ |
| DWORD WINAPI ImmGetIMCCSize(HIMCC hIMCC) |
| { |
| TRACE("(0x%08x)\n", (unsigned)hIMCC); |
| |
| return IMM32_MoveableGetSize( (IMM32_MOVEABLEMEM*)hIMCC ); |
| } |
| |
| |