summaryrefslogtreecommitdiff
path: root/p11p-daemon/src/p11p_remote.erl
diff options
context:
space:
mode:
Diffstat (limited to 'p11p-daemon/src/p11p_remote.erl')
-rw-r--r--p11p-daemon/src/p11p_remote.erl26
1 files changed, 20 insertions, 6 deletions
diff --git a/p11p-daemon/src/p11p_remote.erl b/p11p-daemon/src/p11p_remote.erl
index c91f47c..3790971 100644
--- a/p11p-daemon/src/p11p_remote.erl
+++ b/p11p-daemon/src/p11p_remote.erl
@@ -28,7 +28,8 @@
replyto :: pid() | undefined,
timer :: reference() | undefined,
token :: string(), % Name
- outbuf = <<>> :: binary()
+ outbuf = <<>> :: binary(),
+ msg :: p11rpc:msg() | undefined
}).
%% FIXME: move to config
@@ -71,11 +72,14 @@ 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) 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) when Port == State#state.port andalso Timer == State#state.timer ->
+%% TODO: dedup code w/ p11p_server
+handle_info({Port, {data, Data}}, #state{replyto = Pid} = State) when Port == State#state.port, State#state.msg == undefined ->
+ Version = hd(Data), % First octet is version.
+ p11p_server:add_to_clientbuf(Pid, <<Version>>),
+ {noreply, handle_remote_data(State, p11p_rpc:new(), tl(Data))};
+handle_info({Port, {data, Data}}, #state{msg = Msg} = State) when Port == State#state.port ->
+ {noreply, handle_remote_data(State, Msg, Data)};
+handle_info({timeout, Timer, Port}, #state{token = TokName} = State) when Port == State#state.port, Timer == State#state.timer ->
p11p_remote_manager:timeout(TokName),
NewState = State#state{timer = undefined},
{noreply, NewState};
@@ -99,3 +103,13 @@ 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 = <<>>}.
+
+handle_remote_data(#state{replyto = Pid, timer = Timer} = State, Msg, Data) ->
+ case p11p_rpc:parse(Msg, list_to_binary(Data)) of
+ {done, NewMsg} ->
+ erlang:cancel_timer(Timer, [{async, true}, {info, false}]),
+ ok = p11p_server:reply(Pid, NewMsg),
+ State#state{msg = p11p_rpc:new(NewMsg#p11rpc_msg.buffer)};
+ {needmore, NewMsg} ->
+ State#state{msg = NewMsg}
+ end.