diff --git a/src/dbus_introspect.erl b/src/dbus_introspect.erl index 3a03863..6ad887e 100644 --- a/src/dbus_introspect.erl +++ b/src/dbus_introspect.erl @@ -167,17 +167,17 @@ to_xmerl(#dbus_node{}=Elem) -> [{name, Name}] end, to_xmerl(Elem#dbus_node.elements) ++ - to_xmerl(Elem#dbus_node.interfaces) + to_xmerl(gb_trees:to_list(Elem#dbus_node.interfaces)) }; -to_xmerl(#dbus_iface{}=Elem) -> +to_xmerl({_, #dbus_iface{}=Elem}) -> {interface, [{name, to_binary(Elem#dbus_iface.name)}], - to_xmerl(Elem#dbus_iface.methods) ++ - to_xmerl(Elem#dbus_iface.signals) ++ + to_xmerl(gb_trees:to_list(Elem#dbus_iface.methods)) ++ + to_xmerl(gb_trees:to_list(Elem#dbus_iface.signals)) ++ to_xmerl(Elem#dbus_iface.properties)}; -to_xmerl(#dbus_method{}=Elem) -> +to_xmerl({_ , #dbus_method{}=Elem}) -> Result = case Elem#dbus_method.result of none -> @@ -196,7 +196,8 @@ to_xmerl(#dbus_method{}=Elem) -> end, to_xmerl(Elem#dbus_method.args) ++ Result}; -to_xmerl(#dbus_signal{}=Elem) -> +to_xmerl({_, #dbus_signal{}=Elem}) -> + ?info("singal: ~p~n", [Elem#dbus_signal.name]), Result = case Elem#dbus_signal.result of none -> @@ -207,7 +208,7 @@ to_xmerl(#dbus_signal{}=Elem) -> [to_xmerl(Arg)] end, {signal, - case list_to_binary(Elem#dbus_signal.name) of + case to_binary(Elem#dbus_signal.name) of undefined -> []; Name -> diff --git a/src/dbus_message.erl b/src/dbus_message.erl index 46d8202..e5e5471 100644 --- a/src/dbus_message.erl +++ b/src/dbus_message.erl @@ -105,18 +105,23 @@ signal(Destination, Path, Interface, #dbus_signal{name=SigName, out_sig=_Signature, out_types=Types}, Args, Opts) when is_list(Args) -> {Body, _Pos} = dbus_marshaller:marshal_list(Types, Args), - Fields = [ + Fields = destination(Destination, [ {?FIELD_PATH, #dbus_variant{type=object_path, value=Path}}, {?FIELD_INTERFACE, #dbus_variant{type=string, value=Interface}}, {?FIELD_MEMBER, #dbus_variant{type=string, value=SigName}}, - {?FIELD_SIGNATURE, #dbus_variant{type=signature, value=dbus_marshaller:marshal_signature(Types)}}, - {?FIELD_DESTINATION, #dbus_variant{type=string, value=Destination}} - ], + {?FIELD_SIGNATURE, #dbus_variant{ + type=signature, value=dbus_marshaller:marshal_signature(Types) + } + }]), Header = #dbus_header{type=?TYPE_SIGNAL, flags=process_flags(Opts), fields=Fields}, {ok, #dbus_message{header=Header, body=Body}}. +destination(undefined, Fields) -> + Fields; +destination(Destination, Fields) -> + Fields ++ [{?FIELD_DESTINATION, #dbus_variant{type=string, value=Destination}}]. %% @doc Build an error message %% @end @@ -134,6 +139,7 @@ error(#dbus_message{}=Orig, ErrName, ErrText) -> ], Header = #dbus_header{type=?TYPE_ERROR, fields=Fields}, + #dbus_message{header=Header, body=Body}. @@ -154,7 +160,6 @@ return(#dbus_message{}=Orig, Types, Body) when is_list(Types) -> Header = #dbus_header{type=?TYPE_METHOD_RETURN, fields=Fields}, #dbus_message{header=Header, body=BinBody}. - %% @doc Get serial number from message %% @end -spec get_serial(dbus_message()) -> integer(). diff --git a/src/gen_dbus.erl b/src/gen_dbus.erl index 6b29732..aadc579 100644 --- a/src/gen_dbus.erl +++ b/src/gen_dbus.erl @@ -18,9 +18,6 @@ signal/3 ]). -%% behaviour callback --export([behaviour_info/1]). - %% gen_server callback2 -export([ init/1, @@ -31,11 +28,8 @@ terminate/2 ]). -behaviour_info(callbacks) -> - [ - {init, 1}, - {handle_info, 2} - ]. +-callback init(tuple()) -> atom(). +-callback handle_info(tuple()) -> atom(). -record(state, { service, @@ -67,7 +61,7 @@ signal(Signal, Args, Options) -> %% gen_server callbacks %% init([Module, Args]) -> - case Module:init(Args) of + case erlang:apply(Module, init, [Args]) of {stop, Reason} -> {stop, Reason}; ignore -> @@ -116,12 +110,13 @@ setup(DBus_config, State) -> {Iface, Interfaces} = lists:foldl(Fun, {undefined, dict:new()}, DBus_config), + Node = #dbus_node{name=State1#state.path, - interfaces=lists:map(fun({Key, {Methods, Signals}}) -> - #dbus_iface{name=Key, - methods=Methods, - signals=Signals} - end, dict:to_list(Interfaces))}, + interfaces=gb_trees:from_orddict(lists:map(fun({Key, {Methods, Signals}}) -> + {Key, #dbus_iface{name=Key, + methods=gb_trees:from_orddict(Methods), + signals=gb_trees:from_orddict(Signals)}} + end, dict:to_list(Interfaces)))}, ?debug("Node: ~p~n", [Node]), Xml_body = dbus_introspect:to_xml(Node), State2 = State1#state{default_iface=Iface,node=Node,xml_body=Xml_body}, @@ -176,12 +171,10 @@ handle_cast({signal, SignalName, Args, Options}, State) -> State#state.default_iface end, - Signal = dbus_introspect:find_signal(State#state.node, IfaceName, SignalName), - - case Signal of + case dbus_introspect:find_signal(State#state.node, IfaceName, SignalName) of {error, _}=Error -> {reply, Error, State}; - _ -> + {ok, Signal} -> do_signal(IfaceName, Signal, Args, Options, State) end; @@ -247,7 +240,7 @@ terminate(_Reason, _State) -> do_signal(IfaceName, Signal, Args, _Options, State) -> Path = State#state.path, - Message = dbus_message:signal(undefined, Path, IfaceName, Signal, Args), + {ok, Message} = dbus_message:signal(undefined, Path, IfaceName, Signal, Args), dbus_bus_reg:cast(Message), {noreply, State}. @@ -261,7 +254,7 @@ do_method_call(Module, Member, Message = #dbus_message{header = Header}, Conn, S end, Signature = - case lists:keysearch(signature, 1, Module:Member(dbus_info)) of + case lists:keysearch(signature, 1, erlang:apply(Module, Member, [dbus_info])) of {value, {signature, _Args, Returns}} -> Returns; false -> @@ -269,13 +262,12 @@ do_method_call(Module, Member, Message = #dbus_message{header = Header}, Conn, S end, Args = - case Message#dbus_message.body of - undefined -> []; + case Message#dbus_message.body of undefined -> []; List when is_list(List) -> List; Other -> [Other] end, - case {Module:Member(Args , {self(), From}, Sub), From} of + case {erlang:apply(Module, Member, [Args , {self(), From}, Sub]), From} of {{dbus_error, Iface, Msg, Sub1}, _} -> Reply = dbus_message:error(Message, Iface, Msg), ok = dbus_connection:cast(Conn, Reply), @@ -304,7 +296,6 @@ member_build_introspect(MemberType, Member, State, Interfaces) when is_atom(Member), is_record(State, state) -> {InterfaceName, MemberName} = member_info(MemberType, Member, State), - {Methods, Signals} = case dict:find(InterfaceName, Interfaces) of {ok, Value} -> @@ -322,11 +313,10 @@ member_build_introspect(MemberType, Member, end, dict:store(InterfaceName, Interface1, Interfaces). - + member_info(MemberType, Member, State) -> - Module = State#state.module, - Info = Module:Member(dbus_info), + Info = erlang:apply(State#state.module, Member, [dbus_info]), InterfaceName = case lists:keysearch(interface, 1, Info) of {value, {interface, Interface1}} -> @@ -336,8 +326,8 @@ member_info(MemberType, Member, State) -> end, MemberName = - case lists:keysearch(signature, 1, Info) of - {value, {signature, Args, Results}} -> + case lists:keysearch(signature, 1, Info) of + {value, {signature, Args, Results}} -> ResultsArg = case args_build_introspect(Results, out) of [] -> @@ -346,16 +336,16 @@ member_info(MemberType, Member, State) -> E end, ArgsXml = args_build_introspect(Args, in), - case MemberType of method -> - #dbus_method{name = Member, + {Member, #dbus_method{name = Member, args = ArgsXml, - result = ResultsArg}; + result = ResultsArg}}; signal -> - #dbus_signal{name = Member, + {Member, #dbus_signal{name = Member, args = ArgsXml, - result = ResultsArg} + out_types = Results, + result = ResultsArg}} end; false -> undefined