From 1c1ca74237bee683cf05eff54ee844156ad5e905 Mon Sep 17 00:00:00 2001 From: David Reiss Date: Tue, 10 Jun 2008 22:57:21 +0000 Subject: [PATCH] Make processor use a service definition and handler to determine types git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@666376 13f79535-47bb-0310-9956-ffa450edef68 --- lib/alterl/src/test_handler.erl | 7 +++ lib/alterl/src/test_service.erl | 10 ++++ lib/alterl/src/thrift_processor.erl | 74 +++++++++++++++++++---------- lib/alterl/src/thrift_server.erl | 6 +-- lib/alterl/src/thrift_service.erl | 2 +- 5 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 lib/alterl/src/test_handler.erl create mode 100644 lib/alterl/src/test_service.erl diff --git a/lib/alterl/src/test_handler.erl b/lib/alterl/src/test_handler.erl new file mode 100644 index 00000000..a0aa2a55 --- /dev/null +++ b/lib/alterl/src/test_handler.erl @@ -0,0 +1,7 @@ +-module(test_handler). + +-export([handle_function/2]). + +handle_function(add, Params = {A, B}) -> + io:format("Got params: ~p~n", [Params]), + {reply, A + B}. diff --git a/lib/alterl/src/test_service.erl b/lib/alterl/src/test_service.erl new file mode 100644 index 00000000..b7f00d9f --- /dev/null +++ b/lib/alterl/src/test_service.erl @@ -0,0 +1,10 @@ +-module(test_service). +% +% Test service definition + +-export([function_info/2]). + +function_info(add, params_type) -> + {struct, [{1, i32}, + {2, i32}]}; +function_info(add, reply_type) -> i32. diff --git a/lib/alterl/src/thrift_processor.erl b/lib/alterl/src/thrift_processor.erl index fd6972db..546bcfe2 100644 --- a/lib/alterl/src/thrift_processor.erl +++ b/lib/alterl/src/thrift_processor.erl @@ -36,35 +36,57 @@ loop(State = #state{in_protocol = IProto, ok end. -handle_function(State = #state{in_protocol = IProto, - out_protocol = OProto}, - add) -> - io:format("Reading struct~n"), - {ok, Struct} = thrift_protocol:read(IProto, - {struct, [{1, i32}, - {2, i32}]}), - io:format("Struct: ~p~n", [Struct]), +%handle_function(State = #state{in_protocol = IProto, +% out_protocol = OProto}, +% add) -> +% io:format("Reading struct~n"), +% {ok, Struct} = thrift_protocol:read(IProto, +% {struct, [{1, i32}, +% {2, i32}]}), +% io:format("Struct: ~p~n", [Struct]), - {A, B} = Struct, +% {A, B} = Struct, - thrift_protocol:write(OProto, #protocol_message_begin{ - name = "addResult", - type = ?tMessageType_REPLY, - seqid = 0}), - thrift_protocol:write(OProto, {{struct, [{0, i32}]}, - {A + B}}), - thrift_protocol:write(OProto, message_end); +% thrift_protocol:write(OProto, #protocol_message_begin{ +% name = "addResult", +% type = ?tMessageType_REPLY, +% seqid = 0}), +% thrift_protocol:write(OProto, {{struct, [{0, i32}]}, +% {A + B}}), +% thrift_protocol:write(OProto, message_end); -handle_function(State = #state{in_protocol = IProto, - out_protocol = OProto}, - complexTest) -> - io:format("Reading struct~n"), - Struct = thrift_protocol:read( - IProto, - {struct, [{1, {struct, - [{1, {list, i32}}, - {2, {map, string, {struct, [{1, i16}]}}}]}}]}), +%handle_function(State = #state{in_protocol = IProto, +% out_protocol = OProto}, +% complexTest) -> +% io:format("Reading struct~n"), +% Struct = thrift_protocol:read( +% IProto, +% {struct, [{1, {struct, +% [{1, {list, i32}}, +% {2, {map, string, {struct, [{1, i16}]}}}]}}]}), - io:format("Struct: ~p~n", [Struct]). +% io:format("Struct: ~p~n", [Struct]); + +handle_function(State = #state{in_protocol = IProto, + out_protocol = OProto, + handler = Handler, + service = Service}, + Function) -> + InParams = Service:function_info(Function, params_type), + {ok, Params} = thrift_protocol:read(IProto, InParams), + Result = Handler:handle_function(Function, Params), + + ReplyType = Service:function_info(Function, reply_type), + + case Result of + {reply, Reply} -> + thrift_protocol:write(OProto, #protocol_message_begin{ + name = atom_to_list(Function) ++ "_result", + type = ?tMessageType_REPLY, + seqid = 0}), + thrift_protocol:write(OProto, {{struct, [{0, ReplyType}]}, {Reply}}), + thrift_protocol:write(OProto, message_end) + end, + ok. diff --git a/lib/alterl/src/thrift_server.erl b/lib/alterl/src/thrift_server.erl index fd559f1d..5760e1cf 100644 --- a/lib/alterl/src/thrift_server.erl +++ b/lib/alterl/src/thrift_server.erl @@ -19,7 +19,6 @@ -define(SERVER, ?MODULE). -record(state, {listen_socket, acceptor, service}). --record(handler, {module}). %%==================================================================== %% API @@ -42,8 +41,7 @@ start_link(Port, Service, HandlerModule) when is_integer(Port), is_atom(HandlerM %% {stop, Reason} %% Description: Initiates the server %%-------------------------------------------------------------------- -init({Port, Service, HandlerModule}) -> - Handler = #handler{module = HandlerModule}, +init({Port, Service, Handler}) -> {ok, Socket} = gen_tcp:listen(Port, [binary, {packet, 0}, @@ -109,7 +107,7 @@ code_change(_OldVsn, State, _Extra) -> %%-------------------------------------------------------------------- acceptor(ListenSocket, Service, Handler) - when is_port(ListenSocket), is_record(Handler, handler) -> + when is_port(ListenSocket), is_atom(Handler) -> {ok, Socket} = gen_tcp:accept(ListenSocket), error_logger:info_msg("Accepted client"), diff --git a/lib/alterl/src/thrift_service.erl b/lib/alterl/src/thrift_service.erl index 89479c8d..1ecfb9da 100644 --- a/lib/alterl/src/thrift_service.erl +++ b/lib/alterl/src/thrift_service.erl @@ -3,4 +3,4 @@ -export([behaviour_info/1]). behaviour_info(callbacks) -> - [{service_info, 1}]. + [{function_info, 2}]. -- 2.17.1