root/modules/widgetman/widgetman.h

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

INCLUDED FROM


//This software module was originally developed by TelecomParisTech in the
//course of the development of MPEG-U Widgets (ISO/IEC 23007-1) standard.
//
//This software module is an implementation of a part of one or
//more MPEG-U Widgets (ISO/IEC 23007-1) tools as specified by the MPEG-U Widgets
//(ISO/IEC 23007-1) standard. ISO/IEC gives users of the MPEG-U Widgets
//(ISO/IEC 23007-1) free license to this software module or modifications
//thereof for use in hardware or software products claiming conformance to
//the MPEG-U Widgets (ISO/IEC 23007-1). Those intending to use this software
//module in hardware or software products are advised that its use may
//infringe existing patents.
//The original developer of this software module and his/her company, the
//subsequent editors and their companies, and ISO/IEC have no liability
//for use of this software module or modifications thereof in an implementation.
//Copyright is not released for non MPEG-U Widgets (ISO/IEC 23007-1) conforming
//products.
//Telecom ParisTech retains full right to use the code for his/her own purpose,
//assign or donate the code to a third party and to inhibit third parties from
//using the code for non MPEG-U Widgets (ISO/IEC 23007-1) conforming products.
//
//This copyright notice must be included in all copies or derivative works.
//
//Copyright (c) 2009 Telecom ParisTech.
//
// Alternatively, this software module may be redistributed and/or modified
//  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.
//
/////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////
//
//      Authors:
//                                      Jean Le Feuvre, Telecom ParisTech
//                                      Cyril Concolato, Telecom ParisTech
//
/////////////////////////////////////////////////////////////////////////////////

#ifndef _WIDGETMAN_H_
#define _WIDGETMAN_H_

#include "unzip.h"

/*base SVG type*/
#include <gpac/modules/js_usr.h>

#ifdef GPAC_HAS_SPIDERMONKEY

#include <gpac/nodes_mpeg4.h>
#include <gpac/nodes_x3d.h>
#include <gpac/nodes_svg.h>
/*dom events*/
#include <gpac/events.h>

#include <gpac/download.h>
#include <gpac/crypt.h>
#include <gpac/network.h>
#include <gpac/xml.h>
#include <gpac/internal/scenegraph_dev.h>


#include <gpac/isomedia.h>

#include <gpac/internal/smjs_api.h>

#include <gpac/internal/terminal_dev.h>
#include <gpac/internal/compositor_dev.h>


JSBool gf_sg_js_event_add_listener(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval, GF_Node *vrml_node);
JSBool gf_sg_js_event_remove_listener(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval, GF_Node *vrml_node);

typedef struct _widget_manager
{
        JSContext *ctx;
        /*widget manager class*/
        GF_JSClass widmanClass;
        /*widget class used by the widget manager*/
        GF_JSClass wmWidgetClass;

        /*widget class used by the widget scripts*/
        GF_JSClass widgetClass;

        GF_JSClass widgetAnyClass;

        JSObject *obj;
        GF_Terminal *term;
        GF_List *widget_instances;
        /*list of loaded prototypes (eg 1 per all instances of the same widget*/
        GF_List *widgets;
} GF_WidgetManager;



enum
{
        GF_WPIN_STRING,
        GF_WPIN_INTEGER,
        GF_WPIN_NUMBER,
};

typedef struct
{
        char *inner_path;
        char *extracted_path;
        Bool extracted;
} GF_WidgetPackageResource;

typedef struct _widget_package_relocator
{
        GF_TERM_URI_RELOCATOR
        GF_List *resources;
        struct _widget *widget;
        GF_WidgetManager *wm;
        Bool is_zip;
        char root_extracted_path[GF_MAX_PATH];
        char archive_id[14];
        char *package_path;
        GF_DownloadSession *sess;
} GF_WidgetPackage;


enum
{
        GF_WM_PARAM_OUTPUT,
        GF_WM_PARAM_INPUT,
        GF_WM_INPUT_ACTION,
        GF_WM_OUTPUT_TRIGGER,
        GF_WM_BIND_ACTION,
        GF_WM_UNBIND_ACTION,
        GF_WM_PREF_CONNECT,
        GF_WM_ACTIVATE_TRIGGER,
        GF_WM_DEACTIVATE_TRIGGER,
        GF_WM_PREF_SAVEDACTION,
        GF_WM_PREF_RESTOREDACTION,
        GF_WM_PREF_SAVETRIGGER,
        GF_WM_PREF_RESTORETRIGGER,
};

#define GF_WM_PARAM_SCRIPT_STRING       (u16) 0
#define GF_WM_PARAM_SCRIPT_BOOL         (u16) 1
#define GF_WM_PARAM_SCRIPT_NUMBER       (u16) 2

typedef struct
{
        struct __widget_message *msg;

        u16 type;
        u16 script_type;
        Bool in_action;

        char *name;
        char *node;
        char *attribute;
        char *default_value;
} GF_WidgetPin;

typedef struct __widget_message
{
        struct _widget_interface *ifce;

        char *name;
        Bool is_output;
        GF_List *params;

        GF_WidgetPin *input_action;
        GF_WidgetPin *output_trigger;

} GF_WidgetMessage;

