summaryrefslogtreecommitdiff
path: root/mess_server.erl
blob: ad52f0f115b0eb2f0a0f71fb893c0a8e6ddd0ed8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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.