Beispiel #1
0
        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;
        }
Beispiel #2
0
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;
}
Beispiel #3
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);
}
Beispiel #4
0
        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;
        }
Beispiel #5
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);
}
Beispiel #6
0
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);
}
Beispiel #7
0
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 "";
}
Beispiel #8
0
        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);
        }
Beispiel #9
0
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;
}
Beispiel #10
0
 virtual int error(int v)
 {
     asyncLog(console_base::_ERROR, "TcpServer: " + getResultMessage(v));
     set(close);
     return 0;
 }
Beispiel #11
0
 virtual int32_t error(int32_t v)
 {
     asyncLog(console_base::_ERROR, "TcpServer: " + getResultMessage(v));
     return v;
 }
Beispiel #12
0
 virtual int32_t error(int32_t v)
 {
     errorLog("TcpServer: " + getResultMessage(v));
     set(close);
     return 0;
 }
Beispiel #13
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;
}