Обработка передачи файлов вручную
Приложение может реализовать интерфейс IWMDMOperation для управления частью процесса чтения или записи. На устройстве считывания реализация позволяет приложению получать блоки необработанных данных из файла устройства. При записи на устройство приложение позволяет приложению отправлять блоки необработанных данных в файл на устройстве.
В операциях чтения и записи метод IWMDMOperation::TransferObjectData передает данные между компьютером и устройством. Чтобы узнать направление передачи данных, приложение должно задать флаг, когда диспетчер устройств Windows Media вызывает BeginRead или BeginWrite. При вызове метода End приложение должно сбросить этот флаг.
Заметка
Если поставщик услуг и устройство правильно реализуют IMDSPObject2, то сначала будет вызван метод IWMDMOperation3::TransferObjectDataOnClearChannel приложения, если он реализован. Этот метод является более эффективным способом передачи данных. TransferObjectDataOnClearChannel обрабатывается так же, как TransferObjectData, за исключением того, что данные никогда не шифруются и не имеют значений MAC для проверки.
В следующих разделах описываются как процесс чтения, так и процесс записи, когда ваше приложение реализует IWMDMOperation .
чтение с устройства
При чтении файла с устройства менеджер устройств Windows Media вызывает следующие методы IWMDMOperation:
- BeginRead вызывается, чтобы уведомить приложение о начале чтения с устройства.
-
TransferObjectData вызывается один или несколько раз. Обработка данных описана в следующих шагах:
- TransferObjectData получает буфер pDataразмером pdwSize байт, заполненный данными, и MAC для проверки входящих данных.
- Приложение проверяет входящие параметры с помощью MAC входящих данных.
- Приложение расшифровывает и считывает столько данных в pData, как это возможно, и изменяет возвращаемое значение pdwSize, чтобы указать, сколько байтов было прочитано.
- Приложение расшифровывает данные, используя CSecureChannelClient::DecryptParam, и сохраняет их или использует по мере необходимости.
- TransferObjectData возвращает S_OK.
- Диспетчер устройств Windows Media продолжает вызывать TransferObjectData до тех пор, пока приложение не считывает все данные из файла, или приложение возвращает WMDM_E_USER_CANCELLED, чтобы отменить операцию (в этом случае чтение отменено, и диспетчер устройств Windows Media вызывает end).
- Конец Вызывается, чтобы уведомить приложение о завершении процесса чтения с устройства.
запись на устройство
При записи файла на устройство диспетчер устройств Windows Media последовательно вызывает следующие методы IWMDMOperation:
- GetObjectName Вызов, чтобы разрешить приложению указать имя нового хранилища. Этот метод вызывается только в том случае, если приложение не указало имя в методе Insert.
- GetObjectAttributes вызывается для того, чтобы приложение могло задать атрибуты нового хранилища на устройстве.
- BeginWrite Вызывается, чтобы уведомить о начале записи на устройство.
- 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.
- Конец: Звонили, чтобы уведомить о завершении записи на устройство.
Пример кода см. в шифровании и расшифровке.
Связанные разделы