| /* |
| * This file implements 'moveable' memory block. |
| * |
| * Copyright 2000 Hidenori Takeshima |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| #include "config.h" |
| |
| #include "winbase.h" |
| #include "windef.h" |
| #include "wingdi.h" |
| #include "winuser.h" |
| #include "winerror.h" |
| #include "immddk.h" |
| #include "wine/debug.h" |
| WINE_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\n" ); |
| } |
| 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 ); |
| } |
| |
| |