Exemple #1
0
        private void DispatchRequest(Request request, Action <Response, ResultCode> sendResponse)
        {
            if (request is GetAccountRequest)
            {
                var message = (GetAccountRequest)request;

                var command = new GetAccountCommand(message.Address, (acc, rc) => sendResponse(ResponseHelper.CreateGetAccountResponse(acc), rc));
                LiveService.AddCommand(command);
            }
            else if (request is GetTransactionsRequest)
            {
                var message = (GetTransactionsRequest)request;

                if (!RequestHelper.TryReadTransactionHashes(message, out var hashes))
                {
                    sendResponse.Call(ResponseHelper.CreateGetTransactionResponse(), ResultCode.InvalidInputParam);
                    return;
                }

                LiveService.AddCommand(new GetTransactionsCommand(hashes, sendResponse));
            }
            else if (request is SendTransactionRequest)
            {
                var message = (SendTransactionRequest)request;
                if (!RequestHelper.TryReadSignedTransaction(message, out var signed))
                {
                    sendResponse.Call(new SendTransactionResponse(), ResultCode.CannotReadSignedTransaction);
                    return;
                }

                LiveService.AddCommand(new SendTransactionCommand(signed, sendResponse));
            }
            else if (request is GetSignedLedgerRequest)
            {
                var message = (GetSignedLedgerRequest)request;

                if (message.Height < 0)
                {
                    sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(null), ResultCode.InvalidInputParam);
                    return;
                }

                var height = LedgerService.LedgerManager.GetSignedLedger().GetHeight();

                if (message.Height > height)
                {
                    sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(null), ResultCode.LedgerDoesnotExist);
                    return;
                }

                if (message.Height == height)
                {
                    var ledger = LedgerService.LedgerManager.GetSignedLedger();
                    var zipped = LedgerCompressionEngine.ZipSignedLedger(ledger);
                    sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(zipped), ResultCode.Success);
                    return;
                }

                var signed = DatabaseService.ReadDatabaseManager.GetRawLedger(message.Height);
                if (signed == null)
                {
                    sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(null), ResultCode.LedgerDoesnotExist);
                }

                sendResponse.Call(ResponseHelper.CreateGetSignedLedgerResponseFromZip(signed), ResultCode.Success);
            }
            else if (request is GetCurrentLedgerHeightRequest)
            {
                var height = LedgerService.LedgerManager.GetSignedLedger().GetHeight();
                sendResponse.Call(ResponseHelper.CreateGetCurrentLedgerHeightResponse(height), ResultCode.Success);
            }

            else
            {
                sendResponse.Call(new Response(), ResultCode.UnknownMessage);
            }
        }