private void Client_OnReadMessage(ClientInfo ci, uint code, byte[] bytes, int len)
 {
     if (code == 0) //String
     {
         Console.WriteLine("Received msg from Client[" + ci.ID + "]: " + Encoding.UTF8.GetString(bytes));
         if (ReceiveMessage != null)
         {
             ReceiveMessage.Invoke(Encoding.UTF8.GetString(bytes), EventArgs.Empty);
         }
     }
     else if (code == 1) //File
     {
         File.WriteAllBytes("file.txt", bytes);
     }
     else if (code == 2) //Projection
     {
         string        ret        = string.Empty;
         ProjectionObj projection = ProjectionObj.Deserialize(bytes);
         ReceiveProjection.Invoke(projection, EventArgs.Empty);
     }
     else if (code == 3) //ProjectionManger
     {
         ProjectionManager recManager = ProjectionManager.Deserialize(bytes);
         ReceiveProjectionManager.Invoke(recManager, EventArgs.Empty);
     }
     else
     {
         Console.WriteLine("Unknown msg from server, disregarding...");
     }
 }
        public Projection_Server(bool debugMode = false)
        {
            InitializeComponent();
            lblIP.Parent    = pbProject;
            lblIP.Font      = new Font(lblIP.Font.FontFamily, 16.0f); // FontStyle.Bold, 32.0f);
            lblIP.TextAlign = ContentAlignment.MiddleCenter;
            IPAddress[] ipv4Addresses = Array.FindAll(Dns.GetHostEntry(string.Empty).AddressList,
                                                      a => a.AddressFamily == AddressFamily.InterNetwork);
            lblIP.BackColor = Color.White;
            lblIP.Text      = ipv4Addresses.Last().ToString();
            warmup          = true;

            transitionTimer = new Timer()
            {
                Interval = 25
            };
            transitionStep = 0;

            if (debugMode)
            {
                StartPosition = FormStartPosition.Manual;
                Left          = 0;
                Top           = 0;
                Left          = 2000;
                debugMode     = false;
            }

            intervalWatch = new Stopwatch();
            //saveProjectionManagerWatch = new Stopwatch();
            //intervalWatch.Start();
            //saveProjectionManagerWatch.Start();



            //Clear out base image
            pbProject.Image = null;

            if (!debugMode)
            {
                WindowState = FormWindowState.Maximized;
            }
            //pbProject.Dock = DockStyle.None;

            if (!File.Exists("collection.pm"))
            {
                projectionManager = new ProjectionManager(Properties.Resources.scenic1);
                //Projection defaultProj = new Projection(DateTime.Now, DateTime.MinValue, DateTime.MaxValue)
                //{
                //    isDefault = true
                //};
            }
            else //Serialized data found
            {
                try
                {
                    projectionManager = ProjectionManager.Deserialize("collection.pm");
                    if (projectionManager == null)
                    {
                        throw new Exception("Failed to deserialize ProjectionManager state :(");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.StackTrace);
                    MessageBox.Show(this, "There was an error loading previously scheduled projections.\nData may be corrupt.", "Projection", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    projectionManager = new ProjectionManager(Properties.Resources.scenic1);
                }
            }

            displayServer = new DisplayServer();
            displayServer.projectionManager   = projectionManager;
            displayServer.ReceivedProjection += ReceiveProjection;
            displayServer.Start();

            tmrUpdate.Start();
            intervalWatch.Start();
        }