Module name:		Shard Script
Short name:			SSS
Associated modules:	None
Requires:			Naming Service

Description
-----------

Todo
----


****************************************************************************************************
* The following block is a possible better implementation of the core of the script system
****************************************************************************************************


#if 0
//-------------------------------------------------------------------------------------------------
// class IScriptLine
//-------------------------------------------------------------------------------------------------

class IScriptLine: public NLMISC::CRefCount
{
public:
	virtual ~IScriptLine() {}
	virtual void execute()=0;
};
typedef NLMISC::CSmartPtr<IScriptLine> TScriptLinePtr;


//-------------------------------------------------------------------------------------------------
// class CScriptLineCmd
//-------------------------------------------------------------------------------------------------

class CScriptLineCmd: public IScriptLine
{
private:
	CScriptLineCmd(uint32 delay,const NLMISC::CSString& service,const NLMISC::CSString& cmdLine);
public:
	static CScriptLineCmd* buildNew(const NLMISC::CSString& txt);
	virtual void execute();
private:
	uint32 _Delay;
	NLMISC::CSString _Service;
	NLMISC::CSString _CmdLine;
};

CScriptLineCmd::CScriptLineCmd(uint32 delay,const NLMISC::CSString& service,const NLMISC::CSString& cmdLine)
{
	_Delay= delay;
	_Service= service;
	_CmdLine= cmdLine;
}

CScriptLineCmd* CScriptLineCmd::buildNew(const NLMISC::CSString& txt)
{
	todo(" convert command line to components");
	return new CScriptLineCmd(0,txt,txt);
}

void CScriptLineCmd::execute()
{
	CCommandExecutor::getInstance()->addCommand(_Delay,_Service,_CmdLine);
}


//-------------------------------------------------------------------------------------------------
// class CScriptLineSetVar
//-------------------------------------------------------------------------------------------------

class CScriptLineSetVar: public IScriptLine
{
private:
	CScriptLineSetVar(const NLMISC::CSString& keyVarName,const NLMISC::CSString& keyValue,const NLMISC::CSString& targetVarName);
public:
	static CScriptLineSetVar* buildNew(const NLMISC::CSString& txt);
	virtual void execute();
private:
	NLMISC::CSString _KeyVarName;
	NLMISC::CSString _KeyValue;
	NLMISC::CSString _TargetVarName;
};

CScriptLineSetVar::CScriptLineSetVar(const NLMISC::CSString& keyVarName,const NLMISC::CSString& keyValue,const NLMISC::CSString& targetVarName)
{
	_KeyVarName= keyVarName;
	_KeyValue= keyValue;
	_TargetVarName= targetVarName;
}

CScriptLineSetVar* CScriptLineSetVar::buildNew(const NLMISC::CSString& txt)
{
	todo("split up the call into its components");
	return new CScriptLineSetVar(txt,txt,txt);
}

void CScriptLineSetVar::execute()
{
	todo("...todo...");
}


//-------------------------------------------------------------------------------------------------
// class CScriptLineCall
//-------------------------------------------------------------------------------------------------

class CScriptLineCall: public IScriptLine
{
private:
	CScriptLineCall(const NLMISC::CSString& scriptName);
public:
	static CScriptLineCall* buildNew(const NLMISC::CSString& txt);
	virtual void execute();
private:
	NLMISC::CSString _ScriptName;
};

CScriptLineCall::CScriptLineCall(const NLMISC::CSString& scriptName)
{
	_ScriptName= scriptName;
}

CScriptLineCall* CScriptLineCall::buildNew(const NLMISC::CSString& txt)
{
	if (txt.countWords()!=1)
	{
		nlwarning("the following is not a valid routine name: %s",txt.c_str());
		return NULL;
	}
	return new CScriptLineCall(txt);
}

void CScriptLineCall::execute()
{
	CScriptManager::getInstance()->runScript(_ScriptName);
}


//-------------------------------------------------------------------------------------------------
// IScriptLine factory: buildScriptLine()
//-------------------------------------------------------------------------------------------------

static TScriptLinePtr buildScriptLine(const NLMISC::CSString& txt)
{
	NLMISC::CSString keyword= txt.firstWordConst().strip();
	NLMISC::CSString rawArgs= txt.tailFromFirstWord().strip();

	if (keyword=="cmd")		return CScriptLineCmd::buildNew(rawArgs);
	if (keyword=="setVar")	return CScriptLineSetVar::buildNew(rawArgs);
	if (keyword=="runScript")	return CScriptLineCall::buildNew(rawArgs);

	return NULL;
}
#endif
