/*
 * Copyright 2005 Francois Gouget
 *
 * 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 "oaidl.idl";

typedef enum
{
    ADS_RIGHT_DS_CREATE_CHILD         = 0x00000001,
    ADS_RIGHT_DS_DELETE_CHILD         = 0x00000002,
    ADS_RIGHT_ACTRL_DS_LIST           = 0x00000004,
    ADS_RIGHT_DS_SELF                 = 0x00000008,
    ADS_RIGHT_DS_READ_PROP            = 0x00000010,
    ADS_RIGHT_DS_WRITE_PROP           = 0x00000020,
    ADS_RIGHT_DS_DELETE_TREE          = 0x00000040,
    ADS_RIGHT_DS_LIST_OBJECT          = 0x00000080,
    ADS_RIGHT_DS_CONTROL_ACCESS       = 0x00000100,

    ADS_RIGHT_DELETE                  = 0x00010000,
    ADS_RIGHT_READ_CONTROL            = 0x00020000,
    ADS_RIGHT_WRITE_DAC               = 0x00040000,
    ADS_RIGHT_WRITE_OWNER             = 0x00080000,
    ADS_RIGHT_SYNCHRONIZE             = 0x00100000,
    ADS_RIGHT_ACCESS_SYSTEM_SECURITY  = 0x00200000,

    ADS_RIGHT_GENERIC_ALL             = 0x10000000,
    ADS_RIGHT_GENERIC_EXECUTE         = 0x20000000,
    ADS_RIGHT_GENERIC_WRITE           = 0x40000000,
    ADS_RIGHT_GENERIC_READ            = 0x80000000
} ADS_RIGHTS_ENUM;

/*****************************************************************************
 *    IADsContainer interface
 */
[
    object,
    uuid(001677d0-fd16-11ce-abc4-02608c9e7553)
]
interface IADsContainer: IDispatch
{
    [propget] HRESULT Count(
        [out, retval] long *retval);
    [propget, restricted] HRESULT _NewEnum(
        [out, retval] IUnknown **retval);
    [propget] HRESULT Filter(
        [out, retval] VARIANT *pvFilter);
    [propput] HRESULT Filter(
        [in] VARIANT vFilter);
    [propget] HRESULT Hints(
        [out, retval] VARIANT *pvHints);
    [propput] HRESULT Hints(
        [in] VARIANT vHints);
    HRESULT GetObject(
        [in] BSTR bstrClassName,
        [in] BSTR bstrRelativeName,
        [out, retval] IDispatch **ppObject);
    HRESULT Create(
        [in] BSTR bstrClassName,
        [in] BSTR bstrRelativeName,
        [out, retval] IDispatch **ppObject);
    HRESULT Delete(
        [in] BSTR bstrClassName,
        [in] BSTR bstrRelativeName);
    HRESULT CopyHere(
        [in] BSTR bstrSourceName,
        [in] BSTR bstrNewName,
        [out, retval] IDispatch **ppObject);
    HRESULT MoveHere(
        [in] BSTR bstrSourceName,
        [in] BSTR bstrNewName,
        [out, retval] IDispatch **ppObject);
}
