Книга: Программирование мобильных устройств на платформе .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
- Листинг 15.1. Простой код файлового ввода-вывода, иллюстрирующий различия между локальной и удаленной передачей данных
- Листинг 15.2. Имитация сбоев при передаче данных для тестирования приложения
- Листинг 15.3. Тестовый код, который необходимо поместить в класс формы для тестирования передачи и приема данных посредством механизма IrDA
- Листинг 15.4. Класс IrDAFileSend
- Листинг 15.5. Класс IrDAFileReceive
- Листинг 15.6. Простая Web-служба
- Листинг 15.7. Вызовы Web-служб с передачей параметров только явным образом
- Листинг 15.8. Вызов Web-служб путем неявной передачи параметров посредством cookie-файлов
- Листинг 15.9. Неэффективная организация диалога с Web-службой, в которой используется множество вызовов
- Листинг 15.10. Группирование запросов в одном вызове Web-службы
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Листинг 15.4. Класс IrDAIrDAFileSend
- Листинг 15.8. Вызов Web-служб путем неявной передачи параметров посредством cookie-файлов
- Листинг 15.10. Группирование запросов в одном вызове Web-службы
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Листинг 3.1. Конфигурационный файл lilo.conf
- Листинг 3.2. Файл настройки программы inittab
- Листинг 3.3. Файл
- Листинг 3.4. Информация о конфигурации и состоянии сети
- Листинг 4.1. Файл
- Листинг 4.2. Содержимое конфигурационного файла
- Листинг 4.3. Информация о программе sudo