Книга: Программирование мобильных устройств на платформе .NET Compact Framework

Листинг 15.4. Класс IrDAIrDAFileSend

Листинг 15.4. Класс IrDAIrDAFileSend

//====================================================================
//Этот класс является клиентом IrDA. Он осуществляет поиск сервера
//IrDA, имя которого совпадает с именем службы IrDA, и после того, как
//он найден, направляет ему поток данных файла.
//====================================================================
class IrDAFileSend {
 private string m_descriptionOfLastSendAttempt;
 private string m_IrDAServiceName;
 private string m_fileToSend;
 private bool m_wasSenderStopped;
 public enum SendStatus {
  AttemptingToSend,
  Finished_Successfully,
  Finished_Aborted,
  Finished_Error
 }
 private SendStatus m_SendStatus;
 public SendStatus Status {
  get {
   //Блокировка выполнения параллельных операций чтения/записи в m_SendStatus
   lock(this) {return m_SendStatus;}
  }
 }
 private void setStatus(SendStatus newStatus) {
  //Блокировка выполнения параллельных операций чтения/записи в m_SendStatus
  lock(this) {m_SendStatus = newStatus;}
 }
 public string ErrorText {
  get {return m_descriptionOfLastSendAttempt;}
 }
 //-----------
 //КОНСТРУКТОР
 //-----------
 public IrDAFileSend(string fileToSend,string irdaServiceName) {
  //Имя сокета IrDA, поиск которого мы хотим осуществить
  m_IrDAServiceName = irdaServiceName;
  //Файл, который мы хотим передать
  m_fileToSend = fileToSend;
 }
 //--------------------------------------------------------------
 //Запускает новый поток для осуществления попытки отправки файла
 //--------------------------------------------------------------
 public void LoopAndAttemptIRSendAsync() {
  //Мы находимся в режиме передачи
  setStatus(SendStatus.AttemptingToSend);
  //Пользователь пока что не отменил выполнение операции
  m_wasSenderStopped = false;
  //Это функция, которую должен запустить на выполнение новый поток
  System.Threading.ThreadStart threadEntryPoint;
  threadEntryPoint = new System.Threading.ThreadStart(LoopAndAttemptIRSend);
  //-----------------------------------
  //Создать новый поток и запустить его
  //-----------------------------------
  System.Threading.Thread newThread = new System.Threading.Thread(threadEntryPoint);
  newThread.Start(); //Вперед!
 }
 //-----------------------------------------------------
 //Входит в цикл и пытается передать файл посредством IR
 //-----------------------------------------------------
 public void LoopAndAttemptIRSend() {
  System.Net.Sockets.IrDAClient irDASender;
  System.IO.Stream streamOutToIrDA;
  System.IO.Stream streamInFromFile;
  //Пользователь пока что не отменил выполнение операции
  m_wasSenderStopped = false;
  setStatus(SendStatus.AttemptingToSend);
  //-----------------------------------------------------------------
  //Непрерывное выполнение цикла, пока не удастся отправить сообщение
  //-----------------------------------------------------------------
  while(true) {
   //Значения всех этих переменных должны быть нулевыми до и после
   //вызова 'sendStream(...)', если не было сгенерировано исключение!
   irDASender = null;
   streamOutToIrDA = null;
   streamInFromFile = null;
   //Попытаться передать поток
   bool bSuccess;
   try {
    bSuccess = sendStream(
     out m_descriptionOfLastSendAttempt, ref streamOutToIrDA,
     ref irDASender, ref streamInFromFile);
   } catch (System.Exception eUnexpected) //Неожиданная ошибка!!!
   {
    setStatus(SendStatus.Finished_Error); //Отметить возникновение сбоя
    m_descriptionOfLastSendAttempt =
     "Unexpected error in IR send loop. " + eUnexpected.Message;
    //------------------------------------------------
    //Освободить все распределенные нами ранее ресурсы
    //------------------------------------------------
    if (streamOutToIrDA != null) {
     try {
      streamOutToIrDA.Close();
     } саtch{};//Поглотить любую ошибку
     streamOutToIrDA = null;
    }
    if (streamInFromFile != null) {
     try {
      streamInFromFile.Close();
     } catch{};//Поглотить любую ошибку
     streamInFromFile = null;
    }
    if (irDASender != null) {
     try {
      irDASender.Close();
     } catch{}; //Поглотить любую ошибку
     irDASender = null;
    }
    return; //Выход
   }
   //Проверить успешность выполнения
   if (bSuccess == true) {
    m_descriptionOfLastSendAttempt = "Success!";
    setStatus(SendStatus.Finished_Successfully);
    return;
   }
   //Проверить, не была ли операция отменена пользователем
   if (m_wasSenderStopped == true) {
    m_descriptionOfLastSendAttempt = "User Aborted.";
    setStatus(SendStatus.Finished_Aborted);
    return;
   }
   //B противном случае... Нам пока не удалось обнаружить сервер IrDA,
   //имя которого совпадает с именем службы. Мы продолжим выполнение
   //цикла и попытаемся найти сервер.
  }
  //Мы никогда не попадем в это место программы при выполнении
 }
 //Попытаться передать поток ввода-вывода (например, файл) посредством IR
 //[возвращаемое значение]:
 // true: успешная передача файла
 // false: файл не был успешно передан
 private bool sendStream(
  out string errorDescription, ref System.IO.Stream streamOutToIrDA,
  ref System.Net.Sockets.IrDAClient irDASender, ref System.IO.Stream streamInFromFile) {
  errorDescription = "";
  //----------------------------
  //Создание нового клиента IRDA
  //----------------------------
  try {
   //-------------------------------------------------------
   //Возврат произойдет довольно быстро. Клиент будет выбран
   //и возвращен, если прослушивающие клиенты отсутствуют.
   //-------------------------------------------------------
   irDASender = new System.Net.Sockets.IrDAClient(m_IrDAServiceName);
  } catch (System.Exception eCreateClient) {
   //B данном случае могло возникнуть несколько ситуаций:
   //#1: отсутствуют прослушивающие устройства
   //#2: прослушивающее устройство существует, но не реагирует
   // (может отказаться от разговора)
   errorDescription = eCreateClient.Message;
   return false;
  }
  //B данном случае могло возникнуть несколько ситуаций:
  //#1: Мы получили соединение от приемного устройства IR
  //#2: IR-запрос был отменен (кто-то вызвал функцию STOP).
  if (m_wasSenderStopped == true) {
   irDASender.Close();
   irDASender = null;
   return false;
  }
  //==========================================
  //ПЕРЕДАТЬ ДАННЫЕ!
  //==========================================
  //Открыть файл, который мы хотим передать
  streamInFromFile = System.IO.File.OpenRead(m_fileToSend);
  //Открыть сокет IrDA, которому мы хотим передать данные
  streamOutToIrDA = irDASender.GetStream();
  const int BUFFER_SIZE = 1024;
  byte[] inBuffer = new byte[BUFFER_SIZE];
  int bytesRead;
  int iTestAll = 0;
  int iTestWrite = 0;
  do {
   //Считать байты из файла
   bytesRead = streamInFromFile.Read(inBuffer, 0, BUFFER_SIZE);
   iTestAll = iTestAll + 1;
   //Записать байты в наш выходной поток
   if (bytesRead > 0) {
    streamOutToIrDA.Write(inBuffer, 0, bytesRead);
    iTestWrite = iTestWrite + 1;
   }
  } while (bytesRead > 0);
  //Сбросить выходной поток
  streamOutToIrDA.Flush(); //Закончить запись любых данных
  streamOutToIrDA.Close(); //Закрыть поток
  streamOutToIrDA = null;
  //Освободить локальный файл
  streamInFromFile.Close();
  streamOutToIrDA = null;
  //Освободить порт IrDA
  irDASender.Close();
  irDASender = null;
  //Успешное завершение!!!
  return true;
 }
} //конец класса

Оглавление книги


Генерация: 1.130. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз