/// <summary> /// Méthode de déconnexion au serveur web /// </summary> public void Disconnect(Disco_mode Mode = Disco_mode.Normal) { if (m_bConnected) { ATCTimer.Stop(); OnLiveUpdate(null, null); XmlDocument SendLogout = new XmlDocument(); XmlBuild(ref SendLogout, XmlCode.logout); Log.LogMessage("Déconnexion en cours..."); #if DEBUG Log.LogMessage("PManager: Demande de déconnexion =\n " + Beautify(SendLogout), Color.DarkRed, 2); #endif m_sURL = "http://" + User.URL + "/action.php"; HTTPRequestThread Requete = new HTTPRequestThread(SendLogout, m_sURL, DisconnectCB); Requete.Start(); switch (Mode) { case (Disco_mode.Close): DelayedExit = true; break; case (Disco_mode.Reco): DelayReco = true; break; } } }
/// <summary> /// Méthode de connexion au serveur web /// </summary> /// <param name="pUser"></param> public void Connect(PirepUser pUser) { if (!m_bConnected) { try { // On crée un thread pour opérer la connexion de manière asynchrone, sans bloquer // La collecte de donnée du thread principal User = pUser; m_sURL = "http://" + User.URL + "/action.php"; XmlBuild(ref SendHello, XmlCode.hello); Log.LogMessage("Connexion en cours..."); #if DEBUG Log.LogMessage("PManager: Demande de connexion =\n " + Beautify(SendHello), Color.DarkRed, 2); #endif HTTPRequestThread Requete = new HTTPRequestThread(SendHello, m_sURL, HelloCB); Requete.Start(); } catch (Exception e) { // Nous le signalons par un message Log.LogMessage("La connexion au serveur a échoué : " + e.Message, Color.Violet); } } }
/// <summary> /// Méthode cyclique du timer /// Gestion des tâches périodiques /// Pour les demandes de données sur le simulateur /// </summary> /// <param name="source"></param> /// <param name="evt"></param> private void OnATCUpdate(object source, ElapsedEventArgs evt) { if (IsConnected() && SCM.IsConnected()) { int Transponder = Outils.ConvertToBinaryCodedDecimal(Analyse.GetLastState().Squawk); if ((Transponder == 1200) || (Transponder == 7000)) { return; } XmlBuild(ref SendAtc, XmlCode.atc); XmlNodeList Nodes = SendAtc.GetElementsByTagName("atc"); foreach (XmlNode node in Nodes) { foreach (XmlNode child in node.ChildNodes) { switch (child.Name) { case "latitude": child.InnerText = string.Format("{0:0.00000}", Analyse.GetLastState().Latitude); break; case "longitude": child.InnerText = string.Format("{0:0.00000}", Analyse.GetLastState().Longitude); break; case "heading": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().Heading); break; case "altitude": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().Altitude); break; case "groundSpeed": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().GSpeed); break; case "iaspeed": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().IASSpeed); break; case "squawk": child.InnerText = string.Format("{0:0.}", Outils.ConvertToBinaryCodedDecimal(Analyse.GetLastState().Squawk)); break; } } } #if DEBUG Log.LogMessage("PManager: ATCUpdate =\n " + Beautify(SendAtc), Color.DarkRed, 2); #endif HTTPRequestThread Requete = new HTTPRequestThread(SendAtc, m_sURL, ATCCB); Requete.Start(); } }
/// <summary> /// Callback Requete de mise à jour /// </summary> /// <param name="asyncResult"></param> private void SyncAICB(HttpWebResponse Response) { if (!m_bConnected) { return; } Dictionary <string, string> Fichiers = new Dictionary <string, string>(); XmlDocument xmlDoc = null; if (Response != null) { xmlDoc = GetResultXml(ref Response); Response.Close(); } if (xmlDoc != null) { CheckError(xmlDoc); XmlNode Node = GetFirstElement(ref xmlDoc, "no_found"); if (Node != null) { List <string> Manquants = Outils.PhpDeSerialize(Node.InnerText); foreach (string item in Manquants) { #if DEBUG Log.LogMessage("PManager: Fichier manquant :" + item + " Fichier :" + Mapping.GetPath(item), Color.DarkBlue, 1); #endif Fichiers.Add(item, Mapping.GetFichierData(item)); break; } if (Fichiers.Count == 0) { return; } XmlBuild(ref SendAI, XmlCode.sendai); XmlNode DNode = GetFirstElement(ref SendAI, "sendai"); foreach (KeyValuePair <string, string> item in Fichiers) { XmlNode Fichier = SendAI.CreateElement(string.Empty, "MD5_" + item.Key, string.Empty); Fichier.InnerText = item.Value; DNode.AppendChild(Fichier); } HTTPRequestThread Requete = new HTTPRequestThread(SendAI, m_sURL, SyncAICB); Requete.Start(); #if DEBUG Log.LogMessage("PManager: Envois des AI : \n" + Beautify(SendAI), Color.DarkRed, 2); #endif } } m_SyncAIDone = true; }
private void HelloCB(HttpWebResponse Response) { XmlDocument xmlDoc = null; if (Response != null) { if (Response.StatusCode != HttpStatusCode.OK) { Log.LogMessage("Erreur de connexion : " + Response.StatusDescription, Color.DarkViolet); } xmlDoc = GetResultXml(ref Response); Response.Close(); } if (xmlDoc == null) { if (m_btnConnect != null) { m_btnConnect.Invoke(new Action(() => { m_btnConnect.Enabled = true;; })); } Log.LogMessage("Erreur de connexion", Color.DarkViolet); return; } //Test de la licence XmlNode Node = GetFirstElement(ref xmlDoc, "certificat"); if (Node != null) { RSAtoPHPCryptography rsa = new RSAtoPHPCryptography(); rsa.LoadCertificateFromString(Node.InnerText); Crypted_AESKey = Convert.ToBase64String(rsa.Encrypt(Convert.FromBase64String(m_sAESKey))); XmlBuild(ref SendVerify, XmlCode.verify); #if DEBUG Log.LogMessage("PManager: AES Key encrypted = " + Crypted_AESKey, Color.DarkBlue, 1); Log.LogMessage("PManager: Demande de connexion =\n " + Beautify(SendVerify), Color.DarkRed, 2); #endif HTTPRequestThread Requete = new HTTPRequestThread(SendVerify, m_sURL, ConnectCB); Requete.Start(); } }
/// <summary> /// Constructeur de la fenêtre principale /// </summary> public ffs2play() { // Définition de la culture par défaut Thread.CurrentThread.CurrentUICulture = FrenchCulture; // LeResourceManager prend en paramètre : nom_du_namespace.nom_de_la_ressource_principale RM = new System.Resources.ResourceManager("Localisation.Form1", typeof(ffs2play).Assembly); // Initialisation de contenu de la fenêtre InitializeComponent(); #if DEBUG #if P3D Text = "ffs2play P3D (version Debug)"; #else Text = "ffs2play (version Debug)"; #endif #else #if P3D Text = "ffs2play P3D"; #else Text = "ffs2play"; #endif #endif pInstance = this; // Préparation du bouton de connexion au simulateur ILConnexionFS.Images.Add(Resources.plane_red); ILConnexionFS.Images.SetKeyName(0, "Déconnecté"); ILConnexionFS.Images.Add(Resources.plane_green); ILConnexionFS.Images.SetKeyName(1, "Connecté"); btnConnectFS.ImageIndex = 0; // Préparation du bouton de connexion au serveur web ilServeur.Images.Add(Resources.connect2_R); ilServeur.Images.SetKeyName(0, "Déconnecté"); ilServeur.Images.Add(Resources.connect2_V); ilServeur.Images.SetKeyName(1, "Connecté"); btnConPirep.ImageIndex = 0; // Configuration par défaut de la fenêtre WindowState = FormWindowState.Normal; StartPosition = FormStartPosition.WindowsDefaultBounds; SetAllowUnsafeHeaderParsing20(); // Copy user settings from previous application version if necessary settings = Settings.Default; if ((bool)settings["UpgradeRequired"] == true) { // upgrade the settings to the latest version settings.Upgrade(); // clear the upgrade flag settings["UpgradeRequired"] = false; settings.Save(); } else { // the settings are up to date } // On vérifie des les données de taille et de position de la fenêtre ne sont pas vides // Et qu'elles sont toujours valides avec la configuration d'écran actuelle // Ceci pour éviter une fenêtre en dehors des limites if (Properties.Settings.Default.WindowPosition != Rectangle.Empty && IsVisibleOnAnyScreen(Properties.Settings.Default.WindowPosition)) { // Définition de la position et de la taille de la fenêtre StartPosition = FormStartPosition.Manual; DesktopBounds = Properties.Settings.Default.WindowPosition; // Définition de l'état de la fenêtre pour être maximisée // ou réduite selon la sauvegarde WindowState = Properties.Settings.Default.WindowState; } else { // Réinitialisation de la position à la valeur par défaut StartPosition = FormStartPosition.WindowsDefaultLocation; // Nous pouvons alors définir la taille enrégistrée si celle ci // Existe if (Properties.Settings.Default.WindowPosition != Rectangle.Empty) { Size = Properties.Settings.Default.WindowPosition.Size; } } // Mise à jour de l'option Météo Automatique cbEnaAutoWeather.Checked = Settings.Default.MetarAutoEnable; // La fenêtre est configurée windowInitialized = true; log = Logger.Instance; log.LogMessage("ffs2play démarré"); // Creation du contrôleur d'interface avec le simulateur scm = SCManager.Instance; // Création du contrôleur de mapping des AI m_Mapping = AIMapping.Instance; // Création du contrôleur d'inteface avec le serveur web pm = PirepManager.Instance; // Création du contrôleur d'analyse de vol Analyse = AnalyseurManager.Instance; // Création du contrôleur de connexion P2P P2P = P2PManager.Instance; if (Properties.Settings.Default.P2PEnable) { P2P.Init(true); } AcceptButton = btnSend; string[] arguments = Environment.GetCommandLineArgs(); scm.openConnection(); //Vérification de la version string CheckVersionURL; #if P3D CheckVersionURL = "http://download.ffsimulateur2.fr/ffs2playp3d.php"; #else CheckVersionURL = "http://download.ffsimulateur2.fr/ffs2play.php"; #endif if (Properties.Settings.Default.Beta) { CheckVersionURL += "?beta"; } HTTPRequestThread CheckVersion = new HTTPRequestThread(CheckVersionURL, CheckVersionCallBack); CheckVersion.Start(); if (!Properties.Settings.Default.LogVisible) { scMainWindow.Panel2Collapsed = true; scMainWindow.Panel2.Hide(); } }
/// <summary> /// Méthode cyclique du timer /// Gestion des tâches périodiques /// Pour les demandes de données sur le simulateur /// </summary> /// <param name="source"></param> /// <param name="evt"></param> private void OnLiveUpdate(object source, ElapsedEventArgs evt) { if (IsConnected() && SCM.IsConnected()) { XmlBuild(ref SendUpdate, XmlCode.liveupdate); XmlNodeList Nodes = SendUpdate.GetElementsByTagName("liveupdate"); foreach (XmlNode node in Nodes) { foreach (XmlNode child in node.ChildNodes) { switch (child.Name) { case "pilotID": child.InnerText = User.Login; break; case "registration": child.InnerText = Analyse.GetLastState().Title; break; case "latitude": child.InnerText = string.Format("{0:0.00000}", Analyse.GetLastState().Latitude); break; case "longitude": child.InnerText = string.Format("{0:0.00000}", Analyse.GetLastState().Longitude); break; case "heading": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().Heading); break; case "altitude": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().Altitude); break; case "groundSpeed": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().GSpeed); break; case "iaspeed": child.InnerText = string.Format("{0:0.}", Analyse.GetLastState().IASSpeed); break; case "squawk": child.InnerText = string.Format("{0:0.}", Outils.ConvertToBinaryCodedDecimal(Analyse.GetLastState().Squawk)); break; case "onground": child.InnerText = string.Format("{0:0.}", Convert.ToInt32(Analyse.GetLastState().OnGround)); break; case "sim": child.InnerText = SCM.GetVersion().ToString(); break; } } } #if DEBUG Log.LogMessage("PManager: Mise à jour de la position =\n " + Beautify(SendUpdate), Color.DarkRed, 2); #endif HTTPRequestThread Requete = new HTTPRequestThread(SendUpdate, m_sURL, LiveUpdateCB); Requete.Start(); } }
/// <summary> /// Callback Requete de mise à jour /// </summary> /// <param name="asyncResult"></param> private void LiveUpdateCB(HttpWebResponse Response) { // Si pas connecté au serveur on ignore le CB if (!m_bConnected) { return; } XmlDocument xmlDoc = null; // On récupère le contenu XML if (Response != null) { xmlDoc = GetResultXml(ref Response); Response.Close(); } // Si le contenu est vide on ignore le CB if (xmlDoc == null) { return; } LastGoodUpdate = DateTimeEx.UtcNowMilli; //On vérifie les erreurs retournées par le serveur if (CheckError(xmlDoc)) { Disconnect(); return; } // On charge la liste des joueurs depuis le wazzup XmlNode Wazzup = GetFirstElement(ref xmlDoc, "whazzup"); if (Wazzup != null) { P2P.Wazzup_Update(Wazzup, m_sAESKey); } //On synchronise le serveur avec les AI disponibles if ((!m_SyncAIDone) && m_AIManagement) { if (!Mapping.IsInit) { return; } XmlBuild(ref SendSyncAI, XmlCode.syncai); XmlNodeList Nodes = SendSyncAI.GetElementsByTagName("syncai"); foreach (XmlNode node in Nodes) { foreach (XmlNode child in node.ChildNodes) { switch (child.Name) { case "md5list": child.InnerText = Outils.PhpSerialize(Mapping.GetList.Keys); break; } } } HTTPRequestThread Requete = new HTTPRequestThread(SendSyncAI, m_sURL, SyncAICB); Requete.Start(); #if DEBUG Log.LogMessage("PManager: Synchronisation des AI : \n" + Beautify(SendSyncAI), Color.DarkRed, 2); #endif } // On check la méteo XmlNode Metar = GetFirstElement(ref xmlDoc, "metar"); if (Metar != null) { MetarUpdate(ref Metar); } }