void VJSGlobalClass::do_ProgressIndicator(VJSParms_callStaticFunction& ioParms, VJSGlobalObject *inContext) { VString sessiontile; VString windowtile, userinfo; bool caninterrupt = false; Real maxvalue = -1; VError err = VE_OK; if (ioParms.IsNumberParam(1)) ioParms.GetRealParam(1, &maxvalue); else err = vThrowError(VE_JVSC_WRONG_PARAMETER_TYPE_NUMBER, "1"); if (err == VE_OK ) { if (ioParms.IsStringParam(2)) ioParms.GetStringParam(2, sessiontile); else err = vThrowError(VE_JVSC_WRONG_PARAMETER_TYPE_STRING, "2"); } caninterrupt = ioParms.GetBoolParam( 3, L"Can Interrupt", "Cannot Interrupt"); //VProgressIndicator* progress = inContext->GetRuntimeDelegate()->CreateProgressIndicator( windowtile); if (err == VE_OK) { VProgressIndicator* progress = new VProgressIndicator(); if (progress != NULL) { if (ioParms.CountParams() >= 4) { if (ioParms.IsStringParam(4)) { ioParms.GetStringParam(4, windowtile); progress->SetTitle(windowtile); } else vThrowError(VE_JVSC_WRONG_PARAMETER_TYPE_STRING, "4"); } if (ioParms.CountParams() >= 5) { if (ioParms.IsStringParam(5)) { ioParms.GetStringParam(5, userinfo); progress->SetUserInfo(userinfo); } else vThrowError(VE_JVSC_WRONG_PARAMETER_TYPE_STRING, "5"); } progress->BeginSession((sLONG8)maxvalue, sessiontile, caninterrupt); } ioParms.ReturnValue(VJSProgressIndicator::CreateInstance(ioParms.GetContextRef(), progress)); ReleaseRefCountable( &progress); } else ioParms.ReturnNullValue(); }
void VJSStream::_PutReal(VJSParms_callStaticFunction& ioParms, VStream* inStream) { Real r = 0; if (ioParms.IsNumberParam(1)) { ioParms.GetRealParam(1, &r); VError err = inStream->PutReal(r); } else vThrowError(VE_JVSC_WRONG_PARAMETER_TYPE_NUMBER, "1"); }
void VJSTimer::_SetTimer (VJSParms_callStaticFunction &ioParms, VJSWorker *inWorker, bool inIsInterval) { xbox_assert(inWorker != NULL); if (!ioParms.CountParams()) return; XBOX::VJSContext context(ioParms.GetContext()); XBOX::VJSObject functionObject(context); ioParms.GetParamObject(1, functionObject); if (!functionObject.IsFunction()) return; functionObject.Protect(); Real duration; duration = 0.0; if (ioParms.CountParams() >= 2) { if (ioParms.IsNumberParam(2)) { if (!ioParms.GetRealParam(2, &duration)) duration = 0.0; } else { // According to specification, if timeout is an object, call its toString() method if any. // Then apply ToNumber() on the string to obtain duration. XBOX::VJSObject timeOutObject(context); if (ioParms.GetParamObject(2, timeOutObject)) { timeOutObject.SetContext(context); if (timeOutObject.HasProperty("toString")) { XBOX::VJSObject toStringObject = timeOutObject.GetPropertyAsObject("toString"); if (toStringObject.IsFunction()) { std::vector<XBOX::VJSValue> values; XBOX::VJSValue string(context); toStringObject.SetContext(context); timeOutObject.CallFunction(toStringObject, &values, &string, NULL); if (string.IsString()) { // If Number() is called as a function (and not as a constructor), it acts as ToNumber(). // See section 15.7.1 of ECMA-262 specification. XBOX::VJSObject toNumberObject = context.GetGlobalObject().GetPropertyAsObject("Number"); if (toNumberObject.IsFunction()) { XBOX::VJSValue number(context); values.clear(); values.push_back(string); toNumberObject.SetContext(context); context.GetGlobalObject().CallFunction(toNumberObject, &values, &number, NULL); if (number.IsNumber() && !number.GetReal(&duration)) duration = 0.0; } } } } } } // (value != value) is true if value is a NaN. if (duration < 0.0 || duration > XBOX::kMAX_Real || duration != duration) duration = 0.0; } std::vector<XBOX::VJSValue> *arguments; arguments = new std::vector<XBOX::VJSValue>; for (sLONG i = 3; i <= ioParms.CountParams(); i++) arguments->push_back(ioParms.GetParamValue(i)); sLONG period, id; VJSTimer *timer; period = (sLONG) duration; if (inIsInterval) { if (period < VJSTimer::kMinimumInterval) period = VJSTimer::kMinimumInterval; } else { if (period < VJSTimer::kMinimumTimeout) period = VJSTimer::kMinimumTimeout; } timer = new VJSTimer(functionObject, inIsInterval ? period : VJSTimer::kTimeOut); if ((id = inWorker->GetTimerContext()->InsertTimer(timer)) < 0) { // Too many timers (should never happen). Silently ignore. // Returned ID (-1) isn't valid and a clear on it, will do nothing. timer->Release(); delete arguments; } else { XBOX::VTime triggerTime; triggerTime.FromSystemTime(); triggerTime.AddMilliseconds(period); inWorker->QueueEvent(VJSTimerEvent::Create(timer, triggerTime, arguments)); } ioParms.ReturnNumber(id); }