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

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

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

Option Strict On
'====================================================================
'Этот класс является клиентом IrDA. Он осуществляет поиск сервера
'IrDA, имя которого совпадает с именем службы IrDA, и после того, как
'он найден, направляет ему поток данных файла,
'====================================================================
Class IrDAFileSend
Private m_descriptionOfLastSendAttempt As String
Private m_IrDAServiceName As String
Private m_fileToSend As String
Private m_wasSenderStopped As Boolean
Public Enum SendStatus
 AttemptingToSend
 Finished_Successfully
 Finished_Aborted
 Finished_Error
End Enum
Private m_SendStatus As SendStatus
Public ReadOnly Property Status() As SendStatus
 Get
  'Блокировка выполнения параллельных операций чтения/записи в m_SendStatus
  SyncLock (Me)
   Return m_SendStatus
  End SyncLock
 End Get
End Property
Private Sub setStatus(ByVal newStatus As SendStatus)
 'Блокировка выполнения параллельных операций чтения/записи в m SendStatus
 SyncLock (Me)
  m_SendStatus = newStatus
 End SyncLock
End Sub
Public ReadOnly Property ErrorText() As String
 Get
  Return m_descriptionOfLastSendAttempt
 End Get
End Property
'-----------
'КОНСТРУКТОР
'-----------
Public Sub New(ByVal fileToSend As String, ByVal irdaServiceName As String)
 'Имя сокета IrDA, поиск которого мы хотим осуществить
 m_IrDAServiceName = irdaServiceName
 'Файл, который мы хотим передать
 m_fileToSend = fileToSend
End Sub
'--------------------------------------------------------------
'Запускает новый поток для осуществления попытки отправки файла
'--------------------------------------------------------------
Public Sub LoopAndAttemptIRSendAsync()
 'Мы находимся в режиме передачи
 setStatus(SendStatus.AttemptingToSend)
 'Пользователь пока что не отменил выполнение операции
 m_wasSenderStopped = False
 'Это функция, которую должен запустить на выполнение новый поток
 Dim threadEntryPoint As System.Threading.ThreadStart
 threadEntryPoint = _
  New System.Threading.ThreadStart(AddressOf LoopAndAttemptIRSend)
 '-----------------------------------
 'Создать новый поток и запустить его
 '-----------------------------------
 Dim newThread As System.Threading.Thread = _
  New System.Threading.Thread(threadEntryPoint)
 newThread.Start()
 'Вперед!
End Sub
'-----------------------------------------------------
'Входит в цикл и пытается передать файл посредством IR
'-----------------------------------------------------
Public Sub LoopAndAttemptIRSend()
 Dim irDASender As System.Net.Sockets.IrDAClient
 Dim streamOutToIrDA As System.IO.Stream
 Dim streamInFromFile As System.IO.Stream
 'Пользователь пока что не отменил выполнение операции
 m_wasSenderStopped = False
 setStatus(SendStatus.AttemptingToSend)
 '-----------------------------------------------------------------
 'Непрерывное выполнение цикла, пока не удастся отправить сообщение
 '-----------------------------------------------------------------
 While (True)
  'Значения всех этих переменных должны быть нулевыми до и после
  'вызова sendStream(...), если не было сгенерировано исключение!
  irDASender = Nothing
  streamOutToIrDA = Nothing
  streamInFromFile = Nothing
  'Попытаться передать поток
  Dim bSuccess As Boolean
  Try
   bSuccess = sendStream(mjdescriptionOfLastSendAttempt, _
    streamOutToIrDA, irDASender, streamInFromFile)
  Catch eUnexpected As System.Exception 'Неожиданная ошибка!!!
   setStatus(SendStatus.Finished_Error) 'Уведомить о сбое
   m_descriptionOfLastSendAttempt = _
    "Unexpected error in IR send loop. " + eUnexpected.Message
   '------------------------------------------------
   'Освободить все распределенные нами ранее ресурсы
   '------------------------------------------------
   If Not (streamOutToIrDA Is Nothing) Then
    Try
     streamOutToIrDA.Close()
    Catch
     'Поглотить любую ошибку
    End Try
    streamOutToIrDA = Nothing
   End If
   If Not (streamInFromFile Is Nothing) Then
    Try
     streamInFromFile.Close()
    Catch
     'Поглотить любую ошибку
    End Try
    streamInFromFile = Nothing
   End If
   If Not (irDASender Is Nothing) Then
    Try
     irDASender.Close()
    Catch
     'Поглотить любую ошибку
    End Try
    irDASender = Nothing
   End If
   Return 'Выход
  End Try
  'Проверить успешность выполнения
  If (bSuccess = True) Then
   m_descriptionOfLastSendAttempt = "Success!"
   setStatus(SendStatus.Finished Successfully)
   Return
  End If
  'Проверить, не была ли операция отменена пользователем
  If (m_wasSenderStopped = True) Then
   m_descriptionOfLastSendAttempt = "User Aborted."
   setStatus(SendStatus.Finished_Aborted)
   Return
  End If
  'В противном случае... Нам пока не удалось обнаружить сервер IrDA,
  'имя которого совпадает с именем службы. Мы продолжим выполнение цикла
  'и попытаемся найти сервер.
 End While
 'Мы никогда не попадем в это место программы при выполнении
