#include <string.h>

#include "Desk.MsgTrans.h"
#include "Desk.Module.h"
#include "Desk.Error2.h"
#include "Desk.Debug.h"

#ifdef MemCheck_MEMCHECK
	#include "MemCheck.MemCheck.h"
#endif
/*
We do the removal of MemCheck calls by hand to allow compilation without
the MemCheck header file.
 */


static void	Desk_MessageTrans__FreeRMABlock( Desk_msgtrans_rmafiledesc* filedesc)
	{
	#ifdef MemCheck_MEMCHECK
		MemCheck_UnRegisterMiscBlock( filedesc->desc);
		MemCheck_UnRegisterMiscBlock( filedesc->filename);
	#endif
	if ( filedesc->desc)		Desk_Module_Free( filedesc->desc);
	filedesc->desc	= NULL;
	
	if ( filedesc->filename)	Desk_Module_Free( filedesc->filename);
	filedesc->filename	= NULL;
	}


void	Desk_MessageTrans_OpenFileRMA( Desk_msgtrans_rmafiledesc* filedesc, const char* filename)
	{
	Desk_Debug_Assert( filedesc);
	Desk_Debug_Assert( filename);
	
	filedesc->filename	= NULL;
	filedesc->desc		= NULL;
	
	Desk_Error2_Try	{
		Desk_Module_Claim( 16, (void**) &filedesc->desc);
		Desk_Module_Claim( 1 + strlen( filename), (void**) &filedesc->filename);
		#ifdef MemCheck_MEMCHECK
			MemCheck_RegisterMiscBlock( filedesc->filename, 1 + strlen( filename));
			MemCheck_RegisterMiscBlock( filedesc->desc, 16);
		#endif
		strcpy( filedesc->filename, filename);
		Desk_MessageTrans_OpenFile( filedesc->desc, filedesc->filename, NULL);
		}
	Desk_Error2_Catch	{
		Desk_MessageTrans__FreeRMABlock( filedesc);
		Desk_Error2_ReThrow();
		}
	Desk_Error2_EndCatch
	}


void	Desk_MessageTrans_CloseFileRMA( Desk_msgtrans_rmafiledesc* filedesc)
	{
	Desk_error2_block*	e = NULL;
	
	Desk_Debug_Assert( filedesc);
	
	Desk_Error2_TryCatch(
		Desk_MessageTrans_CloseFile( filedesc->desc);
		,
		e = &Desk_Error2_globalblock;
		)
		
	Desk_MessageTrans__FreeRMABlock( filedesc);
	
	if ( e)	Desk_Error2_Handle( e);
	}

