private void MessageReceivedCallback(IAsyncResult result)
        {
            Tuple <MessageReader, bool> state =
                result.AsyncState as Tuple <MessageReader, bool>;

            MessageReader packetAssembler      = state.Item1;
            bool          listenForNextMessage = state.Item2;

            try
            {
                int bytesReceived = this.client.Socket.EndReceive(result);

                if (bytesReceived > 0)
                {
                    Message message =
                        SerManager.Deserialize <Message>(packetAssembler.DataBuffer);

                    packetAssembler.Dispose();

                    this.client.MsgQueue.Enqueue(message);

                    if (listenForNextMessage)
                    {
                        this.ReadLengthPrefix(listenForNextMessage);
                    }
                }
            }
            catch
            {
                packetAssembler.Dispose();
            }
        }
Example #2
0
        private void LengthPrefixReceivedCallback(IAsyncResult result)
        {
            Tuple <Client, PrefixReader, bool> state = (Tuple <Client, PrefixReader, bool>)result.AsyncState;

            if (state.Item1.Disposed)
            {
                state.Item2.Dispose();
                return;
            }

            try
            {
                int bytesRead = state.Item1.Socket.EndReceive(result);
                state.Item2.PushReceivedData(bytesRead);

                if (state.Item2.BytesToRead == 0)
                {
                    int messageLength = SerManager.GetLengthPrefix(state.Item2.PrefixData) - PrefixReader.PrefixBytes;
                    state.Item2.Dispose();
                    this.ReadMessage(state.Item1, messageLength, state.Item3);
                }
                else
                {
                    this.ContinueReadingLengthPrefix(state);
                }
            }
            catch
            {
                state.Item1.ErrorsAccumulated++;
                state.Item1.Dispose();
                state.Item2.Dispose();
                Console.WriteLine("Error while reading length prefix");
            }
        }
        private void LengthPrefixReceivedCallback(IAsyncResult result)
        {
            Tuple <PrefixReader, bool> state = (Tuple <PrefixReader, bool>)result.AsyncState;

            try
            {
                int bytesRead = this.client.Socket.EndReceive(result);
                state.Item1.PushReceivedData(bytesRead);

                if (state.Item1.BytesToRead == 0)
                {
                    int messageLength = SerManager.GetLengthPrefix(state.Item1.PrefixData) - PrefixReader.PrefixBytes;
                    state.Item1.Dispose();
                    this.ReadMessage(messageLength, state.Item2);
                }
                else
                {
                    this.ContinueReadingLengthPrefix(state);
                }
            }
            catch
            {
                state.Item1.Dispose();
                this.ReadMessagesContinuously();
            }
        }
Example #4
0
        public void SendTo(Client client, Message message)
        {
            if (client.Disposed)
            {
                return;
            }

            Tuple <byte[], int> data = null;

            try
            {
                data = SerManager.SerializeToManagedBufferPrefixed(message, this.server.Buffers);

                if (client.Disposed)
                {
                    this.server.Buffers.Return(data.Item1);
                    return;
                }

                client.Socket.BeginSend(data.Item1, 0, data.Item2, SocketFlags.None, this.SendToCallback, Tuple.Create(client, data.Item1));
            }
            catch (Exception e)
            {
                client.ErrorsAccumulated++;
                this.server.Buffers.Return(data?.Item1);
                Console.WriteLine(e.ToString());
            }
        }
Example #5
0
        public void SendToThenDropConnection(Client client, Message message)
        {
            if (client.Disposed)
            {
                return;
            }

            Tuple <byte[], int> data = null;

            try
            {
                data = SerManager.SerializeToManagedBufferPrefixed(message, this.server.Buffers);

                if (client.Disposed)
                {
                    this.server.Buffers.Return(data.Item1);
                    return;
                }

                client.Socket.Send(data.Item1, 0, data.Item2, SocketFlags.None);

                this.server.Auth.TryLogout(client);
                client.Dispose();
                this.server.Buffers.Return(data.Item1);
            }
            catch (Exception e)
            {
                this.server.Buffers.Return(data?.Item1);
                this.server.Auth.TryLogout(client);
                client.Dispose();
                Console.WriteLine(e.ToString());
            }
        }