End Sub
'----------------------------------------------------------------------
'Попытаться передать поток ввода-вывода (например, файл) посредством IR
'[возвращаемое значение]:
' true: успешная передача файла
' false: файл не был успешно передан
'----------------------------------------------------------------------
Private Function sendStream(ByRef errorDescription As String, _
 ByRef streamOutToIrDA As System.IO.Stream, _
 ByRef irDASender As System.Net.Sockets.IrDAClient, _
 ByRef streamInFromFile As System.IO.Stream) As Boolean
 errorDescription = ""
 '----------------------------
 'Создание нового клиента IRDA
 '----------------------------
 Try
  '-------------------------------------------------------
  'Возврат произойдет довольно быстро. Клиент будет выбран
  'и возвращен, если прослушивающие клиенты отсутствуют.
  '-------------------------------------------------------
  irDASender = _
   New System.Net.Sockets.IrDAClient(m_IrDAServiceName)
  Catch eCreateClient As System.Exception
   'В данном случае могли возникнуть несколько ситуаций:
   '#1: отсутствуют прослушивающие устройства
   '#2: прослушивающее устройство существует, но не реагирует
   ' (может отказаться от разговора)
   errorDescription = eCreateClient.Message
   Return False
  End Try
  'В данном случае могли возникнуть несколько ситуаций:
  '#1: Мы получили соединение от приемного устройства IR
  '#2: IR-запрос был отменен (кто-то вызвал функцию STOP).
  If (m_wasSenderStopped = True) Then
   irDASender.Close()
   irDASender = Nothing
   Return False
  End If
 '==========================================
 'ПЕРЕДАТЬ ДАННЫЕ!
 '==========================================
 'Открыть файл, который мы хотим передать
 streamInFromFile = System.IO.File.OpenRead(m_fileToSend)
 'Открыть сокет IrDA, которому мы хотим передать данные
 streamOutToIrDA = irDASender.GetStream()
 Const BUFFER_SIZE As Integer = 1024
 Dim inBuffer() As Byte
 ReDim inBuffer(BUFFER_SIZE)
 Dim bytesRead As Integer
 Dim iTestAll As Integer
 Dim iTestWrite As Integer
 ' Цикл...
 Do
  'Считать байты из файла
  bytesRead = streamInFromFile.Read(inBuffer, 0, BUFFER_SIZE)
  iTestAll = iTestAll + 1
  'Записать байты в наш выходной поток
  If (bytesRead > 0) Then
   streamOutToIrDA.Write(inBuffer, 0, bytesRead)
   iTestWrite = iTestWrite + 1
  End If
 Loop While (bytesRead > 0)
 'Сбросить выходной поток
 streamOutToIrDA.Flush() 'Закончить запись любых данных
 streamOutToIrDA.Close() 'Закрыть поток
 streamOutToIrDA = Nothing
 'Освободить локальный файл
 streamInFromFile.Close()
 streamOutToIrDA = Nothing
 'Освободить порт IrDA
 irDASender.Close()
 irDASender = Nothing
 'Успешное завершение!!!
 Return True
End Function
End Class

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


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