Skip to content

Commit

Permalink
First version.
Browse files Browse the repository at this point in the history
  • Loading branch information
Licenser committed Nov 11, 2012
0 parents commit 26faa0b
Show file tree
Hide file tree
Showing 10 changed files with 752 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -0,0 +1,2 @@
deps
ebin
381 changes: 381 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

48 changes: 48 additions & 0 deletions Makefile
@@ -0,0 +1,48 @@
APP_NAME=libhowl
APP_DIR=.
OBJ=$(shell ls $(APP_DIR)/src/*.erl | sed -e 's/\.erl$$/.beam/' | sed -e 's;^$(APP_DIR)/src;$(APP_DIR)/ebin;g') $(shell ls $(APP_DIR)/src/*.app.src | sed -e 's/\.src$$//g' | sed -e 's;^$(APP_DIR)/src;$(APP_DIR)/ebin;g')
DEPS=$(shell cat rebar.config |sed -e 's/%.*//'| sed -e '/{\(\w\+\), [^,]\+, {\w\+, [^,]\+, {[^,]\+, [^}]\+}}},\?/!d' | sed -e 's;{\(\w\+\), [^,]\+, {\w\+, [^,]\+, {[^,]\+, [^}]\+}}},\?;deps/\1/rebar.config;')
ERL=erl
PA=$(shell pwd)/$(APP_DIR)/ebin
ERL_LIBS=`pwd`/deps/
REBAR=./rebar

all: $(DEPS) $(OBJ)

test:
echo $(DEPS)
echo $(OBJ)

doc: FORCE
$(REBAR) doc
clean: FORCE
$(REBAR) clean
-rm *.beam erl_crash.dump
-rm -r rel/$(APP_NAME)
-rm rel/$(APP_NAME).tar.bz2

$(DEPS):
$(REBAR) get-deps
$(REBAR) compile

$(APP_DIR)/ebin/%.app: $(APP_DIR)/src/%.app.src
$(REBAR) compile

$(APP_DIR)/ebin/%.beam: $(APP_DIR)/src/%.erl
$(REBAR) compile

