/*
 * Copyright (C) 2010 Alistair Leslie-Hughes
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "unknwn.idl";
import "objidl.idl";
import "oaidl.idl";

[
    object,
    dual,
    uuid(D97A6DA0-A864-11cf-83BE-00A0C90C2BD8)
]
interface IRequestDictionary : IDispatch
{
    [propget]
    HRESULT Item([in, optional] VARIANT Var, [retval, out] VARIANT *pVariantReturn);

    [restricted, propget]
    HRESULT _NewEnum([retval, out] IUnknown **ppEnumReturn);

    [propget]
    HRESULT Count([retval, out] int *count);

    [propget]
    HRESULT Key([in] VARIANT key, [retval, out] VARIANT *value);
};

[
    object,
    dual,
    uuid(D97A6DA0-A864-11cf-83BE-00A0C90C2BD8)
]
interface IResponse : IDispatch
{
    [propget]
    HRESULT Buffer([retval, out] VARIANT_BOOL *is_buffering);

    [propput]
    HRESULT Buffer([in] VARIANT_BOOL is_buffering);

    [propget]
    HRESULT ContentType([retval, out] BSTR *content_type);

    [propput]
    HRESULT ContentType([in] BSTR content_type);

    [propget]
    HRESULT Expires([retval, out] VARIANT *minutes);

    [propput]
    HRESULT Expires([in] LONG minutes);

    [propget]
    HRESULT ExpiresAbsolute([retval, out] VARIANT *expires);

    [propput]
    HRESULT ExpiresAbsolute([in] DATE expires);

    [propget]
    HRESULT Cookies([retval, out] IRequestDictionary **cookies);

    [propget]
    HRESULT Status([retval, out] BSTR *status);

    [propput]
    HRESULT Status([in] BSTR status);

    [hidden]
    HRESULT Add([in] BSTR value, [in] BSTR name);

    HRESULT AddHeader([in] BSTR name, [in] BSTR value);

    HRESULT AppendToLog([in] BSTR log_entry);

    HRESULT BinaryWrite([in] VARIANT input);

    HRESULT Clear();

    HRESULT End();

    HRESULT Flush();

    HRESULT Redirect(BSTR url);

    HRESULT Write([in] VARIANT text);

    [hidden]
    HRESULT WriteBlock([in] short block_number);

    HRESULT IsClientConnected([retval, out] VARIANT_BOOL *is_connected);

    [propget]
    HRESULT CharSet([retval, out] BSTR *charset);

    [propput]
    HRESULT CharSet([in] BSTR charset);

    HRESULT Pics([in] BSTR value);

    [propget]
    HRESULT CacheControl([retval, out] BSTR *cache_control);

    [propput]
    HRESULT CacheControl([in] BSTR cache_control);

    [propget]
    HRESULT CodePage([retval, out] LONG *codepage);

    [propput]
    HRESULT CodePage([in] LONG codepage);

    [propget]
    HRESULT LCID([retval, out] LONG *lcid);

    [propput]
    HRESULT LCID([in] LONG lcid);
}
