アップロード/応答ジョブからの応答の取得

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.
}