-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}.