Lookup and authentication for websocket services
    
        App instances can provide services on incoming appwebsocket connections that can be used by the PBX or other app instances.
        Those services are JSON APIs that are identified by a string. For ensuring the uniqueness, we recommend using the reverse domain name notation like "com.innovaphone.provisioning".
        See the documentation of AppWebsocket::AppWebsocketServiceInfo on how to publish services.
    
    
        If you want to find and authenticate against one of those services you can use this library. After attaching it to the websocket connection from the PBX you can
        
            - get the available services and their websocket URLs for a given service id.
 
            - get an authentication for a service from the PBX.
 
        
    
    File information
    
    
    Functions
    Functions to initialize
    extern class IServicesApi * CreateServicesApi(class UServicesApi * user, class IJsonApiConnection * conn);
    CreateServicesApi
    
        Creates an instance of the service API and attaches it to a IJsonApiConnection.
        Parameters
        
            | class UServicesApi * user | The UServicesApi implementation that will handle the callbacks. | 
            | class IJsonApiConnection * conn | The IJsonApiConnection instance that shall be used. It must be an appwebsocket connection from a PBX that offered the "Services" API in the PbxInfo message. | 
        
        Return value
        The actual IServicesApi object. The object is owned by the IJsonApiConnection and is deleted when the connection is closed. It must not be deleted by the application.
    
    
    Classes
    IServicesApi
    class IServicesApi {
public:
    virtual ~IServicesApi() {};
    virtual class IService * GetService(const char * api) = 0;
    virtual class IAppWebsocketAuthenticator * CreateAuthenticator(class UAppWebsocketAuthenticator * user = 0) = 0;
};
    Overview
    This class provides lookup and authentication for services.
    Public functions
    GetService
    
        Returns the first IService object for the given API ID.
        Parameters
        
            | const char * api | The ID of the API, typically in reverse domain name notation. | 
        
        Return value
        An IService object representing the first found service. If there is no matching service the return value will be NULL.
        Remarks
        The returned object is volatile. The application should not store a pointer to it but just use the contained values or copy them.
    
    CreateAuthenticator
    
        Creates an object that can handle the authentication against services. It can be passed to IAppWebsocketClient::Connect.
        Parameters
        
        Return value
        The created UAppWebsocketAuthenticator object that will be used by IAppWebsocketClient::Connect. 
    
    UServicesApi
    class UServicesApi {
public:
    virtual void ServicesApiUpdated(class IServicesApi * servicesApi) = 0;
    virtual void ServicesApiClosed(class IServicesApi * servicesApi) = 0;
};
    Overview
    Base class for applications that use the library.
    Public functions
    ServicesApiUpdated
    
        Called if there are updates on the available services. This can happen if services appear, disappear or the details are changed.
        Parameters
        
            | class IServicesApi * servicesApi | A pointer to the source of the callback. | 
        
    
    ServicesApiClosed
    
        Called if the IServicesApi is closed. The application must not do any more function calls on it.
        Parameters
        
            | class IServicesApi * servicesApi | A pointer to the source of the callback. | 
        
        Remarks
        The application must not delete the IServicesApi. This is done by the IJsonApiConnection that owns the object.
    
    IService
    class IService {
public:
    virtual const char * GetName() = 0;
    virtual const char * GetTitle() = 0;
    virtual const char * GetWebsocketUrl() = 0;
    virtual const char * GetApiInfo() = 0;
    virtual class IService * GetNext() = 0;
};
    Overview
    This class provides the information about a single service and a pointer to the next service of the same type.
    Public functions
    GetName
    
        Return value
        The SIP URI of the app instance providing the service.
    
    GetTitle
    
        Return value
        The display name of the app instance providing the service.
    
    GetWebsocketUrl
    
        Return value
        The websocket URL of the service.
    
    GetApiInfo
    
        Return value
        A string containing a JSON structure with further information about the service.
    
    GetNext
    
        Return value
        Returns the next IService in the list or NULL if there are no more.
    
 
     Code Example 
    Attaching to the websocket connection from the PBX
    void MyAppwebsocketSession::AppWebsocketMessage(class json_io & msg, word base, const char * mt, const char * src)
{
    if (!strcmp(mt, "PbxInfo")) {
        servicesApi = CreateServicesApi(this, this);
        AppWebsocketMessageComplete();
    }
    else {
        AppWebsocketMessageComplete();
    }
}
    Lookup and authentication
    class IService * service = services.GetService("com.innovaphone.provisioning");
if (service) {
    appWebsocketClient->Connect(service->GetWebsocketUrl(), service->GetName(), servicesApi->CreateAuthenticator());
}