アップロード/応答ジョブからの応答の取得
BITS Upload-Reply ジョブは、ファイルをサーバーにアップロードするだけでなく、サーバー応答の一部として送信された応答 URL も検査し、応答 URL を自動的にたどってそこから応答をダウンロードします。 BITS-Reply-URL ヘッダー値の詳細については、「フラグメントに対する確認応答」のドキュメントを参照してください。
ジョブの種類を BG_JOB_TYPE_UPLOAD_REPLY に設定して、Upload-Reply 型ジョブを作成します。 応答データは、ジョブが BG_JOB_STATE_TRANSFERRED 状態に入った後にクライアントで使用できます。 応答を取得するには、次のいずれかのメソッドを呼び出します。
IBackgroundCopyJob2::GetReplyData
応答データのメモリ内コピーを提供します。 IBackgroundCopyJob::Complete メソッドを呼び出す前または後に応答データを読み取る場合は、このメソッドを使用します。 応答データが 1 MB (メガバイト)を超える場合、アプリケーションは IBackgroundCopyJob2::GetReplyFileName メソッドを呼び出して応答ファイルの名前を取得し、その内容を直接読み取る必要があります。
IBackgroundCopyJob2::GetReplyFileName
応答を含むファイルの名前を提供します。 応答ファイルを開いて読み取る前に、IBackgroundCopyJob::Complete メソッドを呼び出す必要があります。応答ファイルは、Complete メソッドを呼び出すまでクライアントで使用できません。
応答が小さく、コールバック スレッドをブロックしないように迅速に処理できる場合にのみ、IBackgroundCopyCallback::JobTransferred メソッドでこれらのメソッドを呼び出します。 コールバックの代わりにコマンド ライン通知を使用する場合は、ジョブ識別子を実行可能ファイルに渡します。 実行可能ファイルでは、ジョブ識別子を使用して Complete メソッドを呼び出し、応答ファイルを使用できるようにします。
次の例は、各メソッドを使用して応答データを取得する方法を示しています。
GetReplyData の使用
次の例は、IBackgroundCopyJob2::GetReplyData メソッドを使用して応答データを取得する方法を示しています。 この例では、IBackgroundCopyJob インターフェイス ポインターが有効であり、ジョブの種類が upload-reply であり、ジョブの状態がBG_JOB_STATE_TRANSFERREDされていることを前提としています。
HRESULT hr;
IBackgroundCopyJob* pJob;
IBackgroundCopyJob2* pJob2 = NULL;
BYTE* pReply = NULL;
UINT64 ReplySize;
//Need to query the IBackgroundCopyJob interface for an IBackgroundCopyJob2
//interface pointer. The IBackgroundCopyJob2 interface contains the GetReplyData method.
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
if (SUCCEEDED(hr))
{
hr = pJob2->GetReplyData(&pReply, &ReplySize);
if (S_OK == hr))
{
if (pReply)
{
//Do something with the data.
CoTaskMemFree(pReply);
}
else
{
//The server application did not return a reply.
}
}
else if (BG_E_TOO_LARGE == hr)
{
//The reply exceeds 1 MB. To retrieve the reply, get the reply file name,
//complete the job, open the reply file, and read the reply.
}
else
{
//Handle the error
}
pJob2->Release(); //When done, release the interface.
}
else
{
//Handle error. QueryInterface will return E_NOINTERFACE if the version of BITS
//running on the computer is less than BITS 1.5.
}
GetReplyFileName の使用
次の例は、IBackgroundCopyJob2::GetReplyFileName メソッドを使用して応答データを取得する方法を示しています。 この例では、IBackgroundCopyJob インターフェイス ポインターが有効であり、ジョブの種類が upload-reply であり、ジョブの状態がBG_JOB_STATE_TRANSFERREDされていることを前提としています。
HRESULT hr;
IBackgroundCopyJob* pJob;
IBackgroundCopyJob2* pJob2 = NULL;
WCHAR* pszFileName = NULL;
//Need to query the IBackgroundCopyJob interface for an IBackgroundCopyJob2
//interface pointer. The IBackgroundCopyJob2 interface contains the GetReplyFileName method.
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
if (SUCCEEDED(hr))
{
hr = pJob2->GetReplyFileName(&pszFileName);
if (SUCCEEDED(hr))
{
//Calling the Complete method removes the job from the queue,
//so make sure you maintain an interface pointer to this job
//or retrieve any job related information that you require
//when processing the reply.
hr = pJob->Complete();
//Open, read the file, and do something with the data.
CoTaskMemFree(pszFileName);
}
pJob2->Release(); //When done, release the interface.
}
else
{
//Handle error. QueryInterface will return E_NOINTERFACE if the version of BITS
//running on the computer is less than BITS 1.5.
}