summaryrefslogtreecommitdiff
path: root/mess_server.erl
diff options
context:
space:
mode:
Diffstat (limited to 'mess_server.erl')
-rw-r--r--mess_server.erl65
1 files changed, 65 insertions, 0 deletions
diff --git a/mess_server.erl b/mess_server.erl
new file mode 100644
index 0000000..3a25a98
--- /dev/null
+++ b/mess_server.erl
@@ -0,0 +1,65 @@
+%%% This is the server process of the messenger service
+
+-module(mess_server).
+-export([server_start/0, server/0]).
+-include("mess_interface.hrl").
+
+server() ->
+ process_flag(trap_exit, true),
+ server([]).
+
+%%% the user list has the format [{ClientPid1, Name1},{ClientPid2,Name2},...]
+server(User_List) ->
+ io:format("User list = ~p~n", [User_List]),
+ receive
+ #logon{client_pid=From, username=Name} ->
+ New_User_List = server_logon(From, Name, User_List),
+ server(New_User_List);
+ {'EXIT', From, _} ->
+ New_User_List = server_logoff(From, User_List),
+ server(New_User_List);
+ #message{client_pid=From, to_name=ToName, message=Message} ->
+ server_transfer(From, ToName, Message, User_List),
+ server(User_List)
+ end.
+
+%%% Start the server
+server_start() ->
+ register(messenger, spawn(?MODULE, server, [])).
+
+%%% Server adds a new user to the user list
+server_logon(From, Name, User_List) ->
+ %% check if logged on anyone else
+ case lists:keymember(Name, 2, User_List) of
+ true ->
+ From ! #abort_client{message=user_exists_at_other_node},
+ User_List;
+ false ->
+ From ! #server_reply{message=logged_on},
+ link(From),
+ [{From, Name} | User_List] % add user to the list
+ end.
+
+%%% Server deletes a user from the user list
+server_logoff(From, User_List) ->
+ lists:keydelete(From, 1, User_List).
+
+%%% Server transfers a message between user
+server_transfer(From, To, Message, User_List) ->
+ %% check that the user is logged on and who he is
+ case lists:keysearch(From, 1, User_List) of
+ false ->
+ From ! #abort_client{message=you_are_not_logged_on};
+ {value, {_, Name}} ->
+ server_transfer(From, Name, To, Message, User_List)
+ end.
+
+%%% If the user exists, send the message
+server_transfer(From, Name, To, Message, User_List) ->
+ case lists:keysearch(To, 2, User_List) of
+ false ->
+ From ! #server_reply{message=receiver_not_found};
+ {value, {ToPid, To}} ->
+ ToPid ! #message_from{from_name=Name, message=Message},
+ From ! #server_reply{message=sent}
+ end.