typedef struct _widget_interface
{
        struct __widget_content *content;
        char *type;
        GF_List *messages;

        GF_WidgetPin *bind_action;
        GF_WidgetPin *unbind_action;
        Bool provider, multiple_binding, required;
        char *connectTo;

        JSObject *obj;
} GF_WidgetInterface;

typedef struct _widget_component
{
        struct __widget_content *content;
        char *id;       /*may be NULL*/
        char *src;      /*may be NULL*/
        GF_List *required_interfaces;   /*may be empty*/
        GF_WidgetPin *activateTrigger;
        GF_WidgetPin *deactivateTrigger;
        GF_WidgetPin *activatedAction;
        GF_WidgetPin *deactivatedAction;
} GF_WidgetComponent;

enum
{
        GF_WM_PREF_READONLY = 1,
        GF_WM_PREF_SAVE = 1<<1,
        GF_WM_PREF_MIGRATE = 1<<2,
};

typedef struct
{
        char *name, *value;
        u32 flags;
        GF_WidgetPin *connectTo;
} GF_WidgetPreference;

typedef struct
{
        char *name, *value;
} GF_WidgetFeatureParam;

typedef struct
{
        char *name;
        Bool required;
        GF_List *params;
} GF_WidgetFeature;

typedef struct __widget_content
{
        struct _widget *widget;

        char *src;
        char *relocated_src;
        u32 width, height;

        char *encoding, *mimetype;

        GF_List *interfaces;
        GF_List *components;
        /*list of preferences for the widget content*/
        GF_List *preferences;

        GF_WidgetPin *savedAction;
        GF_WidgetPin *restoredAction;
        GF_WidgetPin *saveTrigger;
        GF_WidgetPin *restoreTrigger;
} GF_WidgetContent;

typedef struct _widget
{
        GF_WidgetManager *wm;

        u32 nb_instances;

        /* url to the file.wgt file when zip packaged or to the config.xml file when unpackaged */
        char *url;
        /* path to the manifest/config document */
        char *manifest_path;

        GF_List *icons;
        /*
                GF_WidgetContent *simple;
                char *icon_url;
        */
        GF_WidgetContent *main;

        GF_WidgetPackage *wpack;

        /*misc metadata for W3C Widgets API*/
        char *name, *shortname, *identifier,
             *authorName, *authorEmail, *authorHref,
             *description, *version,
             *uuid, *license, *licenseHref, *viewmodes;

        u32 width, height;

        GF_List *features;

        Bool discardable, multipleInstance;

        /*when a widget is being received from a remote peer,
        we remember where we locally store it to be able to further remote it
        This is only supported for packaged widgets*/
        char *local_path;
} GF_Widget;

typedef struct _widget_instance
{
        GF_Widget *widget;

        u32 instance_id;
        JSObject *obj;
        u8 secname[18];
        GF_SceneGraph *scene;
        /*node in the widget manager which holds the widget: Inline {} , <animation>, ...*/
        GF_Node *anchor;

        Bool activated, permanent;

        GF_List *output_triggers;
        GF_List *bound_ifces;
        /*list of components for a parent widget*/
        GF_List *components;
        /*parent of the widget for a component widget*/
        struct _widget_instance *parent;

        GF_DOMParser *mpegu_context;


        /*scripting context of the widget scene*/
        JSContext *scene_context;
        JSObject *scene_global;
        /*"Widget" object in the scene*/
        JSObject *scene_obj;
} GF_WidgetInstance;


typedef struct
{
        GF_WidgetInterface *ifce;
        GF_WidgetInstance *wid;
        char *hostname;
        JSObject *obj;
        JSObject *cookie;
} GF_WidgetInterfaceInstance;

typedef struct
{
        GF_WidgetComponent *comp;
        GF_WidgetInstance *wid;
} GF_WidgetComponentInstance;


GF_WidgetInstance *wm_load_widget(GF_WidgetManager *wm, const char *path, u32 InstanceID, Bool skip_context);


JSBool SMJS_FUNCTION(widget_has_feature);
JSBool SMJS_FUNCTION(widget_open_url);
JSBool SMJS_FUNCTION(widget_get_attention);
JSBool SMJS_FUNCTION(widget_show_notification);
JSBool SMJS_FUNCTION(widget_get_interface);
SMJS_DECL_FUNC_PROP_GET(widget_getProperty);
SMJS_DECL_FUNC_PROP_SET(widget_setProperty);

void widget_on_interface_bind(GF_WidgetInterfaceInstance *ifce, Bool unbind);

void widget_load(GF_WidgetManager *wm, GF_SceneGraph *scene, JSContext *c, JSObject *global, Bool unload);

GF_WidgetComponentInstance *wm_activate_component(JSContext *c, GF_WidgetInstance *wid, GF_WidgetComponent *comp, Bool skip_wm_notification);

void wm_deactivate_component(JSContext *c, GF_WidgetInstance *wid, GF_WidgetComponent *comp, GF_WidgetComponentInstance *comp_inst);



const char *wm_xml_get_attr(GF_XMLNode *root, const char *name);

GF_BaseInterface *LoadWidgetReader();
void ShutdownWidgetReader(GF_BaseInterface *ifce);


#endif /*GPAC_HAS_SPIDERMONKEY*/

#endif

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