/*
 *	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 );
}


