Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 160 161 162 163 164 165 166 167 168 ... 206
Перейти на страницу:

    //Освободить все распределенные нами ранее ресурсы

    //------------------------------------------------

    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;

 }

} //конец класса

Листинг 15.5. Класс IrDAFileReceive

//-------------------------------------------------------------------

//Обеспечивает прием файла через IrDA (инфракрасный порт).

//

//Этот класс НЕ является реентерабельным и не должен вызываться более

//чем одной функцией за один раз. Если необходимо иметь несколько

//сеансов связи через IR, это необходимо делать путем создания

//нескольких различных экземпляров данного класса.

//-------------------------------------------------------------------

public class IrDAFileReceive {

 private bool m_wasListenerStopped;

 private string m_IrDAServiceName;

 private string m_fileNameForDownload;

 private string m_errorDuringTransfer;

 private System.Net.Sockets.IrDAListener m_irListener;

 private ReceiveStatus m_ReceiveStatus;

 public string ErrorText {

  get {

   return m_errorDuringTransfer;

  }

 }

 //--------------------------

 //Различные состояния приема

 //--------------------------

 public enum ReceiveStatus {

  NotDone_SettingUp,

  NotDone_WaitingForSender,

  NotDone_Receiving,

  Done_Success,

  Done_Aborted,

  Done_ErrorOccured

 }

 //------------------------------

 // Возвращает состояние передачи

 //------------------------------

 public ReceiveStatus Status {

  get {

   //Обеспечить многопоточную безопасность для предотвращения

   //параллельного выполнения операций чтения/записи

   lock(this) {

    return m_ReceiveStatus;

   } //конец lock

  } //конец get

 } //конец свойства

 private void setStatus(ReceiveStatus newStatus) {

  //Обеспечить многопоточную безопасность для предотвращения

  //параллельного выполнения операций чтения/записи

  lock(this) {

   m_ReceiveStatus = newStatus;

  } //конец lock

 }

 //--------------------------------------------------

 // [in] filename: желаемое имя для входного файла IR

 //--------------------------------------------------

 public IrDAFileReceive(string filename, string irdaServiceName) {

  //Имя сокета IrDA, который мы хотим открыть

  m_IrDAServiceName = irdaServiceName;

  //Имя файла, в котором мы хотим сохранить полученные данные

  m_fileNameForDownload = filename;

 }

 //----------------------------------------------------------

 //Обеспечивает асинхронный прием файла через IR

 //

 // [in] filename: имя файла, в который осуществляется запись

 //----------------------------------------------------------

 public void WaitForIRFileDownloadAsync() {

  //Заметьте, что сейчас мы находимся в режиме подготовки

  setStatus(ReceiveStatus.NotDone_SettingUp);

  //-------------------

  //Создать новый поток

  //-------------------

  System.Threading.ThreadStart threadEntryPoint;

  threadEntryPoint =

   new System.Threading.ThreadStart(WaitForIRFileDownload);

  System.Threading.Thread newThread = new System.Threading.Thread(threadEntryPoint);

  //Запустить поток на выполнение

  newThread.Start();

 }

 //------------------------------------------

 //Открывает порт IR и ожидает загрузки файла

 //------------------------------------------

 public void WaitForIRFileDownload() {

  System.IO.Stream outputStream = null;

  System.Net.Sockets.IrDAClient irdaClient = null;

  System.IO.Stream irStreamIn = null;

  try {

   //=========================================================

   //Задать и загрузить файл!

   //=========================================================

   internal WaitForIRFileDownload(ref outputStream,ref irdaClient, ref irStreamIn);

  } catch

  //Поглотить любые возникающие ошибки

  {

   setStatus(ReceiveStatus.Done_ErrorOccured);

  }

  //=============================================

  //Освободить все ресурсы

  //=============================================

  //Закрыть наш входной поток

  if (irStreamIn != null) {

   try {

    irStreamIn.Close();

   } catch {} //Поглотить любые возникающие ошибки

  }

  //Закрытие клиента IrDA

1 ... 160 161 162 163 164 165 166 167 168 ... 206
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре.
Комментарии