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); }
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); } }
void AddUser(IPCReceiver receiver, IPCReader data, SyncHandler sync) { var magic = data.ReadUInt64(); var id = data.ReadInt32(); if (!sync.UserExists(magic)) { sync.AddUser(magic, id); } }
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); }
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(); } }
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(); } }