Example #6
0
        /// <summary>
        /// Does the "real" translation unit creating, adds it to TranslationUnits collection, from which its later available.
        /// </summary>
        /// <param name="fileName">
        /// A <see cref="string"/>: The filename associated with the translation unit. Basically the source file's name
        /// </param>
        /// <param name = "unsavedFiles">
        /// A <see cref="CXUnsavedFile"/> array: array with the contents of unsaved files in IDE. Safe to be a null sized array - CDocumentParser.Parse reparses the TU with properly initialized unsaved files.
        /// </param>
        /// <param name = "force">Set to true when an existing Translation Unit should be disposed and remade.</param>
        void AddToTranslationUnits(string fileName, CXUnsavedFile[] unsavedFiles, bool force)
        {
            lock (SyncRoot) {
                var options = clang.defaultEditingTranslationUnitOptions();                 // & ~(uint)CXTranslationUnit_Flags.PrecompiledPreamble; <- without this we have NO ERROR MARKERS!

                if (!force)
                {
                    if (!SerializationManager.SerFormIsUpToDate(fileName))
                    {
                        SerManager.Update(fileName, CmdArguments(fileName));
                    }
                    translationUnits.Add(fileName, clang.createTranslationUnit(index, fileName + ".pch"));
                    Loaded [fileName] = true;
                }
                else
                {
                    translationUnits.Add(fileName, clang.parseTranslationUnit(
                                             index,
                                             fileName,
                                             CmdArguments(fileName),
                                             CmdArguments(fileName).Length,
                                             unsavedFiles,
                                             (uint)unsavedFiles.Length,
                                             options
                                             ));
                }
                UpdateDatabase(fileName, translationUnits[fileName]);
                SerManager.Add(fileName, CmdArguments(fileName));                   //this is here to avoid a data race with configurations.
            }
        }
Example #7
0
 void HandleRename(object sender, ProjectFileRenamedEventArgs args)
 {
     foreach (var e in args)
     {
         translationUnits.Remove(e.OldName);
         CreateTranslationUnit(e.NewName, project.UnsavedFiles.Get().ToArray());
         SerManager.Rename(e.OldName, e.NewName, CmdArguments(e.NewName));
     }
 }
        public void Send(Message message)
        {
            Tuple <byte[], int> data = null;

            try
            {
                data = SerManager.SerializeToManagedBufferPrefixed(message, this.client.Buffers);

                this.client.Socket.BeginSend(data.Item1, 0, data.Item2, SocketFlags.None, this.SendCallback, data.Item1);
            }
            catch
            {
                this.client.Buffers.Return(data?.Item1);
            }
        }
Example #9
0
        void HandleChange(object sender, ProjectFileEventArgs args)
        {
            foreach (var e in args)
            {
                CheckForBom(e.ProjectFile.Name);

                if (!project.Loading && !project.IsCompileable(e.ProjectFile.Name) &&
                    e.ProjectFile.BuildAction == BuildAction.Compile)
                {
                    e.ProjectFile.BuildAction = BuildAction.None;
                }

                SerManager.Update(e.ProjectFile.Name, CmdArguments(e.ProjectFile.Name));
            }
        }
Example #10
0
        void HandleRemoval(object sender, ProjectFileEventArgs args)
        {
            foreach (var e in args)
            {
                if (!project.Loading && !project.IsCompileable(e.ProjectFile.Name) &&
                    e.ProjectFile.BuildAction == BuildAction.Compile)
                {
                    e.ProjectFile.BuildAction = BuildAction.None;
                }
                if (e.ProjectFile.BuildAction == BuildAction.Compile)
                {
                    RemoveTranslationUnit(e.ProjectFile.Name);
                }

                SerManager.Remove(e.ProjectFile.Name);
            }
        }
Example #11
0
        private void MessageReceivedCallback(IAsyncResult result)
        {
            Tuple <Client, MessageReader, bool> state =
                result.AsyncState as Tuple <Client, MessageReader, bool>;

            if (state == null || state.Item1.Disposed)
            {
                state?.Item2.Dispose();
                return;
            }

            Client        client               = state.Item1;
            MessageReader packetAssembler      = state.Item2;
            bool          listenForNextMessage = state.Item3;

            try
            {
                int bytesReceived = client.Socket.EndReceive(result);

                if (bytesReceived > 0)
                {
                    Message message =
                        SerManager.Deserialize <Message>(packetAssembler.DataBuffer);

                    packetAssembler.Dispose();

                    // handle the data
                    this.server.Parser.ParseReceived(client, message);

                    if (state.Item3)
                    {
                        this.ReadLengthPrefix(client, listenForNextMessage);
                    }
                }
            }
            catch (Exception e)
            {
                client.ErrorsAccumulated++;
                packetAssembler.Dispose();
                this.server.Responses.SomethingWentWrong(client);
                client.Dispose();

                Console.WriteLine(e.ToString());
            }
        }
Example #12
0
        public AsynchronousSocketListener()
        {
            this.connectionHandle = new ManualResetEvent(false);
            this.listener         = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            this.Clients = new ConcurrentDictionary <Guid, Client>();
            this.Players = new ConcurrentDictionary <Guid, PlayerDTO>();
            this.Battles = new ConcurrentDictionary <Guid, BattleInfo>();
            //this.BlockedIps = new ConcurrentDictionary<string, DateTime>();
            this.Context = new SimpleWarsContext();

            this.Auth      = new AuthenticationServices(this);
            this.Game      = new GameServices(this);
            this.Reader    = new DefaultReader(this);
            this.Writer    = new DefaultWriter(this);
            this.Responses = new PredefinedResponses(this);
            this.Parser    = new DefaultParser(this);
            this.Buffers   = new Buffers(BufferPoolSize, MaxBufferSize);
            this.PingByte  = SerManager.SerializeWithLengthPrefix(Messages.Ping);
        }