예제 #1
0
파일: Message.cs 프로젝트: k3ldar/SharedLib
        /// <summary>
        /// Converts string array to message
        /// </summary>
        /// <param name="charArray"></param>
        /// <returns></returns>
        public static Message StringArrayToMessage(char[] charArray)
        {
#if DEBUG
            EventLog.Debug("Message.cs " + System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif
            try
            {
                MessageType type = CharToMessageType(charArray[0]);

                string msgArray         = new string(charArray);
                int    sepCharsTitle    = msgArray.IndexOf("#A!");
                int    sepCharsClientID = msgArray.IndexOf("#B!");


                string title = msgArray.Substring(1, sepCharsTitle - 1);

                string  clientID = msgArray.Substring(sepCharsTitle + 3, sepCharsClientID - 3 - sepCharsTitle);
                string  contents = msgArray.Substring(sepCharsClientID + 3).TrimEnd('\0');
                Message Result   = new Message(title.Trim(), contents.Trim(), type);
                Result.SetClientID(clientID);
                return(Result);
            }
            catch (Exception err)
            {
#if DEBUG
                EventLog.Debug(err);
                EventLog.Debug("Message.cs " + System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif
                EventLog.Add(err);
                return(new Message("Error", err.Message, MessageType.Error));
            }
        }
예제 #2
0
        /// <summary>
        /// Sends the message to the server
        /// </summary>
        /// <param name="message">Message to be sent</param>
        internal void sendMessage(Message message)
        {
#if DEBUG
            EventLog.Debug(String.Format("{0} - {1}", message.Title, message.Contents));
            EventLog.Debug("MessageClient.cs " + System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif
            try
            {
                if (_tcpClient != null && _tcpClient.Connected)
                {
                    message.SetClientID(_clientID);

                    if (String.IsNullOrEmpty(message.ClientID))
                    {
                        message.SetClientID("SERVER");
                    }


                    char[] characters = Message.MessageToStringArray(message);
                    byte[] toSend     = System.Text.Encoding.UTF8.GetBytes(characters, 0, characters.Length);

                    _tcpClient.GetStream().Write(toSend, 0, toSend.Length);
                }
            }
            catch (Exception err)
            {
#if DEBUG
                EventLog.Debug(err);
                EventLog.Debug("MessageClient.cs " + System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif
                if (!HandleClientException(err))
                {
                    throw;
                }
            }
        }
예제 #3
0
        protected override bool Run(object parameters)
        {
#if DEBUG
            EventLog.Debug("MessageClient.cs " + System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif

            byte brokenMessageCount = 0;

            try
            {
                while (_parentMessageClient.IsRunning)
                {
                    // Block until an instance Message is received
                    byte[] bytes = new byte[(int)_parentMessageClient.BufferSize];

                    // Read can return anything from 0 to numBytesToRead.
                    // This method blocks until at least one byte is read.

                    do
                    {
                        int bytesRead = _parentMessageClient._tcpClient.GetStream().Read(bytes, 0, bytes.Length);

                        _completeMessage.AppendFormat("{0}", Encoding.UTF8.GetString(bytes, 0, bytesRead));
                    } while (_parentMessageClient._tcpClient.GetStream().DataAvailable);

                    //if we haven't got the complete message, keep going until it's here
                    if (!_completeMessage.ToString().EndsWith("#END#") && brokenMessageCount < 100)
                    {
                        brokenMessageCount++;
                        continue;
                    }

                    brokenMessageCount = 0;

                    string[] messages = _completeMessage.ToString().Split(new string[] { "#END#" }, StringSplitOptions.None);

                    _completeMessage.Clear();

                    foreach (string msg in messages)
                    {
                        if (String.IsNullOrEmpty(msg.Trim()))
                        {
                            continue;
                        }

                        Message message = Message.StringToMessage(msg);

#if DEBUG
                        EventLog.Debug("MessageClient.cs " + System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif


                        //have we stopped running?
                        if (!_parentMessageClient.IsRunning)
                        {
                            return(false);
                        }

                        if (MessageReceived != null && message != null)
                        {
                            switch (message.Type)
                            {
                            case MessageType.Command:
                                //some command messages are handled internally
                                switch (message.Title)
                                {
                                case "NEWCLIENTID":
                                    _parentMessageClient.ClientID = message.Contents;
                                    _parentMessageClient.RaiseClientIDChanged();
                                    break;

                                case "SERVERSTOPPING":
                                    _parentMessageClient.StopListening();
                                    break;

                                case "LOGIN_REQUIRED":
                                    string loginDetails = _parentMessageClient.RaiseLoginRequired(message.Contents);

                                    _parentMessageClient.sendMessage(new Message("LOGIN", loginDetails, MessageType.Command));
                                    break;

                                case "LOGIN_FAILED":
                                    _parentMessageClient.StopListening();
                                    _parentMessageClient.RaiseLoginFailed();
                                    break;

                                case "LOGGED_IN":
                                    _parentMessageClient.RaiseLoggedIn();
                                    break;

                                case "TIMEOUT":
                                    _parentMessageClient.TimeOut = true;
                                    break;

                                case "CONNECTION_REFUSED":
                                    _parentMessageClient.RaiseConnectionRefused();
                                    break;

                                default:         //not an internal message process as normal
                                    message.SetClientID(_parentMessageClient.ClientID);
                                    MessageReceived(this, message);
                                    break;
                                }

                                break;

                            case MessageType.File:
                                string newFileName = _parentMessageClient.RaiseFileReceive(message.Title);
                                //FileTransfer transfer = new FileTransfer();
                                //transfer.FileReceived += RaiseFileReceived;
                                //transfer.ProcessClientFiles(this, message);

                                byte[] rebin = Convert.FromBase64String(message.Contents);
                                using (FileStream fs = new FileStream(newFileName, FileMode.Create))
                                {
                                    using (BinaryWriter bw = new BinaryWriter(fs))
                                        bw.Write(rebin);
                                }

                                _parentMessageClient.RaiseFileReceived(this, new TransferFileEventArgs(newFileName));
                                MessageReceived(this, message);

                                continue;

                            default:

                                // any other message forward onto event handler
                                message.SetClientID(_parentMessageClient.ClientID);
                                MessageReceived(this, message);
                                break;
                            }
                        }
                    }
                }
            }
            catch
#if DEBUG
            (ObjectDisposedException errDisposed)
#else
            (ObjectDisposedException)
#endif
            {
#if DEBUG
                EventLog.Debug(errDisposed);
                EventLog.Debug("MessageClient.cs ObjectDisposedException " +
                               System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif
                return(false);
            }
            catch (Exception err)
            {
#if DEBUG
                EventLog.Debug(err);
                EventLog.Debug("MessageClient.cs Exception " +
                               System.Reflection.MethodBase.GetCurrentMethod().Name);
#endif
                if (!_parentMessageClient.HandleClientException(err))
                {
                    throw;
                }
            }

            return(!HasCancelled());
        }