using System; using Hik.Communication.Scs.Communication; using Hik.Communication.Scs.Communication.EndPoints.Tcp; using Hik.Communication.ScsServices.Client; using Hik.Communication.ScsServices.Communication.Messages; using Hik.Samples.Scs.IrcChat.Arguments; using Hik.Samples.Scs.IrcChat.Contracts; namespace Hik.Samples.Scs.IrcChat.Client { /// /// This class is a mediator with view and SCS system. /// internal class ChatController : IChatController { #region Private fields /// /// Reference to login form. /// public ILoginFormView LoginForm { get; set; } /// /// Reference to chat room window. /// public IChatRoomView ChatRoom { get; set; } /// /// The object which handles remote method calls from server. /// It implements IChatClient contract. /// private ChatClient _chatClient; /// /// This object is used to connect to SCS Chat Service as a client. /// private IScsServiceClient _scsClient; #endregion #region IChatController implementation /// /// Connects to the server. /// It automatically Logins to server if connection success. /// public void Connect() { //Disconnect if currently connected Disconnect(); //Create a ChatClient to handle remote method invocations by server _chatClient = new ChatClient(ChatRoom); //Create a SCS client to connect to SCS server _scsClient = ScsServiceClientBuilder.CreateClient(new ScsTcpEndPoint(LoginForm.ServerIpAddress, LoginForm.ServerTcpPort), _chatClient); //Register events of SCS client _scsClient.Connected += ScsClient_Connected; _scsClient.Disconnected += ScsClient_Disconnected; //Connect to the server _scsClient.Connect(); } /// /// Disconnects from server if it is connected. /// public void Disconnect() { if (_scsClient != null && _scsClient.CommunicationState == CommunicationStates.Connected) { try { _scsClient.Disconnect(); } catch { } _scsClient = null; } } /// /// Sends a public message to room. /// It will be seen by all users in room. /// /// Message to be sent public void SendMessageToRoom(ChatMessage message) { _scsClient.ServiceProxy.SendMessageToRoom(message); } /// /// Change status of user. /// /// New status public void ChangeStatus(UserStatus newStatus) { _scsClient.ServiceProxy.ChangeStatus(newStatus); } /// /// Sends a private message to a user. /// /// Destination nick /// Message public void SendPrivateMessage(string nick, ChatMessage message) { _scsClient.ServiceProxy.SendPrivateMessage(nick, message); } #endregion #region Private methods /// /// This method handles Connected event of _scsClient. /// /// Source of event /// Event arguments private void ScsClient_Connected(object sender, EventArgs e) { try { _scsClient.ServiceProxy.Login(LoginForm.CurrentUserInfo); ChatRoom.OnLoggedIn(); } catch (ScsRemoteException ex) { Disconnect(); ChatRoom.OnLoginError(ex.InnerException != null ? ex.InnerException.Message : ex.Message); } catch { Disconnect(); ChatRoom.OnLoginError("Can not login to server. Please try again later."); } } /// /// This method handles Disconnected event of _scsClient. /// /// Source of event /// Event arguments private void ScsClient_Disconnected(object sender, EventArgs e) { ChatRoom.OnLoggedOut(); } #endregion } }