diff options
Diffstat (limited to 'p11p-daemon/src/p11p_remote.erl')
-rw-r--r-- | p11p-daemon/src/p11p_remote.erl | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/p11p-daemon/src/p11p_remote.erl b/p11p-daemon/src/p11p_remote.erl index 784f938..c91f47c 100644 --- a/p11p-daemon/src/p11p_remote.erl +++ b/p11p-daemon/src/p11p_remote.erl @@ -14,7 +14,9 @@ %% API. -export([start_link/3]). --export([send/3]). +-export([request/3, add_to_outbuf/2]). + +-include("p11p_rpc.hrl"). %% Genserver callbacks. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, @@ -25,7 +27,8 @@ port :: port(), replyto :: pid() | undefined, timer :: reference() | undefined, - token :: string() + token :: string(), % Name + outbuf = <<>> :: binary() }). %% FIXME: move to config @@ -37,9 +40,12 @@ start_link(ServName, TokName, ModPath) -> lager:info("~p: p11p_remote starting for ~s", [ServName, ModPath]), gen_server:start_link({local, ServName}, ?MODULE, [TokName, ModPath], []). --spec send(pid(), pid(), binary()) -> ok. -send(From, Remote, Data) -> - gen_server:cast(Remote, {send, From, Data}). +-spec request(pid(), pid(), p11rpc_msg()) -> ok. +request(From, Remote, Request) -> + gen_server:cast(Remote, {request, From, Request}). + +add_to_outbuf(Remote, Data) -> + gen_server:cast(Remote, {add_to_outbuf, Data}). %% Genserver callbacks. init([TokName, ModPath]) -> @@ -52,36 +58,26 @@ handle_call(Request, _From, State) -> lager:debug("~p: Unhandled call: ~p~n", [self(), Request]), {reply, unhandled, State}. -handle_cast({send, From, Data}, #state{port = Port} = State) -> +handle_cast({add_to_outbuf, Data}, State) -> + {noreply, do_add_to_outbuf(Data, State)}; +handle_cast({request, From, Request}, #state{port = Port} = State) -> lager:debug("~p: sending request to remote ~p", [self(), Port]), - port_command(Port, Data), - Timer = erlang:start_timer(3000, self(), Port), - NewState = State#state{replyto = From, timer = Timer}, - {noreply, NewState}; + NewState = do_add_to_outbuf(p11p_rpc:serialise(Request), State), + NewState2 = do_send(NewState), + Timer = erlang:start_timer(3000, self(), Port), % Keep below gen_server:call timeout (default 5000). + NewState3 = NewState2#state{replyto = From, timer = Timer}, + {noreply, NewState3}; handle_cast(Request, State) -> lager:debug("~p: Unhandled cast: ~p~n", [self(), Request]), {noreply, State}. -handle_info({Port, {data, Data}}, #state{replyto = Pid, timer = Timer} = State) -> - if - Port == State#state.port -> - erlang:cancel_timer(Timer, [{async, true}, {info, false}]), - p11p_server:reply(Pid, Data); - true -> - lager:debug("~p: data from unknown port ~p", [self(), Port]) - end, +handle_info({Port, {data, Data}}, #state{replyto = Pid, timer = Timer} = State) when Port == State#state.port -> + erlang:cancel_timer(Timer, [{async, true}, {info, false}]), + p11p_server:reply(Pid, Data), {noreply, State}; -handle_info({timeout, Timer, Port}, #state{token = TokName} = State) -> - NewState = - if - Port == State#state.port andalso Timer == State#state.timer -> - p11p_remote_manager:timeout(TokName), - State#state{timer = undefined}; - true -> - lager:debug("~p: unknown timer ~p fired for port ~p", - [self(), Timer, Port]), - State - end, +handle_info({timeout, Timer, Port}, #state{token = TokName} = State) when Port == State#state.port andalso Timer == State#state.timer -> + p11p_remote_manager:timeout(TokName), + NewState = State#state{timer = undefined}, {noreply, NewState}; handle_info(Info, State) -> lager:debug("~p: Unhandled info: ~p~n", [self(), Info]), @@ -92,3 +88,14 @@ terminate(_Reason, _State) -> code_change(_OldVersion, State, _Extra) -> {ok, State}. + +%% Private +do_add_to_outbuf(Data, #state{outbuf = Buf} = State) -> + lager:debug("~p: adding ~B octets to outbuf", [self(), size(Data)]), + NewBuf = <<Buf/binary, Data/binary>>, + State#state{outbuf = NewBuf}. + +do_send(#state{port = Port, outbuf = Buf} = State) -> + lager:debug("~p: sending ~B octets to remote", [self(), size(Buf)]), + port_command(Port, Buf), + State#state{outbuf = <<>>}. |