You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
7.7 KiB
271 lines
7.7 KiB
//========= Copyright (C) Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Helper for UI components - used for binding to both Scaleform ActionScript and
|
|
// Panorama Javascript.
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#include "cbase.h"
|
|
#include "uicomponent_common.h"
|
|
|
|
#if defined ( USE_PANORAMA_BINDINGS )
|
|
static CPanoramaMarshallHelper g_PanoramaMarshallHelper;
|
|
CPanoramaMarshallHelper* GetPanoramaMarshallHelper( void )
|
|
{
|
|
return &g_PanoramaMarshallHelper;
|
|
}
|
|
|
|
SFVALUEARRAY CPanoramaMarshallHelper::Params_GetArgs( SFPARAMS params )
|
|
{
|
|
Assert( 0 ); // IMPLEMENT ME OR REFACTOR CALLING CODE
|
|
return SFVALUEARRAY();
|
|
}
|
|
|
|
unsigned int CPanoramaMarshallHelper::Params_GetNumArgs( SFPARAMS params )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
return args.Length();
|
|
}
|
|
|
|
bool CPanoramaMarshallHelper::Params_ArgIs( SFPARAMS params, unsigned int index, _ValueType v )
|
|
{
|
|
return ( Params_GetArgType( params, index ) == v );
|
|
}
|
|
|
|
SFVALUE CPanoramaMarshallHelper::Params_GetArg( SFPARAMS params, int index /*= 0 */ )
|
|
{
|
|
Assert( 0 ); // IMPLEMENT ME OR REFACTOR CALLING CODE
|
|
return NULL;
|
|
}
|
|
|
|
IUIMarshalHelper::_ValueType CPanoramaMarshallHelper::Params_GetArgType( SFPARAMS params, int index /*= 0 */ )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
if ( args[ index ]->IsBoolean() )
|
|
return VT_Boolean;
|
|
else if ( args[ index ]->IsNumber() )
|
|
return VT_Number;
|
|
else if ( args[ index ]->IsInt32() )
|
|
return VT_Int;
|
|
else if ( args[ index ]->IsUint32() )
|
|
return VT_UInt;
|
|
else if ( args[ index ]->IsString() )
|
|
return VT_String;
|
|
else if ( args[ index ]->IsUndefined() )
|
|
return VT_Undefined;
|
|
else if ( args[ index ]->IsNull() )
|
|
return VT_Null;
|
|
|
|
|
|
Assert( 0 );
|
|
return VT_Undefined;
|
|
}
|
|
|
|
double CPanoramaMarshallHelper::Params_GetArgAsNumber( SFPARAMS params, int index /*= 0 */ )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
Assert( args[ index ]->IsNumber() );
|
|
return args[ index ]->NumberValue();
|
|
}
|
|
|
|
bool CPanoramaMarshallHelper::Params_GetArgAsBool( SFPARAMS params, int index /*= 0 */ )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
Assert( args[ index ]->IsBoolean() );
|
|
return args[ index ]->BooleanValue();
|
|
}
|
|
|
|
const char* CPanoramaMarshallHelper::Params_GetArgAsString( SFPARAMS params, int index /*= 0 */ )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
m_vecStringStorage.EnsureCount( index + 1 );
|
|
Assert( args[ index ]->IsString() );
|
|
v8::String::Utf8Value str( args[ index ] );
|
|
m_vecStringStorage[ index ].Set( *str );
|
|
return m_vecStringStorage[ index ];
|
|
}
|
|
|
|
const wchar_t* CPanoramaMarshallHelper::Params_GetArgAsStringW( SFPARAMS params, int index /*= 0 */ )
|
|
{
|
|
Assert( 0 ); // IMPLEMENT ME OR REFACTOR CALLING CODE
|
|
return NULL;
|
|
}
|
|
|
|
void CPanoramaMarshallHelper::Params_DebugSpew( SFPARAMS params )
|
|
{
|
|
Assert( 0 );
|
|
}
|
|
|
|
void CPanoramaMarshallHelper::Params_SetResult( SFPARAMS params, SFVALUE value )
|
|
{
|
|
Assert( 0 );
|
|
}
|
|
|
|
void CPanoramaMarshallHelper::Params_SetResult( SFPARAMS params, int value )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
args.GetReturnValue().Set( v8::Integer::New( args.GetIsolate(), value ) );
|
|
}
|
|
|
|
void CPanoramaMarshallHelper::Params_SetResult( SFPARAMS params, float value )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
args.GetReturnValue().Set( v8::Number::New( args.GetIsolate(), value ) );
|
|
}
|
|
|
|
void CPanoramaMarshallHelper::Params_SetResult( SFPARAMS params, bool value )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
args.GetReturnValue().Set( v8::Boolean::New( args.GetIsolate(), value ) );
|
|
}
|
|
|
|
void CPanoramaMarshallHelper::Params_SetResult( SFPARAMS params, const char* value, bool bMakeNewValue /*=false*/ )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
args.GetReturnValue().Set( v8::String::NewFromOneByte( args.GetIsolate(), (uint8*)value ) );
|
|
}
|
|
|
|
void CPanoramaMarshallHelper::Params_SetResult( SFPARAMS params, const wchar_t* value, bool bMakeNewValue /*=false*/ )
|
|
{
|
|
const v8::FunctionCallbackInfo<v8::Value> &args = *reinterpret_cast< const v8::FunctionCallbackInfo<v8::Value> * >( params );
|
|
args.GetReturnValue().Set( v8::String::NewFromTwoByte( args.GetIsolate(), (uint16*)value ) );
|
|
}
|
|
|
|
SFVALUE CPanoramaMarshallHelper::Params_CreateNewObject( SFPARAMS params )
|
|
{
|
|
Assert( 0 );
|
|
return NULL;
|
|
}
|
|
|
|
SFVALUE CPanoramaMarshallHelper::Params_CreateNewString( SFPARAMS params, const char* value )
|
|
{
|
|
Assert( 0 );
|
|
return NULL;
|
|
}
|
|
|
|
SFVALUE CPanoramaMarshallHelper::Params_CreateNewString( SFPARAMS params, const wchar_t* value )
|
|
{
|
|
Assert( 0 );
|
|
return NULL;
|
|
}
|
|
|
|
SFVALUE CPanoramaMarshallHelper::Params_CreateNewArray( SFPARAMS params, int size /*= -1 */ )
|
|
{
|
|
Assert( 0 );
|
|
return NULL;
|
|
}
|
|
#endif // USE_PANORAMA_BINDINGS
|
|
|
|
// Using this from webapi_response to reuse some code.
|
|
extern void EmitJSONString( CUtlBuffer &outputBuffer, const char *pchValue );
|
|
|
|
// Convert keyvalues to a json object.
|
|
bool Helper_RecursiveKeyValuesToJSONString( const KeyValues* pKV, CUtlBuffer &outBuffer )
|
|
{
|
|
outBuffer.PutChar( '{' );
|
|
for ( KeyValues *dat = pKV->GetFirstSubKey(); dat != NULL; dat = dat->GetNextKey() )
|
|
{
|
|
if ( !dat->GetName() )
|
|
{
|
|
Assert( 0 ); // Unhandled
|
|
return false;
|
|
}
|
|
|
|
EmitJSONString( outBuffer, dat->GetName() );
|
|
outBuffer.PutChar( ':' );
|
|
|
|
if ( dat->GetFirstSubKey() )
|
|
{
|
|
Helper_RecursiveKeyValuesToJSONString( dat, outBuffer );
|
|
}
|
|
else
|
|
{
|
|
switch ( dat->GetDataType() )
|
|
{
|
|
case KeyValues::TYPE_NONE:
|
|
{
|
|
Helper_RecursiveKeyValuesToJSONString( dat, outBuffer );
|
|
break;
|
|
}
|
|
case KeyValues::TYPE_STRING:
|
|
{
|
|
if ( dat->GetString() )
|
|
EmitJSONString( outBuffer, dat->GetString() );
|
|
else
|
|
outBuffer.Put( "null", 4 );
|
|
|
|
break;
|
|
}
|
|
case KeyValues::TYPE_INT:
|
|
{
|
|
CNumStr numStr( dat->GetInt() );
|
|
outBuffer.Put( numStr.String(), Q_strlen( numStr.String() ) );
|
|
break;
|
|
}
|
|
|
|
case KeyValues::TYPE_UINT64:
|
|
{
|
|
CNumStr numStr( dat->GetUint64() );
|
|
outBuffer.Put( numStr.String(), Q_strlen( numStr.String() ) );
|
|
break;
|
|
}
|
|
|
|
case KeyValues::TYPE_FLOAT:
|
|
{
|
|
CNumStr numStr( dat->GetFloat() );
|
|
outBuffer.Put( numStr.String(), Q_strlen( numStr.String() ) );
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
Assert( 0 ); // Unhandled
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( dat->GetNextKey() )
|
|
{
|
|
outBuffer.PutChar( ',' );
|
|
}
|
|
}
|
|
outBuffer.PutChar( '}' );
|
|
return true;
|
|
}
|
|
|
|
void Helper_TrackedCachedGcValueAcrossRuns( ConVar &cv, int &nValue, bool bValueObtainedThisSession, RTime32 rtNow )
|
|
{
|
|
if ( !rtNow )
|
|
return;
|
|
|
|
bool bUpdateCachedValue = false;
|
|
RTime32 const rtCached = cv.GetInt();
|
|
|
|
if ( !bValueObtainedThisSession )
|
|
{
|
|
if ( ( int( rtCached - 24 * 3600 ) < int( rtNow ) ) &&
|
|
( int( rtNow - rtCached ) < 7 * 24 * 3600 ) )
|
|
{
|
|
nValue = rtCached & 0xFF; // Return a cached number
|
|
}
|
|
else
|
|
{
|
|
nValue = RandomInt( 4, 19 ); // Fake number of teammates to lure user
|
|
bUpdateCachedValue = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bUpdateCachedValue = true;
|
|
}
|
|
|
|
if ( bUpdateCachedValue )
|
|
{
|
|
rtNow &= ~0xFF; // vacate room for caching 0..255
|
|
rtNow |= nValue & 0xFF; // store the count in there too
|
|
if ( rtNow != rtCached )
|
|
cv.SetValue( int( rtNow ) );
|
|
}
|
|
}
|