예제 #1
0
        /// <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;
                }
            }
        }
예제 #2
0
        /// <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);
                }
            }
        }
예제 #3
0
        /// <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();
            }
        }
예제 #4
0
        /// <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;
        }
예제 #5
0
        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();
            }
        }
예제 #6
0
        /// <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();
            }
        }
예제 #7
0
        /// <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();
            }
        }
예제 #8
0
        /// <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);
            }
        }