[Freeswitch-users] I got ERLang to fire a configuration request
Michael Collins
msc at freeswitch.org
Tue Sep 15 12:51:25 PDT 2009
Mark,
You might want to send this question to
freeswitch-dev at lists.freeswitch.orgas it's a bit intense for the users
list. :)
-MC
On Tue, Sep 15, 2009 at 7:38 AM, Mark Sobkow
<m.sobkow at marketelsystems.com>wrote:
> I still need to stuff the Freeswitch PID into global storage somewhere so
> the process that's handling the configuration requests can send the reply
> without crashing (it's just getting a node id, not a Pid), but I seem to be
> on my way to configuring Freeswitch via ERLang.
>
> freeswitch_bind.erl has the calls added to register the ERLang callbacks.
> The callback function itself is in the aptly named freeswitch_callback.erl.
>
> -module(freeswitch_bind).
>
> -behaviour(gen_server).
>
> -record(st, {fsnode, pbxpid, configpid, dirpid, dialpid}).
>
> -export([start/3, terminate/2, code_change/3, init/1,
> handle_call/3, handle_cast/2, handle_info/2]).
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> %% gen_server methods
> start(Node, Section, Pid) ->
> gen_server:start(?MODULE, [Node, Section, Pid], []).
>
> init([Node, Section, Pid]) ->
> io:format( "freeswitch_bind:init( [Node=~w, Section=~w, Pid=~w])~n",
> [Node, Section, Pid] ),
> {api, Node} ! {bind, Section},
> receive
> ok ->
> {ok, ConfigurationPid } = freeswitch:start_fetch_handler(
> Node, configuration, freeswitch_callback, fetch_handler ),
> {ok, DirectoryPid } = freeswitch:start_fetch_handler( Node,
> directory, freeswitch_callback, fetch_handler ),
> {ok, DialplanPid } = freeswitch:start_fetch_handler( Node,
> dialplan, freeswitch_callback, fetch_handler ),
> {ok, #st{fsnode=Node, pbxpid=Pid, configpid=ConfigurationPid,
> dirpid=DirectoryPid, dialpid=DialplanPid}};
> {error, Reason} ->
> {stop, {error, {freeswitch_error, Reason}}}
> after 5000 ->
> {stop, {error, freeswitch_timeout}}
> end.
>
> terminate(_Reason, _State) ->
> ok.
>
> code_change(_OldVsn, State, _Extra) ->
> {ok, State}.
>
> %%
> %% If the request isn't recognized, just log it and do nothing.
> %%
> handle_call(Request, _From, State) ->
> io:format("freeswitch_bind:handle_call( ~w, _From, State) unrecognized
> request~n",
> [Request]),
> {reply, {error, unrecognized_request}, State}.
>
> handle_cast(Message, State) ->
> error_logger:error_msg("~p received unrecognized cast ~p~n",
> [self(), Message]),
> {noreply, State}.
>
> handle_info({fetch, Section, Tag, Key, Value, FetchID, Params},
> #st{fsnode=Node, pbxpid=Pid}=State) ->
> {ok, XML} = gen_server:call(Pid, {fetch, Section, Tag, Key, Value,
> Params}),
> {api, Node} ! {fetch_reply, FetchID, XML},
> receive
> ok ->
> {noreply, State};
> {error, Reason} ->
> {stop, {error, Reason}, State}
> end.
>
> %% Author: mark
> %% Created: Sep 15, 2009
> %% Description: TODO: Add description to freeswitch_callback
> -module(freeswitch_callback).
>
> -behaviour(gen_server).
>
> -record(st, {fsnode, pbxpid}).
>
> -export([start/3, terminate/2, code_change/3, init/1,
> handle_call/3, handle_cast/2, handle_info/2, fetch_handler/1]).
>
> start(Node, Section, Pid) ->
> gen_server:start(?MODULE, [Node, Section, Pid], []).
>
> init([Node, Section, Pid]) ->
> io:format( "freeswitch_callback:init( [Node=~w, Section=~w,
> Pid=~w])~n", [Node, Section, Pid] ),
> {ok, #st{fsnode=Node, pbxpid=Pid}}.
>
> terminate(_Reason, _State) ->
> ok.
>
> code_change(_OldVsn, State, _Extra) ->
> {ok, State}.
>
> %%
> %% Callback for freeswitch:start_fetch_handler() called in
> freeswitch_bind:init()
> %%
> fetch_handler( FreeswitchNode ) ->
> receive
> { nodedown, Node } ->
> io:format( "freeswitch_callback:fetch_handler() Node
> ~w is down~n", [Node] ),
> ok;
> { fetch, Section, Tag, Key, Value, FetchId, Params } ->
> io:format( "freeswitch_callback:fetch_handler()
> Invoking xml_fetch()~n" ),
> {ok, Xml} = xml_fetch( {fetch, Section, Tag, Key, Value,
> Params} ),
> io:format( "freeswitch_callback:fetch_handler()
> Sending reply to FreeswitchNode ~w: ~s~n", [FreeswitchNode, Xml] ),
> FreeswitchNode ! { fetch_reply, FetchId, Xml },
> io:format( "freeswitch_callback:fetch_handler()
> Reply sent~n" ),
> ok
> end,
> { ok } = fetch_handler( FreeswitchNode ),
> { ok }.
>
> %%
> %% Configuration handler replies that the requested document section,
> tag, and key are not
> %% found.
> %%
> xml_fetch({fetch, configuration, Tag, Key, Value, Params}) ->
> io:format( "freeswitch_callback:handle_call( {fetch, configuration,
> Tag=~s, Key=~s, Value=~s, Params=~w} )~n",
> [Tag, Key, Value, Params]),
> Xml =
> "<document type=\"freeswitch/xml\">
> <section name=\"result\">
> <result status=\"not found\" />
> </section>
> </document>",
> {ok, Xml };
>
> %%
> %% Directory handler replies that the requested document section, tag,
> and key are not
> %% found.
> %%
> xml_fetch({fetch, directory, Tag, Key, Value, Params}) ->
> io:format( "freeswitch_callback:xml_fetch( {fetch, directory,
> Tag=~s, Key=~s, Value=~s, Params=~w} )~n",
> [Tag, Key, Value, Params]),
> Xml =
> "<document type=\"freeswitch/xml\">
> <section name=\"result\">
> <result status=\"not found\" />
> </section>
> </document>",
> {ok, Xml };
>
> %%
> %% Dialplan handler replies that the requested document section, tag,
> and key are not
> %% found.
> %%
> xml_fetch({fetch, dialplan, Tag, Key, Value, Params}) ->
> io:format( "freeswitch_callback:xml_fetch( {fetch, dialplan, Tag=~s,
> Key=~s, Value=~s, Params=~w} )~n",
> [Tag, Key, Value, Params]),
> Xml =
> "<document type=\"freeswitch/xml\">
> <section name=\"result\">
> <result status=\"not found\" />
> </section>
> </document>",
> {ok, Xml };
>
> %%
> %% Default handler replies that the requested document section, tag,
> and key are not
> %% found.
> %%
> xml_fetch({fetch, Section, Tag, Key, Value, Params}) ->
> io:format( "freeswitch_callback:xml_fetch( {fetch, Section=~w,
> Tag=~s, Key=~s, Value=~s, Params=~w} )~n",
> [Section, Tag, Key, Value, Params]),
> Xml =
> "<document type=\"freeswitch/xml\">
> <section name=\"result\">
> <result status=\"not found\" />
> </section>
> </document>",
> {ok, Xml };
>
> %%
> %% If the request isn't recognized, just log it.
> %%
> xml_fetch( Request ) ->
> io:format( "freeswitch_callback:xml_fetch( Request=~w ) not
> recognized~n",
> [Request]),
> Xml =
> "<document type=\"freeswitch/xml\">
> <section name=\"result\">
> <result status=\"not found\" />
> </section>
> </document>",
> {ok, Xml }.
>
>
> %%
> %% If the request isn't recognized, just log it and do nothing.
> %%
> handle_call(Request, _From, State) ->
> io:format("freeswitch_callback:handle_call( ~w, _From, State)
> unrecognized request~n",
> [Request]),
> {reply, {error, unrecognized_request}, State}.
>
> handle_cast(Message, State) ->
> error_logger:error_msg("~p received unrecognized cast ~p~n",
> [self(), Message]),
> {noreply, State}.
>
> handle_info({fetch, Section, Tag, Key, Value, FetchID, Params},
> #st{fsnode=Node, pbxpid=Pid}=State) ->
> {ok, XML} = gen_server:call(Pid, {fetch, Section, Tag, Key, Value,
> Params}),
> {api, Node} ! {fetch_reply, FetchID, XML},
> receive
> ok ->
> {noreply, State};
> {error, Reason} ->
> {stop, {error, Reason}, State}
> end.
>
> _______________________________________________
> FreeSWITCH-users mailing list
> FreeSWITCH-users at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
> http://www.freeswitch.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20090915/ce6325b2/attachment-0002.html
More information about the FreeSWITCH-users
mailing list