/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
#endif

interface IWebNotification;
interface IWebNotificationObserver;

[
    object,
    oleautomation,
    hidden,
    uuid(1E411ABE-DAA0-4a83-BCCA-D94E0704F193),
    pointer_default(unique)
]
interface IWebNotificationCenter : IUnknown
{
#ifndef DO_NO_IMPORTS
    import "IWebNotification.idl";
    import "IWebNotificationObserver.idl";
#endif

    //+ (NSNotificationCenter *)defaultCenter
    HRESULT defaultCenter([out, retval] IWebNotificationCenter** center);

    //- (void)addObserver:(id)anObserver selector:(SEL)aSelector name:(NSString *)notificationName object:(id)anObject
    HRESULT addObserver([in] IWebNotificationObserver* observer, [in] BSTR notificationName, [in] IUnknown* anObject);

    //- (void)postNotification:(NSNotification *)notification
    HRESULT postNotification([in] IWebNotification* notification);

    //- (void)postNotificationName:(NSString *)notificationName object:(id)anObject
    //- (void)postNotificationName:(NSString *)notificationName object:(id)anObject userInfo:(NSDictionary *)userInfo
    HRESULT postNotificationName([in] BSTR notificationName, [in] IUnknown* anObject, [in] IPropertyBag* userInfo);

    //- (void)removeObserver:(id)anObserver
    //- (void)removeObserver:(id)anObserver name:(NSString *)notificationName object:(id)anObject
    HRESULT removeObserver([in] IWebNotificationObserver* anObserver, [in] BSTR notificationName, [in] IUnknown* anObject);
}
