示例#1
0
        void GetChannels(IPCReceiver receiver, IPCReader data, SyncHandler sync)
        {
            var channels = sync.GetAllChannels();
            var packet   = new IPCWriter(IPC.ChannelList);

            packet.Write(channels.Count);           // server count

            foreach (var server in channels)
            {
                packet.Write((int)server.Key);      // server id
                packet.Write(server.Value.Count);   // channel count

                foreach (var channel in server.Value)
                {
                    packet.Write(channel.Value.id);
                    packet.Write(channel.Value.type);
                    packet.Write((int)channel.Value.ip);
                    packet.Write(channel.Value.port);
                    packet.Write(channel.Value.maxPlayers);
                    packet.Write(channel.Value.curPlayers);
                }
            }

            receiver.Send(packet);
        }
示例#2
0
        void AddChannel(IPCReceiver receiver, IPCReader data, SyncHandler sync)
        {
            var serverId   = data.ReadByte();
            var channelId  = data.ReadByte();
            var type       = data.ReadInt32();
            var ip         = data.ReadUInt32();
            var port       = data.ReadInt16();
            var maxPlayers = data.ReadInt16();

            if (!sync.ServerExists(serverId))
            {
                sync.AddServer(serverId);
            }

            if (sync.ServerHasChannel(serverId, channelId))
            {
                return;
            }

            sync.AddServerChannel(serverId, channelId, new ChannelData(channelId, type, ip, port, maxPlayers, 0));
            receiver.SetServerInfo(serverId, channelId);

            if (!Configuration.serverDBs.ContainsKey(serverId))
            {
                Configuration.LoadMasterServer(serverId);

                Log.Message("Connecting to Database for Server " + serverId.ToString() + "...", Log.DefaultFG);
                var db = new DatabaseHandler(Configuration.serverDBTypes[serverId], Configuration.serverDBIPs[serverId], Configuration.serverDBs[serverId], Configuration.serverDBUsers[serverId], Configuration.serverDBPasses[serverId]);
                sync.AddServerDB(serverId, db);
            }
        }
示例#3
0
        void AddUser(IPCReceiver receiver, IPCReader data, SyncHandler sync)
        {
            var magic = data.ReadUInt64();
            var id    = data.ReadInt32();

            if (!sync.UserExists(magic))
            {
                sync.AddUser(magic, id);
            }
        }
示例#4
0
        void GetUser(IPCReceiver receiver, IPCReader data, SyncHandler sync)
        {
            var magic  = data.ReadUInt64();
            var packet = new IPCWriter(IPC.GetUser);

            if (!sync.UserExists(magic))
            {
                packet.Write(-1);
                receiver.Send(packet);
                return;
            }

            var id = sync.GetUser(magic);

            packet.Write(id);
            receiver.Send(packet);
        }
示例#5
0
        void HeartBeat(IPCReceiver receiver, IPCReader data, SyncHandler sync)
        {
            var packet = new IPCWriter(IPC.HeartBeat);

            receiver.Send(packet);
        }
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public ApplicationContext(
            string htmlDirPath
            , bool showBrowser  = true
            , bool appDebugMode = false
            ) : base()
        {
            // アプリケーション生成
            var app = new Core.Application
            {
                DebugMode   = appDebugMode,
                HtmlDirPath = htmlDirPath
            };

            // ロガー用にログディレクトリパスを設定
            NLog.GlobalDiagnosticsContext.Set("LogDirPath", app.LogDirPath);
            // ログパスを設定
            var nlogConfPath =
                Path.Combine(System.Windows.Forms.Application.StartupPath, "nlogconf", (app.DebugMode ? @"Debug.config" : @"Release.config"));

            NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(nlogConfPath);

            // Inazuma Searchアプリケーションクラスの起動
            var bootSuccess = app.Boot();

            if (!bootSuccess)
            {
                Environment.Exit(0);
            }

            // メインコンポーネントの生成
            var comp = new MainComponent(app);

            // 通知アイコンをアプリケーションのstaticプロパティに設定
            Core.Application.NotifyIcon = comp.NotifyIcon;

            // 常駐クロールモードであれば、通知アイコンを表示する
            if (app.UserSettings.AlwaysCrawlMode)
            {
                Core.Application.NotifyIcon.Visible = true;
            }

            // メインフォームの生成(画面には表示しない)
            var mainForm = new BackgroundMainForm();

            mainForm.Show();
            mainForm.Hide();

            // IPCサーバーを起動(二重起動時に他プロセスからの操作を受けるために使用)
            // 例外が発生した場合は無視
            try
            {
                var ipcChannel = new IpcServerChannel(IPCReceiver.GetIPCPortName());
                ChannelServices.RegisterChannel(ipcChannel, true);
                var ipcReceiver = new IPCReceiver(comp, mainForm);
                RemotingServices.Marshal(ipcReceiver, IPCReceiver.UriName, typeof(IPCReceiver));
            }
            catch (Exception ex)
            {
                app.Logger.Warn(ex);
            }

            // ブラウザの立ち上げ
            if (showBrowser)
            {
                comp.StartBrowser();
            }
        }
示例#7
0
        private static void Main(string[] args)
        {
            // 例外ハンドラ登録
            System.Windows.Forms.Application.ThreadException += Application_ThreadException;
            System.Windows.Forms.Application.SetUnhandledExceptionMode(System.Windows.Forms.UnhandledExceptionMode.CatchException);
            System.AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            // Mutex名
            const string mutexName = "inazumaapps.info/InazumaSearch";

            // Mutexオブジェクトを作成する
            bool createdNew;
            var  mutex = new Mutex(true, mutexName, out createdNew);

            //ミューテックスの初期所有権が付与されたか調べる
            if (!createdNew)
            {
                // 初期所有権が付与されなかった場合は二重起動とみなし
                // すでに起動中のプロセスに対して、プロセス間通信で接続し、新しいウインドウを開かせてそのまま終了
                var client = new IpcClientChannel();
                ChannelServices.RegisterChannel(client, true);
                var ipcReceiver = (IPCReceiver)Activator.GetObject(typeof(IPCReceiver), $"ipc://{IPCReceiver.GetIPCPortName()}/{IPCReceiver.UriName}");
                ipcReceiver.OnDoubleBoot();

                return;
            }

            try
            {
                System.Windows.Forms.Application.EnableVisualStyles();
                System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
                //Application.Run(new MainForm());

                // コマンドライン引数の解析
                string errorMessage;
                var    opts = Core.Application.ParseCommandLineOptions(args, out errorMessage);
                if (opts == null)
                {
                    Core.Util.ShowErrorMessage(errorMessage);
                    return;
                }

                // HTMLフォルダが存在しなければエラー
                if (!Directory.Exists(opts.HtmlFullPath))
                {
                    Core.Util.ShowErrorMessage("htmlフォルダが見つかりませんでした。\nデバッグ起動の場合は、コマンドライン引数の --html-path でhtmlフォルダのパスを指定してください。");
                    return;
                }

                var appDebugMode = false;
#if DEBUG
                appDebugMode = true;
#endif

                // 起動
                System.Windows.Forms.Application.Run(new InazumaSearch.ApplicationContext(
                                                         htmlDirPath: opts.HtmlFullPath
                                                         , showBrowser: !opts.BackgroundMode
                                                         , appDebugMode: appDebugMode
                                                         ));
            }
            finally
            {
                //ミューテックスを解放する
                mutex.ReleaseMutex();
                mutex.Close();
            }
        }