Идеальный файл.

Здесь описывается полный желаемый интерфейс для обращения к файлам
в MyCpp. Ни в одной из подерживаемых ОС в полной мере этот интерфейс
пока не реализован: для ряда операций используются заглушки из-за
отсутствия достаточно полной функциональности в ОС.

Над файлом можно производить следующие операции:
1) открытие файла (open);
2) чтение/запись данных (read/write);
3) изменение позиции чтения/записи (для файлов со случайным доступом) (seek);
4) определение текущей позиции чтения/записи (tell)
5) форсирование передачи буферизованных данных слою нижнего уровня (flush);
6) синхронизация записанных данных с физическим носителем (sync);
7) закрытие файла (close).

Далее - подробно о каждой операции.
1. Открытие файла. Открытие - асинхронная операция.
   По завершении генерируется событие "fileOpened (AsyncFile *file, Exception *exc)".

   Открытие файла может производиться разными способами. Например,
   для открытия файла из файловой системы требуются в качестве параметров
   флаги открытия и режим доступа. Для этих операций возможно использование
   глобальных фабрик.

   Поскольку открытие файла не входит в интерфейс AsyncFile, реальные операции
   открытия выносятся во внешние фабрики.

   Потребители файла должны иметь возможность дождаться его открытия,
   поэтому фабрики оказывают косвенное влияние на генерацию события fileOpened
   объектом-файлом.

   ОБНОВЛЕНИЕ: Заставлять всез потребителей дожидаться открытия перед
   использованием файла нецелесообразно. Если открытие файла является
   отложенным, файл должен сам дожидаться его завершения перед выполнением
   операций ввода/вывода. В случае ошибки открытия генерируется событие Error
   с передачей возникшего исключения.

2. Чтение/запись данных. Это асинхронные операции, внешний интерфейс - в стиле
   POSIX: генерируются события input/output/error, по результатам записи
   возвращается Normal/Again/Eof.

3. Изменение позиции чтения/записи. В некоторых файлах не поддерживается =>
   нужна интроспекция "bool isSeekable()". Операция мгновенная, синхронная,
   неблокирующаяся.

4. Определение текущей позиции чтения/записи. Операция мгновенная, синхронная,
   неблокирующаяся. Имеет смысл только при последовательном организованном
   обращении к файлу (т.е. в большинстве случаев).

5. Форсирование передачи буферизованных данных. Операция асинхронная.
   Варианты семантики:
   	а) flush() только для текущего объекта (слоя передачи данных);
	б) flush() для всех объектов в цепочке передачи.
   Не вижу смысла в выполнении flush() только для текущего объекта.
   В модели MyCpp считается, что flush() выполняется для всех объектов
   в цепочке передачи.

   flush() совершается на момент вызова. Необходимо уведомление о завершении
   передачи. Уведомления могут быть эксклюзивными. Возможна отмена
   уведомления. 

6. Синхронизация с физическим носителем. Это асинхронная операция. Имеет смысл
   не для всех файлов, но интроспекция isSyncable() не нужна: файлы,
   не требующие для работы sync() подразумевают полную синхронность операций
   после write/flush. Аналогично flush(), sync() выполняется для всех
   объектов в цепочке передачи.

7. Закрытие файла. Асинхронная операция, вызывающий обязан проверять результат,
   если нужно убедиться в корректном выполнении всех предыдущих вызовов write().

