/*
 * 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 COMPUTER, 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 COMPUTER, 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);
}
