virtual int32_t error(int32_t v) { m_pThis->m_stats->inc(PACKET_ERROR); if (is(send)) { exlib::string err = getResultMessage(v); m_error = v; m_msg->set_lastError(err); asyncLog(console_base::_ERROR, "WebSocketHandler: " + err); m_pThis->m_stats->dec(PACKET_PENDDING); set(on_error); return 0; } if (is(end)) m_pThis->m_stats->dec(PACKET_PENDDING); if (is(invoke)) { m_pThis->m_stats->inc(PACKET_TOTAL); m_pThis->m_stats->inc(PACKET_REQUEST); return done(CALL_RETURN_NULL); } return v; }
result_t AsyncCallBack::syncFunc(AsyncCallBack* pThis) { JSFiber::scope s; v8::Local<v8::Function> func = v8::Local<v8::Function>::New(pThis->m_isolate->m_isolate, pThis->m_cb); v8::Local<v8::Value> args[2]; if (pThis->m_v == CALL_RETURN_NULL) { args[0] = v8::Undefined(pThis->m_isolate->m_isolate); args[1] = v8::Null(pThis->m_isolate->m_isolate); } else if (pThis->m_v >= 0) { args[0] = v8::Undefined(pThis->m_isolate->m_isolate); args[1] = pThis->getValue(); } else { if (pThis->m_v == CALL_E_EXCEPTION) Runtime::setError(pThis->m_error); v8::Local<v8::Value> e = v8::Exception::Error( pThis->m_isolate->NewFromUtf8(getResultMessage(pThis->m_v))); e->ToObject()->Set(pThis->m_isolate->NewFromUtf8("number"), v8::Int32::New(pThis->m_isolate->m_isolate, -pThis->m_v)); args[0] = e; args[1] = v8::Undefined(pThis->m_isolate->m_isolate); } func->Call(v8::Undefined(pThis->m_isolate->m_isolate), 2, args); delete pThis; return 0; }
void GameSession::endGame(GameSessionEndReason reason, ChessGameResult result) { clockUpdateTimer_.stop(); // g_localChessGui.switchToCommandView(); // sessionInfo_.moves = game_.moves(); // if(reason==reasonGameFinished) { g_localChessGui.showSessionMessage(g_msg("GameFinished")); } // QString resultMsg = getResultMessage(reason, result); // game_.stop(result, resultMsg); // whitePlayer_->gameResult(result); blackPlayer_->gameResult(result); // disconnectPlayers(); disconnectGame(); // if(!resultMsg.isEmpty()) g_localChessGui.showSessionMessage(resultMsg); // emit end(reason, result, resultMsg); }
virtual int32_t error(int32_t v) { if (v == CALL_E_BAD_FILE || v == CALL_E_INVALID_CALL) return v; errorLog("TcpServer: " + getResultMessage(v)); return 0; }
v8::Local<v8::Value> ThrowResult(result_t hr) { Isolate &isolate = Isolate::now(); v8::Local<v8::Value> e = v8::Exception::Error( v8::String::NewFromUtf8(isolate.isolate, getResultMessage(hr).c_str())); e->ToObject()->Set(v8::String::NewFromUtf8(isolate.isolate, "number"), v8::Int32::New(isolate.isolate, -hr)); return isolate.isolate->ThrowException(e); }
v8::Local<v8::Value> ThrowResult(result_t hr) { Isolate* isolate = Isolate::current(); v8::Local<v8::Value> e = v8::Exception::Error( isolate->NewFromUtf8(getResultMessage(hr))); e->ToObject()->Set(isolate->NewFromUtf8("number"), v8::Int32::New(isolate->m_isolate, -hr)); return isolate->m_isolate->ThrowException(e); }
std::string GetException(TryCatch &try_catch, result_t hr) { if (try_catch.HasCaught()) { v8::String::Utf8Value exception(try_catch.Exception()); v8::Local<v8::Message> message = try_catch.Message(); if (message.IsEmpty()) return ToCString(exception); else { v8::Local<v8::Value> trace_value = try_catch.StackTrace(); if (!IsEmpty(trace_value)) { v8::String::Utf8Value stack_trace(trace_value); return ToCString(stack_trace); } std::string strError; v8::String::Utf8Value filename(message->GetScriptResourceName()); if (qstrcmp(ToCString(exception), "SyntaxError: ", 13)) { strError.append(ToCString(exception)); strError.append("\n at "); } else { strError.append((ToCString(exception) + 13)); strError.append("\n at "); } strError.append(ToCString(filename)); int lineNumber = message->GetLineNumber(); if (lineNumber > 0) { char numStr[32]; strError.append(1, ':'); sprintf(numStr, "%d", lineNumber); strError.append(numStr); strError.append(1, ':'); sprintf(numStr, "%d", message->GetStartColumn() + 1); strError.append(numStr); } return strError; } } else if (hr < 0) return getResultMessage(hr); return ""; }
virtual int error(int v) { m_pThis->m_stats->inc(PACKET_ERROR); if (is(send)) { m_pThis->m_stats->dec(PACKET_PENDDING); asyncLog(console_base::_ERROR, "PacketHandler: " + getResultMessage(v)); } if (is(end)) m_pThis->m_stats->dec(PACKET_PENDDING); if (is(invoke)) { m_pThis->m_stats->inc(PACKET_TOTAL); m_pThis->m_stats->inc(PACKET_REQUEST); } return done(CALL_RETURN_NULL); }
result_t JsonRpcHandler::invoke(object_base *v, obj_ptr<Handler_base> &retVal, exlib::AsyncEvent *ac) { if (ac) return CHECK_ERROR(CALL_E_NOASYNC); obj_ptr<Message_base> msg = Message_base::getInstance(v); if (msg == NULL) return CHECK_ERROR(CALL_E_BADVARTYPE); obj_ptr<HttpRequest_base> htreq = HttpRequest_base::getInstance(v); obj_ptr<SeekableStream_base> body; obj_ptr<Buffer_base> buf; v8::Local<v8::Value> jsval; v8::Local<v8::Object> o; Variant result; std::string str; int64_t len; int32_t sz, i; result_t hr; bool bFormReq = false; obj_ptr<List_base> params; if (htreq != NULL) { if (htreq->firstHeader("Content-Type", result) == CALL_RETURN_NULL) return CHECK_ERROR(Runtime::setError("jsonrpc: Content-Type is missing.")); str = result.string(); if (!qstricmp(str.c_str(), "application/x-www-form-urlencoded", 33)) { obj_ptr<HttpCollection_base> form; htreq->get_form(form); if (form->first("jsonrpc", result) == CALL_RETURN_NULL) return CHECK_ERROR(Runtime::setError("jsonrpc: Invalid form data.")); str = result.string(); bFormReq = true; } else if (qstricmp(str.c_str(), "application/json", 16)) return CHECK_ERROR(Runtime::setError("jsonrpc: Invalid Content-Type.")); } if (!bFormReq) { msg->get_body(body); body->size(len); sz = (int32_t) len; body->rewind(); hr = body->ac_read(sz, buf); if (hr < 0) return hr; if (hr == CALL_RETURN_NULL) return CHECK_ERROR(Runtime::setError("jsonrpc: request body is empty.")); body.Release(); buf->toString(str); buf.Release(); } hr = encoding_base::jsonDecode(str.c_str(), jsval); if (hr < 0) return hr; if (!jsval->IsObject()) return CHECK_ERROR(Runtime::setError("jsonrpc: Invalid rpc request.")); o = v8::Local<v8::Object>::Cast(jsval); jsval = o->Get(v8::String::NewFromUtf8(isolate, "method", v8::String::kNormalString, 6)); if (IsEmpty(jsval)) return CHECK_ERROR(Runtime::setError("jsonrpc: method is missing.")); msg->get_value(str); str += '/'; str.append(*v8::String::Utf8Value(jsval)); msg->set_value(str.c_str()); jsval = o->Get(v8::String::NewFromUtf8(isolate, "params", v8::String::kNormalString, 6)); if (!jsval.IsEmpty() && jsval->IsArray()) { v8::Local<v8::Array> jsparams = v8::Local<v8::Array>::Cast(jsval); sz = jsparams->Length(); msg->get_params(params); params->resize(sz); for (i = 0; i < sz; i++) params->_indexed_setter(i, jsparams->Get(i)); } obj_ptr<Handler_base> hdlr1; hr = JSHandler::js_invoke(m_handler, v, hdlr1, NULL); if (hr >= 0 && hr != CALL_RETURN_NULL) hr = mq_base::ac_invoke(hdlr1, v); v8::Local<v8::String> strId = v8::String::NewFromUtf8(isolate, "id", v8::String::kNormalString, 2); jsval = o->Get(strId); o = v8::Object::New(isolate); o->Set(strId, jsval); if (hr < 0) { asyncLog(console_base::_ERROR, "JsonRpcHandler: " + getResultMessage(hr)); result_t hr1 = encoding_base::jsonEncode(o, str); if (hr1 < 0) return hr1; if (str.length() <= 2) str.assign("{", 1); else { str.resize(str.length() - 1); str += ','; } if (hr == CALL_E_INVALID_CALL) str.append( "\"error\": {\"code\": -32601, \"message\": \"Method not found.\"}}"); else str.append( "\"error\": {\"code\": -32603, \"message\": \"Internal error.\"}}"); } else { msg->get_result(result); o->Set(v8::String::NewFromUtf8(isolate, "result", v8::String::kNormalString, 6), result); hr = encoding_base::jsonEncode(o, str); if (hr < 0) return hr; } body = new MemoryStream(); if (bFormReq) { std::string strTemp; strTemp.assign( "<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><script>window.name=\"", 94); encoding_base::jsstr(str.c_str(), str); strTemp.append(str); strTemp.append("\";</script></html>", 18); str = strTemp; } buf = new Buffer(str); hr = body->ac_write(buf); if (hr < 0) return hr; obj_ptr<Message_base> rep; hr = msg->get_response(rep); if (hr < 0) return hr; rep->set_body(body); if (htreq) ((HttpMessage_base *)(Message_base *)rep)->setHeader("Content-Type", bFormReq ? "text/html" : "application/json"); return CALL_RETURN_NULL; }
virtual int error(int v) { asyncLog(console_base::_ERROR, "TcpServer: " + getResultMessage(v)); set(close); return 0; }
virtual int32_t error(int32_t v) { asyncLog(console_base::_ERROR, "TcpServer: " + getResultMessage(v)); return v; }
virtual int32_t error(int32_t v) { errorLog("TcpServer: " + getResultMessage(v)); set(close); return 0; }
result_t JsonRpcHandler::invoke(object_base *v, obj_ptr<Handler_base> &retVal, AsyncEvent *ac) { if (ac) return CHECK_ERROR(CALL_E_NOASYNC); obj_ptr<Message_base> msg = Message_base::getInstance(v); if (msg == NULL) return CHECK_ERROR(CALL_E_BADVARTYPE); Isolate* isolate = holder(); obj_ptr<HttpRequest_base> htreq = HttpRequest_base::getInstance(v); obj_ptr<SeekableStream_base> body; obj_ptr<Buffer_base> buf; v8::Local<v8::Value> jsval; v8::Local<v8::Object> o; Variant result; exlib::string str; int64_t len; int32_t sz, i; result_t hr; obj_ptr<List_base> params; if (htreq != NULL) { if (htreq->firstHeader("Content-Type", result) == CALL_RETURN_NULL) return CHECK_ERROR(Runtime::setError("jsonrpc: Content-Type is missing.")); str = result.string(); if (qstricmp(str.c_str(), "application/json", 16)) return CHECK_ERROR(Runtime::setError("jsonrpc: Invalid Content-Type.")); } msg->get_body(body); body->size(len); sz = (int32_t) len; body->rewind(); hr = body->ac_read(sz, buf); if (hr < 0) return hr; if (hr == CALL_RETURN_NULL) return CHECK_ERROR(Runtime::setError("jsonrpc: request body is empty.")); body.Release(); buf->toString(str); buf.Release(); hr = json_base::decode(str, jsval); if (hr < 0) return hr; if (!jsval->IsObject()) return CHECK_ERROR(Runtime::setError("jsonrpc: Invalid rpc request.")); o = v8::Local<v8::Object>::Cast(jsval); jsval = o->Get(isolate->NewFromUtf8("method", 6)); if (IsEmpty(jsval)) return CHECK_ERROR(Runtime::setError("jsonrpc: method is missing.")); msg->get_value(str); str += '/'; str.append(*v8::String::Utf8Value(jsval)); msg->set_value(str); jsval = o->Get(isolate->NewFromUtf8("params", 6)); if (!jsval.IsEmpty() && jsval->IsArray()) { v8::Local<v8::Array> jsparams = v8::Local<v8::Array>::Cast(jsval); sz = jsparams->Length(); msg->get_params(params); params->resize(sz); for (i = 0; i < sz; i++) params->_indexed_setter(i, jsparams->Get(i)); } obj_ptr<Handler_base> hdlr1; hr = JSHandler::js_invoke(m_handler, v, hdlr1, NULL); if (hr >= 0 && hr != CALL_RETURN_NULL) hr = mq_base::ac_invoke(hdlr1, v); v8::Local<v8::String> strId = isolate->NewFromUtf8("id", 2); jsval = o->Get(strId); o = v8::Object::New(isolate->m_isolate); o->Set(strId, jsval); if (hr < 0) { errorLog("JsonRpcHandler: " + getResultMessage(hr)); result_t hr1 = json_base::encode(o, str); if (hr1 < 0) return hr1; if (str.length() <= 2) str.assign("{", 1); else { str.resize(str.length() - 1); str += ','; } if (hr == CALL_E_INVALID_CALL) str.append( "\"error\": {\"code\": -32601, \"message\": \"Method not found.\"}}"); else str.append( "\"error\": {\"code\": -32603, \"message\": \"Internal error.\"}}"); } else { msg->get_result(result); o->Set(isolate->NewFromUtf8("result", 6), result); hr = json_base::encode(o, str); if (hr < 0) return hr; } body = new MemoryStream(); buf = new Buffer(str); hr = body->ac_write(buf); if (hr < 0) return hr; obj_ptr<Message_base> rep; hr = msg->get_response(rep); if (hr < 0) return hr; rep->set_body(body); if (htreq) ((HttpMessage_base *)(Message_base *)rep)->setHeader( "Content-Type", "application/json"); return CALL_RETURN_NULL; }