Обработка передачи файлов вручную
Приложение может реализовать интерфейс IWMDMOperation для управления частью процесса чтения или записи. На устройстве считывания реализация позволяет приложению получать блоки необработанных данных из файла устройства. При записи на устройство приложение позволяет приложению отправлять блоки необработанных данных в файл на устройстве.
В операциях чтения и записи метод IWMDMOperation::TransferObjectData передает данные между компьютером и устройством. Чтобы узнать направление передачи данных, приложение должно задать флаг, когда Windows Media диспетчер устройств вызывает BeginRead или BeginWrite. При вызове метода End приложение должно сбросить этот флаг.
Примечание.
Если поставщик услуг и устройство правильно реализуют IMDSPObject2, он сначала вызовет метод IWMDMOperation3::TransferObjectDataOnClearChannel, если реализован. Этот метод является более эффективным способом передачи данных. TransferObjectDataOnClearChannel обрабатывается так же, как TransferObjectData, за исключением того, что данные никогда не шифруются и не имеют значений MAC для проверки.
В следующих разделах описывается как чтение, так и процесс записи, когда приложение реализует IWMDMOperation.
Чтение с устройства
При чтении файла с устройства Windows Media диспетчер устройств вызывает следующие методы IWMDMOperation.
- BeginRead Called, чтобы уведомить приложение о начале чтения с устройства.
- TransferObjectData Вызывается один или несколько раз. Обработка данных описана в следующих шагах:
- TransferObjectData получает буфер, pData, размер pdwSize байтов, заполненный данными и MAC для проверки входящих данных.
- Приложение проверяет входящие параметры с помощью MAC входящих данных.
- Приложение расшифровывает и считывает столько данных в pData , сколько это возможно, и изменяет возвращаемое значение pdwSize , чтобы указать, сколько байтов было прочитано.
- Приложение расшифровывает данные с помощью CSecureChannelClient::D ecryptParam и сохраняет его или использует его по мере необходимости.
- TransferObjectData возвращает S_OK.
- Windows Media диспетчер устройств продолжает вызывать TransferObjectData, пока приложение не считывает все данные из файла, или приложение возвращает WMDM_E_USER_CANCELLED, чтобы отменить операцию (в этом случае чтение отменено, и Windows Media диспетчер устройств вызовов End).
- Завершится вызовом, чтобы уведомить приложение о завершении чтения с устройства.
Запись на устройство
При записи файла на устройство Windows Media диспетчер устройств вызывает следующие методы IWMDMOperation:
- Метод GetObjectName , позволяющий приложению указать имя нового хранилища. Этот метод вызывается только в том случае, если приложение не указало имя в методе Insert .
- Метод GetObjectAttributes , позволяющий приложению указывать атрибуты для нового хранилища на устройстве.
- BeginWrite Called, чтобы уведомить о начале записи на устройство.
- Метод GetObjectTotalSize Вызывается для получения общего размера объекта, записываемого на устройство, для включения оптимизации передачи, а также предоставления Windows Media диспетчер устройств возможность отмены передачи, если файл слишком велик для устройства.
- TransferObjectData Вызывается один или несколько раз. Обработка данных описана в следующих шагах:
- TransferObjectData получает указатель на буфер размера pdwSize байтов.
- Приложение получает блок данных для отправки на устройство, как правило, считывая данные из файла, и заполняет полученный буфер размером до pdwSize байтов. Он должен изменить pdwSize (при необходимости), чтобы отразить, сколько байтов было добавлено в буфер.
- Приложение создает MAC всех параметров метода.
- Приложение шифрует данные в буфере с помощью CSecureChannelClient::EncryptParam.
- TransferObjectData возвращает S_OK, чтобы указать, что есть больше данных или S_FALSE, чтобы указать, что больше данных нет. Если приложение возвращает WMDM_E_USER_CANCELLED, операция записи отменена, а windows Media диспетчер устройств вызовет End.
- Windows Media диспетчер устройств продолжает вызывать TransferObjectData, пока приложение возвращает S_OK.
- Завершится вызовом, чтобы уведомить о завершении записи на устройство.
Пример кода см. в разделе "Шифрование и расшифровка".
См. также