From e0ebfade97302b880a18ff268f284f345ac82ff5 Mon Sep 17 00:00:00 2001 From: Craig Everett Date: Tue, 19 May 2026 18:15:25 +0900 Subject: [PATCH] WIP: Need to switch to wxAcceleratorTable --- src/gd_con.erl | 22 ++--- src/gd_gui.erl | 44 ++++++--- src/gd_n_recvr.erl | 16 +++- src/gd_n_rider.erl | 89 +++++++++++++++---- ...d_v_doomweaver.erl => gd_v_fateweaver.erl} | 2 +- 5 files changed, 128 insertions(+), 45 deletions(-) rename src/{gd_v_doomweaver.erl => gd_v_fateweaver.erl} (99%) diff --git a/src/gd_con.erl b/src/gd_con.erl index 93a319d..eef0a57 100644 --- a/src/gd_con.erl +++ b/src/gd_con.erl @@ -55,7 +55,7 @@ -type state() :: #s{}. -type ui_name() :: gd_v_netman | gd_v_wallman - | gd_v_doomweaver + | gd_v_fateweaver | gd_v_express. @@ -248,8 +248,8 @@ open_contract(ConID) -> when ConID :: string(), DevmanToFront :: boolean(). %% @doc -%% Ask the controller to tell the doomweaver interface to open a deployed contract. -%% The controller will start the doomweaver if it isn't already on. +%% Ask the controller to tell the fateweaver interface to open a deployed contract. +%% The controller will start the fateweaver if it isn't already on. open_contract(ConID, DevmanToFront) when is_binary(ConID) -> gd_server:cast(?MODULE, {open_contract, ConID, DevmanToFront}); @@ -272,9 +272,9 @@ show_call(ConID, Info) -> Info :: map(), DevmanToFront :: boolean(). %% @doc -%% Ask the controller to tell the doomweaver interface to dislpay the result of a call +%% Ask the controller to tell the fateweaver interface to dislpay the result of a call %% to the indicated contract. Opens the contract in question if it isn't alread open. -%% Starts the doomweaver if it isn't already running. +%% Starts the fateweaver if it isn't already running. show_call(ConID, Info, DevmanToFront) when is_binary(ConID) -> gd_server:cast(?MODULE, {show_call, ConID, Info, DevmanToFront}); @@ -661,7 +661,7 @@ task_data(gd_v_netman, #s{wallet = none}) -> []; task_data(gd_v_wallman, #s{wallets = Wallets}) -> Wallets; -task_data(gd_v_doomweaver, #s{}) -> +task_data(gd_v_fateweaver, #s{}) -> []; task_data(gd_v_express, State) -> {ok, Selected, Keys} = do_list_keys(State), @@ -1075,15 +1075,15 @@ do_drop_key(ID, State = #s{wallet = W, wallets = Wallets, pass = Pass}) -> do_open_contract(ConID, ToFront, State) -> - NewState = do_show_ui(gd_v_doomweaver, ToFront, State), - ok = gd_v_doomweaver:open_contract(ConID), + NewState = do_show_ui(gd_v_fateweaver, ToFront, State), + ok = gd_v_fateweaver:open_contract(ConID), NewState. do_show_call(ConID, Info, ToFront, State) -> - NewState = do_show_ui(gd_v_doomweaver, ToFront, State), - ok = gd_v_doomweaver:open_contract(ConID), - ok = gd_v_doomweaver:call_result(ConID, Info), + NewState = do_show_ui(gd_v_fateweaver, ToFront, State), + ok = gd_v_fateweaver:open_contract(ConID), + ok = gd_v_fateweaver:call_result(ConID, Info), NewState. diff --git a/src/gd_gui.erl b/src/gd_gui.erl index b5985fb..f91274b 100644 --- a/src/gd_gui.erl +++ b/src/gd_gui.erl @@ -291,7 +291,7 @@ handle_event(#wx{event = #wxCommand{type = command_button_clicked}, case lists:keyfind(ID, #w.id, Buttons) of #w{name = wallet} -> wallman(State); #w{name = chain} -> netman(State); - #w{name = dev} -> doomweaver(State); + #w{name = dev} -> fateweaver(State); #w{name = node} -> set_node(State); #w{name = make_key} -> make_key(State); #w{name = recover} -> recover_key(State); @@ -312,13 +312,15 @@ handle_event(#wx{event = #wxCommand{type = command_listbox_selected, State) -> NewState = do_selection(Selected, State), {noreply, NewState}; -handle_event(#wx{event = #wxKey{keyCode = Code}}, State) -> +handle_event(#wx{event = Event = #wxKey{keyCode = Code}}, State = #s{frame = Frame}) -> NewState = case Code of - 69 -> express(State); - 70 -> doomweaver(State); + 69 -> express(State); % 'E' + 70 -> fateweaver(State); % 'F' _ -> - ok = io:format("Code: ~p~n", [Code]), + ok = tell(info, "Code: ~p", [Code]), + ok = tell(info, "Frame ID: ~p", [wxFrame:getId(Frame)]), + ok = tell(info, "Event: ~p", [Event]), State end, {noreply, NewState}; @@ -377,10 +379,10 @@ netman(State) -> State. -doomweaver(State = #s{accounts = []}) -> +fateweaver(State = #s{accounts = []}) -> State; -doomweaver(State) -> - ok = gd_con:show_ui(gd_v_doomweaver), +fateweaver(State) -> + ok = gd_con:show_ui(gd_v_fateweaver), State. @@ -392,6 +394,7 @@ express(State) -> set_node(State = #s{frame = Frame, j = J}) -> + true = wxFrame:disconnect(Frame, char_hook), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Set Node")), Sizer = wxBoxSizer:new(?wxVERTICAL), @@ -443,6 +446,7 @@ set_node(State = #s{frame = Frame, j = J}) -> ok end, ok = wxDialog:destroy(Dialog), + ok = wxFrame:connect(Frame, char_hook), State. add_node2(Address, PortCtrls) -> @@ -475,6 +479,7 @@ s_to_i(S) -> make_key(State = #s{frame = Frame, j = J}) -> + true = wxFrame:disconnect(Frame, char_hook), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("New Key")), Sizer = wxBoxSizer:new(?wxVERTICAL), @@ -544,10 +549,12 @@ make_key(State = #s{frame = Frame, j = J}) -> ok end, ok = wxDialog:destroy(Dialog), + ok = wxFrame:connect(Frame, char_hook), State. recover_key(State = #s{frame = Frame, j = J}) -> + true = wxFrame:disconnect(Frame, char_hook), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Mnemonic")), Sizer = wxBoxSizer:new(?wxVERTICAL), MnemSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Recovery Phrase")}]), @@ -573,6 +580,7 @@ recover_key(State = #s{frame = Frame, j = J}) -> ok end, ok = wxDialog:destroy(Dialog), + ok = wxFrame:connect(Frame, char_hook), State. @@ -585,6 +593,7 @@ show_mnemonic(State = #s{picker = Picker}) -> end. show_mnemonic(Selected, State = #s{frame = Frame, j = J, accounts = Accounts}) -> + true = wxFrame:disconnect(Frame, char_hook), #poa{id = ID} = lists:nth(Selected, Accounts), {ok, Mnemonic} = gd_con:mnemonic(ID), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Mnemonic")), @@ -610,6 +619,7 @@ show_mnemonic(Selected, State = #s{frame = Frame, j = J, accounts = Accounts}) - ?wxID_OK -> gd_lib:copy_to_clipboard(Mnemonic) end, ok = wxDialog:destroy(Dialog), + ok = wxFrame:connect(Frame, char_hook), State. @@ -644,6 +654,7 @@ drop_key(State = #s{picker = Picker}) -> end. drop_key(Selected, State = #s{frame = Frame, j = J, accounts = Accounts, prefs = Prefs}) -> + true = wxFrame:disconnect(Frame, char_hook), #poa{id = ID, name = Name} = lists:nth(Selected, Accounts), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("New Key"), [{size, {500, 150}}]), Sizer = wxBoxSizer:new(?wxVERTICAL), @@ -672,6 +683,7 @@ drop_key(Selected, State = #s{frame = Frame, j = J, accounts = Accounts, prefs = Prefs end, ok = wxDialog:destroy(Dialog), + ok = wxFrame:connect(Frame, char_hook), State#s{prefs = NewPrefs}. @@ -841,6 +853,7 @@ do_chain(ChainID, #node{ip = IP}, #s{buttons = Buttons}) -> do_ask_password(#s{frame = Frame, prefs = Prefs, j = J}) -> + true = wxFrame:disconnect(Frame, char_hook), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Password")), Sizer = wxBoxSizer:new(?wxVERTICAL), Label = J("Password (leave blank for no password)"), @@ -872,7 +885,8 @@ do_ask_password(#s{frame = Frame, prefs = Prefs, j = J}) -> ?wxID_CANCEL -> gd_con:open_wallet(Path, none) end, - wxDialog:destroy(Dialog). + ok = wxDialog:destroy(Dialog), + wxFrame:connect(Frame, char_hook). do_grids_mess_sig(_, #s{accounts = []}) -> ok; @@ -901,6 +915,7 @@ do_grids_mess_sig2(Request = #{"grids" := 1, "public_id" := ID, "payload" := Message}, #s{frame = Frame, j = J}) -> + true = wxFrame:disconnect(Frame, char_hook), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Message Signature Request")), Sizer = wxBoxSizer:new(?wxVERTICAL), Instruction = @@ -936,13 +951,15 @@ do_grids_mess_sig2(Request = #{"grids" := 1, ?wxID_OK -> gd_con:sign_mess(Request); ?wxID_CANCEL -> ok end, - wxDialog:destroy(Dialog); + ok = wxDialog:destroy(Dialog), + wxFrame:connect(Frame, char_hook); do_grids_mess_sig2(Request = #{"grids" := 1, "type" := "binary", "url" := URL, "public_id" := ID, "payload" := Base64}, #s{frame = Frame, j = J}) -> + true = wxFrame:disconnect(Frame, char_hook), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Binary Data Signature Request")), Sizer = wxBoxSizer:new(?wxVERTICAL), Instruction = @@ -978,7 +995,8 @@ do_grids_mess_sig2(Request = #{"grids" := 1, ?wxID_OK -> gd_con:sign_binary(Request); ?wxID_CANCEL -> ok end, - wxDialog:destroy(Dialog); + ok = wxDialog:destroy(Dialog), + wxFrame:connect(Frame, char_hook); do_grids_mess_sig2(Request = #{"grids" := 1, "type" := "tx", "url" := URL, @@ -987,6 +1005,7 @@ do_grids_mess_sig2(Request = #{"grids" := 1, "public_id" := ID, "payload" := CallData}, #s{frame = Frame, j = J}) -> + true = wxFrame:disconnect(Frame, char_hook), Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Message Signature Request")), Sizer = wxBoxSizer:new(?wxVERTICAL), @@ -1034,6 +1053,7 @@ do_grids_mess_sig2(Request = #{"grids" := 1, ?wxID_OK -> gd_con:sign_tx(Request); ?wxID_CANCEL -> ok end, - wxDialog:destroy(Dialog); + ok = wxDialog:destroy(Dialog), + wxFrame:connect(Frame, char_hook); do_grids_mess_sig2(BadRequest, _) -> tell("Bad request: ~tp", [BadRequest]). diff --git a/src/gd_n_recvr.erl b/src/gd_n_recvr.erl index d13e202..3195a1c 100644 --- a/src/gd_n_recvr.erl +++ b/src/gd_n_recvr.erl @@ -37,11 +37,13 @@ fetch(Rider, Parcel) -> init(ID, Host = {Addr, Port}) -> ok = tell(info, "Addr: ~p, Port: ~p", [Addr, Port]), Options = [{mode, binary}, {active, once}, {packet, 4}, {keepalive, true}], + State = #s{id = ID, host = Host}, case gen_tcp:connect(Addr, Port, Options, 5000) of {ok, Socket} -> ok = tell(info, "Socket: ~p", [Socket]), + NextState = State#s{socket = Socket}, ok = gen_tcp:send(Socket, <<"GajuExpress 1 RECVR">>), - authenticate(#s{host = Host, socket = Socket}); + authenticate(NextState); Error -> ok = tell(warning, "Failed to connect to ~p with ~p", [Host, Error]), retire(State, normal) @@ -92,13 +94,13 @@ get_list(State = #s{socket = Socket}) -> ok = inet:setopts(Socket, [{active, once}]), receive {tcp, Socket, Binary} -> - read_manifest(State, Binary); + read_manifest(State, Binary) after 5000 -> ok = tell(info, "Timed out on get_list/1"), retire(State, normal) end. -read_manifest(State = #s{id = ID}, Binary) -> +read_manifest(State, Binary) -> case zx_lib:b_to_ts(Binary) of {ok, {pending, Manifest}} -> ok = gd_v_express:pending(Manifest), @@ -119,6 +121,7 @@ loop(State = #s{socket = Socket}) -> ok = tell(info, "Got: ~tp", [Message]), loop(State); {fetch, ParcelID} -> + ok = do_fetch(State, ParcelID), loop(State); {tcp_closed, Socket} -> retire(State, normal); @@ -128,10 +131,15 @@ loop(State = #s{socket = Socket}) -> end. +do_fetch(State, ParcelID) -> + tell(info, "Wood B Fetching! State: ~p ParcelID: ~p", [State, ParcelID]), + ok. + + retire(#s{socket = none}, Reason) -> gd_v_express ! {retiring, self(), Reason}, exit(Reason); -retire(#s{socket = Socket} Reason) -> +retire(#s{socket = Socket}, Reason) -> ok = zx_net:disconnect(Socket), gd_v_express ! {retiring, self(), Reason}, exit(Reason). diff --git a/src/gd_n_rider.erl b/src/gd_n_rider.erl index 07ac364..2c5fd54 100644 --- a/src/gd_n_rider.erl +++ b/src/gd_n_rider.erl @@ -16,7 +16,7 @@ -copyright("QPQ AG "). -license("GPL-3.0-or-later"). --export([stuff/1, check/2]). +-export([quote/2, tx/2]). -export([init/1, stop/1]). -include("$zx_include/zx_logger.hrl"). @@ -25,14 +25,19 @@ socket = none :: none | gen_tcp:socket()}). -stuff(Rider) -> - Rider ! {self(), host}, - receive {host, Stuff} -> Stuff end. +quote(Rider, MochilaSize) -> + Ref = make_ref(), + Rider ! {Ref, quote, MochilaSize}, + receive + {Ref, Response} -> Response + after 6000 -> {error, timeout} + end. -check(Rider, ID) -> - Rider ! {check, ID}, - ok. +tx(Rider, MochilaPath) -> + Ref = make_ref(), + Rider ! {Ref, tx, MochilaPath}, + receive {Ref, Response} -> Response end. stop(Rider) -> @@ -43,31 +48,81 @@ stop(Rider) -> init(Host = {Addr, Port}) -> ok = tell(info, "Addr: ~p, Port: ~p", [Addr, Port]), Options = [{mode, binary}, {active, once}, {packet, 4}, {keepalive, true}], + State = #s{host = Host}, case gen_tcp:connect(Addr, Port, Options, 5000) of {ok, Socket} -> - ok = tell(info, "Socket: ~p", [Socket]), - loop(#s{host = Host, socket = Socket}); + NextState = State#s{socket = Socket}, + ok = send(NextState, <<"GajuExpress 1 RIDER">>), + loop(NextState); Error -> ok = tell(warning, "Failed to connect to ~p with ~p", [Host, Error]), - retire(normal) + retire(State, normal) end. loop(State = #s{socket = Socket}) -> ok = inet:setopts(Socket, [{active, once}]), receive - {tcp, Socket, Message} -> - ok = tell(info, "Got: ~tp", [Message]), + {tcp, Socket, Binary} -> + ok = handle(State, Binary), loop(State); - {check, ID} -> - ok = gen_tcp:send(Socket, <<"GajuExpress 1 RECVR">>), + {tcp_closed, Socket} -> + retire(State, normal); + {Ref, quote, Mochila} -> + Response = do_quote(State, Mochila), + gd_v_express ! {Ref, Response}, loop(State); retire -> - ok = gen_tcp:send(<<"bye">>), - retire(normal) + retire(State, normal) end. -retire(Reason) -> +handle(State = #s{socket = Socket}, Binary) -> + case zx_lib:b_to_ts(Binary) of + {ok, ping} -> + Pong = term_to_binary(pong), + send(Socket, Pong); + Error -> + ok = tell(info, "Received weird message: ~p", [Error]), + retire(State, normal) + end. + + +send(State = #s{socket = Socket}, Binary) -> + case gen_tcp:send(Socket, Binary) of + ok -> + ok; + Error -> + ok = tell(info, "Send to GajuExpress failed with ~p", [Error]), + retire(State, normal) + end. + + +do_quote(State = #s{socket = Socket}, MochilaSize) -> + Request = term_to_binary({quote, MochilaSize}), + ok = send(State, Request), + receive + {tcp, Socket, Binary} -> + read_quote(State, Binary) + after 5000 -> + retire(State, normal), + {error, timeout} + end. + +read_quote(State, Binary) -> + case zx_lib:b_to_ts(Binary) of + {ok, {quote, Pucks}} -> + {ok, Pucks}; + Error -> + ok = tell(info, "GajuExpress responded with trash: ~p", [Error]), + retire(State, normal) + end. + + +retire(#s{socket = none}, Reason) -> + gd_v_express ! {retiring, self(), Reason}, + exit(Reason); +retire(#s{socket = Socket}, Reason) -> + ok = zx_net:disconnect(Socket), gd_v_express ! {retiring, self(), Reason}, exit(Reason). diff --git a/src/gd_v_doomweaver.erl b/src/gd_v_fateweaver.erl similarity index 99% rename from src/gd_v_doomweaver.erl rename to src/gd_v_fateweaver.erl index 779f737..4a52da7 100644 --- a/src/gd_v_doomweaver.erl +++ b/src/gd_v_fateweaver.erl @@ -1,4 +1,4 @@ --module(gd_v_doomweaver). +-module(gd_v_fateweaver). -vsn("0.10.0"). -author("Craig Everett "). -copyright("QPQ AG ").