aboutsummaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/client.erl80
1 files changed, 47 insertions, 33 deletions
diff --git a/client/client.erl b/client/client.erl
index b72b5ee..97f0735 100644
--- a/client/client.erl
+++ b/client/client.erl
@@ -12,49 +12,53 @@ checkLogin(Value) ->
end.
buildNode(Server) ->
+ %% build the node string of the server by using the hostname
list_to_atom("distributed_music_system_main_node@" ++ Server).
rpc(Server, Function, Params) ->
rpc:call(buildNode(Server), client, Function, Params).
+ %% shortcut for calling a function from the server
-wait_for_reply() ->
- receive
- {_, Msg} ->
- Msg;
- Why -> Why
- after 3000 ->
- {error, timeout}
- end.
-
-register(Name, Password) ->
- try checkLogin(true) of
- _ ->
- server:rpc(cli, {register, Name, Password})
- catch
- {error, login_state} ->
- {error, not_logged_in}
- end.
-
-%register the client with the server
register(Server, Name, Password) ->
+ %% check if client is not logged in (if client is logged in,
+ %% register/2 should be used)
try checkLogin(false) of
_ ->
+ %% register a new user account on the server
rpc(Server, register, [self(), {Name, Password}])
catch
{error, login_state} ->
{error, logged_in}
end,
- wait_for_reply().
-%login to the server
+ %% wait for response
+ receive
+ {_, Msg} ->
+ Msg;
+ Why -> Why
+ after 3000 ->
+ %% protect from waiting endless for server response (maybe
+ %% if used wrong hostname or something like that)
+ {error, timeout}
+ end.
+
login(Server, Name, Password) ->
+ %% load common/server (used by server and client)
code:purge(server),
code:load_abs("../common/server"),
+ %% check if client is not logged in (if client is logged in, it
+ %% would make no sense to login again)
try checkLogin(false) of
_ ->
+ %% login to the server
rpc(Server, login, [self(), {node(), Name, Password}]),
receive
+ %% the server returns the Pid of the process on the
+ %% client, that should handle the communication
+ %% between server and client, the process is started
+ %% by the server on the client node and registered
+ %% here as cli process
{ok, {ok, {logged_in, Pid}}} ->
erlang:register(cli, Pid),
{ok, logged_in};
@@ -63,6 +67,9 @@ login(Server, Name, Password) ->
Msg ->
Msg
after 3000 ->
+ %% protect from waiting endless for server
+ %% response (maybe if used wrong hostname or
+ %% something like that)
{error, timeout}
end
catch
@@ -70,17 +77,10 @@ login(Server, Name, Password) ->
{error, logged_in}
end.
-%request the playlist from the server
-list() ->
- try checkLogin(true) of
- _ ->
- server:rpc(cli, list)
- catch
- {error, login_state} ->
- {error, not_logged_in}
- end.
-
send_to_server(Cmd, Server) ->
+ %% generic helper function for sending a message to the given
+ %% server and wait for a response from the server (the function
+ %% returns a tupel of the reponse and the server)
Server ! Cmd,
receive
{ok, Msg} ->
@@ -89,6 +89,8 @@ send_to_server(Cmd, Server) ->
{Msg, Server}
end.
+%% the handle functions are called from the process started by the
+%% process started by the server on login and registered as cli
handle(list, Server) ->
send_to_server(list, Server);
handle(get_votes, Server) ->
@@ -99,15 +101,20 @@ handle({devote, Artist, Title}, Server) ->
send_to_server({devote, Artist, Title}, Server);
handle({register, Name, Password}, Server) ->
send_to_server({register, Name, Password}, Server);
+
handle({change_state, NewState}, _) ->
+ %% change the state of the server (used from the client process on
+ %% the server to set the process id, so that the client could send
+ %% messages directly to the server
{{ok}, NewState};
handle(Cmd, Server) ->
+ %% fallback to return a error message for not existing commands
{{error, {unknown_command, Cmd}}, Server}.
try_logged_in_rpc(Rpc) ->
- %% tries to execute an rpc for logged in user and returns error
- %% message if user is not logged in
+ %% helper function that tries to execute an rpc for logged in user
+ %% and returns error message if user is not logged in
try checkLogin(true) of
_ ->
server:rpc(cli, Rpc)
@@ -116,6 +123,10 @@ try_logged_in_rpc(Rpc) ->
{error, not_logged_in}
end.
+list() ->
+ %% request the playlist from the server
+ try_logged_in_rpc(list).
+
getVotes() ->
%% queries the server for the current votes this client possesses
try_logged_in_rpc(get_votes).
@@ -128,3 +139,6 @@ devote(Artist, Title) ->
%% negative vote, decrements the votes for {Artist, Title} by one
try_logged_in_rpc({devote, Artist, Title}).
+register(Name, Password) ->
+ %% register a new user (used by the admin)
+ try_logged_in_rpc({register, Name, Password}).