Создание бизнес-приложений с помощью Silverlight - Реализация извещающих уведомлений
ОГЛАВЛЕНИЕ
Реализация извещающих уведомлений
Приложение центра обработки звонков должно иметь возможность создать всплывающее сообщение с информацией о вызывающих. Рабочий день центра обработки звонков начинается с регистрации представителя с помощью сервера центра обработки звонков. Извещающие уведомления реализуются с помощью ориентированных на подключения сокетов. Полная реализация сервера диспетчера звонков не показана на рисунках, но входит в прилагающийся к статье загружаемый код. Когда клиент Silverlight выполняет подключение через сокет на сервере, новый объект RepConnection добавляется к RepList. RepList – это общий список, проиндексированный уникальным номером представителя. При приходе вызова этот список используется для обнаружения доступного представителя и, посредством подключения через сокет, связанного с RepConnection, отправки информации о вызове в виде уведомления для агента. RepConnection использует ReceiveBuffer, как показано на рис. 13.
Рис. 13. RepConnection использует ReceiveBuffer
class SocketBuffer
{
public const int BUFFERSIZE = 5120;
protected byte[] _buffer = new byte[BUFFERSIZE]
protected int _offset = 0;
public byte[] Buffer
{
get { return _buffer; }
set { _buffer = value; }
}
//offset will always indicate the length of the buffer that is filled
public int Offset
{
get {return _offset ;}
set { _offset = value; }
}
public int Remaining
{
get { return _buffer.Length - _offset; }
}
}
class ReceiveBuffer : SocketBuffer
{
//removes a serialized message from the buffer, copies the partial message
//to the beginning and adjusts the offset
public void AdjustBuffer()
{
int messageSize = BitConverter.ToInt32(_buffer, 0);
int lengthToCopy = _offset - NetworkMessage.LENGTH_BYTES - messageSize;
Array.Copy(_buffer, _offset, _buffer, 0, lengthToCopy);
offset = lengthToCopy;
}
//this method checks if a complete message is received
public bool IsMessageReceived()
{
if (_offset < 4)
return false;
int sizeToRecieve = BitConverter.ToInt32(_buffer, 0);
//check if we have a complete NetworkMessage
if((_offset - 4) < sizeToRecieve)
return false; //we have not received the complete message yet
//we received the complete message and may be more
return true;
}
}
Симулятор Silverlight будет здесь использоваться для сброса вызова в CallDispatcher._callQueue и инициации процесса всплывания окна. CallDispatcher не показан ни на одном из рисунков, но доступен в прилагающемся к статье коде. Он присоединяет обработчик к _callQueue.OnCallReceived и получает уведомление, когда симулятор ставит в очередь сообщение к _callQueue внутри реализации ProcessMessage. Пользуясь всплывающими диалогами, о которых я говорил ранее, клиент отобразит уведомление о принятии или отклонении вызова, как показано на рис. 14. Вот строка кода, отвечающая за отображение собственно диалога уведомления с рис. 8:
ClientGlobals.notifyCallPopup.ShowDialog(true);
Рис. 14. Уведомление о входящем вызове