Книга: Программирование мобильных устройств на платформе .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;
}
} //конец класса
- Соединение равноправных узлов сети посредством IrDA
- Сокеты IrDA и .NET Compact Framework
- В настоящее время поддержка сокетов .NET для IrDA доступна лишь в .NET Compact Framework, тогда как в .NET Framework для настольных компьютеров она отсутствует
- В настоящее время код, использующий сокеты IrDA .NET Compact Framework, будет выполняться на таких физических устройствах, оборудованных аппаратурой IrDA, как Pocket PC и смартфоны, но не будет правильно выполняться на эмуляторах
- Листинг 15.3. Тестовый код, который необходимо поместить в класс формы для тестирования передачи и приема данных посредством механизма IrDA
- Листинг 15.4. Класс IrDAIrDAFileSend
- Листинг 15.5. Класс IrDAFileReceive
- Листинг 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
- Листинг 5.1. Файл конфигурации sshd
- Листинг 5.2. Конфигурационный файл
- Листинг 5.3. Файл конфигурации