using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace IrDA_CS
{
    public partial class Form1 : Form
    {
        private IrDAListener irListen;
        private IrDAClient irClient;
        private IrDAEndPoint irEndP;
        private IrDADeviceInfo[] irDevices;

        string fileSend;
        string fileReceive;
        string irServiceName;

        int buffersize;


        public Form1()
        {
            InitializeComponent();
            irClient = new IrDAClient();

            // Файлы, предназначенные для отправки и приема
            fileSend = ".\\My Documents\\send.txt";
            fileReceive = ".\\My Documents\\receive.txt";

            // Задаем имя для службы IrDA
            // Это может быть любое слово
            // Другие устройства для примера должны использовать это же слово
            irServiceName = "IrDA";

            // Устанавливаем максимальный размер буфера для передаваемого файла
            buffersize = 256;

            // Делаем недоступными кнопки отправки и посылки сообщений
            // до тех пор, пока не будут обнаружены устройства
            butSend.Enabled = false;
            butReceive.Enabled = false;

        }

        private void butFindDevs_Click(object sender, EventArgs e)
        {
            // Ищем доступные устройства с инфракрасной связью
            // и помещаем их в список
            // При поиске устройства направьте инфракрасные датчики устройств друг на друга
            // Поиск не более трех доступных устройств
            irDevices = irClient.DiscoverDevices(2);

            // Если устройства не найдены, то выводим сообщение
            if (irDevices.Length == 0)
            {
                MessageBox.Show("Устройства с ИК-портами не обнаружены!");
                return;
            }

            // Перечисляем массив IrDADeviceInfo
            // и выводим информацию о каждом устройстве в список
            string device;
            int ID;
            listBox1.Items.Clear();
            foreach (IrDADeviceInfo irDevice in irDevices)
            {
                ID = BitConverter.ToInt32(irDevice.DeviceID, 0);
                device = ID.ToString() + " " + irDevice.DeviceName + " "
                    + irDevice.CharacterSet + " " + irDevice.Hints;
                listBox1.Items.Add(device);
            }

            listBox1.SelectedIndex = 0;
            if (irDevices.Length > 0)
                statusBar1.Text =
                    irDevices.Length.ToString() + " устройств(а)";

            // Делаем доступными кнопки для отправки и посылки сообщения
            butSend.Enabled = true;
            butReceive.Enabled = true;
        }

        private void butSend_Click(object sender, EventArgs e)
        {
            // Открываем файл для отправки и получаем его поток
            Stream fileStream;
            try
            {
                fileStream = new FileStream(fileSend, FileMode.Open);
            }
            catch (Exception exFile)
            {
                MessageBox.Show("Не могу открыть " + exFile.ToString());
                return;
            }

            // Создаем IrDA-клиент с установленным именем службы,
            // которое должно совпадать с именем службы на другом IrDA-клиенте
            try
            {
                irClient = new IrDAClient(irServiceName);
            }
            catch (SocketException exS)
            {
                MessageBox.Show("Ошибка сокета: " + exS.Message +
                    " - Вы щелкнули на кнопке Получить на другом устройстве?");
                return;
            }

            // Получим поток
            Stream baseStream = irClient.GetStream();

            // Получим размер отправляемого файла
            // и запишем это значение в поток
            byte[] length = BitConverter.GetBytes((int)fileStream.Length);
            baseStream.Write(length, 0, length.Length);

            // Создаем буфер для чтения файла
            byte[] buffer = new byte[buffersize];

            // Показываем число отправленнных байт
            int fileLength = (int)fileStream.Length;
            statusBar1.Text = "Отправлено " + fileLength + " байт";

            // Читаем файловый поток в базовом потоке
            while (fileLength > 0)
            {
                int numRead = fileStream.Read(buffer, 0, buffer.Length);
                baseStream.Write(buffer, 0, numRead);
                fileLength -= numRead;
            }

            fileStream.Close();
            baseStream.Close();
            irClient.Close();
            statusBar1.Text = "Файл отправлен";

        }

        private void butReceive_Click(object sender, EventArgs e)
        {
            // Создаем поток для записи файла
            Stream writeStream;
            try
            {
                writeStream = new FileStream(fileReceive,
                    FileMode.OpenOrCreate);
            }
            catch (Exception)
            {
                MessageBox.Show("Не могу открыть "
                    + fileReceive + " для записи");
                return;
            }

            // Создаем соединение с помощью класса IrDAEndPoint
            // для выбранного устройства из списка
            // Начинаем прослушку входящих сообщений
            // из устройства с объектом IrDAListener
            try
            {
                int i = listBox1.SelectedIndex;
                irEndP = new IrDAEndPoint(irDevices[i].DeviceID,
                    irServiceName);
                irListen = new IrDAListener(irEndP);
                irListen.Start();
            }
            catch (SocketException exSoc)
            {
                MessageBox.Show("Не могу прослушивать на службе "
                    + irServiceName + ": "
                    + exSoc.ErrorCode);
            }

            // Показываем прослушивание выбранного устройства
            statusBar1.Text = "Прослушка "
                + listBox1.SelectedItem.ToString();

            // Создаем соединение
            // для службы, обнаруженной прослушкой
            IrDAClient irClient;
            try
            {
                irClient = irListen.AcceptIrDAClient();
            }
            catch (SocketException exp)
            {
                MessageBox.Show("Не могу принять сокет "
                    + exp.ErrorCode);
                return;
            }

            // Показываем идет ли передача файла
            if (irListen.Pending() == true)
                statusBar1.Text = "Передача из "
                    + irClient.RemoteMachineName;
            else
                statusBar1.Text = "Нет передачи из "
                    + irClient.RemoteMachineName;

            // Получим поток из клиента
            Stream baseStream = irClient.GetStream();

            int numToRead;

            // Создаем буфер для чтения файла
            byte[] buffer = new byte[buffersize];

            // Читаем поток данных, который содержит
            // данные из передающего устройства
            numToRead = 4;
            while (numToRead > 0)
            {
                int numRead = baseStream.Read(buffer, 0, numToRead);
                numToRead -= numRead;
            }

            // Получим размер буфера для показа
            // числа байт для записи в файл
            numToRead = BitConverter.ToInt32(buffer, 0);
            statusBar1.Text = "Записываем "
                + numToRead + " байт";

            // Записываем поток в файл до тех пор, 
            // пока не будут прочитаны все байты
            while (numToRead > 0)
            {
                int numRead = baseStream.Read(buffer, 0, buffer.Length);
                numToRead -= numRead;
                writeStream.Write(buffer, 0, numRead);
            }

            // Сообщаем, что файл получен
            statusBar1.Text = "Файл получен";

            baseStream.Close();
            writeStream.Close();
            irListen.Stop();
            irClient.Close();
        }
    }
}