ISCPSecureExchange3
COM公式ドキュメント
ISCPSecureExchange3 インターフェースは、データ交換のパフォーマンスを向上させ、転送完了コールバックメソッドを提供することで ISCPSecureExchange2 を拡張します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
TransferContainerDataOnClearChannel メソッドは、クリアチャネル経由でコンテナーファイルのデータをコンテンツプロバイダーに転送します。
| pDevice | IMDSPDevice* | inoptional | デバイスオブジェクトへのポインター。 | ||||||
| pData | BYTE* | in | コンテナーファイルから現在転送中のデータを保持するバッファーへのポインター。 | ||||||
| dwSize | DWORD | in | バッファー内のバイト数が格納されます。 | ||||||
| pProgressCallback | IWMDMProgress3* | inoptional | コンテンツプロバイダーが実行する必要のある処理について、その進行状況を報告できる進行状況コールバック。処理は IWMDMProgress3 の各メソッドの EventId パラメーターによって識別されます。 | ||||||
| pfuReadyFlags | DWORD* | out | コンテナーファイルのどの部分が読み取り可能かを示すフラグ。このパラメーターは出力側のメッセージ認証コードに含まれます。次のフラグが、準備できている内容を示します。
|
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
| 戻り値 | 説明 |
|---|---|
|
呼び出し元は、このインターフェースを使用する権限がありません。 |
| 呼び出し元は、要求された操作を実行するために必要な権利を持っていません。 | |
| メッセージ認証コードが無効です。 | |
| メソッドが失敗しました。コンテンツプロバイダーとのやり取りを終了してください。 | |
| パラメーターが無効であるか、NULL ポインターです。 | |
| 不明なエラーが発生しました。 |
解説(Remarks)
Windows Media Device Manager はこのメソッドを繰り返し呼び出し、コンテナーファイルのデータをコンテンツプロバイダーへ転送します。最終的に Windows Media Device Manager は、転送するデータがもうないことを示すために dwSize に 0 を設定してこのメソッドを呼び出します。コンテンツプロバイダーはデータを収集して各種オブジェクトを抽出しながら、呼び出しごとに、利用可能になったオブジェクト (存在する場合) を Windows Media Device Manager に報告します。利用可能なオブジェクトがない場合、コンテンツプロバイダーは pfuReadyFlags パラメーターに 0 を設定して S_OK を返します。転送中のファイルに対してこれ以上の処理や変更が不要であるとコンテンツプロバイダーが判断した場合は、WMDM_SCP_NO_MORE_CHANGES フラグが返されます。その後、Windows Media Device Manager はファイルの残りの部分をデバイスに直接転送できます。
オブジェクトのデータは、GetObjectDataOnClearChannel メソッドを呼び出すことでコンテンツプロバイダーから転送されます。Windows Media Device Manager は、3 番目のパラメーター pdwsize に 0 が返されるまで GetObjectDataOnClearChannel を繰り返し呼び出します。
データ転送の終了を通知するため、Windows Media Device Manager は ISCPSecureExchange::TransferComplete メソッド (セッションがアクティブな場合は TransferCompleteForDevice) を呼び出します。
Windows Media Device Manager は、アプリケーションが提供する進行状況コールバックを pProgressCallback パラメーターでコンテンツプロバイダーに渡します。コンテンツプロバイダーはこのパラメーターを使用して、実行する必要のある処理の進行状況を通知できます。処理自体は、IWMDMProgress3 の各メソッドの最初のパラメーターである EventId によって識別されます。アプリケーションが使用する EventId の値は、個々のコンテンツプロバイダーの実装で定義されます。
このメソッドは ISCPSecureExchange::TransferContainerData と同一ですが、このメソッドに渡されるパラメーターは暗号化されない点が異なります。そのため、このメソッドの方が効率的です。
| pDevice | IMDSPDevice* | inoptional | 取得元となるIMDSPDevice。平文チャネルで読み取る対象。 |
| pData | BYTE* | out | 取得したオブジェクトデータを受け取るバッファ。 |
| pdwSize | DWORD* | inout | 要求サイズを入力し、実際に取得できたバイト数を返す入出力。 |
TransferCompleteForDevice メソッドは、特定のデバイスに対するデータ転送の終了を通知するために Windows Media Device Manager から呼び出されます。
| pDevice | IMDSPDevice* | inoptional | デバイスオブジェクトへのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
| 戻り値 | 説明 |
|---|---|
|
呼び出し元は、このインターフェースを使用する権限がありません。 |
| 呼び出し元は、要求された操作を実行するために必要な権利を持っていません。 | |
| メッセージ認証コードが無効です。 | |
| 不明なエラーが発生しました。 |
解説(Remarks)
このメソッドは ISCPSecureExchange::TransferComplete と同一ですが、転送セッション内で転送が完了したときに呼び出される点が異なります。
その場合、セキュアコンテンツプロバイダーはどのデバイスに対する転送が完了したのかを知る必要があるため、このメソッドは pDevice パラメーターを受け取ります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ISCPSecureExchange3 "{AB4E77E4-8908-4B17-BD2A-B1DBE6DD69E1}" #usecom global ISCPSecureExchange3 IID_ISCPSecureExchange3 "{}" #comfunc global ISCPSecureExchange3_TransferContainerDataOnClearChannel 7 sptr,var,int,sptr,var #comfunc global ISCPSecureExchange3_GetObjectDataOnClearChannel 8 sptr,var,var #comfunc global ISCPSecureExchange3_TransferCompleteForDevice 9 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ISCPSecureExchange3 "{AB4E77E4-8908-4B17-BD2A-B1DBE6DD69E1}" #usecom global ISCPSecureExchange3 IID_ISCPSecureExchange3 "{}" #comfunc global ISCPSecureExchange3_TransferContainerDataOnClearChannel 7 sptr,sptr,int,sptr,sptr #comfunc global ISCPSecureExchange3_GetObjectDataOnClearChannel 8 sptr,sptr,sptr #comfunc global ISCPSecureExchange3_TransferCompleteForDevice 9 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。