aboutsummaryrefslogblamecommitdiffstats
path: root/server/dispatcher.erl
blob: 27c2d4c41dfdf227cff18dee4600d52c616b441f (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                    
                             

                         
                                                                            


                     

          

                                                

                                      
 
                         

                
                                             







                                                                             
 





                                                                      
                                                    
               
                                           

                




                                                           
                                             

                                                  
 
                               

                                                                
                                
 
                                                 
                                   


                                               
                            
                                                    
                      
                                                            
                

                                                             

        



                                                                   
          
 
                     
                                                                   
                                             
-module(dispatcher).
-export([start/0, handle/2]).

checkUserExists([_|_]) ->
    %% helper function to check if given array contains at least one element
    false;
checkUserExists(_) ->
    true.

start() ->
    %% load server module from common directory,
    %% used form server and client
    code:purge(server),
    code:load_abs("../common/server"),

    %% initalize database
    cldb:init(),

    %% spawn media backend in seperat process
    try spawn(media, init, []) of
	_ ->
	    io:format("Media-Backend started!~n")
    catch
	_: Why ->
	    io:format("Error starting media backend: ~w! Exiting.~n", [Why]),
	    exit(1)
    end,

    %% start server (registered as dis, arriving messages will call
    %% the handle function to get the result)
    %% The state of the server is true if register is allowed (no user
    %% exists) -> first created user is admit and after the first
    %% registration only the admit could register the other user
    UserExists = checkUserExists(cldb:all()),
    try server:start(dis, dispatcher, UserExists) of
	true ->
	    io:format("Server started!~n"),
	    true
    catch
	_ ->
	    io:format("Error starting server! Exiting.~n"),
	    exit(1)
    end.

handle({register, {User, Password}}, true) ->
    %% first registration
    {cldb:register(User, Password, admin), false};

handle({register, _}, false) ->
    %% if state of the server is false, no registration allowed,
    %% because the admin user allready exists
    {{error, no_rights}, false};

handle({login, {Node, User, Password}}, State) ->
    %% login user if Password match
    case cldb:login(User, Password) of
	{ok, UserRow} ->
	    case client:start(Node, UserRow) of
		{ok, Pid} ->
		    {{ok, {logged_in, Pid}}, State};
		Why ->
		    {{error, {unable_to_login, Why}}, State}
	    end;
	Why ->
	    {{error, {user_or_password_invalid, Why}}, State}
    end;

handle({'EXIT', From, _}, State) ->
    %% handle the exit messages from the client, so that the client
    %% logouts if the connection between server and client breaks
    cldb:logout(From),
    State;

handle(Cmd, State) ->
    %% standard command, to find invalid commands and emit an error
    {{error, {unknown_command, Cmd}}, State}.