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
if (irdaClient != null) {
try {
irdaClient.Close();
} catch {} //Поглотить любые возникающие ошибки
}
//Закрыть файл, в который осуществлялась запись
if (outputStream != null) {
try {
outputStream.Close();
} catch {} //Поглотить любые возникающие ошибки
}
//Закрыть прослушивающее устройство, если оно выполняется
if (m_irListener != null) {
//Установить первым, чтобы код, выполняющийся другим потоком,
//был отменен, если он установлен
m_wasListenerStopped = true;
try {
m_irListener.Stop();
} catch {} //Поглотить любые возникающие ошибки
m_irListener = null;
}
}
private void internal_WaitForIRFileDownload(
ref System.IO.Stream outputStream,
ref System.Net.Sockets.IrDAClient irdaClient,
ref System.IO.Stream irStreamIn) {
//---------------------------------------------------------
//Открыть входной файл для направления в него потока данных
//---------------------------------------------------------
outputStream = System.IO.File.Open(m_fileNameForDownload, System.IO.FileMode.Create);
//==========================================
//ОБНОВЛЕНИЕ СОСТОЯНИЯ
//==========================================
setStatus(ReceiveStatus.NotDone_WaitingForSender);
//---------------------------------
//Открыть прослушивающее устройство
//---------------------------------
try {
m_wasListenerStopped = false;
m_irListener = new System.Net.Sockets.IrDAListener(m_IrDAServiceName);
m_irListener.Start();
} catch (System.Exception eListener) {
m_errorDuringTransfer = "Error creating listener - " + eListener.Message;