-module(interface_server2).
-behaviour(gen_server).
-compile(export_all).
-record(interface_state, {port, lsock, buffer}).
process_data([13,10], State) ->
exec_call(State),
New_state = State#interface_state{buffer = []},
New_state;
process_data(RawData, State) ->
Buffer = State#interface_state.buffer,
New_state = State#interface_state{buffer = Buffer ++ RawData},
New_state.
args_to_terms(RawArgs) ->
{ok, Toks, _Line} = erl_scan:string("[" ++ RawArgs ++ "]. ", 1),
{ok, Args} = erl_parse:parse_term(Toks),
Args.
exec_call(State) ->
Socket = State#interface_state.lsock,
Buffer = State#interface_state.buffer,
{match, [XMod, XFun, XArgs]} = re:run(Buffer, "^([^\s]+):([^\s]+)\\(\s*(.*)\s*\\)$", [{capture, [1, 2, 3], list}]),
Mod = list_to_atom(XMod),
Fun = list_to_atom(XFun),
Args = args_to_terms(XArgs),
io:format("~p:~p~w~n", [Mod, Fun, Args]),
Result = apply(Mod, Fun, Args),
gen_tcp:send(Socket, io_lib:fwrite("~p~n", [Result])),
io:format("~w~n", [Result]).
start_link(Port) -> gen_server:start_link({local, ?MODULE}, ?MODULE, [Port], []).
init([Port]) ->
{ok, LSock} = gen_tcp:listen(Port, [{active, true}]),
{ok, #interface_state{port = Port, lsock = LSock, buffer=[]}, 0}.
handle_info({tcp, _Socket, RawData}, State) ->
New_state = process_data(RawData, State),
{noreply, New_state};
handle_info(timeout, #interface_state{lsock = LSock} = State) ->
{ok, _Sock} = gen_tcp:accept(LSock),
{noreply, State}.
handle_cast(stop, State) -> {stop, normal, State}.
%handle_call(_Request, _From, State) -> {reply, Reply, State}.
%handle_cast(_Msg, State) -> {noreply, State}.
%handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.