Counter Strike : Global Offensive Source Code
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

//========= 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 ) );
}
}