129 lines
3.6 KiB
C++
129 lines
3.6 KiB
C++
/**********************************************************************
|
|
|
|
Filename : FxGameDelegate.cpp
|
|
Content : Communication logic for CLIK GameDelegate
|
|
Created :
|
|
Authors : Prasad Silva
|
|
|
|
Copyright : (c) 2005-2009 Scaleform Corp. All Rights Reserved.
|
|
|
|
This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
|
|
THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR ANY PURPOSE.
|
|
|
|
**********************************************************************/
|
|
|
|
#include "FxGameDelegate.h"
|
|
|
|
//
|
|
// Visitor to register callbacks
|
|
//
|
|
class AddCallbackVisitor : public FxDelegateHandler::CallbackProcessor
|
|
{
|
|
public:
|
|
AddCallbackVisitor(FxDelegateHandler* pthis, FxDelegate::CallbackHash* phash)
|
|
: pThis(pthis), pHash(phash) {}
|
|
|
|
void Process(const GString& methodName, FxDelegateHandler::CallbackFn method)
|
|
{
|
|
FxDelegate::CallbackDefn cbt;
|
|
cbt.pThis = pThis;
|
|
cbt.pCallback = method;
|
|
pHash->Add(methodName, cbt);
|
|
}
|
|
|
|
private:
|
|
FxDelegateHandler* pThis;
|
|
FxDelegate::CallbackHash* pHash;
|
|
};
|
|
|
|
|
|
//
|
|
// Visitor to unregister callbacks
|
|
//
|
|
class RemoveCallbackVisitor : public FxDelegateHandler::CallbackProcessor
|
|
{
|
|
public:
|
|
RemoveCallbackVisitor(FxDelegateHandler* pthis, FxDelegate::CallbackHash* phash)
|
|
: pThis(pthis), pHash(phash) {}
|
|
|
|
void Process(const GString& methodName, FxDelegateHandler::CallbackFn method)
|
|
{
|
|
GUNUSED(method);
|
|
pHash->Remove(methodName);
|
|
}
|
|
|
|
private:
|
|
FxDelegateHandler* pThis;
|
|
FxDelegate::CallbackHash* pHash;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
FxDelegate::FxDelegate()
|
|
{
|
|
|
|
}
|
|
|
|
void FxDelegate::RegisterHandler(FxDelegateHandler* callback)
|
|
{
|
|
AddCallbackVisitor reg(callback, &Callbacks);
|
|
callback->Accept(®);
|
|
}
|
|
|
|
void FxDelegate::UnregisterHandler(FxDelegateHandler* callback)
|
|
{
|
|
RemoveCallbackVisitor reg(callback, &Callbacks);
|
|
callback->Accept(®);
|
|
}
|
|
|
|
void FxDelegate::Invoke(GFxMovieView* pmovieView, const char* methodName,
|
|
FxResponseArgsBase& args)
|
|
{
|
|
GFxValue* pv = NULL;
|
|
UInt nv = args.GetValues(&pv);
|
|
pv[0] = methodName;
|
|
pmovieView->Invoke("call", pv, nv);
|
|
}
|
|
void FxDelegate::Invoke2(GFxMovieView* pmovieView, const char* methodName,
|
|
FxResponseArgsBase& args)
|
|
{
|
|
GFxValue* pv = NULL;
|
|
UInt nv = args.GetValues(&pv);
|
|
pmovieView->Invoke(methodName, NULL, pv+1, nv-1);
|
|
}
|
|
|
|
void FxDelegate::Callback(GFxMovieView* pmovieView, const char* methodName, const GFxValue* args, UInt argCount)
|
|
{
|
|
// KevinJ: With calling ExternalInterface from flash, this is apparently obsolete now
|
|
// GASSERT(argCount > 0); // Must at least have a uid parameter
|
|
|
|
CallbackDefn* pcb = Callbacks.GetAlt(methodName);
|
|
if (pcb != NULL)
|
|
{
|
|
// KevinJ: With calling ExternalInterface from flash, this is apparently obsolete now
|
|
// FxDelegateArgs params(args[0],
|
|
// pcb->pThis,
|
|
// pmovieView,
|
|
// &args[1],
|
|
// argCount - 1);
|
|
FxDelegateArgs params(GFxValue(),
|
|
pcb->pThis,
|
|
pmovieView,
|
|
argCount>=1 ? &args[0] : NULL,
|
|
argCount);
|
|
pcb->pCallback(params);
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
void FxDelegateArgs::Respond(FxResponseArgsBase& params) const
|
|
{
|
|
GFxValue* pv = NULL;
|
|
UInt nv = params.GetValues(&pv);
|
|
pv[0] = ResponseID;
|
|
pMovieView->Invoke("respond", pv, nv);
|
|
}
|