예제 #1
0
        /// <summary>
        /// Takes the configuration info, and begins the threading
        /// model to take care of all the Server objects created.
        /// </summary>
        private void StartServerThreads()
        {
            //Make sure the file system environment is set up for the servers:
            if ( !Directory.Exists( "userdb" ) )
                Directory.CreateDirectory( "userdb" );
            if ( !Directory.Exists( "logs" ) )
                Directory.CreateDirectory( "logs" );
            if ( !Directory.Exists( "modules" ) )
                Directory.CreateDirectory( "modules" );

            Configuration.ServerConfig[] list = config.Servers;

            WriteLogFunction wlf = new WriteLogFunction( WriteLog );

            bool allServersReady = true;

            //Loads & Initializes all servers.
            for ( int i = 0; i < list.Length; i++ ) {
                Server s = new Server( list[i], wlf );
                Thread t = new Thread( s.Connect );
                servers[i] = new ServerThread( s, t );
                servers[i].LoadModules = s.Init();
                allServersReady = allServersReady && servers[i].LoadModules;
            }

            //Load all modules.
            WriteLog( "Loading Modules..." );
            LoadModules( config.Modules );

            //Activate all the modules.
            for ( int m = 0; m < MaxModules; m++ ) {
                if ( modules[m] == null ) continue;

                WriteLog( "  Module Loaded: " + modules[m].ModuleConfig.FullName );

                for ( int s = 0; s < MaxServers; s++ ) {
                    if ( servers[s] == null || !servers[s].LoadModules ||
                        !modules[m].ModuleConfig.QueryServerList( servers[s].Server.Config.Name ) ) continue;

                    modules[m].Activate( s );
                    WriteLog( "    Activated Link: " + servers[s].Server.Config.Name + "." + modules[m].ModuleConfig.FullName );
                }

                if ( allServersReady ) {
                    WriteLog( "    Activation Completed: " + modules[m].ModuleConfig.FullName );
                    modules[m].ActivationComplete();
                }
            }

            foreach ( ServerThread st in servers )
                if ( st == null ) continue;
                else st.Thread.Start();
        }