shell: all
ERL_LIBS="$(ERL_LIBS)" $(ERL) -pa $(PA) deps/*/ebin -s libhowl
[ -f *.beam ] && rm *.beam || true
[ -f erl_crash.dump ] && rm erl_crash.dump || true

remove_trash:
-find . -name "*~" -exec rm {} \;.
-rm *.beam erl_crash.dump
FORCE:

clean-docs:
-rm doc/*.html doc/*.png doc/*.css doc/edoc-info

docs: clean-docs
@$(REBAR) doc skip_deps=true
Binary file added rebar
Binary file not shown.
7 changes: 7 additions & 0 deletions rebar.config
@@ -0,0 +1,7 @@
{lib_dirs, ["deps"]}.
{erl_opts, [{i, "../../deps/alog/include"}, {i, "deps/alog/include"}, {i, ".."}, {i,"deps"}, {parse_transform, lager_transform}, debug_info, warnings_as_errors]}.
{deps,
[
{mdns_client_lib, ".*", {git, "https://github.com/Licenser/mdns_client_lib.git", {branch, master}}},
{lager, ".*", {git, "git://github.com/basho/lager.git", {tag, "1.0.0"}}}
]}.
13 changes: 13 additions & 0 deletions src/libhowl.app.src
@@ -0,0 +1,13 @@
{application, libhowl,
[
{description, ""},
{vsn, "1"},
{registered, []},
{applications, [
kernel,
stdlib,
mdns_client_lib
]},
{mod, { libhowl_app, []}},
{env, [{domain, ".local"}]}
]}.
66 changes: 66 additions & 0 deletions src/libhowl.erl
@@ -0,0 +1,66 @@
-module(libhowl).

-export([
start/0,
servers/0
]).


-export([
send/2
]).

%%%===================================================================
%%% Generatl Functions
%%%===================================================================

%%--------------------------------------------------------------------
%% @private
%% @doc Starts the service.
%% @spec start() -> ok
%% @end
%%--------------------------------------------------------------------

-spec start() -> ok.
start() ->
application:start(mdns_client_lib),
application:start(libhowl).

%%--------------------------------------------------------------------
%% @doc Gets a list of servers
%% @spec servers() -> [term()]
%% @end
%%--------------------------------------------------------------------

-spec servers() -> [term()].

servers() ->
libhowl_server:servers().

%%--------------------------------------------------------------------
%% @doc Sends a message to a channel.
%% @spec send(Channel::term(), Message::term()) -> ok
%% @end
%%--------------------------------------------------------------------

-spec send(Channel::term(), Message::term()) ->
{ok, Token::{token, binary()}} |
{error, not_found}.

send(Channel, Message) ->
send({msg, Channel, Message}).

%%%===================================================================
%%% Internal Functions
%%%===================================================================

%%--------------------------------------------------------------------
%% @private
%% @doc Sends a message.
%% @spec send(Msg::term()) -> {ok, Reply::term()} | {error, no_server}
%% @end
%%--------------------------------------------------------------------

-spec send(Msg::term()) -> {ok, Reply::term()} | {error, no_server}.
send(Msg) ->
libhowl_server:cast(Msg).
16 changes: 16 additions & 0 deletions src/libhowl_app.erl
@@ -0,0 +1,16 @@
-module(libhowl_app).

-behaviour(application).

%% Application callbacks
-export([start/2, stop/1]).

%% ===================================================================
%% Application callbacks
%% ===================================================================

start(_StartType, _StartArgs) ->
libhowl_sup:start_link().

stop(_State) ->
ok.
191 changes: 191 additions & 0 deletions src/libhowl_server.erl
@@ -0,0 +1,191 @@
%%%-------------------------------------------------------------------
%%% @author Heinz Nikolaus Gies <heinz@licenser.net>
%%% @copyright (C) 2012, Heinz Nikolaus Gies
%%% @doc
%%%
%%% @end
%%% Created : 20 Aug 2012 by Heinz Nikolaus Gies <heinz@licenser.net>
%%%-------------------------------------------------------------------
-module(libhowl_server).

-behaviour(gen_server).

%% API
-export([start_link/0,
call/1,
cast/1,
servers/0]).

%% gen_server callbacks
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
terminate/2,
code_change/3]).

-define(SERVER, ?MODULE).

-record(state, {zmq_worker}).

%%%===================================================================
%%% API
%%%===================================================================

%%--------------------------------------------------------------------
%% @doc
%% Starts the server.
%%
%% @spec start_link() -> {ok, Pid} | ignore | {error, Error}
%% @end
%%--------------------------------------------------------------------
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).

%%--------------------------------------------------------------------
%% @doc
%% This function sends a message to the server and waits for a reply.
%%
%% @spec call(Msg::term()) -> {error, no_server} |
%% {ok, Reply::term()}
%% @end
%%--------------------------------------------------------------------

call(Msg) ->
gen_server:call(?SERVER, {call, Msg}).

%%--------------------------------------------------------------------
%% @doc
%% This function sends a message to the server and just return. Since
%% there is no way of determinign the success of sending the library
%% will try to retransmitt once the server is back online. Be careful
%% it won't be guarnateed that your messages are delivered in order!
%%
%% @spec cast(Msg::term()) -> ok
%% @end
%%--------------------------------------------------------------------

cast(Msg) ->
gen_server:cast(?SERVER, {cast, Msg}).

%%--------------------------------------------------------------------
%% @doc
%% Returns a list of all connected servers
%%
%% @spec servers() -> [] | [Server::term()]
%% @end
%%--------------------------------------------------------------------

servers() ->
gen_server:call(?SERVER, servers).

%%%===================================================================
%%% gen_server callbacks
%%%===================================================================

%%--------------------------------------------------------------------
%% @private
%% @doc
%% Initializes the server
%%
%% @spec init(Args) -> {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% @end
%%--------------------------------------------------------------------

init([]) ->
{ok, Pid} = mdns_client_lib:instance("howl"),
{ok, #state{zmq_worker = Pid}}.

%%--------------------------------------------------------------------
%% @private
%% @doc
%% Handling call messages
%%
%% @spec handle_call(Request, From, State) ->
%% {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} |
%% {stop, Reason, State}
%% @end
%%--------------------------------------------------------------------

handle_call(servers, _From, #state{zmq_worker = Pid} = State) ->

Reply = mdns_client_lib:servers(Pid),
{reply, Reply, State};

handle_call({call, Msg}, From, #state{zmq_worker = Pid} = State) ->
spawn(fun() ->
Reply = mdns_client_lib:call(Pid, Msg),
gen_server:reply(From, Reply)
end),
{noreply, State};

handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.

%%--------------------------------------------------------------------
%% @private
%% @doc
%% Handling cast messages
%%
%% @spec handle_cast(Msg, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% @end
%%--------------------------------------------------------------------

handle_cast({cast, Msg}, #state{zmq_worker = Pid} = State) ->
mdns_client_lib:cast(Pid, Msg),
{noreply, State};

handle_cast(_Msg, State) ->
{noreply, State}.

%%--------------------------------------------------------------------
%% @private
%% @doc
%% Handling all non call/cast messages
%%
%% @spec handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% @end
%%--------------------------------------------------------------------
handle_info(_Info, State) ->
{noreply, State}.

%%--------------------------------------------------------------------
%% @private
%% @doc
%% This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any
%% necessary cleaning up. When it returns, the gen_server terminates
%% with Reason. The return value is ignored.
%%
%% @spec terminate(Reason, State) -> void()
%% @end
%%--------------------------------------------------------------------
terminate(_Reason, _State) ->
ok.

%%--------------------------------------------------------------------
%% @private
%% @doc
%% Convert process state when code is changed
%%
%% @spec code_change(OldVsn, State, Extra) -> {ok, NewState}
%% @end
%%--------------------------------------------------------------------
code_change(_OldVsn, State, _Extra) ->
{ok, State}.

%%%===================================================================
%%% Internal functions
%%%===================================================================
28 changes: 28 additions & 0 deletions src/libhowl_sup.erl
@@ -0,0 +1,28 @@

-module(libhowl_sup).

-behaviour(supervisor).

%% API
-export([start_link/0]).

%% Supervisor callbacks
-export([init/1]).

%% Helper macro for declaring children of supervisor
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}).

%% ===================================================================
%% API functions
%% ===================================================================

start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).

%% ===================================================================
%% Supervisor callbacks
%% ===================================================================

init([]) ->
{ok, { {one_for_one, 5, 10}, [?CHILD(libhowl_server, worker)]} }.

0 comments on commit 26faa0b

Please sign in to comment.