/****************************************************************
Copyright © 2003-2011, Intel Corporation. All rights reserved.
*****************************************************************/
#include "MessageTable.h"
#include "StringUtils.h"
#include <iostream>
#include <string>
#include <sstream>

using namespace std;
using namespace MessageTable;

HMODULE  _hModule;

#ifdef _MANAGED
#pragma managed(push, off)
#endif

#define DEFAULT_LANG 0x409

BOOL APIENTRY DllMain( HANDLE hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved
					  )
{
	_hModule = (HMODULE)hModule;
	return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif


wstring MessageTable::GetSCSMessageEx( unsigned int errCode,unsigned int paramNumber,...)

{
	va_list argList;
	va_start( argList, paramNumber );
	wstring message;
	GetSCSMessage(errCode,message,paramNumber,argList);
	va_end( argList );
	return message;
}



wstring MessageTable::GetSCSMessage(unsigned int errCode, unsigned int paramNumber,va_list argList)
{
	wstring message;
	GetSCSMessage(errCode,message,paramNumber,argList);
	return message;
}
bool MessageTable::GetSCSMessage(unsigned int errCode, wstring& message,unsigned int paramNumber, va_list argList)
{	
	HLOCAL msg;
	DWORD ret;
	LANGID lang = GetUserDefaultLangID();
	try
	{
#ifdef _DEBUG
	#ifdef RCS
		const TCHAR* dll = L"RCSServerD.exe";
	#else // RCS
		const TCHAR* dll = L"ACUD.dll";
	#endif // RCS
#else //_DEBUG
	#ifdef RCS
		const TCHAR* dll = L"RCSServer.exe";
	#else // RCS
		const TCHAR* dll = L"ACU.dll";
	#endif // RCS
#endif // _DEBUG
		_hModule = GetModuleHandle(dll);
		ret =::FormatMessage(
			FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_IGNORE_INSERTS,
			_hModule,
			errCode,
			lang,
			(LPTSTR) &msg,
			0,
			&argList );

		// if there is not string for the OS language format get English(US) string
		if ((0 == ret)&& (DEFAULT_LANG !=lang))
		{
+++			lang = DEFAULT_LANG;
			ret =::FormatMessage(
			FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_IGNORE_INSERTS,
			_hModule,
			errCode,
---			DEFAULT_LANG,
+++			lang,
			(LPTSTR) &msg,
			0,
			&argList );
		}
		if ( 0 != ret )
		{
			unsigned int count = 0 ;
			message = StrUtl::cleanNonPrintable((LPTSTR)msg);
			if (paramNumber>0)
			{
				wstring::const_iterator iter;
				for (iter = message.begin();iter!=message.end();iter++)
				{

					wchar_t xx = *iter;
					if (xx ==L'%')
						count++;
				}
			}
			if ((count == paramNumber) && (count >0))
			{

				::LocalFree( msg );
				ret =::FormatMessage(
					FORMAT_MESSAGE_ALLOCATE_BUFFER |
					FORMAT_MESSAGE_FROM_HMODULE,
					_hModule,
					errCode,
---					GetUserDefaultLangID(),
+++					lang,
					(LPTSTR) &msg,
					0,
					&argList );
				if ( 0 != ret )
				{
					message = StrUtl::cleanNonPrintable((LPTSTR)msg);
				}
			}
			else if (count != paramNumber)
			{
				wstringstream tmp;
				wstring messNumber;
				tmp << (errCode & 0xFFFF);
				tmp >> messNumber;
				message = L"SCS Code: " + message +L"("+ messNumber + L"). Bad Format String. ";
			}
		}
		else
		{
			wstringstream tmp;
			tmp << (errCode & 0xFFFF);
			message = tmp.str();
		}
		::LocalFree( msg );
	}
	catch (...)
	{
		return false;
	}
	return (0 != ret);
}



