Создание бизнес-приложений с помощью 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. Уведомление о входящем вызове