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
}
}