// ----------------------------------------------------------------------------
// Generated by InterfaceFactory [Wed May 07 00:56:11 2003]
// 
// File        : api_service.h
// Class       : api_service
// class layer : Dispatchable Interface
// ----------------------------------------------------------------------------

#ifndef __API_SERVICE_H
#define __API_SERVICE_H

#include "bfc/dispatch.h"
#include "bfc/platform/types.h"

namespace SvcNotify
{
    enum
    {
        ONREGISTERED     = 100, // init yourself here -- not all other services are registered yet
        ONSTARTUP        = 200, // everyone is initialized, safe to talk to other services
        ONAPPRUNNING     = 210, // app is showing and processing events
        ONSHUTDOWN       = 300, // studio is shutting down, release resources from other services
        ONDEREGISTERED   = 400, // bye bye
        ONDBREADCOMPLETE = 500, // after db is read in (happens asynchronously after ONSTARTUP)
        ONBEFORESHUTDOWN = 600, // system is about to shutdown, call WASABI_API_APP->main_cancelShutdown() to cancel
    };
}

	class waServiceFactory;

// ----------------------------------------------------------------------------

    class NOVTABLE api_service : public Dispatchable
    {
    protected:
        api_service()                            {}
        ~api_service()                           {}

    public:
        int               service_register( waServiceFactory *svc );
        int               service_deregister( waServiceFactory *svc );

        size_t            service_getNumServices( FOURCC svc_type );
        waServiceFactory *service_enumService( FOURCC svc_type, size_t n );

        waServiceFactory *service_getServiceByGuid( GUID guid );

        int               service_lock( waServiceFactory *owner, void *svcptr );
        int               service_clientLock( void *svcptr );
        int               service_release( void *svcptr );
        const char       *service_getTypeName( FOURCC svc_type );

#ifdef WASABI_COMPILE_COMPONENTS
        GUID service_getOwningComponent( void *svcptr );
        GUID service_getLockingComponent( void *svcptr );
#endif // WASABI_COMPILE_COMPONENTS

        int               service_unlock( void *svcptr );
        int               service_isvalid( FOURCC svctype, waServiceFactory *service );
        // removes "me" from the services list and finds a second service with the same GUID and puts it in the same position
        // this is used by the lazy loader service factory - you shouldn't need it for any other purposes.
        // returns 0 if compaction actually happened
        int               service_compactDuplicates( waServiceFactory *me );

    protected:
        enum
        {
            API_SERVICE_SERVICE_REGISTER         = 10,
            API_SERVICE_SERVICE_DEREGISTER       = 20,
            API_SERVICE_SERVICE_GETNUMSERVICES   = 30,
            API_SERVICE_SERVICE_ENUMSERVICE      = 40,
            API_SERVICE_SERVICE_GETSERVICEBYGUID = 50,
            API_SERVICE_SERVICE_LOCK             = 60,
            API_SERVICE_SERVICE_CLIENTLOCK       = 70,
            API_SERVICE_SERVICE_RELEASE          = 80,
            API_SERVICE_SERVICE_GETTYPENAME      = 90,

#ifdef WASABI_COMPILE_COMPONENTS
            API_SERVICE_SERVICE_GETOWNINGCOMPONENT = 100,
            API_SERVICE_SERVICE_GETLOCKINGCOMPONENT = 110,
#endif // WASABI_COMPILE_COMPONENTS

            API_SERVICE_SERVICE_UNLOCK           = 120,
            API_SERVICE_ISVALID                  = 130,
            API_SERVICE_COMPACT_DUPLICATES       = 140,
        };
    };

// ----------------------------------------------------------------------------

    inline int api_service::service_register( waServiceFactory *svc )
    {
        int __retval = _call( API_SERVICE_SERVICE_REGISTER, (int)0, svc );
        return __retval;
    }

    inline int api_service::service_deregister( waServiceFactory *svc )
    {
        int __retval = _call( API_SERVICE_SERVICE_DEREGISTER, (int)0, svc );
        return __retval;
    }

    inline size_t api_service::service_getNumServices( FOURCC svc_type )
    {
        int __retval = _call( API_SERVICE_SERVICE_GETNUMSERVICES, (int)0, svc_type );
        return __retval;
    }

    inline waServiceFactory *api_service::service_enumService( FOURCC svc_type, size_t n )
    {
        waServiceFactory *__retval = _call( API_SERVICE_SERVICE_ENUMSERVICE, (waServiceFactory *)0, svc_type, n );
        return __retval;
    }

    inline waServiceFactory *api_service::service_getServiceByGuid( GUID guid )
    {
        waServiceFactory *__retval = _call( API_SERVICE_SERVICE_GETSERVICEBYGUID, (waServiceFactory *)0, guid );
        return __retval;
    }

    inline int api_service::service_lock( waServiceFactory *owner, void *svcptr )
    {
        int __retval = _call( API_SERVICE_SERVICE_LOCK, (int)0, owner, svcptr );
        return __retval;
    }

    inline int api_service::service_clientLock( void *svcptr )
    {
        int __retval = _call( API_SERVICE_SERVICE_CLIENTLOCK, (int)0, svcptr );
        return __retval;
    }

    inline int api_service::service_release( void *svcptr )
    {
        int __retval = _call( API_SERVICE_SERVICE_RELEASE, (int)0, svcptr );
        return __retval;
    }

    inline const char *api_service::service_getTypeName( FOURCC svc_type )
    {
        const char *__retval = _call( API_SERVICE_SERVICE_GETTYPENAME, (const char *)0, svc_type );
        return __retval;
    }

#ifdef WASABI_COMPILE_COMPONENTS
    inline GUID api_service::service_getOwningComponent( void *svcptr )
    {
        GUID __retval = _call( API_SERVICE_SERVICE_GETOWNINGCOMPONENT, INVALID_GUID, svcptr );
        return __retval;
    }

    inline GUID api_service::service_getLockingComponent( void *svcptr )
    {
        GUID __retval = _call( API_SERVICE_SERVICE_GETLOCKINGCOMPONENT, INVALID_GUID, svcptr );
        return __retval;
    }
#endif // WASABI_COMPILE_COMPONENTS

    inline int api_service::service_unlock( void *svcptr )
    {
        int __retval = _call( API_SERVICE_SERVICE_UNLOCK, (int)0, svcptr );
        return __retval;
    }

    inline int api_service::service_isvalid( FOURCC svctype, waServiceFactory *service )
    {
        int __retval = _call( API_SERVICE_ISVALID, (int)0, svctype, service );
        return __retval;
    }

    inline int api_service::service_compactDuplicates( waServiceFactory *me )
    {
        return _call( API_SERVICE_COMPACT_DUPLICATES, (int)1, me );
    }
// ----------------------------------------------------------------------------


extern api_service *serviceApi;

#ifndef WASABI_API_SVC
#define WASABI_API_SVC serviceApi
#endif // !WASABI_API_SVC

#endif // __API_SERVICE_H