root/modules/platinum/GenericDevice.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      GPAC - Multimedia Framework C SDK
 *
 *                      Authors: Jean Le Feuvre
 *                      Copyright (c) Telecom ParisTech 2009-2012
 *                      All rights reserved
 *
 *  This file is part of GPAC / Platinum UPnP module
 *
 *  GPAC 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, or (at your option)
 *  any later version.
 *
 *  GPAC 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; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 *      ----------------------------------------------------------------------------------
 *              PLATINUM IS LICENSED UNDER GPL or commercial agreement - cf platinum license
 *      ----------------------------------------------------------------------------------
 *
 */


#ifndef _GPAC_GENERIC_DEVICE_H_
#define _GPAC_GENERIC_DEVICE_H_

#include "Neptune.h"
#include "PltCtrlPoint.h"
#include "PltDeviceHost.h"
#include "PltService.h"

#include <gpac/thread.h>
#include <gpac/list.h>

#ifdef GPAC_HAS_SPIDERMONKEY
#include <gpac/internal/scenegraph_dev.h>
#include <gpac/internal/smjs_api.h>
#endif

class GF_UPnP;
class GPAC_ServiceItem;

class GPAC_DeviceItem
{
public:
        GPAC_DeviceItem(PLT_DeviceDataReference device, NPT_String uuid);
        ~GPAC_DeviceItem();

        PLT_DeviceDataReference m_device;
        NPT_String m_UUID;
        GF_UPnP *m_pUPnP;

        GPAC_ServiceItem *FindService(const char *type);
        void RefreshServiceList();

        GF_List *m_Services;
#ifdef GPAC_HAS_SPIDERMONKEY
        void DetachJS();
        JSObject *obj;
        JSContext *js_ctx;
#endif
};

#ifdef GPAC_HAS_SPIDERMONKEY
class GPAC_StateVariableListener
{
public:
        GPAC_StateVariableListener() {
                on_event = JSVAL_NULL;
                name = "";
                var = NULL;
        }
        NPT_String name;
        jsval on_event;
        PLT_StateVariable *var;
};


class GPAC_ActionArgListener
{
public:
        GPAC_ActionArgListener() {
                on_event = JSVAL_NULL;
                arg = NULL;
                action = NULL;
        }
        jsval on_event;
        PLT_ActionDesc *action;
        PLT_ArgumentDesc *arg;
        Bool is_script;
};

class GPAC_ActionUDTA
{
public:
        GPAC_ActionUDTA() {
                m_Reserved = NULL;
                udta = JSVAL_NULL;
        }
        /*members*/

        /*this is used to differentiate browse request from JS (using BrowseDataReference)
        as used in GPAC_MediaController and actionResponse used by the generic controller*/
        void *m_Reserved;
        jsval udta;
};

#endif


class GPAC_ServiceItem
{
public:
        GPAC_ServiceItem(GPAC_DeviceItem *device, PLT_Service *service);
        ~GPAC_ServiceItem();


        GPAC_DeviceItem *m_device;
        PLT_Service *m_service;

        NPT_List<PLT_StateVariable*>*vars;

#ifdef GPAC_HAS_SPIDERMONKEY
        void DetachJS();
        JSObject *obj;
        jsval on_event;
        JSContext *js_ctx;
        GF_List *m_StateListeners;
        GF_List *m_ArgListeners;
        Bool subscribed;
#endif

};


class GPAC_GenericController :  public PLT_CtrlPointListener
{
public:
        GPAC_GenericController(PLT_CtrlPointReference& ctrlPoint, GF_UPnP *upnp);
        ~GPAC_GenericController();

        /*any device control point*/
        virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
        virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
        virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata);
        virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List<PLT_StateVariable*>* vars);

        GF_List *m_Devices;
        GF_UPnP *m_pUPnP;
        PLT_CtrlPointReference m_CtrlPoint;
        GF_Mutex *m_ControlPointLock;
};


class GPAC_GenericDevice : public PLT_DeviceHost
{
public:
        GPAC_GenericDevice(const char* FriendlyName, const char *device_id);
        virtual ~GPAC_GenericDevice();

protected:
        // PLT_DeviceHost methods
        virtual NPT_Result SetupServices();
        virtual NPT_Result OnAction(PLT_ActionReference&          action,
                                    const PLT_HttpRequestContext& context);
public:
        GF_UPnP *m_pUPnP;
        GF_List *m_pServices;

#ifdef GPAC_HAS_SPIDERMONKEY
        void DetachJS(JSContext *c);
        jsval run_proc;
        jsval act_proc;
        JSObject *obj;
        NPT_String js_source;
        PLT_ActionReference act_ref;
        GF_Semaphore *m_pSema;
        GF_Mutex *m_pMutex;
#endif
};

class GPAC_Service : public PLT_Service
{
public:
        GPAC_Service(PLT_DeviceData* device, const char*     type = NULL,  const char*     id = NULL, const char*     name = NULL, const char*     last_change_namespace = NULL);
        ~GPAC_Service();

#ifdef GPAC_HAS_SPIDERMONKEY
        void SetupJS(JSContext *c, GF_UPnP *upnp, JSObject *parent);
        JSObject *m_pObj;
        JSContext *m_pCtx;
        jsval on_action;
#endif

};



#endif //_GPAC_GENERIC_DEVICE_H_

/* [<][>][^][v][top][bottom][index][help] */