// Copyright (c) 2008, NTT DATA Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using System;
using System.Collections.Generic;
using System.Net;

namespace TERASOLUNA.Fw.Client.Communication
{
    /// <summary>
    /// データ送信機能を提供するインターフェイスです。
    /// </summary>
    /// <typeparam name="TParam">
    /// サーバに送信するデータオブジェクトの型。
    /// </typeparam>
    public interface IHttpSender<TParam> where TParam : class
    {
        /// <summary>
        /// <paramref name="request"/> で渡された <see cref="HttpWebRequest"/> を用いて、
        /// <paramref name="paramData"/> と <paramref name="headerCollection"/> の情報を送信します。
        /// </summary>
        /// <remarks>
        /// <see cref="IHttpSender{TParam}.Send"/> を実装する際、
        /// 通信中の例外は <see cref="WebException"/> としてスローします。
        /// </remarks>
        /// <param name="request">送信処理を行うリクエストオブジェクト。</param>
        /// <param name="paramData">送信データを格納したオブジェクト。</param>
        /// <param name="headerCollection">
        /// リクエストヘッダの名前と値のペアを格納している <see cref="IDictionary{String, String}"/>。
        /// </param>
        /// <param name="reporter">進行状況通知を行う <see cref="IProgressChangeReporter"/>。</param>
        /// <exception cref="ArgumentNullException">
        /// 以下のような場合に例外をスローします。
        /// <list type="bullet">
        /// <item>
        /// <paramref name="request"/> が null 参照です。
        /// </item>
        /// <item>
        /// <paramref name="paramData"/> が null 参照です。
        /// </item>
        /// <item>
        /// <paramref name="headerCollection"/> が null 参照です。
        /// </item>
        /// </list>
        /// </exception>
        /// <exception cref="ArgumentException">
        /// 通信処理で必要なデータが不正です。
        /// </exception>
        /// <exception cref="WebException">
        /// サーバとの通信中にエラーが発生しました。または通信がキャンセルされました。
        /// </exception>
        /// <exception cref="CommunicationException">
        /// 送信中に内部処理でエラーが発生しました。
        /// </exception>
        void Send(HttpWebRequest request,
                  TParam paramData,
                  IDictionary<string, string> headerCollection,
                  IProgressChangeReporter reporter);
    }
}
