コード例 #1
0
        private void HandleChatMessage(NetworkPacket netPacket)
        {
            RequestChatMessage requestChatMessage = RequestChatMessage.StaticDeserialize(netPacket.Message.ToArray());

            Console.WriteLine("HandleChatMessage, Sender: {0}, Message: {1}, Recipient: {2}, Size: {3}", requestChatMessage.Sender, requestChatMessage.Message, requestChatMessage.Recipient, requestChatMessage.PacketSize);
            bool isPublicMessage = false;

            /*
             *  Handle one-to-many chat messages
             */
            Chat activeChat = chatList.Find(chat => isPublicMessage = chat.ChatName.Equals(requestChatMessage.Recipient));

            if (activeChat != null)
            {
                activeChat.GetUserList().ForEach(user => {
                    NetworkPacket sendPacket = new NetworkPacket(null, requestChatMessage.Serialize());
                    Console.WriteLine("Send message packet to {0}, {1}, {2}", user.Username, requestChatMessage.Recipient, activeChat.ChatName);
                    AsyncSendPacket(sendPacket, user);
                });
            }

            /*
             *  Handle private chat messages
             */
            if (!isPublicMessage)
            {
                NetworkPacket sendPacket = netPacket;
                userList
                .FindAll(user => user.Username == requestChatMessage.Recipient || user.Username == requestChatMessage.Sender)
                .ForEach(user => AsyncSendPacket(netPacket, user));
            }
            netPacket.Message.Clear();
        }
コード例 #2
0
 public void ShowDialog(MessengerClientMain owner, String chatName, RequestChatMessage requestChatMessage)
 {
     UI.FormChat form = new UI.FormChat(owner, chatName);
     if (requestChatMessage != null)
     {
         form.messageList.Add(requestChatMessage);
     }
     chatWindowList.Add(form);
     form.ShowDialog();
 }
コード例 #3
0
        public void AddNewChatWindow(MessengerClientMain owner, String chatName, RequestChatMessage requestChatMessage = null)
        {
            bool isChatWindowOpen = false;

            foreach (UI.FormChat chat in chatWindowList)
            {
                if (chat.chatName == chatName)
                {
                    isChatWindowOpen = true;
                    break;
                }
            }
            if (!isChatWindowOpen)
            {
                Thread thread = new Thread(() => ShowDialog(owner, chatName, requestChatMessage));
                thread.Name = "thread" + addedWindowsThreadList.Count;
                thread.Start();
                addedWindowsThreadList.Add(thread);
            }
        }
コード例 #4
0
        public void ReceiveDataCallback(IAsyncResult ar)
        {
            // Retrieve the state object and the handler socket from the asynchronous state object.
            NetworkPacket netPacket = (NetworkPacket)ar.AsyncState;
            // Read data from the client socket.
            int bytesRead = netPacket.WorkSocket.EndReceive(ar);

            netPacket.Message.AddRange(netPacket.Buffer);
            int packetSize = BitConverter.ToInt32(netPacket.Message.ToArray(), 0);

            if (packetSize <= 0)
            {
                netPacket.WorkSocket.BeginReceive(
                    netPacket.Buffer, 0, netPacket.BufferSize, 0, new AsyncCallback(ReceiveDataCallback), netPacket);
                return;
            }
            if (bytesRead > 0 && netPacket.Message.Count < packetSize)
            {
                netPacket.BufferSize = packetSize - netPacket.Message.Count;
                netPacket.Buffer     = new byte[netPacket.BufferSize];
                netPacket.WorkSocket.BeginReceive(
                    netPacket.Buffer, 0, netPacket.BufferSize, 0, new AsyncCallback(ReceiveDataCallback), netPacket);
                return;
            }
            else
            {
                switch (RequestBase.GetPacketAction(netPacket))
                {
                /*
                 * case RequestID.RequestResponse: {
                 *      RequestResponse response = new RequestResponse(netPacket);
                 *      switch (response.ResponsePacketAction) {
                 *          case RequestID.LoginRequestAction: {
                 *                  RequestLogin requestLogin = new RequestLogin();
                 *                  requestLogin.Deserialize(netPacket.Message.ToArray());
                 *                  break;
                 *              }
                 *          case RequestID.ChatMessageRequestAction: {
                 *                  break;
                 *              }
                 *          default:
                 *              break;
                 *      }
                 *      break;
                 *  }
                 *
                 * case RequestID.LoginRequestAction: {
                 *      RequestLogin requestLogin = new RequestLogin();
                 *      requestLogin.Deserialize(netPacket.Message.ToArray());
                 *      break;
                 *  }
                 */

                /*
                 *  Handle received chat messages
                 */
                case RequestID.ChatMessageRequestAction: {
                    RequestChatMessage requestChatMessage =
                        RequestChatMessage.StaticDeserialize(netPacket.Message.ToArray());
                    UI.FormChat formChat = chatWindowList.Find(chat => {
                            return((requestChatMessage.Recipient == User.Username &&
                                    requestChatMessage.Sender == chat.chatName) ||
                                   requestChatMessage.Recipient == chat.chatName);
                        });
                    if (formChat != null)
                    {
                        formChat.messageList.Add(requestChatMessage);
                    }
                    else
                    {
                        AddNewChatWindow(this, requestChatMessage.Sender == User.Username ? requestChatMessage.Recipient : requestChatMessage.Sender, requestChatMessage);
                    }
                    break;
                }

                /*
                 *  Handle received chatUserLists
                 */
                case RequestID.RequestGetChatUserList: {
                    form.requestGetChatUserList.Add(
                        RequestGetChatUserList.StaticDeserialize(netPacket.Message.ToArray()));
                    break;
                }
                }
            }
            IsReceivingData = false;
        }