/*
 * Copyright 2006 Matthew Kehrer
 *
 * 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";
import "oleidl.idl";

cpp_quote("EXTERN_C const GUID NAMEDTIMER_DRAW;")

[
    object,
    uuid(3050F361-98B5-11CF-BB82-00AA00BDCE0B),
    pointer_default(unique)
]
interface ITimerSink : IUnknown
{
    HRESULT OnTimer([in] VARIANT vtimeAdvise);
}


[
    object,
    uuid(3050F360-98B5-11CF-BB82-00AA00BDCE0B),
    pointer_default(unique)
]
interface ITimer : IUnknown
{
    HRESULT Advise([in] VARIANT vtimeMin,
                   [in] VARIANT vtimeMax,
                   [in] VARIANT vtimeInterval,
                   [in] DWORD dwFlags,
                   [in] ITimerSink *pTimerSink,
                   [out] DWORD *pdwCookie);

    HRESULT Unadvise([in] DWORD dwCookie);

    HRESULT Freeze([in] BOOL fFreeze);

    HRESULT GetTime([out] VARIANT *pvtime);
}


[
    object,
    uuid(3050F35F-98B5-11CF-BB82-00AA00BDCE0B),
    pointer_default(unique)
]
interface ITimerService : IUnknown
{
    HRESULT CreateTimer([in] ITimer *pReferenceTimer,
                        [out] ITimer **ppNewTimer);

    HRESULT GetNamedTimer([in] REFGUID rguidName,
                          [out] ITimer **ppTimer);

    HRESULT SetNamedTimerReference([in] REFGUID rguidName,
                                   [in] ITimer *pReferenceTimer);
}

cpp_quote("#define SID_STimerService IID_ITimerService")
