From 908a1aa4df007d7ab5c9e5b29e4bb1228f9ff738 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Sat, 11 Feb 2012 19:13:29 +0100 Subject: [PATCH] Imported Upstream version 0.4.5+svn3912~dfsg1 --- applications/hbbtvplayer/README.txt | 15 - applications/hbbtvplayer/REQUIREMENT | 10 - applications/hbbtvplayer/doc/avancement.txt | 17 - applications/hbbtvplayer/doc/introduction.txt | 5 - .../hbbtvplayer/doc/projectmanagement.txt | 16 - applications/hbbtvplayer/getsources.sh | 44 - .../hbbtvplayer/hbbtvbrowserplugin/README | 14 - .../hbbtvplayer/hbbtvbrowserplugin/autogen.sh | 5 - .../hbbtvbrowserplugin/configure.ac | 19 - .../hbbtvBrowserPlugin-NPAPI-20111108.pptx | Bin 651985 -> 0 bytes .../doc/listeOIPFProfile.xlsx | Bin 18967 -> 0 bytes .../hbbtvbrowserplugin.pc.in | 12 - .../hbbtvbrowserplugin.vcproj | 311 ----- .../hbbtvbrowserplugin/makefile.am | 7 - .../hbbtvbrowserplugin/makefile.old | 110 -- .../hbbtvbrowserplugin/hbbtvbrowserplugin.cbp | 92 -- .../hbbtvbrowserplugin.layout | 106 -- .../releases/hbbtvbrowserplugin-0.01.tar.gz | Bin 11234 -> 0 bytes .../hbbtvbrowserplugin/src/applicationclass.c | 265 ---- .../hbbtvbrowserplugin/src/applicationclass.h | 59 - .../src/applicationprivatedataclass.c | 219 ---- .../src/applicationprivatedataclass.h | 54 - .../src/configurationclass.c | 182 --- .../src/configurationclass.h | 43 - .../hbbtvbrowserplugin/src/downloadclass.c | 209 ---- .../hbbtvbrowserplugin/src/downloadclass.h | 42 - .../src/downloadcollectionclass.c | 194 --- .../src/downloadcollectionclass.h | 43 - .../src/drmcontrolinfocollectionclass.c | 20 - .../src/drmcontrolinfocollectionclass.h | 26 - .../src/drmcontrolinformationclass.c | 20 - .../src/drmcontrolinformationclass.h | 26 - .../src/hbbtvbrowserplugin.c | 335 ----- .../src/hbbtvbrowserplugin.h | 82 -- .../src/hbbtvbrowserpluginapi.c | 45 - .../src/hbbtvbrowserpluginapi.h | 32 - .../hbbtvbrowserplugin/src/keysetclass.c | 330 ----- .../hbbtvbrowserplugin/src/keysetclass.h | 51 - .../hbbtvbrowserplugin/src/makefile.am | 47 - .../src/oipfapplicationmanager.c | 203 ---- .../src/oipfapplicationmanager.h | 59 - .../src/oipfconfiguration.c | 182 --- .../src/oipfconfiguration.h | 42 - .../src/oipfdownloadmanager.c | 233 ---- .../src/oipfdownloadmanager.h | 48 - .../src/oipfdownloadtrigger.c | 205 ---- .../src/oipfdownloadtrigger.h | 46 - .../hbbtvbrowserplugin/src/videobroadcast.c | 431 ------- .../hbbtvbrowserplugin/src/videobroadcast.h | 70 -- .../src/webkit-plugin-header/npapi.h | 901 -------------- .../src/webkit-plugin-header/npfunctions.h | 223 ---- .../src/webkit-plugin-header/npruntime.h | 393 ------ .../src/webkit-plugin-header/nptypes.h | 122 -- .../hbbtvplayer/hbbtvterminal/autogen.sh | 6 - .../hbbtvplayer/hbbtvterminal/configure.ac | 40 - .../hbbtvterminal/hbbtv_terminal.vcproj | 219 ---- .../hbbtvplayer/hbbtvterminal/makefile.am | 17 - .../hbbtvplayer/hbbtvterminal/makefile.old | 81 -- .../hbbtvterminal/HbbtvTerminal.cbp | 35 - .../hbbtvterminal/HbbtvTerminal.layout | 28 - .../hbbtvterminal/src/hbbtv_channel.cpp | 253 ---- .../hbbtvterminal/src/hbbtv_demux.cpp | 388 ------ .../hbbtvterminal/src/hbbtv_keycontrol.cpp | 354 ------ .../hbbtvterminal/src/hbbtv_tools.cpp | 51 - .../hbbtvterminal/src/hbbtvterminal.cpp | 1081 ----------------- .../hbbtvterminal/src/hbbtvterminal.h | 350 ------ .../hbbtvplayer/hbbtvterminal/src/makefile.am | 25 - applications/hbbtvplayer/install.sh | 78 -- applications/hbbtvplayer/listdependencies | 79 -- .../codeblocks/hbbtvplayer.workspace | 7 - 70 files changed, 9357 deletions(-) delete mode 100644 applications/hbbtvplayer/README.txt delete mode 100644 applications/hbbtvplayer/REQUIREMENT delete mode 100644 applications/hbbtvplayer/doc/avancement.txt delete mode 100644 applications/hbbtvplayer/doc/introduction.txt delete mode 100644 applications/hbbtvplayer/doc/projectmanagement.txt delete mode 100644 applications/hbbtvplayer/getsources.sh delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/README delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/autogen.sh delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/configure.ac delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/doc/hbbtvBrowserPlugin-NPAPI-20111108.pptx delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/doc/listeOIPFProfile.xlsx delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.pc.in delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.vcproj delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/makefile.am delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/makefile.old delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.cbp delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.layout delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/releases/hbbtvbrowserplugin-0.01.tar.gz delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/makefile.am delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.c delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npapi.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npfunctions.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npruntime.h delete mode 100644 applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/nptypes.h delete mode 100644 applications/hbbtvplayer/hbbtvterminal/autogen.sh delete mode 100644 applications/hbbtvplayer/hbbtvterminal/configure.ac delete mode 100644 applications/hbbtvplayer/hbbtvterminal/hbbtv_terminal.vcproj delete mode 100644 applications/hbbtvplayer/hbbtvterminal/makefile.am delete mode 100644 applications/hbbtvplayer/hbbtvterminal/makefile.old delete mode 100644 applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.cbp delete mode 100644 applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.layout delete mode 100644 applications/hbbtvplayer/hbbtvterminal/src/hbbtv_channel.cpp delete mode 100644 applications/hbbtvplayer/hbbtvterminal/src/hbbtv_demux.cpp delete mode 100644 applications/hbbtvplayer/hbbtvterminal/src/hbbtv_keycontrol.cpp delete mode 100644 applications/hbbtvplayer/hbbtvterminal/src/hbbtv_tools.cpp delete mode 100644 applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.cpp delete mode 100644 applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.h delete mode 100644 applications/hbbtvplayer/hbbtvterminal/src/makefile.am delete mode 100644 applications/hbbtvplayer/install.sh delete mode 100644 applications/hbbtvplayer/listdependencies delete mode 100644 applications/hbbtvplayer/projectmanager/codeblocks/hbbtvplayer.workspace diff --git a/applications/hbbtvplayer/README.txt b/applications/hbbtvplayer/README.txt deleted file mode 100644 index c050ddb..0000000 --- a/applications/hbbtvplayer/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -/*****************************************************************************/ - -Documentation summary - - 'doc/introduction.txt' to know the purpose of the project - - 'doc/projectmanangement.txt' to know the organisation of files and directories. - - 'doc/avancement.txt' to know the progress in the development of the project - -/*****************************************************************************/ - -1. Run getsources.sh (without sudo) to get the sources of gpac and/or webkit if necessary - -2. Run 'sudo ./install.sh' with the appropriate parameter (full, player, gpac, webkit or dependencies) diff --git a/applications/hbbtvplayer/REQUIREMENT b/applications/hbbtvplayer/REQUIREMENT deleted file mode 100644 index 328c4d0..0000000 --- a/applications/hbbtvplayer/REQUIREMENT +++ /dev/null @@ -1,10 +0,0 @@ - -install.sh script will work on the follwoing conditions of execution : - -linux ubuntu 11.04 environnement -graphic drivers supporting transparency -installed xulrunner with correct library path (that could be not the default case in old version of xulrunner) - -the execution of hbbtvplayer require a enought large screen to display several windows, including a main window able in 720p resolution (1280x720) - - diff --git a/applications/hbbtvplayer/doc/avancement.txt b/applications/hbbtvplayer/doc/avancement.txt deleted file mode 100644 index 0b196b9..0000000 --- a/applications/hbbtvplayer/doc/avancement.txt +++ /dev/null @@ -1,17 +0,0 @@ - -mardi 12 avril 2011, 09:09:57 (UTC+0200) - -- video on TVview : bug of displaying, video truncated - -jeudi 2 décembre 2010, 14:14:23 (UTC+0100) - -- adding Remote Control keys as buttons, simulating the RCU - -lundi 22 novembre 2010, 09:50:31 (UTC+0100) - -- construction du GTK global, liaison avec Webkit par le GTKWidget dedie... liaosion avec GPAC , en fenetre -- would be nice to find a way to do all in one window. - -jeudi 14 octobre 2010, 10:15:36 (UTC+0200) - -- création diff --git a/applications/hbbtvplayer/doc/introduction.txt b/applications/hbbtvplayer/doc/introduction.txt deleted file mode 100644 index a9953ac..0000000 --- a/applications/hbbtvplayer/doc/introduction.txt +++ /dev/null @@ -1,5 +0,0 @@ - -HbbTV Player - -the goal is to get a HbbTVTerminal emulation on a PC and be able to play HbbTV applications, that could be include in a Stream. -The player will receveive input of HbbtvApplication entry files, or TS-stream featuring HBBTV. diff --git a/applications/hbbtvplayer/doc/projectmanagement.txt b/applications/hbbtvplayer/doc/projectmanagement.txt deleted file mode 100644 index a94288d..0000000 --- a/applications/hbbtvplayer/doc/projectmanagement.txt +++ /dev/null @@ -1,16 +0,0 @@ - -the project include 2 sub-project : - -- hbbtvterminal : a terminal able to play Video/Audio, an RCU emulation, and display a webbrowser linking to the hbbtvbrowserplugin (see below) - -- hbbtvbrowserplugin : a NPAPI plugin able to play HbbtvApps in a webbrowser . - - -CODEBLOCKS : - -for the use of codeblocks , you can find a workspace in /projectmanager/codeblocks/hbbtvplayer/ - -each project contains a projectmanager directory, including a codeblocks specification projects : - -/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/hbbtvterminal.cbp -/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.cbp diff --git a/applications/hbbtvplayer/getsources.sh b/applications/hbbtvplayer/getsources.sh deleted file mode 100644 index b8a7447..0000000 --- a/applications/hbbtvplayer/getsources.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh -e - -WEBKIT=0 -GPAC=0 - -if [ -z $1 ] ; then - echo "\nDO NOT USE sudo FOR THIS SCRIPT" - echo "\nUsage: You must choose options :" - echo "\n\033[31m full - build the whole package (gpac+webkit+hbbtvplayer) Recommended for computer without gpac \033[0m" - echo "\n\033[33m webkit - download Webkit sources and install it\033[0m" - echo "\n\033[33m gpac - download gpac sources and install it\033[0m" - exit 1 -fi - -for i in $* ; do - if [ "$i" = "full" ] ; then - echo -e "\033[31m Usage: $0 Full Building : Activated \033[0m" - WEBKIT=1 - GPAC=1 - fi - - if [ "$i" = "webkit" ] ; then - echo -e "\033[33m Usage: $0 Webkit Building : Activated \033[0m" - WEBKIT=1 - fi - - if [ "$i" = "gpac" ] ; then - echo -e "\033[33m Usage: $0 gpac Building : Activated \033[0m" - WEBKIT=1 - fi -done - -if [ $GPAC -eq 1 ] ; then - svn checkout https://gpac.svn.sourceforge.net/svnroot/gpac/trunk/gpac gpac -fi - -if [ $WEBKIT -eq 1 ] ; then - svn checkout http://svn.webkit.org/repository/webkit/trunk WebKit --depth files -r 97300 # 98458 ? - svn checkout http://svn.webkit.org/repository/webkit/trunk/Source WebKit/Source -r 97300 - svn checkout http://svn.webkit.org/repository/webkit/trunk/Tools WebKit/Tools -r 97300 - svn checkout http://svn.webkit.org/repository/webkit/trunk/WebKitLibraries WebKit/WebKitLibraries -r 97300 -fi - - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/README b/applications/hbbtvplayer/hbbtvbrowserplugin/README deleted file mode 100644 index d3b8d3f..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/README +++ /dev/null @@ -1,14 +0,0 @@ -****************************************** -HBBTVBROWSERPLUGIN v0.01 - -To build : - - make - -To install : - - sudo make install - -******************************************* - - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/autogen.sh b/applications/hbbtvplayer/hbbtvbrowserplugin/autogen.sh deleted file mode 100644 index 124f59c..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/autogen.sh +++ /dev/null @@ -1,5 +0,0 @@ -#! /bin/sh - -autoreconf --install -v - -./configure diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/configure.ac b/applications/hbbtvplayer/hbbtvbrowserplugin/configure.ac deleted file mode 100644 index ff93781..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/configure.ac +++ /dev/null @@ -1,19 +0,0 @@ - - -AC_INIT([hbbtvbrowserplugin], [0.1.0], [stanislas.selle@telecom-paristech.fr]) - -AC_CONFIG_AUX_DIR([build-aux]) -AC_CONFIG_MACRO_DIR([m4]) - -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - -AM_INIT_AUTOMAKE([foreign -Wall -Werror]) -AC_PROG_CC -AC_PROG_LIBTOOL - -PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.28.0]) -PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.20.1]) -AC_SUBST([PLUGINDIR], [/usr/lib/mozilla/plugins]) -LT_INIT -AC_CONFIG_FILES([makefile src/makefile hbbtvbrowserplugin.pc]) -AC_OUTPUT diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/doc/hbbtvBrowserPlugin-NPAPI-20111108.pptx b/applications/hbbtvplayer/hbbtvbrowserplugin/doc/hbbtvBrowserPlugin-NPAPI-20111108.pptx deleted file mode 100644 index 90203fa87e86d1b2d1839c7b00d08dc4c3fc4639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651985 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 z 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¨Pr^f* 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
wY1I)IJ7R|AxnOOE;U? ziRP7c#~do}aR0oVB*BR_QfIXb2l2tWqe`^FZXT2F$04~B%cVT6n*k1_`m+K4?fm??4o9EnGh*XeATZh zlRr81@Y2JAcN)s)gayi2F&2V8ixCRG$Rh!>G#K5i;Mpv#Bw~f zxF~GFGPZp+{GYVEW|0+Nwcf}ob%%Uzqj;fQn%EX(@PGcp8t!$G$di!p4z8_&uk420XJfJ*3 z=rPVBEZW6c9^l&0#`dYXF^5j`-0WTUkH{i@78Cn%Hks zuOj4Q4%JYeMIBD!Qxp$PZ-v_ECFqg=%YxCs+!n$GjDrOKJ5bmE%9hn}2g}R1acp9) z9hE<5N%Z6I^m;Am$JC)8`&n(|P>f%6fOPRo@*0@f;P16lr!0GR6Z^^ivsGECAoP(H z^jS2QO5%b2BK=6Fo75Ls)vemk1(|1`HYDEkt0k_N6dex^**W}>a7AW%nEiOVy+F68 ztbF#TpvEi5&Z~DnX5h|~AAwy3i*xV1#`m_7qLSrVta+aa^VN?y<$z+7h5H1hCl1xz zhk-V7t4<&XVJe|iJY`UtT|ByR;J(|{$jgb`9}pE226B#T2_KWS96M&G7!#iT)c!vG zNu4&qOscLkbU$Nt9V|TvmYBa~{i#*N$9X*NNz{|aA4BWL*5WP)mmUmh8;cFN*rg83 z%|z$X+?`^wZXjpN)*!s!*^DYbZg+kSJZmxf_J=d8gYUW0?|;54zj(@=6yf4bl*+d<=(9(*vqusOIxIppj1ndieedGgPNA3PYQ z-+{wV&!#Ume|WcdaHC0}ViAY63)A}~OXn>f_FER!B_PkK(oy!~t)li+6Dnr%%h!jr z@sq{xB{rnqx0mz;nXo56<&<=NPg{EVffS_rlh<9J@R}>%>($uZZJ43-Cmd#f@UQOp+FWw#TLJVbN zQhweSxf?QHeW9=_nBC=0?B?b!C8!K|?o@Pn7CIZLeC{v1>@Hp7!68i~r6J#?Vmnq?w zW2ZvZvoDf8sk9vP{j0MzDy~)h9X0E+^O4}F09M%2=UA`}^V53mVIeMHiFxprSTUwu@ zO;!;9qg6>^ow8|Fcm|OE$o~o%+{~F^%qf(*cp|PiA{LaI5mPAltG~wc&Ve`?zim)z zM{5_#=eX1@>EM5Fd8!2*qi2X&a5x5NS>Q|`@9Hmmy3+78=b@VFIUB1dgYc93{2BT2 zxR2uR%k-OjrShU%>XxJ2c4pkJ*V(>(5~MS5nGN^A=g?K(c^51AV)y8$@0*XWek9*6 zHDo+dz{vj$W9|ZF8|AMYk;WpK<`>1ThPN+i1nGv|xtQJdW}(_OTq|!#TmRW6LdH1_ zq=G3ChLUAFa)z^IuP?VYKFq5P`ut%*r;Wg5#T@jQ`Z%_lwW;G-nvQaz%9mOz?edn- zEK0JlWVeTJ(&tyjQ{^>YK(>uOC^2fwv}t;*`(`f&?dp2^#ExExUr+mDs!(`W|Bl}i z;j(^EJF5jA6Pdx582JpA@G3mBopYGJU7zvsGk!VKKRK~qUSHC5Yx+hWFg80K{+OG| z0TvT1YS~Dl;83*K(Vw}QIE2psDcLyWwHf6uJmy+cBKG=O&$+UCcR`7yXjgf$C-wF4 z5bonr{E$<)A!_C;QR6p=1h$~p(k6r)@=8sdhD}B-{SMtOhj1~mW9pFg_-6DOgy4oZ7=&ew>~l~y)XWC)H}{V zHf38zeCfFe%$dE5gWPKr#c_MBn}Q|S*}8G#KNB0k1<`*!u0v*&gDydgz#VV{F)he5 zciTr^?jGLaK90VwPu*;so{Kqq*g2fdo-IR|wA3}#A?MDWgFFF$AZPQCdw=)-M~}aa z{Er&=`_E?`5ax@Jj&l%-b2lL8na@!$pF8XMn+tl5>fdeu%UJN&x$_j1R2Qf(($La@ zAE;x3oIgiFah{Tbii#3kCqDNA{5yn_ndKhuHn!CDtdi(l6e;F8` zn4FrPnf*4mf?NHuw!X2swN3bSaQOS^82EGY*RH>I{>S6rmi<5MVg~IxPf1BZN&VNZ zbLaj48qQ2fbzS1Z<-7XSHl8duBwt-*Reh6P)k(uAWq@aU>NQ5oep7mdpYYeTe_8h5 zGc5T3mu3H_VgHw1a}aupbKu3JV1~dUL}*U5@XE+36Rlv*%m2xC-h)P&`d0hy_!(sR z9R~lX%tdG7cbvcx4A{fuZBNUlWv0JyU2bV;Xsg5qE0riULXk@hL#X;iX|j6r5+G(8+v=2e2ICrJ@D4j%rD>|Hp?vhf%cq1 z9%4V8L0Cy#l`2qNqiuxbrE6InI3R&BHa-Z}$K2I_GcR#62fy?U_#ov~dZ1WbQRl5` zSnxULd&LoksMt-Wl{tf`+Y%1WAQxk>WCe}?;yuJLlqez|i9OVBzkyi^z%7w2_0J%5 zbU1Mmt9xV?V2x}zgQT);pFv6{v72I8@;Qyc(@eenU+_>kuBcu33^LY$KR$y{6QHT2 zhs3O<9~g}+{0<`^I78x0=pP~85IchaYtaAwEsQ({U)g>GY(O1|I)j95#9;n-YW!~p zL#{A5gM4fT8=-=V{|ta*KmWgduPU$N86?=3ya1<1L2=@dP$rC>UM!gjuNPW780XTn zC@=%#^L6^<7^w4+!Mo5|?%{6zQRQt0ky6=@KM05`Gv%00E|@W{&Fz3ptLIdXtmzHh z%fWQsAu9~01a3stE!d9<=tV;**#xw$^d2=gXpZsT*G!QRx|w*R(bNMK-x}LZb(P_< zL7dstdT{#NNfzBbGeI?Brx)%eyO?amJ?tmMQrJ{kPAF`s+l^4gzpXv&Bv^7a`digqL%-Pm#WIX%)DSu^fJ6cHCpiF`Typ20sGzk*y0b@ zsUewG?i5aBBz?p#7o0)r+0zMztBk$kVdf3ph;RPOS$*m9L@K;XH=MPWgz3c6!Ji^R z(6K-Ysop#e&Y^=v0Z^>V?9cUTn zmKIjsi+R?gl^fkic~H%f2s&SvARc$BbE4*`|(093v!h$~h^MnKOFKhYKF-oGC$fuz=`C+Pe_kI%rF zmwM2=<4dOqqslQd7h-dU>wEnie>s-)?f{5h>VZGopXKd8dNYo3it{?{gR|I%9QhJv zy1@gN4a3K*%yf@%0|mX_$O97~Az!TJCY(h@hRA_mkND)6yRteMa2ZH2p8WZ2x-6%@ z+Of>dO?VD{o`@l!tMD$%&`21f6vaP=(!)>S#NOkzmlJwM00%@!y8!TQxfZyci?qd= zc8YR$p#_pw^4kdF{iYf?S**><=>kuyMt(muY`?rLzZEG~5N&-jf@9p%T69Ks!fo2* zIuKWgu6S)tf#I^)!E zi^(~wmby!nZ-qGlm%2M+i#IrZi0{h{$VQn0VIQ|t7=Y3<$W@|f?iN~cvM$CRkFIbJ z5{Rs2`NX&d zmdDTZ?NP5#N3;f%5!nc6EWZD45>Bqi?6-w7o3AK`7G5RYyKKwEniY$;&UNzlby=nE z%9?91nB0e5Uxm&|9ogXvI$a%b4t?-%!U%lA?l(NVJ5BlyQ3EKz6fU7&;Kd_r#Uqwz zTa|OoP-@deW$@d*rp03w+cW2k5AH6vsR*`8JZqP#!gsCvFV5{Z*UaeokqoBim8!hu zY8qDCN>kF>4wp1al(~IFiG8U&WEEGCp8L4bTQkC1>%h{?tqb`~Oo zR+eIZkUqhn_~TwUZ8kwIGrQ0!Q+l$Mx*Rxv26;fBjyg0=P;DlhcTQ21TH0!UQD0Vw zM$K&X?^fY0a2&fNg3{46V2I0#N;B<6M4)NGPN#yNR$(G#64eR-KX-b>9EuMQ-%CnTka`ZAX5Y;E`Tm2@VG*?a@9#^)LhuKq7vflmv^=JQdNYwo_xq^h{ zBlVM#PXK+KH8{7##c8{r^8b1S&h0($N$^P!^55LfRs4Gz#u~$yi z*je4^SPDf`5ahb{c~O$2v`_fV=PkK$+_{D8>76t}>)>iy1g4ei~Eo60OJv@V)_XIDI$WB)#(_qb2bqj>hK&u8$ z!;~SkV^wIXAiNLoPFCa{yffq#$Q+a6PFqv*yGd8#)1>3b`vGWTpazjU>kLAbgROl9 zQ$B@lnullQZATc^AsES%a7aa|Pn%D#8(3+XluS@@31V>UbhlUe#vJiT!eZ{J&YQap zB~53L5ESSbwa9sy-wVK7|JrtRFWWx^#4s*;!4uk-3bOSA{G9@9D6wo@4=N6YOGxV5 zi$TvU;&_8ds*ZDW+AaA>$E!zPqyn-aIO2z59YRr z-Iy>E+b#r*^hwSw0O{r-D<^O9ex+_Gu@{Z&!_G-zf>`JB4^6nTAqSWKw4Xu-T3T?1 zbe)nj$a^3w+r&0?1vubH^TbZ3Qrbhmz5Bopy)k(3`~}RY`U9_2s(d(0bkW41)9BY4 zSo*oxve1A$S|nfOpVuCVl>2R6zB)7h4Vw=DVH-dGFV5;s`YoJ1)XTYf`NBPf0v ztlpc<4i~k!H~G`GT}W{xZ)yIn>!s`h>(56GvMEQS-&K!BRih?)&mfdMU`ITISdMrX z%@bh+orS(C_SAw!XA^K@M|4><$rz9FH?@wHxry5V4dU|!UuixMYs8P446 z74GKlQwiT({+Vob0$ck8s=t=g=jI3{WpSl|UI!x5}+B$f?cv zGM)#Nv}-2Z>Uiui9M0_Kfo5eIyL;j58`0?9q`I}inmSzCy1SmQwUD{MmOWP0vPCF? zv(+^Ao4R$Q609rym)a>-m$@^$YkeU{ z2i1Lg6VoXLxPSeBZlh?;+93@?1yG-2hXuL(G754!7w93R*zqz#kQ+l7Ow-@ z_=(=!2UX*T(5pbM^~B+V>V_6Uz2Ze+%4;WTbC+-8Vi!sZ8|L8LE=N*FwuFryaW2qp z#vANFBhiA>t(xA;;($QI9_R9l^P<+jEZ&Yv3p2*IQ%=p_o0z`$t~6)Hx6S(z?dh6J zo7PXWn-0lwXoZ=GcewT@A(9 z%3^tDwtE1RJs;ppeRVa=Yhbd_Fx!wV<}E3i*5|`^^J{}5g+A#&*SV6x(5ZFx)JU+R z=?Uqjilikn!~j2sOkH``4hBR|ADltlEus)+ga@^l(96h6-8e45jgvZr%N|ISwo<1v z%xz@`5U2WfFOfZSLe_22*d@H)(wynCTf=fXoE<59tdI9k5Jg|Ee?y4r&g3Qh-sp_6 zvRD;+l>;Pok=dqHt~*=Pk4rbg%xnu>>M`?kJk^Vqa|20d5Qhu{s_1}vWFVoqu-VYq zT2dh}#GK@ZZ0)C@SK8uA?6c!c;gWNfEDJ57ocCA<6nO=aK~a4+UMH4TiLGu*=U@|5 z;hDD$iefst;u)ER0AKSv##vSU%iHS7azYbf$VS8Dyg`B*+YzD7B9Cuk3U|iOYIyoIkpB4R`%ol7;zaKtKC4a z3KtO4aU$0Z4S}=z?lS}KmMYZK=Hkr#dGnizebY&gmlnHb#9cUg;j_X=*?ih9j-rI@yJHcZ0kFdR`_ z{e5W~;W8}@lH4sB+FCWy(+(Czx;|EF24Z5-y6rg8=rsobo zNdD%@4P>gxB#fD1CL$-P*UuagaZ?AQ-!f`KrW0kJFm6f|W@pKKLSz7Dr3ZB!iM+rk zX_qqy1c7>7HI>l4&mJdvykegk#QwgBs8x$4e?Ao*c`3c8j+8##=e#Ej_>CVqmWjz+ z*?7ZuyUX)!uHb-VXdY*8Z;`5gm{wwJl4)$NZk%(X?vQG-rgW~ZPLNS!dN_eOPx0#A zM3XSgvTlmY%Ob9&_MR22ui(?0#hBVBgm)Ov!Q16VpG1idb4)3P7M%C$a$R_QaW125f=pBG!@ z50L75fX2rx#IN7LF7)&=P2HpXK7kKbiZaf_cM5b3-WDi2@w=lxY>gMOFTAx#=T0e#}`x=AV~Hr`!*Jg^j2I;^JebVC80&J0VoNh?H3M-`MgMAkb-v9 z?L*ZYq~n)qUFw(mh>{s_bbf$|>&L;P+Ajl!tC-y>0yU1hdn6WdkxWZ82m58%?~1rI z6qeR^Kdw1rJ#5*X8JV`F^u;0Jd4Pg35zDA~HTug>m&d10Q& zSxz2?^VD+hnUA}NVlKOvNoO%28~Sz1oifi8;-+6=@T-5Lvj~_WLFwV-(!Fq{iU=;* z8dv`K+*Q@8O>^Jrc`Nl_<2ycdZ`)?a(;N7Gt&N0k<>}UX%sv;BY~7lSTah>DTJ@NX z(v|c$G7gyV4AWp_j37P&4?3FPAXBr~%vz{UMAjmCI`MGG%ws*15L=bO(L3QryTbPI&q?kBlwE%pE-q1iH=1Tl>(&F_kNzpW$niu+kYio)}vJ16^s5XFZ5 z`kCUF3SJeN%eR|HJI91N2ofvQSdFr@SoPH)|FQAW2P@x&zN`2KO~7ztmXpsQwHrM# z39(t1-Qeyc^vG3fJf>TeqDN6Y7$$Y9@*OakK3>`HM$iypmp5y6+C>ywQyNAAbKzez zJ=z;qT9lp|)i;UmIpu6uS#t+zZp&*H<^PV56E^X5(foq?ts)#P52fn)6R)2>D323~ zk@?~g&}S6_GRo}q#4AKD1R(@^)*nCAsPDpUndDh8zqT{Z4fHJ1MY?-A%Lu6>M)!BO zPBEBHMU35kFt0GcjBn^c;2)6$y2)|?b~z!Im!AORWhK2|CB%Zb9pjI&ibE*FR)cwX zQ<-BLI`(8EqSng7DD4HKe$(WQ+SCVcO!ZnD8T>(qBRB#?cwo{C&O4UVzq96#`}`A$ zT%?aG^!)pgt=CVLH7lHDp|xRclh!aoRvhsjV{C7KJkf@#cfxw>va?BwqG(H}gMG76 zpz9}-kUvv74Ue0P?<9z-JT_DF8W>E`PdmkYZK`W8Cu0+zqGQ^5S0$Q;9ioRC$Lno- z&w&t&H#BcU8F{^%F&0Qsm!}poEO>t7h`A2#Lk@m^25}t$`1cBS z=fN5F+k0@|o!gxOID_Cuz^*-k>{rG6@2;$1uOQvQTkVoh8Hd{VQn!XSL2}DawgD^} zm-CKm?Bm!EN!bYZClx~4TVOl|dWuoAHxE(S^?b=tL+*~q(;xd&JIs_?#Fws zkZ8J!L+z-+`7d|kk_h$D!ZefK`a0@Dw+jpNQ_A=K7Rwsi(?yw2KxY&$X4a`c#7iwP zB4w%WX+dGi89P#Qas5ic)rNB#A|0c7ib#}SWb2;Pp16D_XEnWs=lZ z51!CcC&Jd;$V&%;+#aWRr^OP$k3v*sM09zV{X?dxBW0&952xbS$b6Wti)RpKjnHL$ zy7N&(4TuCH7}A07TO7PL_{ydf3$|_YElejENZXgWb@%gL$7eZRoZsbC#Nm9Nl`-m8@&_08m~ z@RMzP{oVH)k6Wd)BXc&@s`kWdc0TjDah^JK|+CeS~$j3}`ZB#&Zq zal!e*@o&UA%Fs)^5IA1HP3ow2tW|VX^xpDx1&B9>W9iVhkc?K|KKre4wUy48Nk(kr=hlc-VFxoPe7;(2FSXZ5j5WPofO4xwzQrywk{#QYGPM!Psn(A*6K6juf*ybd??^rscK9$>ZV zB!aBme(Z0Or>LJSI59}7LY2qqfdJzXG6s=wUajj=NgGu40Utiht*TEK6n zvAaYMP;^?#Xj8}IzP8zcRSIyIxWiByEH+ihQh$2Sukw6UQN54iEu0gByYLOvHj-ag zsUixl%E*uQ4!2p_+Zb|MZ0!k?X)kLe5UjxI44l6ygf+>mT{*wcV+_Idr#Ukyi0m<+$|HxaShMH zDS!YDs#1W!>Jm7oaG+$C-6MDvz<3+Gs<#_OxWVJnmj(?jbwx`w?Cvk0?g{s|%KfaW7L%$g_L`M&|t1l_#cc}pk7{ty%oZcoE#+BZm< z!vNn9;e&J|T3vXURhhNN#?fa6clhFprtK$0-`0t3r%gI4BPCzngWYczP@#7}FPp!_ zr5>sxARhI0%N<_>F1)ZyepVS>{tOgt7fKFH%#Mmk4#DqlZjiD~6%&}&0RFey6g10(KSy-e3tmM~ z+41r|u_r(+vQsv$lwP6`Udg0E7TL>xwWl~wK$v&J7*MOsrpzbYtL}ghvr%&tRm0#SH)-_pf)YLqw-wah6(w8O8i zU^`u{U7!%a?(qN_CwJ^ldy9EC7Y(1w=xI&oBR7Pp{qUNR}Pn$0h>ejD=vKc z*mhYD#|F%mMNFpzTB+a_`YJNwZasz|rq1K$ zI2tUTX+9`oBUwKWf(K z7S--e%UwXid%2uythE1`auwyvY@@Xt)eVQzMf+qM&@{_GS7%{NwG)aJ9vV^@?f5bI zYksoGpzI+(sw+ct>M`+tF%l4?KDj;BZ)diK7GK%^7IATPMfFPSew;_Z^X;eABGy#P zD%jATnL!VrIY4fz&<>#25fO1b85(c4_nG3Xv;eT$TibwtF68^hQ&WRgG3;}H9ZIS*d+>|bZo53jdp@u9NaDy z2*4rOQE~tkzC}wfBI_KA4#&V~GA1KVfuauSYG=aV%HoKW=}_ST_|(T?erW<>rP2#Z zkAaXvOQ)1DjJygfdIZZtmYqemAFq@pgvtzNQ97peNB+hzY(rVw*^!3*fhh?q`Z)OUVa0Q{Yi$-?eMAqdw7-(71nlwPD1y{C6r0#j4mN7w*A&7nt9S^8qXMu;;S$R z;`=Qc@e6+ldJ)nkJl3n`(}zQf+fxtqYV%jr3e?L@KC2ZVh$B0;xRUPaQW(uJ3Y zl(*+5CmSLgu(ShjhEy*z>YRxdOQ7}1|SKCp`6=1+34l5RZZ8Q*@waNQEEUH z&WdYBzolkUZLRKia`I5ZJpm$X?vdjp`O@bUcQsNP-Y3dSRDb{eKH-w*pm=C0n9&|Br{uY$wDt{1e2k6SDRqIgd6=`hAt7BvM{SMG=g(swBT{%QhfwQAcF_fl1e_Ih7C9c9l zbS0%<3lB=iusb8@4)-Bj7kj!aTpJkf=LevDPZPbV;U7 zeR1YN`^H)cOqPRMaM&Y-8!95ISv1_{%vrBPpT!atrxEbf7M98&qRcgJY@?e{TcS0Q zrh(2?Mm6CQA%Ski(=1Mfrqf>DT-x)n2zOmia>!+D zh!k!Y-J^)y)p=m|x+p4}%fpalM#@pSLmo-N)SF0IFiwCG98Zvpc%5X%vraV(vR zOGot)1v_Yo7J^-C3a{P^aCmeFXvF*X!_FWqyRA}$@%b*5OC&5>1wEB{ZJa|L|4cD6 zcNrcHrEgVQM$kK@)H4w^744SdYPU*#H-EbbFR0F_*NppWa_AA*KOWDdL;N<3~GxQ0-l1P&mf zD~%ks0%by0bOwrr;L6OqcX^?cb=)N-g5~Hi06a#@FTkH=MlesqX#E!hVYKV`hZ@VINKYfyLtk`B^nlk~jb;0I3RRtz zrcp)!Fe^@jIyZ3VF)Sn+_MpQ7h@EHa<7789SNLiCDjq7{1?VJunD{1}#v=@wBf7gI zVDRPV!hH^$d0LmkpXFL`m~)2Pz3Q4KZoCQk!WX-;FzZmx8O7PB?h)`~LikYQC;%L! zy}<37i@Ov>u@ByiyPW6vPGC^nAnim)X{oe?76qA=lkb3|mKK&tNK;_xUU zo$h(jN{LZ|jJ$WJjR!F7IDAQ*A*$bK(9y_Xy~exGAVWY$&V<>cLS8-0+}Po?{l)5j zC`u`As4}3Rb9oc@>$xn)ov&LfUb{PzarEpq8W9qYMVp@eI{xxbu2?Be9eT*BR4^)-Z5Txuwp2lXJL6MdnT zpq`3%&;iP9z}~`wq9e407kT4`E+8V)IC?7}NX64WbJg!o?T}N3x}#LvqYPDxDvx$! z!VZ}RbQWkGR`g<2grSj$%RVXir7rj-q5+hqU6DuuVtU+!@o{DMqwogcLM1S=GKVq- zqM#utnG)q55c?O1PDf0;wc5Jm?Qr?DbK;5Y^=Z@DmkZ<-qqT-p#LCa-7Zu_*SDaRz zA2quwXwaFkxuu7+W^*dO{=g>>Wj&xAPL;BJXYeLY9;PlXIU+$+ zN>wv1O6m$zlqXJz_KL8J)tMt7nw(paN@Lr8_AMTf(2KU#S7W2zJ*UR{=)c;i7rntV zr-~M~L`kG~jH6Tlr85Z4|H0l{N452Td)^h?-K|J*D6S<1id%7acZUEeP~0hAG)02D z6o=x)9f}j6#R?=8Ns)B&{oR>)?tSLoweI{stQE+~S~(==ob0^!YrpqrkBt4=a=vFV z3!TF*1K#l`{zlFQNJ46Fwx8yW0^%lNHYzNzt>g-nnFXOvyZZ;ef#BPga)e8{CO-C> z(f}UF`fnmp;1IQtFr!nj)=)CL<$NDEh!)X~mo2H4ShwG?+=p6~s{66%DwS}W3%Kb* zfuw~S4%NwPN1{fa^esN9uaErd0!K@$K@}4gXv1bzxdY?tPnPRX#0=U@^sA>U`+_rl zDf1UI5;aAQ%c>m+I5}piP5PLZmsnWr6HjgZEOhmWD)WHiik3%MOeE@HV(X#V)QM*#}P z1FrubVZ`k*hS?5>5rncLHg4h&klig)XnS%Gc@2Vn*n%cwB#b0f64Bi)Kb zD2RfY?2?BaUqP=SHRplZstG9VPDi%0a-q9!I0;juj<5WYIOTN5L{zlx2e09 zAB^wy5jn$M206C-hlr#BBsVbsCT~SX?9@cFqV6$$%mNXD;_P>0gBoE&T@E>)PZ=B$t5$J`JV zI4?KQ^p_(EQE#CZIcI?;L)Qaa{m_SN0*oEnrn7twNZ=E;jO$9NtACJ++#hX#-wl10 zT+S|r%N!1|58VZHqx3FN5Vx0Q=uRtv5A<{|SxFO>;#UG=hKBms=Ps>KJ1%&zUEoC$ zITaBiOkpfvw=od-`(O;j1=Mn=pTG%B$_{If@dVLY!!^+sicW`j$WZ{{(NhEdvI(9s zCc_QaIPc%9(;cBnjpKLgo7{U1P*~iZkNtT~p5Si1LLSoL9~Z;_eS~9RkJA8{pl?^| z5u{uH!vHMgLe8$^t+JG#tpl?hJYF7I0b|(fbJ?D(HYE8o@RfOsG?94&4Grof_UtwF zIjrD_2ZCoHRR6x^CtDbG$lxx#qnbQ)_b~@0H?YQrO&AV^J9U z!4;4kN(WMg0fyf{-%AEZfdJ4jH0Nz8M94k>?IZw+2b;-(j+3~{ytm;s{9T{0xUq70 zlTeoV$7v|nSVmojlKew4J;hRE$1iiL0R2P$!86gI;N$;TgK(2+U z7Mups>#hsp?A7tpdrA1PVmYz?q_=nyuR>%ty{bsHMuRK+yGO1Slnnql3Z2W#N~tJyvf$6Z7c+S*YXxIEhl;H7+O9qX)?>HP6Ih}hOZG=$l&r3Z z2AAD^Sas`BsF?PwSpNldMdGx>D+Xjl;fG1m=&+1k%ORi)$FXD-3i1J9^_HoqSpE~9 zlX$Hax7ttY8OnMZM%G9D@E!&}dn%UD|HYqINvU!E1!4$uh?jEE@HUio4#{x*h4fp+ z1O@9Lt2>8E&{!HyhcmOs$>w?(adFIi2*59Z;1A`AIAh3?ST|lUrr&; zK47fw)igAQQ@H@_67X|&AQy522$jZ1RT!e@t_<5YKfL|HqiCKmyjNr80zE`YTkz*1 zan$L|K`!{$A^WHW5j-q1lo~{a z@RAk^x>r1rERTkrhou&gw!!Nm_qt+H4WV2ok{1bn7pdHEp`rFmVB&xzW<5G7eWB)@A7JBX?LpPhqa51y~Z2~V|?)ad_v@meDzq&k7RJk+es85BnD}~bCRTq z!(a`26_GN02#VXUNHIht9CM^kxajW_IXGc>k3{*#Nf=R&{QjeM55Q$5HF$LoUlTud zUH9f5F@CQ*01qaN+h#zxS1=}rQTNe+eBplE#PdCB<&&-`jT8;WzHW%@!q1Kov7|ix zxP}OO2V3b5s&owqOmh+YeLC*xTj7#tk(UZlgQJt<`08;&gYt(K5|Sl#K(HhO7R&@^ z&fg%TBn+I|i!f&%5r$BEv{Vz6{Kt-+Zv1n`Ksix$C~l-(Aup_F2cL_fiN%LD!ho@2 zI$p&}QQ{tCr8>H(x=3@SDyOFZ55sG;%|h|a1kYP3GuoHLA!gH zV28-BexN}}_`+n~(;|t!BZ+{#GB4M`7_$D5qqAaQA6;dL-i$VT#Jugt-M3m+yqFqtzUkdGa`x%bHh=n^r60g5hIXXJ~ zd)FaCXI9_6*BmlTFy}M<#0zcf1~wF5x^Q-7WcXzM;8dB>Dag+}Z=uq6*+vrk7je>Ic9vzJbc_DQNPvNnwo5dUt~h#aIUP{J^P#6yFxZK*jX>b2ra z@iZAAnTK(Q4RQX}OH~q?+6uC_Fa8S+_f+A%_2WfGWnL%Ce_p6x%fL*c53A=q$FY zGqlj)LSyCJZI=@NGLqB4-a1A{FNFY0oP~vHH)T^_Q?Np(jw>ybYrgW>ph9?GC(CG% z)USF_MYT`?r}Zb4wX9f&#APutRMBu)0wc(fQJ!s95VZG2-|}P)Lf0TP;6U!Psr6+T zifl-&h-xqaN+NgAlZt;e;S_4QM-4CjI4m}Jg_3+4u=C>TV+Q7xGY?^o+6R7DlsC=m z#DW7hlU%bUUv-k*rO*rve6u1FLLV|pslBx|B3f(<GP z+ZjSp`0hbVVvs-djPhQ7upj%Xf$-D1eyx+TdqyZ;T14%*tOAD-H28?7lJxe9v=F@85!lK_gVeLLXU-1KeaV z*U@hhc2=a0u{FhxorIBQ9+J~}$n;r%PM@V=*!~2+gq(n!ZTeGD{cN8sO~LzGsUiGR$zr_+2o*v%%frFn|=OE59VIwg;v_ zq$g^cY%05RS&( z3;nIF$)*#FAX{iM?Pw@n=Y2qISk-ZJm=nU&azTXurPNqQ%f03Ii@mn~h@UIei8@g( z3cq!;3LNRJSr^j1(|gSK77c>S^X4c#v($uO&y{yg9gca@kiF3I7OhII zepBQOu>VFs`Nq-!2;SuCTip^@@hZvhv>S~YrX{AHp zYP(v){86g{JFW}_2w8$ESR}MBevdIx_rV>N5DfxS`sh|b>~OU`!-!B0CjgPV=}=h9 z&PXA<8jOGF(cxlPZgtG0nM#EA!U5rrN)}`ub7kmIK?)Eff**3zhZwIzJm0^KkP&m~ z<3x0q_b2!#qRe4O49tl3kbNyOrk$q*P_G5XNHOig~!1nW8%f9`3*FI7ckFwF;4_Fe0zA#5LXv5Ac=nuBp z5SB30F~jvK8kxjhcZ$=SAh`XP_WcVgr)-qH7-eS+eTDc4k|;q0?h$o%!LmCmEKx>9 zMdT6~ri9BFOB21F1|uB_WrM@vJ7*spVeGqM2|dOQP88dCJur-nUB>v}*pZM_dKa3o zDB*ERlt&sEHVMglXP&#-f@&zIm7IKr{foQJ8hUy?qPntnOTjHWV;p^KukVoa zMXYefk%s3FBCv}TXTC=0M`&mVrU6JQl3EouXNSfPdq(t=xq*zK;OIU{m{Pnn zW6gtdq9QyeT!!tzp#$->61cDa1#UR__X!>%M`^B)ER$>GpT7tP zlyHKJkyS=a-NC%E7?4pPA>~RJVMJR$1?U~@9K6?nX%0Mv9!BLD`?o|(Ye+0qA1gA9 zNssL@RS(FePYZNREH!lm;?%#2vQMlrC^#OG`}@QouS!Dq>+%i2K6MhAOl`q}o;>26 zES(HP2H`DGDLaTV4ya-4Vm>x$ z;VTi|M6W)ON8b1X=z6I4>rgrz;*N^0AiNb+j{63VGCD-|y>JPm135yC!<=vdNnIF; z#UPthB#u(WLkLV^E2W_2Xtj@1Yn^?VfwrS3VQ=n%F=s$>lYs~}_VeOb(7n9S^Iz(3*kjxY2DIeh8G=6tnSACpoSH=a}SvaAQ-?Tvx)ss`{N9t<-2)Q413~4?Ci-(v-SAcACuHIWh`bAt*T!^ zKKr32@5g1bQT3M*TWeE^Q7Al<%U7{YAEmB!25qb*dF9EYjDl0@1*6RnzC3p_KM}*dVgbjNShDQ09l1 ziTkTD_KziD&hs!&DBB#fCF$^Rf*u`QZYq6N3Sm$GPH zeX;g#c)1Ahq@=gcH6_S{Ia;OP9q+vhS<{kJ^>W!VS4XAQ@ycM2f+L**r(SKrC1SNo z?a;S~@lMoU91lP?Kh=@{da`4p4}cpn-K@U;#aD~e^7&{7-ATEnPB~ZT1|?1I-q3DX ztB`+6@wLk*rCf(r@6K$c_wa zAxePt>+YzO?U@bxw&o#^Tgv7UwzDxX^W{35!C}tcnjH{$da#9FHc+r2m67_bwqOP)Z&~80D8(lWeKCLV-%U z9F_aq;JlBk33dETaGtvAJS1vPK$sIMwmz^$4sCP8lE0L~geDWAj!FEX_#m8{GqpIDOkH((j@Cy5}gb})dkBPQ)pSKmF{nHuNoiWh|K8vht1#B!>h zXtbUv)@ZZ`H#Q`U$d&e8v&4_tdK2g0mReFL)aF&i)o^wq!oK=*^t{%@hSFp*Fcgu` zf$ILWo&mgwq3{h3o5?XNo(7}(uj6|ny0g2*d~bC;ilSExuEMWOKu zo+lL&>B~A>dEy>)Mw9wL7IM?OEc5cTpX$6PWY-AEim1?NTkO%_b0u8+edDuW2RB>y zj2GsoateI`*UW{0Ubf7GRQAERK=6Bq^LBN&N$owxnvg z`k?$o&qtrzK*u*nuqLj8Mm(X~u&c@<^Mz{b#k4_zEq13OCr1PH_Nh%J^wswwEGV8L zsy1mO_<+ICk8ii^wA)BErB4^Yj~)flMdz??{8Z~fOPDllT{%kTy4QH+O>WJ#R4jgH zemKe)Pm?;N29BbMP2ltFW3+fs>p%>Jlx!P28;S*jN%*dwLlYaw%z-JcnDEyl(=&0? z&aX4qCy#X|ra?FOl|m?AJ$Wb>;&$IN6{Qm5QJ=N83xrCK@1Acty{{Q^a=z8Fot{x? z@d_Ws2pxc7nhSm*o-NKa`q3443}Da0AO;Z9eX2!+y=dN;HEUf(v`V414mek=g)hh7 zRT@*OM5ywba}J`J$*W16aQo^HpH|d}5^eN^&y=Vr_bcrYD2&QPys~z^50^Bra*uN% zS+7M}(KN?K2(7}+9fW~X&%UlVIF}`uz)>D-{a>P&|GcdBA4_e)N)a-2TZomJo6Gf^ z^Y6yyY%P%fSdlGfQ;^)dGnpKBVWP$v>0CN>r5REO>@(9{(K4ZA+jllHFox&wgy`J@ ziVUr{vsBQyaVmC^ab5aoh=gvHVYXLu`i(z*eTK;>zDwR(5e0X=k2(c&Jt=9jADql2 zSvAaHR4c1vRP}d7YypjTf%#J2%4$~tjElP$UJ-u&K)0@=<{KDr*RT%C%$Hrh3i$g( zNffFMSbwM3UgX^I~H{O@0cLVX7Fnx3i*(N_Tmtp2ywG zOAWh<2igK9%!PApiG-d*BS=bzcG|117VWbue z3~;{w!1|*v@#W8-C>x^z*ZI$(&_P^fDCLDGH0Xw$^`R!~98Vnn>Xqw&M} zvmrhRT7~oCZQW9|v2}`y=;$g>010Wdgn@RUijS=L%#5ZcwuH~+=xp6|;HQ@+Wo~lM9R{eUP$!|hhUZ^rEJ(t(t%?+d{KOzN*!Rcry zz;%6LJC`-sT1z5;^ZEX;I11sWuErFeIlyqr1p%$`u^541L)82S5T%XAgGH|#*9}#1q>(&Tf;&kWMSP}lC^_@7; z%*1?*ejvc|qcr6lI*yDYTXKj+4QzEdlxGowDoVi#4hd*%<{$V=jy`N-?vN&S z(rS0c&t1~Iq#pk^&>;GlDJw$`H+TwwzcURx?&LlxV3hwugTPxPHArzxya}D)6S3L{ z)Ifh2@UQ6v>f5X8lWK5_NY!TpvO6|JM|V4hB#lrlB!zVLIGIg^ypz>7#~N0!=A`3& zE+~6KR4E%!RU{*Fh4;1AM;SgR8un-raFl@|l4*ryUN~!cVf4M)uiJgC_iVzB3&ozz zYa7!yoP4EUQr~4g{2^Jkc*`|mbQh3YZfPOAf99y&H~-+i$4F!JeTX0)a>5TiRhswv zu90L=6TBLzLdUf8ZP6t=(9l`h$2|s`7sd(dzp2gJTi=KNx@lI!U*g}RX3D0p%Vjg1 z#}Rh>WCd+X^3kF{H5t-`uigZteMUqoE?UDhqdy}&E#Mg44QoLGMCvFZu=MMf->Gtm zSm43d>x|y?Az?#r?0WmaXWJe##>5i;=kLA-CDa~c6YMl#J=!kG0}h9%X|b)o8<>6K~D zP3$xvXyO@$|Zug41wJU5^)GD<^#>Pn!|c_q>W!^@#1bzjFjJeEz1&x5kZmr z7s!<0O!j(N%Hn3X3Q?iv&^}URwat?5fe{W!I_N-77A+h&?bt58pt(X%kxRqES|S4ika4` z!gOA(<}TuSZA~r!!)#`4$UY;MNC>ebT)_Q`Rzpn}R^L<$+>u{uvzb4-5u;^mixJVs zl>rCxP~4ITZH&?YZS+2}tbZLpowsmWUAbc$iOGj1RzCPb*b^QkcBQ5{c^sA=?A@wr zTqGZFniGS_t4BOolI@B}%DoZ~v)@;Yp3>{0I-HvPKP?H74K|R?#@0-O4XE zC5_?pHZkp*m-{htVst;dl0ER12J$cmrd3@fOpRf8z|w)Ic!I3S@54%6OhPkl6yF_~ zSsKamHZonLSmww$oa|7e+Ay!H6edK>sxB3EJ@XKl7B~+p3BWuTLBCBlf*>DF!93Ub z*~V5b_)F`E3Y{_mk9z943a*9p>WU$MUoPC->Cr5SpFktsDqU=&qt5Awo66niC1O|K!$8$J%I=04(4&8xqmuTF{X5 z8vF?~BdMb}-IFL{vqrW^D0)W}8p~x#`a!9bE;SQ48hQYgsHU6$);dB2Ir8wFga;9{ zn{7roL0zfo<^+33tY%O4x)3{nrOOb`ABH-66H>UpsojU zi!cRyE;4p@RLPX{^$#wu%);8N4UJxs`yAVddi|``D#_)`O?1=(=!XXNgoHX}>niLL zGx?c$D%@YT(oI=vdf}@{ZQNT@+DjmfT1!i(OEtb6fBzuXMI#mQB=wuAgFhNf39k`xfOpxNd-Q-(#{UH3@=RUi6k!pvtF`g8WoOey(N@g zLQYiM$H$r5nEmC!!u)u9rz_v&61hnD0EZ$$rd4Ar8H=W_KbwYvZgW(%sy-db4_^-r zU(uOv1Nd!n+bOl*wBv}$&x(qv`JOL^IlndBS>#Sx)!{;JwsZ;gxtIjc3EqhC{8PF@ z3-B7*tFvcW+>4<_zc==5Qt%*?rLPfp_+X7yWE5AwP_4v7v(Ewf#lcZoE!?T=uCz9k zC7SNeZF0t%zg3pOa?j0k;|+N%48PGXs8-Bbf+1%_*r^76lU{?l3ZPV@Ix4E#Nj4iQ zEP?89rMN58#M53Dvt{AQIyJBU&c@!Nm5|P06N)<*SQckv(p6pYD^9T2RT!fqZ z#e+uO_E5Ry%ZdufHpJieMng{2G3AmXPszU{IXB72gO}kab}MO-MS@2bJD;Owes|x8dJ-+>n2C7-&c(2$WFLg2B7x(KI^rOSN7UI0}ILJy9b@l?V6Iu7`we&_>ZO| z7Hq2xydw0j=F1|cr}*U)KarQNx$df}FLj@$eR})0*pBT9&k3Yi&lY7L4IEaR3`tb$ zrvWDHt)Ec4pIhbYb^t3Pfa{zkS-95w>0);N(t=Hxk!HMPg*dzllEQfrt)vyWvKBW9 zZ6);?3+pv$JT1HhPJ=qDo~YI7Jls^7S&(bzE@7(lt)%!~U+72C;5e zAO2nYU#kHAzrX+Q2>ibz@PBm#-l;uDBYT4J1Pk@77f;6HmPU3^1Fi8;qh{GqkNh)n z-O1X+4mFWp!`j!+-pBVpZvJcT`hnrJ&xR-wYTE2Y_yB}GrbJo0byP>OxvW(ve!poE zGaT#P0Tr6|6CH@3WX7tuR%iLxoyH}r`I9ntND8|L=xA2Kj4yz)JJAy$H#Qq6qGVd` zw;U&sQgr>whS}4JZN>IsKi~eNbs0W!CQPwWU|T2|tkw7U(#Y`Z`xERJ$54VvozyqwdBdw@gEG^2&$L?@(+2jj~4v+t~%J8cQyQQ&xDeRwVrV? z5zDi--tAQJi`X!lfKV<-sJvm>Tc23HzvwYd21BAh4F5E zy8H{5<-FzOao`W0R#pl5lRH(Rw%$Iu%oj*{(hr@;=~oALKPIjPK0_|;Gb~+LX`I5( z5*uhGm(OhSt#7l~1VgZSxvQQP^wIBwMc+Q9Go|#zq)wzYJiFT_|LxU&r!>TID$C+N zn?69ad-7~2SPe3byR!5R$F|nUgO2Ol4MbGbUGPMmj_l#w$1b2H=KO5Db{G3eI5FDa zW^GS_Jpk70Q6=s4uPdXy9n%6jfrbW{+%aI`@cx^gPEksS*{2?M!|l=$CB#ryD(~~l z(pquMtTQ7&Q+?Otg+AJ+GgM5hN7UNGUEVfp#qS0#d(JS8-sE&wzq#r_NK5Wv&dU<9 zJxT6MMz+m;{z*iA_8>#^!aJMI87*jMMoUcpuR=j(e_}?2u99QFU8HqST!qqrv~jtt zpgHS+n`j}1Hos;m^i|dBQJ(euKlyAQStLARL|((?eSJE~BLsDEZhrRFyz=9^ zZ6R-wj zFSu;AOLjcVqgTEnVNE~un#M>pI1+9=7ZDTnuK18zXQ?WQ@71u1Cy9@jwOUsAa-{Mg zt0U?(^Szax@Iy$$5v!EmyYT_Qr*Saq^Z)nn^C$l?Li|#PKXFB^GA#P`$rIEttbaua zKPP*4d(^tZsNeqz2*1os8}gM&LM@&DKHq!o+d+k=rQ*`njvFuGt8BJUx`JdOwx_rLrc=18H+)Vo`Uhp?zj> z*S}rSAZ_m2UAt~)Z~lY(QEmIAzwgiej)i0DmJHy4=BiyW#ny+aN7*psKG;JVBj;V1n1VNGK zJUbtcLLSaOOj#4H7jw>&GEamFd={fDx0fV&{i5V*CS0aTPArZsSnlod*3({V@ghf+ zt0*T+isjg+{!}q(9|phQCgo}C2eW7dK_dlz53Zsqz98_jeH^f7>4KYy`N6+wBk&@j zaD|LWv+I4vVOY2+^NQHulwEObGY>V3jrMEr4HoiyiNBw6F6J@2jw1ct3ClHmu!Xeb z0zJYm9b-Np(*NXm-=iY)HcB($!$o1oyH`VHGd|d@mi1vTnCG(#I_8jNQmJW=@w=22 zJkA5!FVF!yj`HszSh~-=_*ZmNMLsqC@Pb;A#|p(Lrp?l|cr-u(M1K<;%zq9i34HEr z*!keOY-Ol)UGYJ`U#k=E1PI(@{XJquhd41 zHq+*94QY5499?@_j${=va(E>(G@xu4@A9ouXxjtcXch7libN#3R@e3^*po)}*ET0g zfvdPmX%&9Ry^o&gnsvz%(D-l}6O$8mo`?74rPeTp(Oep>_t{E;O>F^Wp3{O$pO}51 zH>yOBE$cHGq*^GHVj`$Y4?T+uC{${L<~GonsHcfLG_35VxWQ7AYKIlS9g}mRb`=%3 zK&Ym_uo?XJDowAL6}dnc^7hKxs5&8%Rr5e6zgf?I#NZct`a^sBIMXWm!RC?j z8?v9nJ-_K?D_F>r%S8aB5gzffN20oGu^B>H4B}-}!~>^E$k@@(9N~)$#-VHxa)2w+ zP~j2KE0Z>?R|{?edx~_P5eHGpE#VAh=Q>!vB@t#vDW6Yc)7Rz3$PpB1vNU_;()@)l z61zDut_cOI6gY_wM$)*G$}olQ#FJ!IGBK*$novhIEQBKPg_<6-Q*O+SAKC!CI^=l- z-t(E@pl@9)$}&0q!PV6gJ4sBf5uY44gqWOEEJ$0#>CC=(u|>?WhQ^hv(z z8L@p>B0E|tUir!ZMBfc7PjBo=U}6{4!YOv{yjh2(%JZaP$};{lQ-oTu58K-hOyiWvEF52+ zPaZryPx)MBTo6bu8)Lmu;vw=pqH%%SCh?hU$LhsMt3?tMR6!0+6_}mHY5UPSiYYoO zj^Xc%2qHk58?=R)BTk+_&9;(6_VYl7VQHfw6P7=VutW-zvQbVgyBiA(*@S#I^}wIbe*`P@P!z#kF8BqNX7Wk6RF zrL@d!3KPqR#Ve@@kGCIHQVWce(&&0xA>bESokg^g4}4wEGme5bmZ7(?gDAlZ{s^M!@e86nyyA;M{-=cnaZhltwtV=ZpMt{q8o7uwr8 zI9bWl_dBxmZ~ZCcW0iUL#_v)lw7(hQEeHA)#8@g``5(VQ-wULj>jv91vk!#IF$Z!- zeKvcFl&dDHQHZ`5rN-QcmB-0=)QH!^=Y=!VauhG zJYUR~|Af`TLEKXOd;gC%i&xx&-rG#a2>e2|@&d=we$s9Ji+DqSYs_fyt&Z*f;(s)K_%}9KdgtclcR^GEg@ej@% z-MLy%w|)(;#>`gd9$8UOk{P1Gh>Tto?6V;UnIx^$G~`UFSK6Qt*X(yOzlXH0JPa_b zT)9g-xVuX?HsIA~bkzkhN#AM+6UIlDF-Zgl!LR1$4EtRa@hlv=0|>%}0W*WR3U4u< zF!2TKgzMR(54`FAQ*bm%$CR%`Vsz(m)WcbcCYdeo1~6(e!q>;RbrHHP{c#=QG53s# zSg3#Tc~@Ti>3pZ&oy4S0M07EWaV0+Y(VmgBnJB%UIUafKHRyBBK2O(hM(&^`(-U!~ zB(URUp*#Y&I7V~l`u(fA=~#htqRwr>-j$L+tk02IhtpXyi#c>hikP4Q^Y6mNAPj<; z={sf$upBw_&y{YjkUaZ_*(Z*8WF+(0S!A)^3F}0Yqw~)3m{(6SYs_WmFZVnGS}*J| z*@)3yfa3Q%5XG{>1^f1w3Q|}P^|)$v=H)(Re_2Eh4s}?5rfD~V*SBWMgaUdMFJNC? z5gFcdN2&J~LuW}+y*E%`SpN?sUV*4gqEc-}COun=9LfuMO&1ht`4$p9NR57yy@|m` ztFc&WFz07J7q+UPv>4Ogm_6oL6UJ`}X5}mt_$Z=K67@4z)vq}`^=9Y_Jy~k{D_r}& zWt{FI;jD&E&rWDfS2{RtMm3byQ@|v4&j}~XV*5pK{b{>trRUcRk2%>Yp>GDP?dgUm zmK(Qs-`A>5$lbX7Hxjp5JL&sYP0Y< zF#D7o`c$7yFY5D*Jp0nij_@-bn`sB+)97EDLlO#uJR=9OFF*DY{k1NER@HHGDh|`W zAbUQ4P32<0*a+k{$yK8~DI zN+xCqc5ECaYqTGS3s5qjsJ4IQJl?eqS}euZ+9vx&Ki(pjP9_K!|A3Z1B+H$2{8o%mY&{`@nq3gE%%x6)j{Dt@9JAKwrD1{J6r%j;f11amDwtAx$myW7+L}#v{^h^E=_D%Fu=SgW_Kfai^GSDfoZ12r?#fWE(v%i#X^pubA=Vlq-9Vo$gGirzE@XJB`NRD7TD^Lf=Q zf0R9C%Phg=&~Ri}86b_akmKwMC&8Cj{`6VNxYFhG)=KSNYYk1upS73$)gKbW>yGtA zK9;ZLdFVgClRk{^2tSoZdMg*eFWeRMn>Fo=W^;~D*zJyN`T0Uuf&)eB|-H5)s zSN)>BV`b7vgtCi@At+`hu*%8H9X)NH7C&h{=G~SPmcB&0d9grCaMCN66KhfXVopYz z0E8DBBuVs)2AsgU95TB)$%qCS9&3PmZ@g|#Tur5a6Q_#(&Jq9fSKO(VLjtC^5VT6u z=LbPgiJZomK05ug*^cpU7Bwhot&>VgPc=M(hUx8?^oL(&c-ov#Pa2*som~YmyX!E% z9qHMwJ4^&RR{y>Azxrpo(*Frc=-Sb1wNao%O#VLwC4ziFceh`rrm6YgNJ0S%NX+4o z02C-G73Z#Bk2QDB8b6U168*Af)fhhhV+UN_mn#|&Da0{8zn<;j)!o(A-PPCSe}Cp_ zNdURw^jt5gH|Y9PQ|ublRxhT|W_lbJro02}S_v?28=vT!FuYssSq=-ioebM{_^&8Q z-T$AG2>lT$4_DP;7)2rlJi5@|HLA81wz4cZGW8h0^M6eQYIAdGqV~azMAC~ zBVp%f@;Bf90U(E?DNRO#l8TLgobVBl12zP4L^JIIdJ*&*b^ZBTP!m6@3Bbezpx1SAs#2d@(7QhsjfzI;j>V(l-=JY4V<^i zX8*z>tN&n;&xQYBkr}}Mhecj}`FB_Zmt|7=TMgd7$0Cytso6aL8;iWl$0hp*i-@ZK zZ!EI&Z&(ED8!O8%lhNQ+m$5GMV+`lMZ?u@`F9ONhQl9d2O^co)YsFgEMjh%A5%?c& zQa+)}d`!kGCvf1W)-}3m$8*>#dztExUPZi>rbwz5^O}wipC(#Z_N)zWy6HG#YxsY1 zksq4)^g9%p|8SAS@72e0|8S9;>=~yFI?s!fwIV7<{2y~U z>}JAovw3VnV#=FOY-?&;XSufmd6ZUH*1RE}17%EdU0d?+g2e)EKLorp~h-n>x={m%0y z<#OfchI`-nUH+Dv>EPgNW8JuD;1CC?N6*Wc92xnVjbVyvL|)?o-p{@FPI!vM?Z6OmuL zzMpm9j%d2#c(HHwjsNcd%0qlcYwaMoDsP;fL_A-)?YF^Fc;k!YeFw~Ni}NZZd%h#(RcsZbP&h(T*>8rlNqB4GvnzL>alWZ^ zLm6RNP*R4j6n*dj0^?sN>wek`59!M`sU1k*jnyIu@b0j2B7;u}pqz8ar+*EFPt(gm zNACbj7Xx2hK8|YtasIsQIamDwqxeIa)-2KOoMN^5w}gaj^a>7<^IFH0h~W;$!O>ie zwF}y4-UyB$aqL82oO~6dbP@M%E|>3XzHxGk*@rLeY?UFO!85C~f4?e@eYEJ!6dv$Q zg~jjgA`InQPdm3k_Nn%2^nA;bQ`R4wYqt+g>%N1ae_}tPMH6W#1;zctMYvF0#8Q>! zASH>RTgQ`A(saL2flyHJliPeQYjh6P8-WOF5B0O~A{yf^7c|NoJ>yKx%H9CwM<)CIG%%{hNt^noj=v>$1iESpa2PrJY2+km4|937 zeCAM8QFy5!aFPU$ChgWsiZCJT$)yl@_C@}?0@tT#Ya3S4(lg?DCBdk-o73nr*mmo;f2EY%>3iii~ies0b9Zp0e~! zE^;bm{r8O7F;*Zx84wZ~aWv;(ogeKELt|6>ynJXbMs|@le8@$S zJ~U-3WUn@%NWHp9(sk-18ky2jF=tGxh`Q7R2M_ zf{?1;Sk?HwN~%7_Gt&-c(=zRMMHIMFdk4vdeR_Nhl#fy50+8Byzy+PCbk|ffeA5_c zSow+mg+zjLIl@V4|Jg%S=n?w^Fy7c$&lW0Iwp^l>EdCX392?J(PfB?U@@Xm_XE0yN zE|@)jT}~;jA48DHxPvp5*AZ*V<5KW3L#bL$^&8Op0H^KBBS&)5jOrc1guPJpW1bsK$=Ffl?}@Oj6#Bn&C;JBIKdf5sw;lPw4FI zIc$jf80laZN~GnjOzoc`&(33eq{iYD`Pp*O)$!3<-=lVndpgvuYj626#r4F`uuG=h z#9ZYUT;)3r6?^WczDJx^h{0rHYH}{PaZPhSW8zR5o(y~aws(o_x=gAW!=0ms8z?S3!@D!VMpk_^v}^j10(|ez2m;uZUh}IrXGFtk zDg?PnW)`S8!%m#FO-N%9Ro>};c7!M40*o}Rmhr`7Jki}OoUh!f_fiy#*Opv*rGY1g z;kVUi4d6duJn40kDKvaE0#6h>AL71G@8+2c$_Jxl3>ggf+4cHA<9b3VYHxYevYJ3S zkVuQicEpnj{)jk@Ra70Xs@11DTKVOTGbOcAn!HC|SK7OZ-5m(uR^FfcRLAM1-Sb(0 zZqaGVZs`(-yU(NT7qp(ziD!E#=xpnxux(e~t+DUHF<$rHH$rl$F|=a)+xG|gf#b{K zGYz=$PP<9PFSv0>lFwI<9JjTzRKgTJ>xl|`AS2SJ9UL{tA9m`L2}P|cwi9V_UE!%} zAyC3MawQz!lQg++yq2mq@-lU;rf=n|XgZnt8PNxxE)wUN=u2GNd}@zW)y|Sbu1b~E zO6tilvGYj2?L{B>mEzUIt5)kt?4CF<3HwPSU}BcTH|&)b440YYH1UJkG#Be4FOyKy zy-qS)Vyg4px&J^OeK2q2zDLckLv!6~eQBhv4+K}$desJ&vp^0nPn|P6+Mmb*%?H?} z;)wybyfMnY0}`1=JTZ}UqPfHtZZFn9D*zdV>=v|Ec9Y&!zel8x=)j=sVcC!N!IHHd zODfkrWSQBDJDBCiWzNXP>urUi2I8 zD|!)cTwYK#F+Sa^=_QYJ@-DBdb(0tfvU{|jPmX!25^~^CLi)`s{Z<4m3{5t61|sOe z-|Omd=Q9Ic9Zm#Y*VV}#p$Ip)!eBP4&5~-ut1;mAqIDtv*-==0O}Uau5KCJtrLBIP zM|0uDUvzag89}vQ`t=h8I#*u2D|m9mEJfw<;UP?LdfAj`F6x1MJcG&QycxLPb<9%# zK)R*<{HUT*Kl2ROdDflU?nZY-wQJ2rF>P74>ZM?2`=N;v-vuV@@ z{zV#S#`6Q_K#SM5T@7SXwVDJSrSRL(dT_n5mmtA8`06r#Chcs$eOy5wuWF!7Qq$?1DVe$%68dfTsGkeoZLibh z@gO>K-C^=enj$qE)KQw)c*uRV{wy^{D~uT6?QUXy;z^fjiJTY*)Q|mNo#u&+=^C2#k??D6%PAMocb|P@=T`15W%~J49lV0 z&Ql2^hcDk6vQs#9zR>;!Djk6yvPNgxYah@tsotyT^*rpc#l=(|mnCEBNe^AHVGrhB z)=}x|nvSj>vOAn1cf}|tiyLx^JI#7dA6TxG&E+)XEW^K}hCd!!ZyF|;wvsy?vv8>m z@3ZpJpw`iLpEIeZ>>O7fF3Z+o2#Qqipif+WwT}vEE~5VYn(RkOKK?nIH3YotI+bTV zF_21iQhn*{fK=MChLuWV{GoaB;%H`s^!DB ztAy?uJnaEiDy7Fsr3qZoq)$^1?pH8Hzf7z=9cD68$H=Uv=<&L(G#s;cMXu=!7oS}; zY&K|iTVM{+vTU{z<((x4e~Eh>o)>0@Xr|cOG|!Qm8@$i|L|^bSY_`_?0^_{Shut5N zX47sv#j3ul)H-;@=z~sW++9?=iAm+_G!^>f!a(+Y+ryh^i17O?L+4oSrweku>*sDuoTTged5C-Dh$>6QLN#$?eZ#Sq2B1 zeeG_znU=>F>Us^svvCXiJw~YOtAZc%Z;O+Tt#N+sp1^SU{tnG4f!8MCy_Hc0RF`rB zl_FJ-KC--v_r*UY^GHed2Uy~70O z-W+y1@SsPCyzAq{_SQQMW5Q@RPLE2_olPN=F?T2TJUyRiGML1_6fsn!^NiX{Pl+}> za7VXOF+QVqrL-6C(cQX1-JhR)pyd)7>MN?!XXZ25U6c1*KYs>~k2xx1cRuI+%O^Oo z>ben4eR`r7@-vhwo!1%8@k)V&GM{sLre=*)z51X{%w~8cqQ^@eW6`Hi|1>K`u$)#U zgMEoq>DsYi#?eCrOsGOeuU+S*m8YW5Ke&oh*G=mXGSyS6WcO(~XY?^YAyByx{b)~} zo_+Oa-WM5TZoCD1c*37ZyPv-7c|x6i*=_gP295;hL~4VjO9SpZ+|_u(6HyK^Rn$8l z7SoB?GP(}eR5nwpOp%s;3^ehujOKh8mSo>4b`)sqc6rDEZJirW_&Ydx4)aM)thUbU zgrq?Dr`2<`DyGq~4o<>YZJo@yx1UAoORY(S3-3iIn6j!j(H|iUzw&glmF(W$7aUwj z3J3d&A^}8G7Q;O`(M!k4s&z+B5zndgpn!17qk5JTE1bT(B6hMjTVp2z)GjYk6FTB z4!C!jP%r`Ml)0ILv7$IH0!~KJd$*jfMb<6!6eB6!?p|}3%xINxnoxRLUfGpp#(e~8 z`RD2)GdQ-Ds-C~DO>vSaeU+K83{T}YOU5f}3gtE+ogUu#`c}XDnh8ZlkhfD>Yk!Tq zj4I7xF2ZnHIZ`=^$n)ps5vQbgh#ICC9&^A-r&q!=9!MkL;Xqqgd7D-Rr>#@3JI}f6 zx;NVCsPeY9I2eVw9|DL7fnPDS(nY;Pp7-g zZzM6OaxNseR*=R5>2zVZ&@)()g3Gvsu68L*`oWoVxsBGE5aKoz4$uYhDD> z>8@rd0wR1N4W7%URg zDZ{FxICMOwSR!~&47PWg?A74Ab^=e;XpFyOthRuRx^t{{RUKaM7V~sP3ln~%TL$GK4Zbi_?mbCA zRp2NUT(%>kCxqEG@d=&;#6{}5t3l?825&>KcAm}vcTbGwKxQZj*^VB>jpG@jsU@9V z{d-fU=OjDGFRIWiS`a*pvzmIc2>-2kdd!{{83D9)7A(J=Ar;5XkechES=8vucTKXY z2cVt#yqPt;vRm)7I5eu?Kit&k>+?kJ&B)v1c2}CDn%H75P!qZ-eg5w&xVAw48hNWG(yLJ5{(R{r1M+ z>+58q6wVFMec)260KbRz+RZmO3smR4I~p$xoX$ zDaDn>hA@xo4j~>ptTXAo>F{j9p=i{{41%h?-t?<0l++~(m-W+qQ)Ffp@wcCi^M7i8 z>^3UiNsE+ar?~jOx3)2)o)P9%`06kv=2+s_Dir$(=~(kzf-Rk=k5i&;qmmBg7d~`3 z8vLQyN!j(@G2cknBO=Ze$)f`8ghBX6kJGe_&j+lkE7w8y#=|mA6Gh+jA1$qagG$^x z=N9Xo*Oe`05qNfOIJ9=urKtV5eg45~M7HcHW?kkC&C0q3o@gmu13^08JwcYaHgD@0kuhuas?g&^zF|EL(X3OSD=ze(z5#d0mhD>J6MiwNF<^G3 z#H=p;8n|~V1$wVcRP|}ZoM&GDgHuV)!JIXT{~c=rUFR9?7JL!6hklS{)Pz3OTTB3eL(DQY^G zQ7tLa%!w!CIcf6|{=s>ZPgl`zL@F5`3A+jTn(Zab!m~{8@*!YTKb9?eNiMlF;u!Ix z8ksNd2B_04$!4!=ucK&9#db7`y0G_E@^>j*kzO0sGuoZ{Fwz#zbv`M8f{*MBHz(PU zOz>XK)1_ku!>wMImO}R{8Vs_jS?CDpie9tfOYV>IcAyBpY(h%1=I!(#V277XPJ@5S z&SK4KvReLA>@@vJld@_2JI!Ku_9i7z2Gix-)~@c=SwJ4K;-B!;WYkzap=n;wUkC;5 zKTr;Pf4yzA#A$npX2zg0!<&?(X;JqS_8G37w@g|&b+3ueDfmI0k@ak5CKDE8b`inE zNjP}@G7H|F6K=G6At7gZ#m5l#6% zIyR+2yp~on`Y06UpDM#2_i^T;`a}|gFYyjCr)G|4?}?4oDoJj=bCQzR<-W)?q<`(= ze(6t_d$rq`sVGbGHJ&Fb%D4J++;97QlGXBkN&|z%`fL#zKRHK z%d5PTaavZaD4gcaMcFflGej3$4I~%^?~taFgsu_Zc|vr?>kad^JxQ^9+dEw<9v_b0 zA>5!QS^;|%cw^Rb#-LJqPYi>H0CeA|cUMr4+>7HpF3!4hl#fzhXd%7d@Qk>Rm!7>e zMUobvH86VC(^gAH#ys@AtYt|-!_^0C&t69VLp^Mt2UWiOCr72c0_a!AS&Bsh3Y#(dH2(9z~7!>8&?j+*z2w>_JP z(SmtPy9n}OL8jOx#5m>*=dR`mq4W?$9Y%X7piDe|gS&jH=T z?K+QN$m}nk(oKB!!L7D|#QwACEr+yM+g+v}U3m5+;W>UMKT_&-sue^0)Q%h4GSL|O z?7>xnyA-DQqcHX{PeOHBD>=3u{2%pCH$*Jq!_I|eu~G}U!pR${ja?r&t&zLm#;r(9Uo~Bc=h_kv(#v%d4-y*ZnsmexR=RD+-MDO-nP=28l!8c|2nraGvn2$Rm8#jIc>9c zer5BC4E1!=k~x>{2}J~)2}cD-t&C22xD*r~6LNUc@cJ}9T=+Oen3~GPiWlH$r=ytb z74~xir@Qnu0@;rXgvM-3W;{iyI?L1U%VEJW+QZ1qC+85R6`!B^<`AEALEwY3o&!Za z0Tr!>@*gZLUwJ8~zDgk2}HwYC3|JY>`8%#?);8yNP zCy$LFoVAHC7J4e?8Ciu0wd!~%hI-DWAu>X<(NcBLWSIDrZ3p0< z-3O@$Cevx^Qx(+b9_-XU1St!oikf;n@@eTL)zqorN61F)w2OY%)UNAQX>cQup15z< zD|!|giam>BHU`_I&uXS>q)3&L$7`Asy?JthDkF9@>SJ|<6#g(n{KH5U2NTj8DM1Io zCgVY9Zp$ly2OJt>ND|%QwR>sAdAD5@ek)2P?n7v5<}`bF^|wT*T-XZ?iPniA@|6g` ztQA=&!%x6JB?MXI|1Ls+c{SX{3DM8PBX&{aLD-w&Dbb+Ui>B5DX6nC4wJ>=_O@T^F`S~kghJo4`Px)#4uV2tiOR^;0M8&AwrxVf{wvh zzWa~Ec7Mge12_l>xDXq--C?3QKh`Y&!Wk4q@HOrY@c$0l-ggv&_^7}AE8C)vAvyFN z(4J@y2ed1PijgRXuC)!y1^Wz%iik+diXddg5F7{zSrKtrgeU~zUxocB+f}@8=@UR# z@xS@8MaNx4F#NB$K*0M^4;b5zdcb%$)&tPwYk6V9c;C||9{ie~Cin*wfpGsn(Gm*- zP|PSqfvc01iY^4hj6vIQPmt{iY)ni$bPA#%At50pp&%utpdlwCr(vL?prB%4q@!b? zqhq9@z+GSe)*pU#VU**j#!#sz98C)1440nM7V=sKbCDlAs7J+ACCZ! zkeG;s5T8N}1k&IWaMB_Ol?|-vxZF;P64A$I+~2p0o5AqeF)?xX(0UbOo;ah4-bot| ziS5_&!+2HWjcwH`u6s)EXfXMRoO*DoveBz=TAlCWjnfYko;Q7(xmoby{pVRzJMZws z%)*z={c}I-+{b#|L*rD87;HSmCwYjl1t8{?sAvF%xW2zs#T}<@2%L*?THH6k0YWhEJ~y9vKfV}}8PZ#fozr0KIfLsuSfQJ zDo8q2T6AS!<^8!W>f|*_&6ozI^_z_!Hu>0nb~a!K z3-2w1AoIteuhS$S-)L#JSr&b9BCgqycXBCs`_Dc zPO6M}vm;5BHex}x+>o4gO z)dny*;@^1q_&k-%pwQg1G1@DRSO21VKQ~oQQN#V<9J`J-DvjsGjTVVySuXoSQgY{= zr49$A52NiLC-ikLDfM>`2cO*)HtRDNFwImy(OEd0-Fo-}iSx^r=79rdrFAdwmME0f zHH4g6b4fl}>V8MAG|=U8lu1V3QQu(WlQtG6DfVLRBO#6IMPJm4OozvwzPx`|$Rnyd z?&E&SI_s{HHyB6{&Np3Naos-4{pLhRpbwi><4{NCjna^t%XcpfDlpEPSw9$FlX&RA z7RA=+>T$3=^{n&wF0ME2sWHJXo$?x2cMK^ZY`u1TG_Mz7J$u%aQVCTPiGp)^9~}!w z^%(J<7mx^Yd6mOen>^um*sD1@YUef`7UqGr#s{MTlKw^J_BU7FVxZbNgq@uiEI#Id zgzx)fjVgBn%(d>-qS%}&#qmt4Sw5zDmJtP#d5c0?dmy; zk2BDT=Jch3+n?a~5g({rTJ{P$*aRM7Dfc)T{3d%j-|fcQfS+;c#yDU)|meaSQfhB(*@IZB#}a3lBEmtLA=)fn==b6-MTz<}aqlnzc=ibhJ9A zKRTmHSGDGySf*g)(P$ogX_Z|&^-RR-T?dBz{b4VscD8oZ-3ajvzRY{HZwc+^G&;MN zAno~xn9}6}F)JgB{VX1m;V0&6Q5NU#UtbQ0|7dlvf~$s^&1bOhZiY}m0-bDwVfWf1 zrulQjkvMIsC;m;BK&Q7^7cB3`j0#2kkWj>gMIh;YTDk;SIRS!*cLKQw5BzX2>|$jI zqE@GvI?MaWwC&y%SjN3u7ksc`_`}#B)=YUNU~$Lc4c0KD&@KvG2w@Q}4y20>+7{(v zufSzutS%(YrKCtE `XVr;Ij#^LIO^6=!)H`%A7rNY4_1cxiTx;h~_RM5_@USKIS z9Ik4t%Av2LWn|0&5`)9l4sdaBIe2=y%EIA3K0dfzC>uwlr?8DX(%KX4{w)rvyoV=9-u~C@0La6;>=!UL1hDnY#XU+RkWORclY=#>8#Gvm#c877{@Si6M+dWMn18WhEpJ$-{9$e_LJ; zPmqGTlePWER6)}tK`SVV$iu&RaRh~bqo_Rm8<{~q|0w_HxnoIV?Fn9rZ<&2>qTh1g z{~qr7P1Ue`@{M?ipXs>8K&1Z^0~y&^JAppp{~GiBQmyZu4&a)tKIeP?^3So1DHsP) zfNlN{j#$5`+IQC38n6BZIU6BV)kzx}lM(`sU4Z%7q9;f6#JVIZ3R7##lwEF~@WJ8TIFnV-NvWD=0; z?+g7+BK=j!-y~iCI`uz_`GA_g$oU9ySrIW=@t@`Vzby0b1pOZp>MxT12EO0G_#2>` zX;SbO{C~l^zt;0lcvlD^{S(`LW$8ZwON)yC4qHM>>L>6P@8UjK*FSf^_t~4`UC?}5 zpsxlK9s1ag`+&9ck1y>Xz1eRW|68~45B9dguFk^xXb(>#8+Vi|=+b}8b^PTU{9o^J z|Eh{uZv9#ilm}YK8nE4la{YCW^@mB1?@9eSq4ei9|LYw7s!tRX5|IMaAI1nNS#cRz zv42^g_=m6d|0-XZxLE&ZhV%ac4E7gw{gZz2|NAlhw{v%Y*(3Z%#`GVZ#>O@U(0}8g z{y&U?f357FaPXfD;eP`DKRB}g59eT4SKI#|M)yCf=7teod24k4myGUT1wUndEijvc z)%Jb+#Q!b;iHHb`f{&{oqSRjrkU;6?4LgngYL0tWs z-LKLYPO!xaxyHB|iVem3KF{%2dHk`O-z3IgYx!5H{HBuf-|P5S5jR%xTgHE^;Wvfl zuT}h3LwPt(4XQ|n)7TDSHMYP|3TsY=v+e@cP*iwu%ot`2Um8yt-<~i4zXzy(zlY+r z;_b%ShuH!cuu{Xv+0cbxfFEl$_Wg1oftX+yaE~0{fq(Ge$}oxpQ)BJ)KpJ@8{&Cu7 zUR>C=9}$&KK0|xiKwf>?6K4aMr1TeZ;XAt_<5DbqEc)K(>$-WDKDoPsklY0zU%W z`j9nvLO~uN1PR$d4j>}748L9*VAwRjTS0!u+ko&L_O^KCnl*AYHtiK^zJ-BW&tG z?+RexnbO+J6Rm-CLArzf(-r_AW6&XfMJ8KE#zL?mTF&+y;P2mEe|#@@Cu6mP#vrS& z#KjW-XNazcJ@O|Ak+qYjv9U#xq~1V5_8WApasUVZ8J+x?y$ae1?Y@DyH0$Z_ z)A$|$qCf}GE?8QFqsLwKygWUS8ySbp2{6(hpcKc@o`9kL04E1c?C>i(?#T0t~vp!Qg;YAR}n~QwW;_)m0D)f);==D@w~y-4OUkuyAD;Rjepn3+_LP0%(qy(u0mDFzq=x>5NwgOlzobYV;wp0)IY~=ZSvHM#roP4hC@soTFDXY7G73Z;O zfK)xy-M{6H70th;uA}0zp^Vsi8KQ9?73*J0ASR9m8Ms7tI@`IUfDik@v7yfE5-}E! zVEs#p7{bN|?Sbi)E&OWP?BXG8ja@s2Gi>&?c7EvV6KP*o31tZ3iDLp;=*S1{aP=g ztlE*D!HIMNB6e&gcl0my-Xe@`65mAAE#wZj=}E8>;|!m+CX!L-MB=+``e z;uvJSp&+ zK}f7Q^hWdNZ%YUTz=}c&*A%HpaB8Fd6gRYh4^QblE-nv9I3l$s1e1sE{=A>Pl#1!-!z03DZ$ z4f2;XCH^kW4e|bvrYaIlvm$NP-O6rG`M91MI}WAMWw{S4PesZf)ZjP;6?yHfJ=)Bipod|iiscu#SqfqmJyT? z1-FfNmX%#h>WDTlnO#kLQPauN=8atN=;pS zpSbG2uLb|9WM7N@FB<`nU`_e&`y6b@A2|UFmDNZ2BApJZqCj7PRhcLvM6fnazYW?z z<{#naKcY%W0$ZxzhWr{6H#=nnBnKpx`*2YTcK&<143u0qQ;at$DpuqqHxBwz9Eg^z)L4yK6Xine)29Od1?16OwK5%8Q zt~9^|E;cVQz${o7n~NA=BCHGI0v8t-u#h-H9E4(BP+H)wL!@wiX{;*)$_ZQ?j*JBG zONnCPQh?on3z$+IAp_FHy4bif(%85%(pVfBX)KP63=T&If%9Wilfk7XBZJLR2A3x2 z-UY=)MG%sLfN=!@vkOWJN(o8}$_N6|AP|BGQ9*>5AVORaFfu?wNC^V27X`TBT>!5F zcuOR}3j_Eayc&Sx<-{e_)l@~4)g{E$5aMEhh9c@Bpm!8il~fi}l@ycs+L%AJ*uR?1 zUB7K!@OxhW9{fj!{~jcZ<2E2iAQgcz>hHiCc<@KCmWm2k&1Z*lLMnO~YV70CQd5yc z$Vf^Gi3$TY{w>~b)6oP=0nzS$K#d5-9qiEa+p%CB3PfG7ED-)(V*VCqJ?6j5{ZZ_H zR}LWEtxPsW+%0l#k!w>F*c9>>cWsetQxw<~@)mb(k!w>F*c9>>cWsetQxw<~@)mb( zk!w>F*c9>>cWsetQxw<~@)mb(k!w>F*c9>>cWsetQxw<~@)mb(k!w>F*c9>>cWset zQxw<~@)mb(k!w>F*c9>>cWsetQxw<~@)mb(k!w>F*c9>>cWsetQxw<~@)mb(k!w>F z*c9>>cWsetQxw<~@)mb(k!w>F*c9>>cWsetQxw<~@)mb(k!w>F*c9?#au?Z;HK<4z zu<+CetT4rVq&NtS^{w;`_0+X=)No6SDKvFZE@(Wk?$z1F(;aKRf6)982k~358kQ97 z5Ck^bv9|GW)iqMb?hyk4(|!)DjX&1^^#ZGV=bG2o$~FpV>T_^>3-|~BX>45G!7eW_ zeSj}!3s#;2|0&>i^6_-V!Y6>A{+J`ykB40oOz#c~2>gs#zx}#j5Qnqw-;4FzI=k2c z9Bi3gZJlkg{^!6S;q8Upcn4nx_`|(XNFU&D0)B2MFK4g<7$3U>6umRj8mxdO!0yPx z?TNGjyBraS06&Ghv7rj^%Y%JdDC{@*k8SXKf*o)GE~J8X^~3E6!?D|D4+mIvBF&+R z^l?IZdJ5@-g~8VDwzz|ntX=#dXuZzZSP<&{;WZovC1FSc#h!>0{!Z3f$3 z`vdkP<_{S98dxh0cH6?g@B?=2G6WT!h9JhaA29B#V3qnQ2r8`GP@nBse%Wva6bfl0 zj3wyz>u(XhWB$2kLw>^8{JyU};ZR-QLWl#))iz*DATM_g5A5nH4xwL}_@9orp;#Nr zAqbW}BHh7pT1XC4z-8b(7|`4;vn35Bwk;=l_GqJm=piO>`syxdHzWi$8<2wJpuLb9qz&nTJ;Tf)OWdwu&R`cY zA1Dwy357#Z&;=*~N`}&*8&DQ>7s`iw<5}R@K2*8oc*-J$PU6X2AijK_fvg!34n?Atm8XLIFZq zLM_6Bg!Y6!gyDpVgqef|gf9r+6MiO~BO)T&PQ*tfMWjh&PIR0ofGCqG9{CCER#}`@{r1s>XF)#`jN(v-XJX|tt0(Rx=cnx#z&?=W=wXR>?Bzd*TgbMQZH3z!wvADdQt?nJQ(02^QzcS8psJ%9p(dr~ zrBr;?g|`dq2!{$636H_K;fLU{@GAJ4h=hof$PJNp1T8`v5sD~A zOo{S~+K8rzHi=P+sf&e(JrbJ~7Z68^r-`>p&`Ib@oRO%ISe2BLbeFs)TXgt*<)ZDKbtJ$K(s%4{(uAdchfI1ATrQ5NHOR)L>LAd zRvFP5Ss7&;%^B}AjxlaG*=^!wQejGEdc-u#blyzWEY7UwApBs^!5VXBbCmg`L&S$n z4`m*jJ*;*(;qd1p5=X+1G+Xdl_*%TOWVUp&EVZJtvbK6~l<=t8(d?ru)_T_0tY?pD z9lLUD!bZjBlFb*}y|x!^hmZ=$IOKqxf?b^5puK{9y#0`al0%}y2ucN&jG8>Ic|862 zyrZ7uEk}%#nNyxKiStqC$1b!kjxNv9Y-nF}y{mw0xNDD_tXqQHg!_K?Ob?icg~uaL zdLT^IdhPZ)?bYk8=$+!d;A86Zz?a6?#kbav-|wv7fWNx`%>aS`n}CWy&cKs_y+O)B z8NsmNW5E?6yFyNdd_JLZ;`T|hla43fgo=d5h0cVTg%zJ-J$2$#-)W80IpN#F-NReX z$el@#Ac#Okyge&+_VU@aNZZKQQ6f=^Q7h3l(XY=T&Ly40oVPpwHbycg?E=vSmkZ6Y zO0l=&XyW|i`r>ut3omk9jJ!CLV3qJHQ9LpI64@oMOFcj~$Rlv0M$ zm@=}mQ)QTP|MJ&qIH8lE+(Hok1qYN~mE;C+3w zNpowERTeb(u`gi+dcMheD8Se#KDQr zlkSt4spx5@>02}6GZnM?vt4t}bIbFQ3rq{Q7o``gmdut0mVH);SCUrutQN2BU+cg) zgFR7yoG`u@$O7vpjIW>H{SUc#KQ6Fa?bmBVOze5uc;Ddv@IMB7!Z`Lcc6=B(lKaOA z<0rrg<3Oy1i15HE+21c>5+XtZQhYLS_BuHL6XApWzXyUKd}2Hj7%4UL(oS$+&B(#vW?wQW`e9O-#+0^D7!YPT7We#-Bo7e^A-jw@2D;+KXRCR#QtG z2y6BZsN>!~zJC6v!_P#Vjl7tUcq!>}@{OCBw{B-;KP)ILdi1#X`HPoT)vsPRy>D)5 z{m}O5bN|5L(D2Oc-2B4g5~x1*OmqT#LIMH;A|gU(P-Gf#CORR42;!nsHXs(YrgtOR zcXC%OgJH(8?P8?&xu4amxKHfp4HXARqchs5PF~CBm0&WKRI}wH^9YMq_r#Xh1nFfe zb?P*(z|(t}FWz{FJsdq@{dDx*8fJFV-w#OtaXPx@K?mQ6q}z|GTL%|pw9HX{XD??x ze)VB!kzZE(&~g9B2 zk;sr`r!UXekdKEt*BQDZOba|J0xE+r6m#Id7ROeXU(~ zeih$lzAeQ-ds{IO zoPDt~Fd75ZClp|yWs89MZ{-izD*hJrx0vTY^6J*76nHnw*?FI_by`s|F62XvkM@2LG+8Y%q-W9lS?KLRz-LSIE;L?L zO=($|eZ%hJ&!<@*hH8;#orCd))y|xpw>-rf&|N%lIX_m~Qo5YyH6Hw>a|`gFrUz#8 zleITPtU{`m^OYvX+pU%#Uz;!ZsMvLOF>1|Zb$-pa9|Pq$H!r16++ce?vhB{Ak;2fE zrK-Sjw#QwJqeBh!3#%XQ%}Y8uxEx{>Wqthcc24j0x1&oP!G_8F!!l`12|NaZ2VOtT z+SOVne=pC9^X#P8v@Qm+uN>I1+He25dv*8uE(|nM*>+A~P}V=JF)!pn?{w7KwAg3# z+C>d?$ei_fo7p?BVX6bAYjtPd!k26763UkhSi#8h;Y>NoO1b5>g6#aVBD-|?xR|0T z1{zZJp2t9TY^yheh%K+qeCZxp2>ghFp42WL#y~e|+Phbi0_GBCShw=}-$%onmsWU} z@5|vo1OiW;+PLD|Zn>)aMd2F$K0%5q-sm@Pk~^0Zizz}}T-x|a9K}jPi#RW4MTVcJ z4`=W@s7A|wn+%#u(?Q(QDSy!%WyMk6A2jc?#xwRB19jC&jPUTy#muEo%+3~!cCX5< zsR4G8xU_m*?VZY4Duw@+J;r~#ISOX;Du#ccYnus~xK+38ajTkYMX{I;1BD2`nS;ml zu?B|oy=bY?XiH1`_k2SSTVNp4Fbq^A8wk!Tul!Pmf##>i;iwx6by)t44cX$)|7EsM zn9XZ9w)k_)!0kU~--p?}Vr7dzxA^lv$Df1^@m7JvTd_;d5>q%Hp3;?Msae{SC5 z_rJ)W&0*cIQx^hRt;^=H0ogF5{Z1h4CHIHADtKi>fFvHg_d~&bEP^SJ>`|OfM zDhx#SVUebx6MWZO$V4r~G%Vgh8~IS#d1cCpS(VPeQSd%=<{0`&SM!Zm&Cm2mZ-w41 zOQ+ATK09dUzT<>Kt11am=|T0~V(;3)7n;Usc6uB;CkDC#uO5B&urRTyQ=z=In>~Q` z0r|uGQEI2!Y3CFN7fp&E9HcC^7c*0ikf>m_{*2sG0J=2v~^(Ioz}XbS%s{W8Chisa?K0iPFatqa$SgGD@FzHBcoQY&&> zbbcSz5m2L$RQar^C>Y=8g(BA(u9=4d7vl2JRm?SW+sU84W4@C-zc0z6S&p zkmuc=vqoFL@~SO|CMxTAc6Y*M=FD_S<1C?4h)bfq0M zxXxdF!=(J7<-?GNtPYc-V^@Y>f@v0dYGVu}9&QQzCw@`b(+8-l#PbHkE_HTuNwPKMeP9Vw>MDl^;AbIx zr>QJHyT32Vn0{1xj%|D4wXB=1jGdEZgHbm2$0LR(ABLdxxx>xTMY2Y$&Lw87PJ}Bj zLwXN@qKAeE%8B)kSB*!c23=`WV$ZoP$?DzHnUcp-IFv7w94O3RRv3SLWHci@vud=o zC@lH$?V(EJCI!O^UeW`1xabegLR!No`T6yXv!(~u=wEepD+KSJyYzzf{ba~ZZ^h10 zhr&0KW?p>{N=n@N@4Xw%?LOH>trvFfb*ZFc`W_*d?ns{77qoiMYw#z}ffxP(33ffB^ZcHa_zXQX91OQ zVAz-AI(9}Z3F_DHbhNhBvU^%DIo@9ymn(5VEPN;$tEe^tQr`KrSpK4nSPG37VQ*w*u#H*fZnX+>gE|Gz2O00(?Uyu5q%j+=s zbf0O^9kE}_;zU|pzE@h>RS7u_!IMon67z6|FAZ+2271#YYsOwmHRwx#CSL3` zYs&9G&)aJuGf)DzB^C8vC$z_B=H%;2=+yBxG1S+cPQDqPupo17wJkF8(7^ud$C>)x z*JmpRIRO?R4PP^u>4dc;h4fQR!O_oDIxRkgCr0(zHFi*IY*(@NI^f8p;MD$kkHB@U zjIPeC)1j!_&pBRc6_{1;#6UDzkwl-4r|vpq?0uJbTfv?+UlC>9m9}8tDm@B)_0H+k z)HuclZq)Goq{!^7$g3uzO-;2^n%!oxQ7mzKMMk}rSFBEXmDR2AQmu6i0o5!9qPn|` zfx2s+l-}oi>5p0yei*e#h=Ih$OUftV-ezlaetFh=l)#INfzIUR=DC1b@a`%2>Yh90 zqs+pg?4E-*TMC)~c72r9KVd`gUmTvlPG7ooFKAe;UfS_$e8mKq2+WUr&sl3FwG#y|>6g*R6er1&oF zwO``FK&L#x*sAZ7z6K^RMa!4d6vpzGyoz59y>|v3a?rVz6Ot`eR|tKkD#s4Ajlg4R z=YsLl;b%G?l}%l1Z(6l$rEFM^EGx5YAI^=5MD@MVh}I-zFlu)6@U2x;KP+54PvLd{ z?qkN`&lo7dezoGwO109|gwp(5uYqEzxv2Mgb78qmL8XnU=EPG0UgMHux7hH2DE2G?{oNW zsim*c8ekx_ZU_59wnY&JD!pX9+)++7&~jtJKNkZH#DYMlML_AZbpjZu_y}JKUqz{T zFwJ|z<)Xu1{O*EL{gG?{AU8iT1|l-$Yv)@wXtZBeZjLVN8hTrlJUG4_cI%PS)YXs) z{N zX>V8b!9X89fTCvX66t8ug4wMdy{zc0-%g-AX-%djheYLattp4pE{~0`?C(qfee931e3Il07!k5*fuAb?XWt`noSO2$b>;FBv>wiGO;}Wx=;WWYb zHYT2aTwF^Y1JMhxkua;8XC4gjxwGSh{?W>c)OP2r}dqn%wQ38yOs@Le@p+M}KZr5%DC6U^WJN#~K2Z+I(euLYmfqj(pT{ zJeYrpt@I<+fsHu4xUBGkLzh?W9SHcP95NjKe7B+?sMH>7zBHkcxod zBY|#hOjmfjIu+VmyLpycU{^ZAOI;bS-2L)p+rt+IE&bbsgPe>PmCG`Ow&iq(94H+}hV2+-db%%d5Cs18pO-_q2LS-H5j5Au7Q`mX-<9(ob$(Q*W~Cc%K+%+EkZHV! z|D`3J@NBs0ty_nim=5PWT=Qn1NY9H)ukG#^7W?F5p|LtXRk>c?32xYWT5S(-#tTY1*{8RjYnF| zDixJ4A6hPoEIX6C5Y~8YdgXe)Z^)<5D>Lq$bW>G9P824*ayv@PB*)nro+BOkzC;Tj z4*DorHr=`$ex%DZp48}U1@Zyo6AMBUH7{|4KIX@5cU0&_>$bO-^2@gS2x*uuuGEI~ ziYSau^Yx?MRzTTa1IN*Up(K$9Nw7md=aY;U5JABUrSC;f0j|x|f zA6j{78CINk_;{OI-aVn^ftGaSx2^Se>8D^LD;_ zvGwu!iVis+mzFsb$pF64_Q_mROF{X|xhIvQ;(4~qYjGoV#rMlc?AmtoX~8KB#d1V3MTNxnHgnhC z_kEEfstWTg{+J)z_&Wc2lVMKHf#WEP+p}hrI$ox?k2Y1Q0(E*XtCcjqh+aGfVqn6j zj-Hwu7880KS1tQ-Z?r}e(NU^TfaVG~Rxy=YsgbnT57`Z0(6d^RTpJr**wdBV1`*P!`hpP}pp zjh?80{6K-`7BHFtA>cRa;H}Z@zg=+uXARo^yUZ1aFkpkr()#?VcLQ_YpXx^CN99e# zXBKk{lB#?1-zgs^xL9zZGVVo_VY3>8g<$T^?7IZ9_e~#hgN;Up&UW6g^Re^s79RWb zKn}rkIVsLODJ3qr3>Zk8j*LC)F7>f6x%g#uykt&TyEuMCz+Fzxz2EzV7m_rYKTOTU z>{M>X?b|mbsIM<{MmnlF9>E7&R^%uxyr{=Oa>0f(Rml1Nw#DmG7GC9s$S;$JTLjuV z7rP#ryVZZ3U>tpAbxCusu%pX(G$Qlmr+A|$S;7VXkG=PfhC6)Mex-^ak|2p5EjrOf zjffUObfQJCWAwpbf*^WJ2%-ehOVq(&BBHnGWsHelXGR~48E1a)dEY{kg8kX5|N!tFwG7Ajc>?*)?cGbw6n}8f++Hj0Uc&@8jCU zxU9tmMBVO9Pq9KNGnm3%s`oIhP_~XQZPxD?xc{`urs(cM45? zXc;{K^yovudby!RE}jf56K&FW{#JJm94fy#u-QJCV{DDLPtwz(O`~KNVT4X8Gv)6f zh2Z~(H$7I~nrWqzIypMS!dfrMd{3IDQAz?hnz!yT9VifXNa_F`oH&W_5qzU77#P3y z#Q5!PT5Vk;x->UW_C!M$i3&bN5)1dT^znUxu~!2QVu5X+{p}=Est4B&KKsn99<;n_ zjlD=$Yb{sHDsO6St=4pP-QITeKG5V8huzoY!lTT$5lZRs9_wV3gjY_<`#Ja!lkLUx zc}q5x+BK!EQMmMsv3pwquzYw_TQg}M7+aP`%VK#Q56E(U_1n~tUE8Wc?;{<$#)ykX zxGI7~qW=o%un+#Ojhw+#p8X6~JY!&8EdDhO98PHn)ji4cD87@#C*Q~vR09IENr`w? zi)C{fB&2K>RYpE=;hX)f`9jq%?3Cv1v{H1zC0V`Fl45pLo zZG&!N7tD}Txs_wM%=Z3_J}0r`P|5K;pVaU8#cP2cgfiXiqIrCU zH=xyWFd>b)dFuzmP%&$sr_CA_cemqGuaQCT=bk>6MrD~)P9MJw5>Bfwz6?F+KN~*u zaapu`A+kWLauoehj7jF4Io{TTDxIUa@ZRSPmTUwpj@-;3u3uF% zqiaeq*=WqDQ&8<~;72K0(+D3A1z-^}B*fpi70UOis-oY%&d5*lj5#6X_0;F7O5i3jYL( z|Gx%`|3zQ?UjlQgBIzaRi2{6IiEl2+hRp9p_ROq{%`qnSfA3x1_w{3-O7Jsmf7bMX z-&K}hW4)}rG^N>4)sbgYVRD~^Ck=0UNj9}HWprUjw9XR&!|SCYZ_aHe_U^PvFa%rK z@gTsXZW!vc1}Po>sPfxeIB8s(oO06limD!iUL4)gWP+pxCZgwqWrls&L=^|Gq=Kc$ zAz9Js)McL#VwQf2oIqXSI~s|4@HYdMs6P$%@wJdx;u?}bAGSXNt(*a zw`$`=wG60?e1>1w4$AnxiocVYWawh~jHf*R^xMAE3i)v8bpMf(xyRz}w$LS+5ft~t ztwx&1CMRi@$vm(Fk^ee=5*$I^!9O9zOqroL>Qp*u7Cm19WpWy@{+hGQH zjHOfE6oopnU1<@QgpH?Gmjtg%kud~)1yDaN=(n8WHIQ&n0Soj;(|7W{EtkS_XR))}1AVI+rSf|HZ?dbMWm`PZls!2D zb!@Dma==TnSj(0J_3xk!M*v}XoT=vBJ1A7gAMjvy!B4U|v~TE=>?#75aSbl@+uWFf z&#F4NWRUI)giGI`0pJkem@!vlHQD(qnK$@+E}M8SgQVPxZ1fTz!P!V+EM%TIpRspb zCUd7T<#cQhMyl~&$Va43yT(6FYPCY4HrSxb>gA!^pAq1PPD}OAZX-wAq4Gz`qw=Ql zEM!afUN`#bt7zSFDM`>OilkStNWP(KLP4@wrDq%j4_@Gt&di|Ti;dBXm^iu2ZTX~r zcP<5%xYK=I6dp{O+~?R-#G-CgUvHTyjOuZ$^?A3J1Lcqz=2WlQoxm<;<>{2)_OsO1 zHl*7uUs6g24pw3h6&B!w`f2Rp7Ez-;58_BLWd;Nc#7Uy`=e-32u z)?0b}tM`pP;1^ec>*sKa9lOQa5)<=jiJ5PMH2ZF650;3)u8VeQtG%qO1YcI*DONUGxc6jt1N)xDgV!!*D6j%C{ zH%i)7BodWTv_Bv>;kh)2?58D7piuKr04DDguNw0U(}s~vqR$$z6Nhyb;X)YKc=r!= zRdBPL(zm{+o3?pP%HMQ|y-Vb($k8Y%Zz(U^i~=OBDO}WcXpm$~ot0DSv@^g#n&=@p zUn{HvFaq}g{2xDJl19|lus5()_=7YZQ&FzAv@=aMW1vZd{CN#;D} zdlz4#!urpY!T)qd<-Y`(S(OS;cXShnDt&S~ygv%qZPLA#^V{e|N`*G-*UXgd!EEcf zNACQAf$>V6gjlDUs);T~lqQFtuZ^cN&fvFi?(0Fe^S1MR^ad(qYj#qdY1VQKA$Q2E z&pVzt{^OTvYK_W^N@pkkqI$&vaZLTlzcNkyQ$f>Or0v}Cyu1q;ze`2oi^x`>b1oK`R zNECWF!bVspJ_qlg1|crV-YIqxbz(9OX%@j1HIPi{exbEGpE;r0R!@c6)Uw}BqLS3w z*2)siZy7bS7>tQATl`$HFW>2F6Zu_O~MmFF8fA(~sCY{S7PC@1!q;(LKbn)xsc#2;CV?WxEH9Xo68X+PCI~jBRDRc@VzG%`xnT z>#bLK%`M2~9>4>?cyz@^UUFHv}&j)oDhW(jnu7wY7tmAqipX6XG z!V@U?9XzZ&C|Z0W8(+C8?x*J`;(`_mGt$hq(Dr!9mR36djM3C5JS&eedBTR@rJmk! z;(QhO(NNM!pH$)+2~d%x?E_DiYu0<8wUIwO zt%uduLJh(Tx@LPCwznKIs`a4| zg^$3OWkm!y5EZ9@RG-cO^$L>u_HF{)HI<285(jOmaxCR#dP%~Sba!RvAZHvW8-2`4 zqaw-XkPVa{dJ%b+frMXGq{A7Lsn<(6y~S9y?6ASn3KLmdRlSW;YP0h)y4b{dmM&=B zGp6y|aC*ZaOiCULGc~71cMzaVSvmIj@cfLr4ovPGT!~q18+wDG0BZq3I9s&r_AM7N za$h50JjBLf-&<8n{dR}W>tRO^rFo66*9WazuzR5BD_av??|1wz$ySXT9t%iK5UQpUA93nz^I0jQk{6QlYJui$bDY^Z1$>)z7z4;fm zOmh7nTg($l-`*T?r1FxC{N+O;-9yrBGVTmcq6?;flQ;y)Y2ry9*^bLzA~fs&)Z8`M zpN?w()57wf?w9&ECn=B$USFc)j=7QQqo zuM^O3Q-1+5f{0e1Y+8;!SlSGMPP9LJscMlaR8c2;F0*Hz*jk=do+=-;RXyt91MBi; zwxF+v&=ge;3?}xpjVlOAh;Y^igvd>hS{G(s5fHM?~G6oDW zrstTOi5Z?Ax>#Av@Nm+%;LPw01=u^}RIRmz=t7 z+b-(sM$?ELg*6n~gsKQn%;8(1J2QM)GQ*m4e~9Z?cJ8@Oc`}jTodD))ia{4C@&u4~=UH65F)hL*Kl=-+X zSLoizTqU(!dic;K;{E#@wH=u%`t9ze9t!t!l8_vTY+~)AS#BFT1PWV2$pHfZ zj4ich@^_Z9>Vo=tdiz+d4>Uu!H5^K^2XAN#CS4!o(%D3OSEacFeQi)-xof?VhE(W= zi7M1DC{aT)q+KrJyX?H^KB2gAH9c)e2*7CdWL0zmT{V`IUxdDW=lcRI8qldr9ev#3<0fmkZOrC?{L7ptSABu zO8xB{(~hk^G*DpryVhy+ZkvtqG^$7@Ef!dd2R0D${PVx_B|?>78L*h1oD#vP$2bhW z5Gx4%ja^&QJ*a0%%8!j+LyGjcmXF{{76Qs2)t=^d+BM5jN>9;elK`|E5=ss!rSlV# zG~wJO8mSVh)nUJibKIUU8R$gNd|(>^uK|C?mpEgH#q$c}?O>-CsK*+zJz+6taAt0J zA1U`4Y7YamXCYds@tW=agb=H#(gis`F_eo~KXHw}+?6steXuU9%!(zTRN`pMdMa;Z zqpekI^(Jt2!|+1?^ja-APWofq1CScxbStIXaCy6&A2+45z7XKD3A@91&N2*thpHdn zaJ|5I(|t1Zs;haQG4@=QLSkoLnU3p7N746UYd3HG20{}_XrEDFs)MnX$CN?UAjSUF zR()lt;}^30Z(mR2vtXVW+4ipNo)xb@dJ~iKrM5*0cC}>Sx&)4hs<797MC)uC&?^7+7yb=d>i<4e-oIgY{@4HHpQhsfzg?H`Z-^)RfAM^tK=z8i z>Xn^aUXmTdQLV@7R+nU|gp5lv zMQjLUlRNK{YzG4O+fHmJ#^FVXA&ciEP)du`Z%$v5h3-tTfC&#ztS|8G$CqUJ>5xmZ zDk5Q~To!jOvI{@Mfp{0v& z^Og3+x6I$^brkEkGn%3CDH5L=y}D%uQ+_ybt9^f*s8F1?q98_M-FMXgIl}vI7kKm^ zf}+n%(*yuRGH1RpR!zZi{zZTT+~mjP-pbEMMre zOR`POjuNq-fbWSWoWmRZu*aD=5`#^lOM3Jd>TpETD<_^ET#!Zm3m;Ox9da5%NWMjiN|NHdJ^`q-r0G~qyQ%aw~v=+{RJ^wBxGH}=rn9RygN#lWyZVvc$=r~5B& zxquZz`TfM(l~qPu_opQ24rCHcTVC3^T~+I+OnuJ6HQ!{p5t6HAndZ{k)?zr>e_dDL zMk!-#PvwirFnvCK^82#dHsFj>X<_{|a;ThnRsC6IM4RuUc;PbygT;6Ely0sA?k9@T zdFsbxi+B14(C*QV)%59rG3CcsNBZcM zxvuDoJ>ODp1&s{M9vwA;X956#JS|J{i7`V=PG=0_==k%!l2i>o$3dfUbv+5M^UOEt zl>HBIbp!Bw*9y=THYn*i?l`--YAkpB)xqmxuMKIRo2pel=OO!QQe=&Psz7;3rUWa6 zAKCAsi0$B-7`FW+#Ms99A~@`l?6uTB>G3mBITuQL$UnA2T4{Oi z9gws5=-#m8+MCj!QlVFs)Rr%kR8W=gt5cDuRU2mhG01e& zSl{SVICVR=po}w>fh)>+j$4iWQ~0gNf5Pu5lV4|!7zg@d+f!=46_qX`23>bg#qMiS zU&ohtE=yfV);}*lRMmX)wl0O=K9WU?{{jCko*k^}=THuEHL!7K2X<5f%sL1HbG>_b zSB0xv`KKVKF+au45995eN^@bG)@KByDrwpBIFk1G9ppb2a(w7wB54mlT%b9(fhOTO zT1cxlgi^1cd90{bR*SB*PMyoWhB>7*N?l#wXlye4mJ}!Q{FYdqIA_@%>RU386CWp8 zrOpxXwN1q)9`B$!NAqB}XKe!9y=Xxxh?mXYndOAFPU+zv^pL+=T~>{>+3i=~my0zm zRjxj7#uW_Qy78W;&=Q`3LoZHv!{?i{U=>VUG+tb9`nf#WOR2>RKF4TYzv-R-=g(1v zqoFbAU3q@J_}%jIg0(N%WMs^F;LW0|8f1pKDKPWe^TXg_6Wuz{`p_cn%1W&3sZ`Tu zCx)W*TTUi>dbOaopZSEkc;OAF+mFJ@Cl>$5H>z%4Bjm&SE4jbJ{b7?{pN5M3{a=sb zlZ#c~{JzS6!)3w|+#HnV=1~4aF0Y|=!^4SJo-HJ56c|$faZryiB_a6<<(JrJzqP|h zTuv-_W;Y#S;ZZ4ENipVoGxEI>@RdLD^#=9)xKNkdn)bl@uUA{C0%ofT4YkJOn~~a& z=p~-S-+D&=-4V5r4f0=J8Ua`kANtt1S~+hW;2{Dkncb6`+5(+#l1XyK`;GwP^3~)G);=SH00bqKss?57&di54Z;p0iagWP}NRde}Y zUNutP_V}k+?Z04FqV<1>6=P^0Bz>2IQZxQr0fVFcWJQ+1-JXVT6P6vXAUu0Rv}aBycJY5dHq>K0CH4im>5 zcw->7_-m$=bo|V&d5kivU+D*>?icBW>vL^c++RPk3;~UYk>2&RPo6 zYvSe6(cx`N_zc*M|M<~>Q>vJgb3|qRmK}g~x5~9A#&tJzf~XS##)%Mi{3&lP26kZ$ z2ACeqSJImAp7dX_rC=;>%YDlH-uYXpk?RdVU+8Y}Dec4~L8}c6&1%izwQ_$9P{<&> z%Mr%2O5^A5?qM#jN|!dZBHC!4XTQ8$RaG3zK-tUSXw8KBK3 z7I4QO-a6kRjfM5YI@YcW2&R|;m;e*KOn2##?^?afHR*(&yDF&qOA%kfR+gs;r(1|; zz}Os?wpLnKZzO9hyD9)Ed*5Mny{N29IFo+|8n>%1c7-4a+cHy^)h~Rr%V?0()Px_xS=(l9$Sj!(ee|i5IBTjs1;smqKjiXh5*; zuH{mjc{Suqp2=?3wFUg4>)+b5?bp_?JS@L0JQ{d)r+N1yH2uD-d#(?kwsmscBi4ch zZ`v_!`WNIaxiS;Sk}q|by_5v^6nxpz6wy}Q_%w{P)W9ODvliUaG-n>-#DlVcV-T8a z0hu@%52+2OwtA`YicYs{-ITf->r(q8Ni15yZM`7Wp!|&4iT^s5wf^kc0@z^rj$ECb zM@gyO;lvTvz+K+lBTHogvCgU5;3gN8TjJNBI51{MzsOwPsm<=%`r$tJ7fn86VTNCZ z6MZxWJJVKpIUn>TS%b0s*Z{(s!{cjJKPY(h#5@RdGumrGxM+_F2Pm8Jgaw*j|D*Zr zO1=nx7?qP|G0{Gc8<%l-b<289bsB#s80rf0Fem{5j8Epw_1K=Zi09-O_MjZ*$%1ilbB^=Fx%kBDb7Gg0S!_#E@| zTUCR;I_SP^^3)|6`=$Xd3ulL@@l@Q%-8}?x`$*=Ze`woLu`j!R$^yfj3pH*1?stkc zd?eD1^**MvrMrtXjlSTUsF&{9K;_U+Hn*p>+wE9Yb~=KJH&COE^){ zi_yM=ubwuV2|=NIS^`}9mgbV*;$-+^rKN29!gNwL)(nU>8`CnEWPWggU306>(KeJ{ zhiR@OvYN9g{EzOvRxR`ASgszjMgF3RSB4K59?VD5O_kaO*~yB()88H9@d~y?=VY{r z!>&03Z&QuFz4(Oi1#9`C6Q<%ys=I*mEbXvXpXPGccMB3^lSLAU)LYjpx18ToFkZdq z8~rgt`6o%CA-_;?I_dWt{n{mr3+d0@Mn6PIb}adL>@V)tOa7+)xyIEHScPM0=8MEr zDx@_fS1oEfBFKrfg);$FNi%Tn15=$gY)C{LGLTqSRm3tAR@~d28ym;evGO``cv#=Y z|5y>i8mE6l^X)snRp;K6<8y8Qweh;-N&y|EygMyygw?P8ppL_bO%I?8y+1r28mHs7 zQ7~>N(Fb6C{q-m5cC;raM);o|QxmD*E~-Ph{F9tdL`G1Ffl9d$;a0YL`#w!R3QqMw zX@z+25)T7g=i&u91bxyXtKhnlT%u*8EP9FVjZK+X>cBR4(3j)ql*T{m8}>7iFBr*a z5X4G9;gD^@-!&_vHTXM1f8)uuG#q}!ZJx8eWkFiI-BIjm)Vw;hQkV9$t7mf9`>;Hs z=;dVcv1Z=m4mO<5645@;I?{**tBz7gN#DJ&wnA6`UCiF$Y%bf`Jls?M@~wRFndSjg ziO7fHcg_NH;-){RBqcH#1D9f)2u+{ql3QAyo@Qk=lqonpgoYk?t08bs4Y*&5${`Wy z-{y;8*&a=e8m}Z?_6)j*Jx(Y_>H1J-cMI!x7a`()1Z&mhr!28k?OP3=?O87TqA)F?sG4884JLNuwyQzsGDX8( zslT<^ze!-JJ~pptaAi%S3`Mc?D#DY4=BD#Ai!`sQ#zM35GboD(4?v}l+7YIF){JSQOr*(Gcj|eB$1Eb$=CxU zRLyb2Z8;*|=}?~UY=7GkpA&*09$JG&K~RPIFOg|@6_AVcR6qT;7C>UVp(%BKE*vS; z=UI*wYP*+h$Lqo{%_Yr#(ca;T&6&8!5+G_}EgG`(>RPWA!{+mZzK-;r-A?HLw0WVn zUNcW`mRZivSw3igAml`6OMDbG!4-Okb8&e%w4Fxu1-7ki>&Gv9IE zM4WZ^x1C9U79BJ{;}rG} z9@Z00{nggzm@1&2rbCLTQ3Lng4v?+(6D^-rY2$;^1yA>(P&>)Q!6}Eoy}}BGJ+Zd~ z7%K(^ZPGMD;`dd#5(MsQT);CdAK_2I_b?@`7h&ib0kHa@6cnK|>Up3|Ytc*phvKTT zJG-<9vo2$gqxjA2ZvT5OYLBPOh(5S=xiy+WRC3PohuCtVmRV#*PCr_rCMLg+B|FLa zhq=`2Nb<*B=np^csi17(R&AKjz})<~j(d*L?g}_uybhkPvlpzA+DXQfNIPo+V?< zJ?8FPI7{l51r2)Nt1Y{JpmDF1l9%fFlN=y5N!h`Z@&v4p;6xSz$>tB&^2N*lxFqv3 z_=j&il5LTNgjMQ}pbmSXka;Q=XM+Puq7w=PS+?3GWe*%$_1P20h!aHCj`tz3OR^G3 zAN;78q<%Lzx84ew_?Glw#DvpX9dJ8B0VoTIueldL7kdaY#zw`8ZB=$#47v;J)9Gis+UvH&%H4%{J%d^A8BmELZY-3zKz{G#ySE_O^E~co?^H}?L&>M&x|nU`W2Sp zRPVn%-@WF#pH_l6IzEt06w%cc_)J_s&TTHCZx)<@GjG%4;A252ZhP#OC^~R6y}h-Q z%JHS>uS4PYM_>N2I4GKW+&`D*1(OcjcQWT14Da03ukdzf4CY^1xyP8vSa{kCuq%ie zPhoshC;u+Lh22A?1VFiOapeqBKk3p02~3ziwM(+WH)BEdeR2<&>V@kqIdWMSSEouF z$yUcdtb9jxS4HmGo$30A+BGy`4-y=P}A$c$LU)d&8;FK7L}-35V@hgpmn1#{o(s8&#UmiJOwmP1M5pSgxu4<{n{Ih3`Xhkr5H{dwzEu#BxEh)u&YK&*8nqd zc)Nz>2lNAYJ56cIoU%e{>W-WA1r0kim#=s?2W^=_@;Rudm!{Z0n)Xl57bh!%R(n*H zyot8FQcapW@okNgs3W8}R%Q30DE2F|0b+1}!?RARik^Tx!ZKU&zrOXrxPs}K^O#n^ zν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 R5(@r%2m-%o4M^xA{||#T6E6S& diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/doc/listeOIPFProfile.xlsx b/applications/hbbtvplayer/hbbtvbrowserplugin/doc/listeOIPFProfile.xlsx deleted file mode 100644 index b5302b4623e8f316ba467c83298135c1613038a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18967 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 QAb7w}J;0>o#eSase diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.pc.in b/applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.pc.in deleted file mode 100644 index d67b557..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ -plugindir=/usr/lib/mozilla/plugins/ - -Name: hbbtvbrowserplugin -Description: The Hbbtv BrowserPlugin (NPAPI) -Version:@PACKAGE_VERSION@ -Cflags: -I${includedir}/hbbtvbrowserplugin -Libs: -L${libdir} -L${plugindir} -lhbbtvbrowserplugin - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.vcproj b/applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.vcproj deleted file mode 100644 index c54579b..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/hbbtvbrowserplugin.vcproj +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/makefile.am b/applications/hbbtvplayer/hbbtvbrowserplugin/makefile.am deleted file mode 100644 index 585a151..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -SUBDIRS = src - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = hbbtvbrowserplugin.pc - - - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/makefile.old b/applications/hbbtvplayer/hbbtvbrowserplugin/makefile.old deleted file mode 100644 index cea09b8..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/makefile.old +++ /dev/null @@ -1,110 +0,0 @@ -############################################################################### -#### -#### MAKEFILE -#### -#### Copyright Telecom Paristech 2011 -#### -#### Author : Stanislas Selle -#### -############################################################################### - -############################################################################### -## Files and Path - -PLUGINDIR = /usr/lib/mozilla/plugins -INSTALL_INCLUDEDIR = /usr/local/include/hbbtvbrowserplugin -INSTALL_LIBDIR = /usr/local/lib -INSTALL_PKGDIR = /usr/lib/pkgconfig - -PKGFILE = hbbtvbrowserplugin.pc - -MAINTARGET = bin/libhbbtvbrowserplugin.so - -SRCDIR = src -HEADERSDIR = src - -OBJ = obj/hbbtvbrowserplugin.o\ - obj/oipfapplicationmanager.o\ - obj/applicationclass.o\ - obj/applicationprivatedataclass.o\ - obj/oipfconfiguration.o\ - obj/configurationclass.o\ - obj/oipfdownloadmanager.o\ - obj/oipfdownloadtrigger.o\ - obj/downloadclass.o\ - obj/downloadcollectionclass.o\ - obj/drmcontrolinfocollectionclass.o\ - obj/drmcontrolinformationclass.o\ - obj/videobroadcast.o\ - obj/keysetclass.o - -EXPORTHEADERS = hbbtvbrowserpluginapi.h - -#TESTURL = file:///home/selle/ressources/HbbTVapps/TPT/app1/index.html -TESTURL = http://aquila.enst.fr:8080/subwebsite/hbbtvtest/test0003/index.php -TESTLOG = /tmp/test-err.txt -############################################################################### -## Programs - -COMPILER = cc -DELETER = rm -f -BROWSERTEST = firefox - - -############################################################################### -## Options, Flags and LinkS - -CFLAGS = -Wall -DXP_UNIX=1 -DMOZ_X11=1 -fPIC -g - -INCLUDEFLAGS = -Isrc -LIBRARYFLAGS = - -FROMPKG = libxul - -PKGFLAGS = `pkg-config --cflags $(FROMPKG) ` -PKGLIBS = `pkg-config --libs $(FROMPKG) ` - -INCLUDEFLAGS += $(PKGFLAGS) -LIBRARYFLAGS += $(PKGLIBS) - -############################################################################### -## Rules - -all : $(MAINTARGET) - -$(MAINTARGET) : $(OBJ) - @echo "====> Compiling $(MAINTARGET)" - $(COMPILER) $(CFLAGS) $(LIBRARYFLAGS) -shared $(OBJ) -o $(MAINTARGET) - -obj/%.o: $(SRCDIR)/%.c $(HEADERSDIR)/%.h - @echo "====> Compiling $< " - $(COMPILER) $(CFLAGS) -c $< $(INCLUDEFLAGS) -o $@ - -test : all - $(BROWSERTEST) $(TESTURL) 2> $(TESTLOG); cat $(TESTLOG) - -install : all - @echo "====> Installing" - cp $(MAINTARGET) $(PLUGINDIR) - @if test -d $(INSTALL_INCLUDEDIR);\ - then echo " ===> $(INSTALL_INCLUDEDIR) existing already" ; \ - else mkdir $(INSTALL_INCLUDEDIR); fi; - cp $(HEADERSDIR)/$(EXPORTHEADERS) $(INSTALL_INCLUDEDIR) - cp $(PKGFILE) $(INSTALL_PKGDIR) - @echo "Done." - -uninstall : - @echo "====> Uninstalling" - $(DELETER) $(INSTALL_PKGDIR)/$(PKGFILE) $(INSTALL_INCLUDEDIR)/$(EXPORTHEADERS) $(INSTALL_INCLUDEDIR)/$(MAINTARGET) - if test -d $(INSTALL_INCLUDEDIR);\ - then rmdir $(INSTALL_INCLUDEDIR); fi; - -clean : - @echo "====> Cleaning" - @$(DELETER) $(OBJ) - @echo "Deleting objects" - @$(DELETER) $(MAINTARGET) - @echo "Deleting $(MAINTARGET)" - -############################################################################### -############################################################################### diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.cbp b/applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.cbp deleted file mode 100644 index 54b6c97..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.cbp +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.layout b/applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.layout deleted file mode 100644 index 5c17549..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/projectmanager/codeblocks/hbbtvbrowserplugin/hbbtvbrowserplugin.layout +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/releases/hbbtvbrowserplugin-0.01.tar.gz b/applications/hbbtvplayer/hbbtvbrowserplugin/releases/hbbtvbrowserplugin-0.01.tar.gz deleted file mode 100644 index c8595c8f094456f4202363a37b9a5e3c4c0bfafb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11234 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 v_APPLICATIONPropertyNames, kAPPLICATION_NUM_PROPERTY_IDENTIFIERS, v_APPLICATIONPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_APPLICATIONMethodNames, kAPPLICATION_NUM_METHOD_IDENTIFIERS, v_APPLICATIONMethodIdentifiers ); -} - -NPClass stAPPLICATIONclass; -NPClass* pAPPLICATIONclass = NULL; - -NPClass* fillAPPLICATIONpclass(void) -{ - TRACEINFO; - if (pAPPLICATIONclass == NULL) - { - stAPPLICATIONclass.allocate = APPLICATION_Allocate; - stAPPLICATIONclass.deallocate = APPLICATION_Deallocate; - stAPPLICATIONclass.invalidate = APPLICATION_Invalidate; - stAPPLICATIONclass.hasMethod = APPLICATION_HasMethod; - stAPPLICATIONclass.invoke = APPLICATION_Invoke; - stAPPLICATIONclass.invokeDefault = APPLICATION_InvokeDefault; - stAPPLICATIONclass.hasProperty = APPLICATION_HasProperty; - stAPPLICATIONclass.getProperty = APPLICATION_GetProperty; - stAPPLICATIONclass.setProperty = APPLICATION_SetProperty; - stAPPLICATIONclass.removeProperty = APPLICATION_RemoveProperty; - stAPPLICATIONclass.enumerate = APPLICATION_Enumerate; - pAPPLICATIONclass = &stAPPLICATIONclass; - } - - return pAPPLICATIONclass; -} - - -NPObject * APPLICATION_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - if (!v_bAPPLICATIONIdentifiersInitialized) - { - v_bAPPLICATIONIdentifiersInitialized = true; - APPLICATIONinitializeIdentifiers(); - } - - NPObj_Application* newapplication = (NPObj_Application*)MEMALLOC(sizeof(NPObj_Application)); - fprintf(stderr, "\t%s : Allocation at \x1b[%i;3%im%p\n\x1b[0m",__FUNCTION__, 1, 1, newapplication ); - newapplication->npp = npp; - newapplication->visible = true; - newapplication->privateData = sBrowserFuncs->createobject(npp, fillAPPPRIVDATApclass()); - fprintf(stderr, "\t%s : Create privateData property at \x1b[%i;3%im%p\n\x1b[0m ",__FUNCTION__, 1, 1, newapplication->privateData ); - newapplication->visible = true; - return (NPObject*)newapplication; -} - - void APPLICATION_Deallocate(NPObject* obj) -{ - TRACEINFO; - NPObj_Application* applicationobj = (NPObj_Application*)obj; - sBrowserFuncs->releaseobject(applicationobj->privateData); - MEMFREE(applicationobj); - return; -} - - void APPLICATION_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - - bool APPLICATION_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kAPPLICATION_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_APPLICATIONMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool APPLICATION_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - if (name == v_APPLICATIONMethodIdentifiers[kAPPLICATION_ID_METHOD_CREATEAPPLICATION]) - { - APPLICATION_Invoke_CreateApplication(obj, args, argCount); - fctresult = true; - } - else if (name == v_APPLICATIONMethodIdentifiers[kAPPLICATION_ID_METHOD_DESTROYAPPLICATION]) - { - APPLICATION_Invoke_DestroyApplication(obj, args, argCount); - fctresult = true; - } - else if (name == v_APPLICATIONMethodIdentifiers[kAPPLICATION_ID_METHOD_HIDE]) - { - APPLICATION_Invoke_Hide(obj, args, argCount); - fctresult = true; - } - else if (name == v_APPLICATIONMethodIdentifiers[kAPPLICATION_ID_METHOD_SHOW]) - { - APPLICATION_Invoke_Show(obj, args, argCount); - fctresult = true; - } - else - { - fctresult = false; - } - return fctresult; -} - - bool APPLICATION_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - - bool APPLICATION_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kAPPLICATION_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_APPLICATIONPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool APPLICATION_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - - bool fctresult = false; - NPObj_Application* AppliObj = (NPObj_Application*)obj; - - if (name == v_APPLICATIONPropertyIdentifiers[kAPPLICATION_ID_PROPERTY_PRIVATEDATA]) - { - sBrowserFuncs->retainobject(AppliObj->privateData); - OBJECT_TO_NPVARIANT(AppliObj->privateData, *result); - fctresult = true; - } - else if (name == v_APPLICATIONPropertyIdentifiers[kAPPLICATION_ID_PROPERTY_VISIBLE]) - { - BOOLEAN_TO_NPVARIANT(AppliObj->visible, *result); - fctresult = true; - } - else - - return fctresult; -} - - bool APPLICATION_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - - bool APPLICATION_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - - bool APPLICATION_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - -/** implementation **/ - -void APPLICATION_Invoke_CreateApplication(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} - -void APPLICATION_Invoke_DestroyApplication(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} - -void APPLICATION_Invoke_Show(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NPObj_Application* AppliObj = (NPObj_Application*)obj; - OnAPPLICATION_Show(); - AppliObj->visible = true; - NOTIMPLEMENTED; -} - -void APPLICATION_Invoke_Hide(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - - NPObj_Application* AppliObj = (NPObj_Application*)obj; - OnAPPLICATION_Hide(); - AppliObj->visible = false; - NOTIMPLEMENTED; -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationclass.h deleted file mode 100644 index 967c1f5..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationclass.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __APPLICATIONCLASS_H__ -#define __APPLICATIONCLASS_H__ - -#include "hbbtvbrowserplugin.h" - -typedef struct -{ - NPObject header; - NPP npp; - - NPBool visible; - NPObject* privateData; - -} NPObj_Application; - - -NPClass* fillAPPLICATIONpclass(void); - -NPObject * APPLICATION_Allocate(NPP npp, NPClass *aClass); -void APPLICATION_Deallocate(NPObject *obj); -void APPLICATION_Invalidate(NPObject *obj); -bool APPLICATION_HasMethod(NPObject *obj, NPIdentifier name); -bool APPLICATION_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool APPLICATION_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool APPLICATION_HasProperty(NPObject *obj, NPIdentifier name); -bool APPLICATION_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool APPLICATION_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool APPLICATION_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool APPLICATION_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - - - -void APPLICATION_Invoke_CreateApplication(NPObject* obj,const NPVariant* args, uint32_t argCount); -void APPLICATION_Invoke_DestroyApplication(NPObject* obj,const NPVariant* args, uint32_t argCount); -void APPLICATION_Invoke_Show(NPObject* obj,const NPVariant* args, uint32_t argCount); -void APPLICATION_Invoke_Hide(NPObject* obj,const NPVariant* args, uint32_t argCount); - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.c deleted file mode 100644 index fdb8443..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "applicationprivatedataclass.h" - -#define kAPPPRIVDATA_ID_PROPERTY_KEYSET 0 -#define kAPPPRIVDATA_ID_PROPERTY_CURRENTCHANNEL 1 -#define kAPPPRIVDATA_NUM_PROPERTY_IDENTIFIERS 2 - -#define kAPPPRIVDATA_ID_METHOD_GETMEMFREE 0 -#define kAPPPRIVDATA_NUM_METHOD_IDENTIFIERS 1 - - - -bool v_bAPPPRIVDATAIdentifiersInitialized = false; - -NPIdentifier v_APPPRIVDATAPropertyIdentifiers[kAPPPRIVDATA_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_APPPRIVDATAPropertyNames[kAPPPRIVDATA_NUM_PROPERTY_IDENTIFIERS] = { - "keyset", - "currentChannel" - }; - -NPIdentifier v_APPPRIVDATAMethodIdentifiers[kAPPPRIVDATA_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_APPPRIVDATAMethodNames[kAPPPRIVDATA_NUM_METHOD_IDENTIFIERS] = { - "getMEMFREE" - }; - -static void APPPRIVDATAinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_APPPRIVDATAPropertyNames, kAPPPRIVDATA_NUM_PROPERTY_IDENTIFIERS, v_APPPRIVDATAPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_APPPRIVDATAMethodNames, kAPPPRIVDATA_NUM_METHOD_IDENTIFIERS, v_APPPRIVDATAMethodIdentifiers ); -} - - -NPClass stAPPPRIVDATAclass; -NPClass* pAPPPRIVDATAclass = NULL; - -NPClass* fillAPPPRIVDATApclass(void) -{ - TRACEINFO; - if (pAPPPRIVDATAclass == NULL) - { - stAPPPRIVDATAclass.allocate = APPPRIVDATA_Allocate; - stAPPPRIVDATAclass.deallocate = APPPRIVDATA_Deallocate; - stAPPPRIVDATAclass.invalidate = APPPRIVDATA_Invalidate; - stAPPPRIVDATAclass.hasMethod = APPPRIVDATA_HasMethod; - stAPPPRIVDATAclass.invoke = APPPRIVDATA_Invoke; - stAPPPRIVDATAclass.invokeDefault = APPPRIVDATA_InvokeDefault; - stAPPPRIVDATAclass.hasProperty = APPPRIVDATA_HasProperty; - stAPPPRIVDATAclass.getProperty = APPPRIVDATA_GetProperty; - stAPPPRIVDATAclass.setProperty = APPPRIVDATA_SetProperty; - stAPPPRIVDATAclass.removeProperty = APPPRIVDATA_RemoveProperty; - stAPPPRIVDATAclass.enumerate = APPPRIVDATA_Enumerate; - pAPPPRIVDATAclass = &stAPPPRIVDATAclass; - } - - return pAPPPRIVDATAclass; -} - - -NPObject * APPPRIVDATA_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - NPObject* result; - - - if (!v_bAPPPRIVDATAIdentifiersInitialized) - { - v_bAPPPRIVDATAIdentifiersInitialized = true; - APPPRIVDATAinitializeIdentifiers(); - } - - NPObj_AppPrivData* newappprivdata = (NPObj_AppPrivData*)MEMALLOC(sizeof(NPObj_AppPrivData)); - fprintf(stderr, "\t%s : Allocation at \x1b[%i;3%im%p\n\x1b[0m",__FUNCTION__, 1, 1, newappprivdata); - newappprivdata->npp = npp; - newappprivdata->keyset = sBrowserFuncs->createobject(npp, fillKEYSETpclass()); - fprintf(stderr, "\t%s : Create keyset property at \x1b[%i;3%im%p\n\x1b[0m",__FUNCTION__, 1, 1, newappprivdata->keyset ); - result = (NPObject*)newappprivdata; - return result; -} - - -void APPPRIVDATA_Deallocate(NPObject* obj) -{ - TRACEINFO; - NPObj_AppPrivData* appprivdataobj = (NPObj_AppPrivData*)obj; - sBrowserFuncs->releaseobject(appprivdataobj->keyset); - MEMFREE(appprivdataobj); - return; -} - -void APPPRIVDATA_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - -bool APPPRIVDATA_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kAPPPRIVDATA_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_APPPRIVDATAMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool APPPRIVDATA_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - if (name == v_APPPRIVDATAMethodIdentifiers[kAPPPRIVDATA_ID_METHOD_GETMEMFREE]) - { - APPPRIVDATA_Invoke_GetFreeMen(obj, args, argCount); - fctresult = true; - } - else - { - fctresult = false; - } - return fctresult; -} - -bool APPPRIVDATA_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - -bool APPPRIVDATA_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kAPPPRIVDATA_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_APPPRIVDATAPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - - return result; -} - -bool APPPRIVDATA_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - - bool fctresult = false; - NPObj_AppPrivData* AppPrivDataObj = (NPObj_AppPrivData*)obj; - if (!strcmp(sBrowserFuncs->utf8fromidentifier(name), v_APPPRIVDATAPropertyNames[kAPPPRIVDATA_ID_PROPERTY_KEYSET])) - { - sBrowserFuncs->retainobject(AppPrivDataObj->keyset); - OBJECT_TO_NPVARIANT(AppPrivDataObj->keyset, *result); - - fctresult = true; - } - else - - return fctresult; -} - -bool APPPRIVDATA_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - bool fctresult = false; - return fctresult; -} - -bool APPPRIVDATA_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - -bool APPPRIVDATA_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - - -/** implementation **/ -void APPPRIVDATA_Invoke_GetFreeMen(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.h deleted file mode 100644 index fc8a867..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/applicationprivatedataclass.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __APPLICATIONPRIVATEDATACLASS_H__ -#define __APPLICATIONPRIVATEDATACLASS_H__ - -#include "keysetclass.h" -#include "hbbtvbrowserplugin.h" - -typedef struct -{ - NPObject header; - NPP npp; - - NPObject* keyset; - NPObject* currentChannel; -} NPObj_AppPrivData; - -NPClass* fillAPPPRIVDATApclass(void); - -NPObject * APPPRIVDATA_Allocate(NPP npp, NPClass *aClass); -void APPPRIVDATA_Deallocate(NPObject *obj); -void APPPRIVDATA_Invalidate(NPObject *obj); -bool APPPRIVDATA_HasMethod(NPObject *obj, NPIdentifier name); -bool APPPRIVDATA_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool APPPRIVDATA_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool APPPRIVDATA_HasProperty(NPObject *obj, NPIdentifier name); -bool APPPRIVDATA_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool APPPRIVDATA_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool APPPRIVDATA_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool APPPRIVDATA_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - - -void APPPRIVDATA_Invoke_GetFreeMen(NPObject* obj,const NPVariant* args, uint32_t argCount); - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.c deleted file mode 100644 index b4f14ff..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Stanislas Selle - * - */ -#include "configurationclass.h" - - -#define kCONFIGURATION_ID_PROPERTY_PREFERREDAUDIOLANGUAGE 0 -#define kCONFIGURATION_ID_PROPERTY_PREFERREDSUBTITLELANGUAGE 1 -#define kCONFIGURATION_ID_PROPERTY_COUNTRYID 2 -#define kCONFIGURATION_NUM_PROPERTY_IDENTIFIERS 3 - -#define kCONFIGURATION_NUM_METHOD_IDENTIFIERS 0 - - - -bool v_bCONFIGURATIONIdentifiersInitialized = false; - -NPIdentifier v_CONFIGURATIONPropertyIdentifiers[kCONFIGURATION_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_CONFIGURATIONPropertyNames[kCONFIGURATION_NUM_PROPERTY_IDENTIFIERS] = { - "preferredAudioLanguage", - "preferredSubtitleLanguage", - "countryId" - }; - -NPIdentifier v_CONFIGURATIONMethodIdentifiers[kCONFIGURATION_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_CONFIGURATIONMethodNames[kCONFIGURATION_NUM_METHOD_IDENTIFIERS] = {}; - -static void CONFIGURATIONinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_CONFIGURATIONPropertyNames, kCONFIGURATION_NUM_PROPERTY_IDENTIFIERS, v_CONFIGURATIONPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_CONFIGURATIONMethodNames, kCONFIGURATION_NUM_METHOD_IDENTIFIERS, v_CONFIGURATIONMethodIdentifiers ); -} - - -NPClass stCONFIGURATIONclass; -NPClass* pCONFIGURATIONclass = NULL; - -NPClass* fillCONFIGURATIONpclass(void) -{ - TRACEINFO; - if (pCONFIGURATIONclass == NULL) - { - stCONFIGURATIONclass.allocate = CONFIGURATION_Allocate; - stCONFIGURATIONclass.deallocate = CONFIGURATION_Deallocate; - stCONFIGURATIONclass.invalidate = CONFIGURATION_Invalidate; - stCONFIGURATIONclass.hasMethod = CONFIGURATION_HasMethod; - stCONFIGURATIONclass.invoke = CONFIGURATION_Invoke; - stCONFIGURATIONclass.invokeDefault = CONFIGURATION_InvokeDefault; - stCONFIGURATIONclass.hasProperty = CONFIGURATION_HasProperty; - stCONFIGURATIONclass.getProperty = CONFIGURATION_GetProperty; - stCONFIGURATIONclass.setProperty = CONFIGURATION_SetProperty; - stCONFIGURATIONclass.removeProperty = CONFIGURATION_RemoveProperty; - stCONFIGURATIONclass.enumerate = CONFIGURATION_Enumerate; - pCONFIGURATIONclass = &stCONFIGURATIONclass; - } - - return pCONFIGURATIONclass; -} - - -NPObject * CONFIGURATION_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - if (!v_bCONFIGURATIONIdentifiersInitialized) - { - v_bCONFIGURATIONIdentifiersInitialized = true; - CONFIGURATIONinitializeIdentifiers(); - } - NPObject* newconfiguration = NULL; - - newconfiguration = (NPObject *)MEMALLOC(sizeof(NPObject)); - - return newconfiguration; -} - - -void CONFIGURATION_Deallocate(NPObject* obj) -{ - TRACEINFO; - MEMFREE(obj); - return; -} - -void CONFIGURATION_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - -bool CONFIGURATION_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kCONFIGURATION_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_CONFIGURATIONMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool CONFIGURATION_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - return true; -} - -bool CONFIGURATION_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - -bool CONFIGURATION_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kCONFIGURATION_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_CONFIGURATIONPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - - return result; -} - -bool CONFIGURATION_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - return true; -} - -bool CONFIGURATION_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - -bool CONFIGURATION_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - -bool CONFIGURATION_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.h deleted file mode 100644 index ddba67b..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/configurationclass.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __CONFIGURATIONCLASS_H__ -#define __CONFIGURATIONCLASS_H__ - -#include "hbbtvbrowserplugin.h" - - -NPClass* fillCONFIGURATIONpclass(void); - -NPObject * CONFIGURATION_Allocate(NPP npp, NPClass *aClass); -void CONFIGURATION_Deallocate(NPObject *obj); -void CONFIGURATION_Invalidate(NPObject *obj); -bool CONFIGURATION_HasMethod(NPObject *obj, NPIdentifier name); -bool CONFIGURATION_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool CONFIGURATION_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool CONFIGURATION_HasProperty(NPObject *obj, NPIdentifier name); -bool CONFIGURATION_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool CONFIGURATION_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool CONFIGURATION_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool CONFIGURATION_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.c deleted file mode 100644 index 6cfb967..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.c +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Stanislas Selle - * - */ -#include "downloadclass.h" - -#define kDOWNLOAD_ID_PROPERTY_TOTALIZE 0 -#define kDOWNLOAD_ID_PROPERTY_STATE 1 -#define kDOWNLOAD_ID_PROPERTY_AMOUNTDOWNLOADED 2 -#define kDOWNLOAD_ID_PROPERTY_NAME 3 -#define kDOWNLOAD_ID_PROPERTY_ID 4 -#define kDOWNLOAD_ID_PROPERTY_CONTENTURL 5 -#define kDOWNLOAD_ID_PROPERTY_DESCRIPTION 6 -#define kDOWNLOAD_ID_PROPERTY_PARENTALRATINGS 7 -#define kDOWNLOAD_ID_PROPERTY_DRMCONTROL 8 -#define kDOWNLOAD_ID_PROPERTY_STARTTIME 9 -#define kDOWNLOAD_ID_PROPERTY_TIMEELAPSED 10 -#define kDOWNLOAD_ID_PROPERTY_TIMEREMAINING 11 -#define kDOWNLOAD_ID_PROPERTY_TRANSFERTYPE 12 -#define kDOWNLOAD_ID_PROPERTY_ORIGINSITE 13 -#define kDOWNLOAD_ID_PROPERTY_ORIGINSITENAME 14 -#define kDOWNLOAD_ID_PROPERTY_CONTENTID 15 -#define kDOWNLOAD_ID_PROPERTY_ICONURL 16 -#define kDOWNLOAD_NUM_PROPERTY_IDENTIFIERS 17 - - -#define kDOWNLOAD_NUM_METHOD_IDENTIFIERS 0 - - -bool v_bDOWNLOADIdentifiersInitialized = false; - -NPIdentifier v_DOWNLOADPropertyIdentifiers[kDOWNLOAD_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_DOWNLOADPropertyNames[kDOWNLOAD_NUM_PROPERTY_IDENTIFIERS] = { - "totalize", - "state", - "amountDownloaded", - "name", - "id", - "contentURL", - "description", - "parentalRatings", - "drmControl", - "startTime", - "timeElapsed", - "timeRemaining", - "transferType", - "originSite", - "originSiteName", - "contentID", - "iconURL" - }; - -NPIdentifier v_DOWNLOADMethodIdentifiers[kDOWNLOAD_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_DOWNLOADMethodNames[kDOWNLOAD_NUM_METHOD_IDENTIFIERS] = { -}; - - -static void DOWNLOADinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_DOWNLOADPropertyNames, kDOWNLOAD_NUM_PROPERTY_IDENTIFIERS, v_DOWNLOADPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_DOWNLOADMethodNames, kDOWNLOAD_NUM_METHOD_IDENTIFIERS, v_DOWNLOADMethodIdentifiers ); -} - -NPClass stDOWNLOADclass; -NPClass* pDOWNLOADclass = NULL; - -NPClass* fillDOWNLOADpclass(void) -{ - TRACEINFO; - if (pDOWNLOADclass == NULL) - { - stDOWNLOADclass.allocate = DOWNLOAD_Allocate; - stDOWNLOADclass.deallocate = DOWNLOAD_Deallocate; - stDOWNLOADclass.invalidate = DOWNLOAD_Invalidate; - stDOWNLOADclass.hasMethod = DOWNLOAD_HasMethod; - stDOWNLOADclass.invoke = DOWNLOAD_Invoke; - stDOWNLOADclass.invokeDefault = DOWNLOAD_InvokeDefault; - stDOWNLOADclass.hasProperty = DOWNLOAD_HasProperty; - stDOWNLOADclass.getProperty = DOWNLOAD_GetProperty; - stDOWNLOADclass.setProperty = DOWNLOAD_SetProperty; - stDOWNLOADclass.removeProperty = DOWNLOAD_RemoveProperty; - stDOWNLOADclass.enumerate = DOWNLOAD_Enumerate; - pDOWNLOADclass = &stDOWNLOADclass; - } - - return pDOWNLOADclass; -} - - -NPObject * DOWNLOAD_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - - if (!v_bDOWNLOADIdentifiersInitialized) - { - v_bDOWNLOADIdentifiersInitialized = true; - DOWNLOADinitializeIdentifiers(); - } - - NPObject* newdownload = (NPObject *)MEMALLOC(sizeof(NPObject)); - - return newdownload; -} - - void DOWNLOAD_Deallocate(NPObject* obj) -{ - TRACEINFO; - MEMFREE(obj); - return; -} - - void DOWNLOAD_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - - bool DOWNLOAD_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kDOWNLOAD_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_DOWNLOADMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool DOWNLOAD_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - return true; -} - - bool DOWNLOAD_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - - bool DOWNLOAD_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kDOWNLOAD_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_DOWNLOADPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - - bool DOWNLOAD_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - return true; -} - - bool DOWNLOAD_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - - bool DOWNLOAD_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - - bool DOWNLOAD_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.h deleted file mode 100644 index a7e5673..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadclass.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __DOWNLOADCLASS_H__ -#define __DOWNLOADCLASS_H__ - -#include "hbbtvbrowserplugin.h" - -NPClass* fillDOWNLOADpclass(void); - -NPObject * DOWNLOAD_Allocate(NPP npp, NPClass *aClass); -void DOWNLOAD_Deallocate(NPObject *obj); -void DOWNLOAD_Invalidate(NPObject *obj); -bool DOWNLOAD_HasMethod(NPObject *obj, NPIdentifier name); -bool DOWNLOAD_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool DOWNLOAD_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool DOWNLOAD_HasProperty(NPObject *obj, NPIdentifier name); -bool DOWNLOAD_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool DOWNLOAD_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool DOWNLOAD_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool DOWNLOAD_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.c deleted file mode 100644 index 40524f6..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "downloadcollectionclass.h" - - -#define kDWLDCOLLECTION_ID_PROPERTY_LENGH 0 -#define kDWLDCOLLECTION_NUM_PROPERTY_IDENTIFIERS 1 - -#define kDWLDCOLLECTION_ID_METHOD_ITEM 0 -#define kDWLDCOLLECTION_NUM_METHOD_IDENTIFIERS 1 - -bool v_bDWLDCOLLECTIONIdentifiersInitialized = false; - -NPIdentifier v_DWLDCOLLECTIONPropertyIdentifiers[kDWLDCOLLECTION_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_DWLDCOLLECTIONPropertyNames[kDWLDCOLLECTION_NUM_PROPERTY_IDENTIFIERS] = { - "lengh" - }; - -NPIdentifier v_DWLDCOLLECTIONMethodIdentifiers[kDWLDCOLLECTION_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_DWLDCOLLECTIONMethodNames[kDWLDCOLLECTION_NUM_METHOD_IDENTIFIERS] = { - "item" - }; - -static void DWLDCOLLECTIONinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_DWLDCOLLECTIONPropertyNames, kDWLDCOLLECTION_NUM_PROPERTY_IDENTIFIERS, v_DWLDCOLLECTIONPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_DWLDCOLLECTIONMethodNames, kDWLDCOLLECTION_NUM_METHOD_IDENTIFIERS, v_DWLDCOLLECTIONMethodIdentifiers ); -} - - -NPClass stDWLDCOLLECTIONclass; -NPClass* pDWLDCOLLECTIONclass = NULL; - -NPClass* fillDWLDCOLLECTIONpclass(void) -{ - TRACEINFO; - if (pDWLDCOLLECTIONclass == NULL) - { - stDWLDCOLLECTIONclass.allocate = DWLDCOLLECTION_Allocate; - stDWLDCOLLECTIONclass.deallocate = DWLDCOLLECTION_Deallocate; - stDWLDCOLLECTIONclass.invalidate = DWLDCOLLECTION_Invalidate; - stDWLDCOLLECTIONclass.hasMethod = DWLDCOLLECTION_HasMethod; - stDWLDCOLLECTIONclass.invoke = DWLDCOLLECTION_Invoke; - stDWLDCOLLECTIONclass.invokeDefault = DWLDCOLLECTION_InvokeDefault; - stDWLDCOLLECTIONclass.hasProperty = DWLDCOLLECTION_HasProperty; - stDWLDCOLLECTIONclass.getProperty = DWLDCOLLECTION_GetProperty; - stDWLDCOLLECTIONclass.setProperty = DWLDCOLLECTION_SetProperty; - stDWLDCOLLECTIONclass.removeProperty = DWLDCOLLECTION_RemoveProperty; - stDWLDCOLLECTIONclass.enumerate = DWLDCOLLECTION_Enumerate; - pDWLDCOLLECTIONclass = &stDWLDCOLLECTIONclass; - } - - return pDWLDCOLLECTIONclass; -} - - -NPObject * DWLDCOLLECTION_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - if (!v_bDWLDCOLLECTIONIdentifiersInitialized) - { - v_bDWLDCOLLECTIONIdentifiersInitialized = true; - DWLDCOLLECTIONinitializeIdentifiers(); - } - - NPObject* newdwldcollection = (NPObject *)MEMALLOC(sizeof(NPObject)); - - return newdwldcollection; -} - - -void DWLDCOLLECTION_Deallocate(NPObject* obj) -{ - TRACEINFO; - MEMFREE(obj); - return; -} - -void DWLDCOLLECTION_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - -bool DWLDCOLLECTION_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kDWLDCOLLECTION_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_DWLDCOLLECTIONMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool DWLDCOLLECTION_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - if (name == v_DWLDCOLLECTIONMethodIdentifiers[kDWLDCOLLECTION_ID_METHOD_ITEM ]) - { - DWLDCOLLECTION_Invoke_Item(obj, args, argCount); - fctresult = true; - } - else - { - fctresult = false; - } - return fctresult; - -} - -bool DWLDCOLLECTION_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - -bool DWLDCOLLECTION_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kDWLDCOLLECTION_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_DWLDCOLLECTIONPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - - return result; -} - -bool DWLDCOLLECTION_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - return true; -} - -bool DWLDCOLLECTION_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - -bool DWLDCOLLECTION_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - -bool DWLDCOLLECTION_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - -/** implementation **/ -void DWLDCOLLECTION_Invoke_Item(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.h deleted file mode 100644 index c178d1b..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/downloadcollectionclass.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __DWLDCOLLECTIONCOLLECTIONCLASS_H__ -#define __DWLDCOLLECTIONCOLLECTIONCLASS_H__ - -#include "hbbtvbrowserplugin.h" - - -NPClass* fillDWLDCOLLECTIONpclass(void); - -NPObject * DWLDCOLLECTION_Allocate(NPP npp, NPClass *aClass); -void DWLDCOLLECTION_Deallocate(NPObject *obj); -void DWLDCOLLECTION_Invalidate(NPObject *obj); -bool DWLDCOLLECTION_HasMethod(NPObject *obj, NPIdentifier name); -bool DWLDCOLLECTION_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool DWLDCOLLECTION_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool DWLDCOLLECTION_HasProperty(NPObject *obj, NPIdentifier name); -bool DWLDCOLLECTION_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool DWLDCOLLECTION_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool DWLDCOLLECTION_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool DWLDCOLLECTION_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - -void DWLDCOLLECTION_Invoke_Item(NPObject* obj,const NPVariant* args, uint32_t argCount); -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.c deleted file mode 100644 index 0dc0bd0..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "drmcontrolinfocollectionclass.h" diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.h deleted file mode 100644 index cb20d97..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinfocollectionclass.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __DRMCONTROLINFOCOLLECTIONCLASS_H__ -#define __DRMCONTROLINFOCOLLECTIONCLASS_H__ - -#include "hbbtvbrowserplugin.h" - - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.c deleted file mode 100644 index 0dc0bd0..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "drmcontrolinfocollectionclass.h" diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.h deleted file mode 100644 index b9a2121..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/drmcontrolinformationclass.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __DRMCONTROLINFORMATIONCLASS_H__ -#define __DRMCONTROLINFORMATIONCLASS_H__ - -#include "hbbtvbrowserplugin.h" - - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.c deleted file mode 100644 index 82c6425..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.c +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -/* -** HbbTV Plugin PC -*/ - - -#include -#ifdef XP_UNIX -#include -#include -#endif -#include - -#include "hbbtvbrowserplugin.h" -#include "oipfapplicationmanager.h" -#include "oipfconfiguration.h" -#include "videobroadcast.h" - -#define MIMETYPEDESCRIPTION "application/hbbtvbrowserplugin::Hbbtv Browser Plugin;" \ - "video/broadcast::Video Broadcast;"\ - "application/oipfapplicationmanager::Oipf Application Manager;"\ - "application/oipfconfiguration::Oipf Configuration;" - - -#define PLUGIN_NAME "hbbtvbrowserplugin" -#define PLUGIN_DESCRIPTION "HbbTV browser plugin " -#define PLUGIN_VERSION "0.20110704" - - - -static void -fillPluginFunctionTable(NPPluginFuncs* pFuncs) -{ - TRACEINFO; - pFuncs->version = 11; - pFuncs->size = sizeof(*pFuncs); - pFuncs->newp = OIPF_NPP_New; - pFuncs->destroy = OIPF_NPP_Destroy; - pFuncs->setwindow = OIPF_NPP_SetWindow; - pFuncs->newstream = OIPF_NPP_NewStream; -// pFuncs->destroystream = NPP_DestroyStream; -// pFuncs->asfile = NPP_StreamAsFile; -// pFuncs->writeready = NPP_WriteReady; -// pFuncs->write = NPP_Write; -// pFuncs->print = NPP_Print; - pFuncs->event = OIPF_NPP_HandleEvent; -// pFuncs->urlnotify = NPP_URLNotify; - pFuncs->getvalue = OIPF_NPP_GetValue; - pFuncs->setvalue = OIPF_NPP_SetValue; -} - -char* booltostr(bool data) -{ - char *result; - if (data) - result = "true"; - else - result = "false"; - return result; -} - -/* - void drawWindow (HBBTVPluginData* instanceData, GdkDrawable* gdkWindow) -{ - TRACEINFO; - NPWindow window = *(instanceData->window); - int x = window.x; - int y = window.y; - int width = window.width; - int height = window.height; - fprintf(stderr,"%p, x = %i y=%i, width = %i height = %i\n",gdkWindow, x ,y,width,height); - - NPP npp = instanceData->npp; - if (!npp) - return; - - const char* uaString = "DemoPlug"; // sBrowserFuncs->uagent(npp); - if (!uaString) - return; - - GdkGC* gdkContext = gdk_gc_new(gdkWindow); - - // draw a grey background for the plugin frame - GdkColor grey; - grey.red = 24000; grey.blue = 24000; grey.green = 24000; - gdk_gc_set_rgb_fg_color(gdkContext, &grey); - gdk_draw_rectangle(gdkWindow, gdkContext, TRUE, x, y, width, height); - - // draw a 3-pixel-thick black frame around the plugin - GdkColor black; - black.red = black.green = black.blue = 0; - gdk_gc_set_rgb_fg_color(gdkContext, &black); - gdk_gc_set_line_attributes(gdkContext, 3, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); - gdk_draw_rectangle(gdkWindow, gdkContext, FALSE, x + 1, y + 1, - width - 3, height - 3); - - // paint the UA string - PangoContext* pangoContext = gdk_pango_context_get(); - PangoLayout* pangoTextLayout = pango_layout_new(pangoContext); - pango_layout_set_width(pangoTextLayout, (width - 10) * PANGO_SCALE); - pango_layout_set_text(pangoTextLayout, uaString, -1); - gdk_draw_layout(gdkWindow, gdkContext, x + 5, y + 5, pangoTextLayout); - g_object_unref(pangoTextLayout); - - g_object_unref(gdkContext); -} -*/ - - -NPError NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs) -{ - TRACEINFO; - - sBrowserFuncs = bFuncs; - - fillPluginFunctionTable(pFuncs); - - return NPERR_NO_ERROR; -} - -char* NP_GetPluginVersion() -{ - TRACEINFO; - return PLUGIN_VERSION; -} - -NPError NP_Shutdown() -{ - TRACEINFO; - return NPERR_NO_ERROR; -} - -char* NP_GetMIMEDescription() -{ - TRACEINFO; - return MIMETYPEDESCRIPTION; -} - - -NPError NP_GetValue(void *instance, NPPVariable variable, void *value) -{ - TRACEINFO; - switch (variable) - { - case NPPVpluginNameString : - *(char**)value = PLUGIN_NAME; - break; - case NPPVpluginDescriptionString : - *(char**)value = PLUGIN_DESCRIPTION; - break; - default : - break; - } - return NPERR_NO_ERROR; -} - -NPError OIPF_NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved) -{ - TRACEINFO; - int i = 0; - - NPBool browserSupportsWindowless = false; - sBrowserFuncs->getvalue(instance, NPNVSupportsWindowless, &browserSupportsWindowless); - if (!browserSupportsWindowless) - { - return NPERR_GENERIC_ERROR; - } - sBrowserFuncs->setvalue(instance, NPPVpluginWindowBool, (void*)false); - sBrowserFuncs->setvalue(instance, NPPVpluginTransparentBool, (void*)false); - - - NPObject* obj; - for(i = 0 ; ipdata = (HBBTVPluginData*)MEMALLOC(sizeof(HBBTVPluginData)); - HBBTVPluginData* pdata = ((HBBTVPluginData*)instance->pdata); - - if (strcmp(argv[i], "application/oipfApplicationManager") == 0) - { - obj = sBrowserFuncs->createobject(instance, fillOAMpclass()); - } - else if (strcmp(argv[i], "application/oipfConfiguration") == 0) - { - obj = sBrowserFuncs->createobject(instance, fillOCFGpclass()); - } - else if (strcmp(argv[i], "video/broadcast") == 0) - { - obj = sBrowserFuncs->createobject(instance, fillVIDBRCpclass()); - }else{ - - obj = NULL; - } - pdata->type = (char*)MEMALLOC(strlen(argv[i])); - strcpy(pdata->type, argv[i] ); - pdata->obj = obj; - pdata->npp = instance; - - }else{ - - obj = NULL; - } - } - - return NPERR_NO_ERROR; -} - -NPError OIPF_NPP_Destroy(NPP instance, NPSavedData **save) -{ - TRACEINFO; - HBBTVPluginData* pdata = (HBBTVPluginData*)instance->pdata; - if (pdata) - { - sBrowserFuncs->releaseobject(pdata->obj); - MEMFREE(pdata->type); - MEMFREE(pdata); - } - return NPERR_NO_ERROR; -} - - -NPError OIPF_NPP_SetWindow(NPP instance, NPWindow *window) -{ - TRACEINFO; - - - - HBBTVPluginData* pdata = (HBBTVPluginData*)instance->pdata; - if(pdata) - { - pdata->window = window; - if (pdata->type) - { - if (strcmp(pdata->type, "video/broadcast") == 0) - { - fprintf(stderr, "%s found \n", pdata->type); - if (pdata->obj) - { - NPObj_VidBrc* vidbrcobj = (NPObj_VidBrc*)pdata->obj; - if (!(vidbrcobj->fullscreen)) - { - OnNoFullscreenSetWindow(pdata->window->x, - pdata->window->y, - pdata->window->width, - pdata->window->height); - } - } - } - } - /*fprintf(stderr, "\tWindow found : %p\n", window); - fprintf(stderr, "\twindow = %p ws_info %p \n\tx = %d, y= %d\n\tclipRect.left = %d clipRect.top= %d\n\twidth=%d, height= %d\n", - pdata->window->window, - pdata->window->ws_info, - pdata->window->x, - pdata->window->y, - pdata->window->clipRect.left, - pdata->window->clipRect.top, - pdata->window->width, - pdata->window->height);*/ - } - - return NPERR_NO_ERROR; -} - -NPError OIPF_NPP_HandleEvent(NPP instance, void* event) -{ - //TRACEINFO; // frequent event, avoid over log... - - XEvent *nativeEvent = (XEvent*)event; - if (nativeEvent->type == GraphicsExpose) - { - XGraphicsExposeEvent *expose = &nativeEvent->xgraphicsexpose; - GC gc = XCreateGC(expose->display, expose->drawable, 0, 0); - XFillRectangle(expose->display, expose->drawable, gc, expose->x, expose->y,expose->width, expose->height); - XFreeGC(expose->display, gc); - return true; - } - - - return false; -} - - - -NPError OIPF_NPP_GetValue(NPP instance, NPPVariable variable, void *value) -{ - TRACEINFO; - - if ( variable == NPPVpluginScriptableNPObject ) - { - void ** v = (void **)value; - if(instance->pdata) - { - NPObject* obj = ((HBBTVPluginData*)instance->pdata)->obj; - if(obj == NULL){ - }else{ - sBrowserFuncs->retainobject(obj); - } - *v = obj; - } - } - return NPERR_NO_ERROR; -} - - -NPError OIPF_NPP_SetValue(NPP instance, NPNVariable variable, void *value) -{ - TRACEINFO; - return NPERR_GENERIC_ERROR; -} - - -NPError OIPF_NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype) -{ - TRACEINFO; - return NPERR_GENERIC_ERROR; -} - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.h deleted file mode 100644 index 87e61c0..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserplugin.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef hbbtvbrowserplugin_h -#define hbbtvbrowserplugin_h - -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -#include -#include -#include - -#include "hbbtvbrowserpluginapi.h" - -#ifndef DEBUG - #define DEBUG true - #define PROJECTNAME "HbbTVBrowserPlugin" - #define TRACEINFO if (DEBUG) { fprintf(stderr,"\x1b[%i;3%im%s\x1b[0m : call %s\n", 1, 3, PROJECTNAME, __FUNCTION__); } - #define NOTIMPLEMENTED if (DEBUG) { printf("%s : %s is \x1b[1;31mNOT IMPLEMENTED\x1b[0m : TODO \n", PROJECTNAME, __FUNCTION__); } -#endif - -typedef struct -{ - NPObject* obj; - char* type; - NPWindow* window; - NPP npp; -}HBBTVPluginData; - -NPNetscapeFuncs* sBrowserFuncs; - -#define ALLOCBROWSERMEMORY true - -#ifdef ALLOCBROWSERMEMORY - #define MEMALLOC sBrowserFuncs->memalloc - #define MEMFREE sBrowserFuncs->memfree -#else - #define MEMALLOC malloc - #define MEMFREE free -#endif - -char* booltostr(bool data); - -NPError NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs); -NPError NP_Shutdown(); -NPError NP_GetValue(void *instance, NPPVariable variable, void *value); -char* NP_GetPluginVersion(); -char* NP_GetMIMEDescription(); - -NPError OIPF_NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved); -NPError OIPF_NPP_Destroy(NPP instance, NPSavedData **save); -NPError OIPF_NPP_SetWindow(NPP instance, NPWindow *window); -NPError OIPF_NPP_HandleEvent(NPP instance, void* Event); -NPError OIPF_NPP_GetValue(NPP instance, NPPVariable variable, void *value); -NPError OIPF_NPP_SetValue(NPP instance, NPNVariable variable, void *value); -NPError OIPF_NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.c deleted file mode 100644 index aa7ff81..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.c +++ /dev/null @@ -1,45 +0,0 @@ - -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */#include "hbbtvbrowserpluginapi.h" - - -void OnNoFullscreenSetWindow(int x, int y, int width, int height) -{ -} - -void OnAPPLICATION_Show() -{ -} - -void OnAPPLICATION_Hide() -{ -} - -void OnVIDBRC_SetFullScreen(int fullscreenparam) -{ -} - -void OnKEYSET_SetValue(double param) -{ -} - -void OnKEYSET_Allocate() -{ -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.h deleted file mode 100644 index 70408a1..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/hbbtvbrowserpluginapi.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef hbbtvbrowserpluginapi_h -#define hbbtvbrowserpluginapi_h - -#include - -///Callbacks -void OnNoFullscreenSetWindow(int x, int y, int width, int height); -void OnAPPLICATION_Show(); -void OnAPPLICATION_Hide(); -void OnVIDBRC_SetFullScreen(int fullscreenparam); -void OnKEYSET_SetValue(double param); -void OnKEYSET_Allocate(); -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.c deleted file mode 100644 index 6e9a9d1..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.c +++ /dev/null @@ -1,330 +0,0 @@ - -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */#include "keysetclass.h" - -#define kKEYSET_ID_PROPERTY_VALUE 0 -#define kKEYSET_ID_PROPERTY_MAXIMUMVALUE 1 -#define kKEYSET_ID_PROPERTY_RED 2 -#define kKEYSET_ID_PROPERTY_GREEN 3 -#define kKEYSET_ID_PROPERTY_YELLOW 4 -#define kKEYSET_ID_PROPERTY_BLUE 5 -#define kKEYSET_ID_PROPERTY_NAVIGATION 6 -#define kKEYSET_ID_PROPERTY_VCR 7 -#define kKEYSET_ID_PROPERTY_SCROLL 8 -#define kKEYSET_ID_PROPERTY_INFO 9 -#define kKEYSET_ID_PROPERTY_NUMERIC 10 -#define kKEYSET_ID_PROPERTY_ALPHA 11 -#define kKEYSET_ID_PROPERTY_OTHER 12 -#define kKEYSET_NUM_PROPERTY_IDENTIFIERS 13 - -#define kKEYSET_ID_METHOD_SETVALUE 0 -#define kKEYSET_NUM_METHOD_IDENTIFIERS 1 - - - -bool v_bKEYSETIdentifiersInitialized = false; - -NPIdentifier v_KEYSETPropertyIdentifiers[kKEYSET_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_KEYSETPropertyNames[kKEYSET_NUM_PROPERTY_IDENTIFIERS] = { - "value", - "maximumValue", - "RED", - "GREEN", - "YELLOW", - "BLUE", - "NAVIGATION", - "VCR", - "SCROLL", - "INFO", - "NUMERIC", - "ALPHA", - "OTHER" - }; - -NPIdentifier v_KEYSETMethodIdentifiers[kKEYSET_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_KEYSETMethodNames[kKEYSET_NUM_METHOD_IDENTIFIERS] = { - "setValue" - }; - -static void KEYSETinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_KEYSETPropertyNames, kKEYSET_NUM_PROPERTY_IDENTIFIERS, v_KEYSETPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_KEYSETMethodNames, kKEYSET_NUM_METHOD_IDENTIFIERS, v_KEYSETMethodIdentifiers ); -} - - -NPClass stKEYSETclass; -NPClass* pKEYSETclass = NULL; - -NPClass* fillKEYSETpclass(void) -{ - TRACEINFO; - if (pKEYSETclass == NULL) - { - stKEYSETclass.allocate = KEYSET_Allocate; - stKEYSETclass.deallocate = KEYSET_Deallocate; - stKEYSETclass.invalidate = KEYSET_Invalidate; - stKEYSETclass.hasMethod = KEYSET_HasMethod; - stKEYSETclass.invoke = KEYSET_Invoke; - stKEYSETclass.invokeDefault = KEYSET_InvokeDefault; - stKEYSETclass.hasProperty = KEYSET_HasProperty; - stKEYSETclass.getProperty = KEYSET_GetProperty; - stKEYSETclass.setProperty = KEYSET_SetProperty; - stKEYSETclass.removeProperty = KEYSET_RemoveProperty; - stKEYSETclass.enumerate = KEYSET_Enumerate; - pKEYSETclass = &stKEYSETclass; - } - - return pKEYSETclass; -} - - -NPObject * KEYSET_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - NPObject* result; - - - if (!v_bKEYSETIdentifiersInitialized) - { - v_bKEYSETIdentifiersInitialized = true; - KEYSETinitializeIdentifiers(); - } - - NPObj_KeySet* newkeyset = (NPObj_KeySet *)MEMALLOC(sizeof(NPObj_KeySet)); - newkeyset->npp = npp; - newkeyset->value = (double*)MEMALLOC(sizeof(double)); - newkeyset->maximumValue = (double*)MEMALLOC(sizeof(double)); - result = (NPObject*)newkeyset; - OnKEYSET_Allocate(); - return result; -} - - -void KEYSET_Deallocate(NPObject* obj) -{ - TRACEINFO; - NPObj_KeySet* keysetobj = (NPObj_KeySet*)obj; - MEMFREE(keysetobj->value); - MEMFREE(keysetobj->maximumValue); - MEMFREE(keysetobj); - return; -} - -void KEYSET_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - -bool KEYSET_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kKEYSET_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_KEYSETMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool KEYSET_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - if (name == v_KEYSETMethodIdentifiers[kKEYSET_ID_METHOD_SETVALUE]) - { - KEYSET_Invoke_SetValue(obj, args, argCount, result); - fctresult = true; - } - else - { - fctresult = false; - } - return fctresult; -} - -bool KEYSET_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - -bool KEYSET_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kKEYSET_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_KEYSETPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - - return result; -} - -bool KEYSET_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - NPObj_KeySet* keysetobj = (NPObj_KeySet*)obj; - - double KEYMASK_RED = 0x1; - double KEYMASK_GREEN = 0x2; - double KEYMASK_YELLOW = 0x4; - double KEYMASK_BLUE = 0x8; - double KEYMASK_NAVIGATION = 0x10; - double KEYMASK_VCR = 0x20; - double KEYMASK_SCROLL = 0x40; - double KEYMASK_INFO = 0x80; - double KEYMASK_NUMERIC = 0x100; - double KEYMASK_ALPHA = 0x200; - double KEYMASK_OTHER = 0x400; - - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_RED]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_RED, *result); - fctresult = true; - } - else - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_GREEN]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_GREEN, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_YELLOW]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_YELLOW, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_BLUE]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_BLUE, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_NAVIGATION]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_NAVIGATION, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_VCR]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_VCR, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_SCROLL]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_SCROLL, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_INFO]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_INFO, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_NUMERIC]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_NUMERIC, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_ALPHA]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_ALPHA, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_OTHER]) - { - DOUBLE_TO_NPVARIANT(KEYMASK_OTHER, *result); - fctresult = true; - } - if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_VALUE]) - { - double* value = keysetobj->value; - DOUBLE_TO_NPVARIANT(*value, *result); - fctresult = true; - } - - if (fctresult) - { - - } - - - - return fctresult; -} - -bool KEYSET_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - bool fctresult = false; - - return fctresult; -} - -bool KEYSET_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - -bool KEYSET_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - - -/** implementation **/ -void KEYSET_Invoke_SetValue(NPObject* obj,const NPVariant* args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - //~ NOTIMPLEMENTED; // in progress - double param; - NPObj_KeySet* keysetobj = (NPObj_KeySet*)obj; - double* value = keysetobj->value; - fprintf(stderr,"nb args : %i, %f", argCount,NPVARIANT_TO_DOUBLE(args[0]) ); - if (!NPVARIANT_IS_DOUBLE(args[0])) { - fprintf(stderr,"\t%s : error\n",__FUNCTION__); - return; - } - else { - param = NPVARIANT_TO_DOUBLE( args[0] ); - fprintf(stderr, "\t%s : param to transmit %f \n", __FUNCTION__, param); - *value = param; - OnKEYSET_SetValue(param); - } -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.h deleted file mode 100644 index 5448d64..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/keysetclass.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __HBBTVKEYSET_H__ -#define __HBBTVKEYSET_H__ - -#include "hbbtvbrowserplugin.h" - -typedef struct -{ - NPObject header; - NPP npp; - - double* value; - double* maximumValue; -} NPObj_KeySet; - -NPClass* fillKEYSETpclass(void); - -NPObject * KEYSET_Allocate(NPP npp, NPClass *aClass); -void KEYSET_Deallocate(NPObject *obj); -void KEYSET_Invalidate(NPObject *obj); -bool KEYSET_HasMethod(NPObject *obj, NPIdentifier name); -bool KEYSET_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool KEYSET_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool KEYSET_HasProperty(NPObject *obj, NPIdentifier name); -bool KEYSET_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool KEYSET_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); -bool KEYSET_RemoveProperty(NPObject *npobj, NPIdentifier name); -bool KEYSET_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - - -void KEYSET_Invoke_SetValue(NPObject* obj,const NPVariant* args, uint32_t argCount, NPVariant *result); - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/makefile.am b/applications/hbbtvplayer/hbbtvbrowserplugin/src/makefile.am deleted file mode 100644 index 59c0d4c..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/makefile.am +++ /dev/null @@ -1,47 +0,0 @@ - -lib_LTLIBRARIES = libhbbtvbrowserplugin.la - -libhbbtvbrowserplugin_la_SOURCES = hbbtvbrowserplugin.c\ - hbbtvbrowserpluginapi.c\ - oipfapplicationmanager.c\ - applicationclass.c\ - applicationprivatedataclass.c\ - oipfconfiguration.c\ - configurationclass.c\ - oipfdownloadmanager.c\ - oipfdownloadtrigger.c\ - downloadclass.c\ - downloadcollectionclass.c\ - drmcontrolinfocollectionclass.c\ - drmcontrolinformationclass.c\ - videobroadcast.c\ - keysetclass.c\ - hbbtvbrowserplugin.h\ - hbbtvbrowserpluginapi.h\ - oipfapplicationmanager.h\ - applicationclass.h\ - applicationprivatedataclass.h\ - oipfconfiguration.h\ - configurationclass.h\ - oipfdownloadmanager.h\ - oipfdownloadtrigger.h\ - downloadclass.h\ - downloadcollectionclass.h\ - drmcontrolinfocollectionclass.h\ - drmcontrolinformationclass.h\ - videobroadcast.h\ - keysetclass.h - -library_includedir=$(includedir)/@PACKAGE_NAME@ -library_include_HEADERS = hbbtvbrowserpluginapi.h - -SPECIALCFLAGS = -g -Wall -DXP_UNIX=1 -DMOZ_X11=1 -fPIC -libhbbtvbrowserplugin_la_CFLAGS = $(GLIB_CFLAGS) $(GTK_CFLAGS) $(NPAPI_CFLAGS) $(SPECIALCFLAGS) -I./webkit-plugin-header/ -I./src/webkit-plugin-header/ -libhbbtvbrowserplugin_la_LDFLAGS = $(GLIB_LIBS) $(GTK_LIBS) $(NPAPI_LIBS) $(SPECIALCFLAGS) -libhbbtvbrowserplugin_la_LIBADD = $(GLIB_LIBS) $(GTK_LIBS) $(NPAPI_LIBS) - -install-exec-local : - ln -fs $(libdir)/lib@PACKAGE_NAME@.so.0.0.0 $(PLUGINDIR)/lib@PACKAGE_NAME@.so - -uninstall-local : - rm -f $(PLUGINDIR)/lib@PACKAGE_NAME@.so diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.c deleted file mode 100644 index 5adebaf..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "oipfapplicationmanager.h" -#include "applicationclass.h" - -#define kOAM_ID_PROPERTY_ON_LOW_MEMORY 0 -#define kOAM_NUM_PROPERTY_IDENTIFIERS 1 - -#define kOAM_ID_METHOD_GET_OWNER_APPLICATION 0 -#define kOAM_NUM_METHOD_IDENTIFIERS 1 - -bool v_bOAMIdentifiersInitialized = false; - -NPIdentifier v_OAMPropertyIdentifiers[kOAM_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_OAMPropertyNames[kOAM_NUM_PROPERTY_IDENTIFIERS] = { - "onLowMemory" - }; - -NPIdentifier v_OAMMethodIdentifiers[kOAM_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_OAMMethodNames[kOAM_NUM_METHOD_IDENTIFIERS] = { - "getOwnerApplication" -}; - - - - -static void OAMinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_OAMPropertyNames, kOAM_NUM_PROPERTY_IDENTIFIERS, v_OAMPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_OAMMethodNames, kOAM_NUM_METHOD_IDENTIFIERS, v_OAMMethodIdentifiers ); -} - -NPClass stOAMclass; -NPClass* pOAMclass = NULL; - -NPClass* fillOAMpclass(void) -{ - TRACEINFO; - if (pOAMclass == NULL) - { - stOAMclass.allocate = OAM_Allocate; - stOAMclass.deallocate = OAM_Deallocate; - stOAMclass.invalidate = OAM_Invalidate; - stOAMclass.hasMethod = OAM_HasMethod; - stOAMclass.invoke = OAM_Invoke; - stOAMclass.invokeDefault = OAM_InvokeDefault; - stOAMclass.hasProperty = OAM_HasProperty; - stOAMclass.getProperty = OAM_GetProperty; - stOAMclass.setProperty = OAM_SetProperty; - stOAMclass.removeProperty = OAM_RemoveProperty; - stOAMclass.enumerate = OAM_Enumerate; - pOAMclass = &stOAMclass; - } - - return pOAMclass; -} - - -NPObject * OAM_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - - if (!v_bOAMIdentifiersInitialized) - { - v_bOAMIdentifiersInitialized = true; - OAMinitializeIdentifiers(); - } - - NPObj_OAM* newapplicationmanager = (NPObj_OAM*)MEMALLOC(sizeof(NPObj_OAM)); - fprintf(stderr, "\t%s : Allocation at \x1b[%i;3%im%p\n\x1b[0m ",__FUNCTION__, 1, 1, newapplicationmanager ); - newapplicationmanager->npp = npp; - newapplicationmanager->ownerApplication = sBrowserFuncs->createobject(npp, fillAPPLICATIONpclass()); - fprintf(stderr, "\t%s : Create ownerApplication member at \x1b[%i;3%im%p\n\x1b[0m ",__FUNCTION__, 1, 1, newapplicationmanager->ownerApplication ); - return (NPObject *)newapplicationmanager; -} - - void OAM_Deallocate(NPObject* obj) -{ - TRACEINFO; - NPObj_OAM* oamobj = (NPObj_OAM*)obj; - sBrowserFuncs->releaseobject(oamobj->ownerApplication); - MEMFREE(oamobj); - return; -} - - void OAM_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - - bool OAM_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kOAM_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_OAMMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool OAM_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - //OAM_ObjectMain * pMainObj = reinterpret_cast(obj); - bool fctresult = false; - if (name == v_OAMMethodIdentifiers[kOAM_ID_METHOD_GET_OWNER_APPLICATION]) - { - OAM_ObjectMain_Invoke_GetOwnerApplication((NPObj_OAM*)obj, args, argCount, result); - fctresult = true; - } - else - { - - fctresult = false; - } - return fctresult; -} - - bool OAM_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - - bool OAM_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kOAM_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_OAMPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool OAM_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - return true; -} - - bool OAM_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - - bool OAM_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - - bool OAM_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - -/** implementation **/ -void OAM_ObjectMain_Invoke_GetOwnerApplication(NPObj_OAM* obj,const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - sBrowserFuncs->retainobject(obj->ownerApplication); - OBJECT_TO_NPVARIANT((NPObject*)(obj->ownerApplication), *result); -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.h deleted file mode 100644 index 4334fe4..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfapplicationmanager.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __OIPFAPPLICATIONMANAGER_H__ -#define __OIPFAPPLICATIONMANAGER_H__ - -#include "hbbtvbrowserplugin.h" - -typedef struct { - NPObject header; - NPP npp; - - NPObject* ownerApplication; -} NPObj_OAM; - -NPClass* fillOAMpclass(void); - -NPObject * OAM_Allocate(NPP npp, NPClass *aClass); -void OAM_Deallocate(NPObject *obj); -void OAM_Invalidate(NPObject *obj); -bool OAM_HasMethod(NPObject *obj, NPIdentifier name); -bool OAM_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool OAM_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool OAM_HasProperty(NPObject *obj, NPIdentifier name); -bool OAM_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool OAM_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); -bool OAM_RemoveProperty(NPObject *npobj, NPIdentifier name); -bool OAM_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - -void OAM_ObjectMain_Invoke_GetOwnerApplication(NPObj_OAM* obj,const NPVariant* args, uint32_t argCount, NPVariant* result); - -/* -typedef struct{ - NPObject headear; - NPP npp; - NPObject* onLowMemory; - NPObject* ownerApplication; - NPObject* newApplication; -} OAM_ObjectMain; -*/ - - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.c deleted file mode 100644 index cb20c44..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "oipfconfiguration.h" - -#define kOCFG_ID_PROPERTY_CONFIGURATION 0 -#define kOCFG_NUM_PROPERTY_IDENTIFIERS 1 - -#define kOCFG_NUM_METHOD_IDENTIFIERS 0 - -bool v_bOCFGIdentifiersInitialized = false; - -NPIdentifier v_OCFGPropertyIdentifiers[kOCFG_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_OCFGPropertyNames[kOCFG_NUM_PROPERTY_IDENTIFIERS] = { - "configuration" - }; - -NPIdentifier v_OCFGMethodIdentifiers[kOCFG_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_OCFGMethodNames[kOCFG_NUM_METHOD_IDENTIFIERS] = {}; - -static void OCFGinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_OCFGPropertyNames, kOCFG_NUM_PROPERTY_IDENTIFIERS, v_OCFGPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_OCFGMethodNames, kOCFG_NUM_METHOD_IDENTIFIERS, v_OCFGMethodIdentifiers ); -} - - -NPClass stOCFGclass; -NPClass* pOCFGclass = NULL; - -NPClass* fillOCFGpclass(void) -{ - TRACEINFO; - if (pOCFGclass == NULL) - { - stOCFGclass.allocate = OCFG_Allocate; - stOCFGclass.deallocate = OCFG_Deallocate; - stOCFGclass.invalidate = OCFG_Invalidate; - stOCFGclass.hasMethod = OCFG_HasMethod; - stOCFGclass.invoke = OCFG_Invoke; - stOCFGclass.invokeDefault = OCFG_InvokeDefault; - stOCFGclass.hasProperty = OCFG_HasProperty; - stOCFGclass.getProperty = OCFG_GetProperty; - stOCFGclass.setProperty = OCFG_SetProperty; - stOCFGclass.removeProperty = OCFG_RemoveProperty; - stOCFGclass.enumerate = OCFG_Enumerate; - pOCFGclass = &stOCFGclass; - } - - return pOCFGclass; -} - - -NPObject * OCFG_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - NPObject* result; - - - if (!v_bOCFGIdentifiersInitialized) - { - v_bOCFGIdentifiersInitialized = true; - OCFGinitializeIdentifiers(); - } - - NPObject* newocfg = (NPObject*)MEMALLOC(sizeof(NPObject)); - result = newocfg; - - return result; -} - - -void OCFG_Deallocate(NPObject* obj) -{ - TRACEINFO; - MEMFREE(obj); - return; -} - -void OCFG_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - -bool OCFG_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kOCFG_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_OCFGMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool OCFG_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - - bool fctresult; - - fctresult = false; - - return fctresult; - -} - -bool OCFG_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - -bool OCFG_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kOCFG_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_OCFGPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool OCFG_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - return true; -} - -bool OCFG_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - -bool OCFG_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - -bool OCFG_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.h deleted file mode 100644 index 25f8cf3..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfconfiguration.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __OIPFCONFIGURATION_H__ -#define __OIPFCONFIGURATION_H__ - -#include "hbbtvbrowserplugin.h" - -NPClass* fillOCFGpclass(void); - -NPObject * OCFG_Allocate(NPP npp, NPClass *aClass); -void OCFG_Deallocate(NPObject *obj); -void OCFG_Invalidate(NPObject *obj); -bool OCFG_HasMethod(NPObject *obj, NPIdentifier name); -bool OCFG_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool OCFG_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool OCFG_HasProperty(NPObject *obj, NPIdentifier name); -bool OCFG_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool OCFG_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool OCFG_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool OCFG_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.c deleted file mode 100644 index cfe9e0f..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "oipfdownloadmanager.h" - -#define kODWLDMAN_ID_PROPERTY_ONDOWNLOADSTATECHANGE 0 -#define kODWLDMAN_NUM_PROPERTY_IDENTIFIERS 1 - -#define kODWLDMAN_ID_METHOD_PAUSE 0 -#define kODWLDMAN_ID_METHOD_RESUME 1 -#define kODWLDMAN_ID_METHOD_REMOVE 2 -#define kODWLDMAN_ID_METHOD_GETDOWNLOADS 3 -#define kODWLDMAN_NUM_METHOD_IDENTIFIERS 4 - -bool v_bODWLDMANIdentifiersInitialized = false; - -NPIdentifier v_ODWLDMANPropertyIdentifiers[kODWLDMAN_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_ODWLDMANPropertyNames[kODWLDMAN_NUM_PROPERTY_IDENTIFIERS] = { - "onDownloadStateChange" - }; - -NPIdentifier v_ODWLDMANMethodIdentifiers[kODWLDMAN_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_ODWLDMANMethodNames[kODWLDMAN_NUM_METHOD_IDENTIFIERS] = { - "pause", - "resume", - "remove", - "getDownloads" -}; - - -static void ODWLDMANinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_ODWLDMANPropertyNames, kODWLDMAN_NUM_PROPERTY_IDENTIFIERS, v_ODWLDMANPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_ODWLDMANMethodNames, kODWLDMAN_NUM_METHOD_IDENTIFIERS, v_ODWLDMANMethodIdentifiers ); -} - -NPClass stODWLDMANclass; -NPClass* pODWLDMANclass = NULL; - -NPClass* fillODWLDMANpclass(void) -{ - TRACEINFO; - if (pODWLDMANclass == NULL) - { - stODWLDMANclass.allocate = ODWLDMAN_Allocate; - stODWLDMANclass.deallocate = ODWLDMAN_Deallocate; - stODWLDMANclass.invalidate = ODWLDMAN_Invalidate; - stODWLDMANclass.hasMethod = ODWLDMAN_HasMethod; - stODWLDMANclass.invoke = ODWLDMAN_Invoke; - stODWLDMANclass.invokeDefault = ODWLDMAN_InvokeDefault; - stODWLDMANclass.hasProperty = ODWLDMAN_HasProperty; - stODWLDMANclass.getProperty = ODWLDMAN_GetProperty; - stODWLDMANclass.setProperty = ODWLDMAN_SetProperty; - stODWLDMANclass.removeProperty = ODWLDMAN_RemoveProperty; - stODWLDMANclass.enumerate = ODWLDMAN_Enumerate; - pODWLDMANclass = &stODWLDMANclass; - } - - return pODWLDMANclass; -} - - -NPObject * ODWLDMAN_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - NPObject* newdwldman = NULL; - if (!v_bODWLDMANIdentifiersInitialized) - { - v_bODWLDMANIdentifiersInitialized = true; - ODWLDMANinitializeIdentifiers(); - } - - newdwldman = (NPObject*)MEMALLOC(sizeof(NPObject)); - - return newdwldman; -} - - void ODWLDMAN_Deallocate(NPObject* obj) -{ - TRACEINFO; - MEMFREE(obj); - return; -} - - void ODWLDMAN_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - - bool ODWLDMAN_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kODWLDMAN_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_ODWLDMANMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool ODWLDMAN_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - if (name == v_ODWLDMANMethodIdentifiers[kODWLDMAN_ID_METHOD_GETDOWNLOADS]) - { - ODWLDMAN_Invoke_GetDownloads(obj, args, argCount); - fctresult = true; - } - else if (name == v_ODWLDMANMethodIdentifiers[kODWLDMAN_ID_METHOD_PAUSE]) - { - ODWLDMAN_Invoke_Pause(obj, args, argCount); - fctresult = true; - } - else if (name == v_ODWLDMANMethodIdentifiers[kODWLDMAN_ID_METHOD_REMOVE]) - { - ODWLDMAN_Invoke_Remove(obj, args, argCount); - fctresult = true; - } - else if (name == v_ODWLDMANMethodIdentifiers[kODWLDMAN_ID_METHOD_RESUME]) - { - ODWLDMAN_Invoke_Resume(obj, args, argCount); - fctresult = true; - } - else - { - fctresult = false; - } - return fctresult; -} - - bool ODWLDMAN_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - - bool ODWLDMAN_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kODWLDMAN_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_ODWLDMANPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - - bool ODWLDMAN_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - return true; -} - - bool ODWLDMAN_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - - bool ODWLDMAN_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - - bool ODWLDMAN_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - -/** implementation */ - - -void ODWLDMAN_Invoke_GetDownloads(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} - -void ODWLDMAN_Invoke_Pause(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} - -void ODWLDMAN_Invoke_Remove(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} - -void ODWLDMAN_Invoke_Resume(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.h deleted file mode 100644 index e9c3226..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadmanager.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __OIPFDOWNLOADMANAGER_H__ -#define __OIPFDOWNLOADMANAGER_H__ - -#include "hbbtvbrowserplugin.h" - - -NPClass* fillODWLDMANpclass(void); - -NPObject * ODWLDMAN_Allocate(NPP npp, NPClass *aClass); -void ODWLDMAN_Deallocate(NPObject *obj); -void ODWLDMAN_Invalidate(NPObject *obj); -bool ODWLDMAN_HasMethod(NPObject *obj, NPIdentifier name); -bool ODWLDMAN_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool ODWLDMAN_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool ODWLDMAN_HasProperty(NPObject *obj, NPIdentifier name); -bool ODWLDMAN_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool ODWLDMAN_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool ODWLDMAN_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool ODWLDMAN_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - - -void ODWLDMAN_Invoke_GetDownloads(NPObject* obj,const NPVariant* args, uint32_t argCount); -void ODWLDMAN_Invoke_Pause(NPObject* obj,const NPVariant* args, uint32_t argCount); -void ODWLDMAN_Invoke_Remove(NPObject* obj,const NPVariant* args, uint32_t argCount); -void ODWLDMAN_Invoke_Resume(NPObject* obj,const NPVariant* args, uint32_t argCount); - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.c deleted file mode 100644 index ae17f4b..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Stanislas Selle - * - */ -#include "oipfdownloadtrigger.h" - - -#define kODWLDTRG_NUM_PROPERTY_IDENTIFIERS 0 - -#define kODWLDTRG_ID_METHOD_REGISTER_DOWNLOAD 0 -#define kODWLDTRG_ID_METHOD_REGISTER_DOWNLOADURL 1 -#define kODWLDTRG_NUM_METHOD_IDENTIFIERS 2 - -bool v_bODWLDTRGIdentifiersInitialized = false; - -NPIdentifier v_ODWLDTRGPropertyIdentifiers[kODWLDTRG_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_ODWLDTRGPropertyNames[kODWLDTRG_NUM_PROPERTY_IDENTIFIERS] = { -}; - -NPIdentifier v_ODWLDTRGMethodIdentifiers[kODWLDTRG_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_ODWLDTRGMethodNames[kODWLDTRG_NUM_METHOD_IDENTIFIERS] = { - "registerDownload", - "registerDownloadURL" -}; - - - -static void ODWLDTRGinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_ODWLDTRGPropertyNames, kODWLDTRG_NUM_PROPERTY_IDENTIFIERS, v_ODWLDTRGPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_ODWLDTRGMethodNames, kODWLDTRG_NUM_METHOD_IDENTIFIERS, v_ODWLDTRGMethodIdentifiers ); -} - -NPClass stODWLDTRGclass; -NPClass* pODWLDTRGclass = NULL; - -NPClass* fillODWLDTRGpclass(void) -{ - TRACEINFO; - if (pODWLDTRGclass == NULL) - { - stODWLDTRGclass.allocate = ODWLDTRG_Allocate; - stODWLDTRGclass.deallocate = ODWLDTRG_Deallocate; - stODWLDTRGclass.invalidate = ODWLDTRG_Invalidate; - stODWLDTRGclass.hasMethod = ODWLDTRG_HasMethod; - stODWLDTRGclass.invoke = ODWLDTRG_Invoke; - stODWLDTRGclass.invokeDefault = ODWLDTRG_InvokeDefault; - stODWLDTRGclass.hasProperty = ODWLDTRG_HasProperty; - stODWLDTRGclass.getProperty = ODWLDTRG_GetProperty; - stODWLDTRGclass.setProperty = ODWLDTRG_SetProperty; - stODWLDTRGclass.removeProperty = ODWLDTRG_RemoveProperty; - stODWLDTRGclass.enumerate = ODWLDTRG_Enumerate; - pODWLDTRGclass = &stODWLDTRGclass; - } - - return pODWLDTRGclass; -} - - -NPObject * ODWLDTRG_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - NPObject* newdwldtrg = NULL; - if (!v_bODWLDTRGIdentifiersInitialized) - { - v_bODWLDTRGIdentifiersInitialized = true; - ODWLDTRGinitializeIdentifiers(); - } - - newdwldtrg = (NPObject*)MEMALLOC(sizeof(NPObject)); - - return newdwldtrg; -} - - void ODWLDTRG_Deallocate(NPObject* obj) -{ - TRACEINFO; - MEMFREE(obj); - return; -} - - void ODWLDTRG_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - - bool ODWLDTRG_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kODWLDTRG_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_ODWLDTRGMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool ODWLDTRG_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - if (name == v_ODWLDTRGMethodIdentifiers[kODWLDTRG_ID_METHOD_REGISTER_DOWNLOAD]) - { - ODWLDTRG_Invoke_registerDownload(obj, args, argCount); - fctresult = true; - } - else if (name == v_ODWLDTRGMethodIdentifiers[kODWLDTRG_ID_METHOD_REGISTER_DOWNLOADURL]) - { - ODWLDTRG_Invoke_registerDownloadURL(obj, args, argCount); - fctresult = true; - } - else - { - fctresult = false; - } - return fctresult; -} - - bool ODWLDTRG_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - - bool ODWLDTRG_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - - int i = 0; - while ((i < kODWLDTRG_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_ODWLDTRGPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - - bool ODWLDTRG_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - return true; -} - - bool ODWLDTRG_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - return true; -} - - bool ODWLDTRG_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - - bool ODWLDTRG_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - -void ODWLDTRG_Invoke_registerDownload(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} - -void ODWLDTRG_Invoke_registerDownloadURL(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; -} diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.h deleted file mode 100644 index cd7c337..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/oipfdownloadtrigger.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Stanislas Selle - * - */ -#ifndef __OIPFDOWNLOADTRIGGER_H__ -#define __OIPFDOWNLOADTRIGGER_H__ - -#include "hbbtvbrowserplugin.h" - - - -NPClass* fillODWLDTRGpclass(void); - -NPObject * ODWLDTRG_Allocate(NPP npp, NPClass *aClass); -void ODWLDTRG_Deallocate(NPObject *obj); -void ODWLDTRG_Invalidate(NPObject *obj); -bool ODWLDTRG_HasMethod(NPObject *obj, NPIdentifier name); -bool ODWLDTRG_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool ODWLDTRG_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool ODWLDTRG_HasProperty(NPObject *obj, NPIdentifier name); -bool ODWLDTRG_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool ODWLDTRG_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); - -bool ODWLDTRG_RemoveProperty(NPObject *npobj, NPIdentifier name); - -bool ODWLDTRG_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - -void ODWLDTRG_Invoke_registerDownload(NPObject* obj,const NPVariant* args, uint32_t argCount); -void ODWLDTRG_Invoke_registerDownloadURL(NPObject* obj,const NPVariant* args, uint32_t argCount); -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.c b/applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.c deleted file mode 100644 index bfcfed7..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#include "videobroadcast.h" - -#define kVIDBRC_ID_PROPERTY_WIDTH 0 -#define kVIDBRC_ID_PROPERTY_HEIGHT 1 -#define kVIDBRC_ID_PROPERTY_FULLSCREEN 2 -#define kVIDBRC_ID_PROPERTY_ONCHANNELCHANGEERROR 3 -#define kVIDBRC_ID_PROPERTY_PLAYSTATE 4 -#define kVIDBRC_ID_PROPERTY_ONPLAYSTATECHANGE 5 -#define kVIDBRC_ID_PROPERTY_ONCHANNELCHANGESUCCEEDED 6 -#define kVIDBRC_ID_PROPERTY_ONFULLSCREENCHANGE 7 -#define kVIDBRC_ID_PROPERTY_ONFOCUS 8 -#define kVIDBRC_ID_PROPERTY_ONBLUR 9 -#define kVIDBRC_NUM_PROPERTY_IDENTIFIERS 10 - -#define kVIDBRC_ID_METHOD_GETCHANNELCONFIG 0 -#define kVIDBRC_ID_METHOD_BINDTOCURRENTCHANNEL 1 -#define kVIDBRC_ID_METHOD_CREATECHANNELOBJECT 2 -#define kVIDBRC_ID_METHOD_CREATECHANNELOBJECT2 3 -#define kVIDBRC_ID_METHOD_SETCHANNEL 4 -#define kVIDBRC_ID_METHOD_PREVCHANNEL 5 -#define kVIDBRC_ID_METHOD_NEXTCHANNEL 6 -#define kVIDBRC_ID_METHOD_SETFULLSCREEN 7 -#define kVIDBRC_ID_METHOD_GETVOLUME 8 -#define kVIDBRC_ID_METHOD_RELEASE 9 -#define kVIDBRC_NUM_METHOD_IDENTIFIERS 10 - - -bool v_bVIDBRCIdentifiersInitialized = false; - -NPIdentifier v_VIDBRCPropertyIdentifiers[kVIDBRC_NUM_PROPERTY_IDENTIFIERS]; -const NPUTF8 * v_VIDBRCPropertyNames[kVIDBRC_NUM_PROPERTY_IDENTIFIERS] = { - "width", - "height", - "fullScreen", - "onChannelChangeError", - "playState", - "onPlayStateChange", - "onChannelChangeSucceeded", - "onFullScreenChange", - "onFocus", - "onBlur" - }; - -NPIdentifier v_VIDBRCMethodIdentifiers[kVIDBRC_NUM_METHOD_IDENTIFIERS]; -const NPUTF8 * v_VIDBRCMethodNames[kVIDBRC_NUM_METHOD_IDENTIFIERS] = { - "getChannelConfig", - "bindToCurrentChannel", - "createChannelObject", - "createChannelObject2", - "setChannel", - "prevChannel", - "nextChannel", - "setFullScreen", - "getVolume", - "release" -}; - -static void VIDBRCinitializeIdentifiers(void) -{ - sBrowserFuncs->getstringidentifiers( v_VIDBRCPropertyNames, kVIDBRC_NUM_PROPERTY_IDENTIFIERS, v_VIDBRCPropertyIdentifiers ); - sBrowserFuncs->getstringidentifiers( v_VIDBRCMethodNames, kVIDBRC_NUM_METHOD_IDENTIFIERS, v_VIDBRCMethodIdentifiers ); -} - -NPClass stVIDBRCclass; -NPClass* pVIDBRCclass = NULL; - -NPClass* fillVIDBRCpclass(void) -{ - TRACEINFO; - if (pVIDBRCclass == NULL) - { - stVIDBRCclass.allocate = VIDBRC_Allocate; - stVIDBRCclass.deallocate = VIDBRC_Deallocate; - stVIDBRCclass.invalidate = VIDBRC_Invalidate; - stVIDBRCclass.hasMethod = VIDBRC_HasMethod; - stVIDBRCclass.invoke = VIDBRC_Invoke; - stVIDBRCclass.invokeDefault = VIDBRC_InvokeDefault; - stVIDBRCclass.hasProperty = VIDBRC_HasProperty; - stVIDBRCclass.getProperty = VIDBRC_GetProperty; - stVIDBRCclass.setProperty = VIDBRC_SetProperty; - stVIDBRCclass.removeProperty = VIDBRC_RemoveProperty; - stVIDBRCclass.enumerate = VIDBRC_Enumerate; - pVIDBRCclass = &stVIDBRCclass; - } - - return pVIDBRCclass; -} - - -NPObject * VIDBRC_Allocate(NPP npp, NPClass *theClass) -{ - TRACEINFO; - - - if (!v_bVIDBRCIdentifiersInitialized) - { - v_bVIDBRCIdentifiersInitialized = true; - VIDBRCinitializeIdentifiers(); - } - - NPObj_VidBrc* newvidbrc = (NPObj_VidBrc*)MEMALLOC(sizeof(NPObj_VidBrc)); - newvidbrc->npp = npp; - - return (NPObject*) newvidbrc; -} - -void VIDBRC_Deallocate(NPObject* obj) -{ - TRACEINFO; - OnVIDBRC_SetFullScreen(true); - NPObj_VidBrc* vidbrc = (NPObj_VidBrc*)obj; - /* - if (vidbrc->pcArg_onChannelChangeSucceeded) - { - MEMFREE(vidbrc->pcArg_onChannelChangeSucceeded); - // vidbrc->pcArg_onChannelChangeSucceeded = NULL; - } - if ( vidbrc->onChannelChangeSucceeded ) - { - // sBrowserFuncs->releaseobject(vidbrc->onChannelChangeSucceeded); - // vidbrc->onChannelChangeSucceeded = NULL; - } - - */ - MEMFREE(obj); - return; -} - - void VIDBRC_Invalidate(NPObject* obj) -{ - TRACEINFO; - return; -} - - bool VIDBRC_HasMethod(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; - - bool result = false; - int i = 0; - NPUTF8* utf8methodname = (char*)sBrowserFuncs->utf8fromidentifier(name); - while ((i < kVIDBRC_NUM_METHOD_IDENTIFIERS) && (result == false)) - { - if ( name == v_VIDBRCMethodIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - -bool VIDBRC_Invoke(NPObject* obj, NPIdentifier name, const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - - if (name == v_VIDBRCMethodIdentifiers[kVIDBRC_ID_METHOD_GETCHANNELCONFIG]) - { - VIDBRC_Invoke_getChannelConfig((NPObj_VidBrc*)obj, args, argCount, result); - fctresult = true; - } - - if (name == v_VIDBRCMethodIdentifiers[kVIDBRC_ID_METHOD_SETFULLSCREEN]) - { - VIDBRC_Invoke_setFullScreen((NPObj_VidBrc*)obj, args, argCount); - fctresult = true; - } - - if (name == v_VIDBRCMethodIdentifiers[kVIDBRC_ID_METHOD_BINDTOCURRENTCHANNEL]) - { - VIDBRC_Invoke_bindToCurrentChannel(obj, args, argCount); - fctresult = true; - } - - - return fctresult; -} - - bool VIDBRC_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) -{ - TRACEINFO; - return true; -} - - bool VIDBRC_HasProperty(NPObject* obj, NPIdentifier name) -{ - TRACEINFO; bool result = false; - NPUTF8* utf8propertyname = (char*)sBrowserFuncs->utf8fromidentifier(name); - int i = 0; - while ((i < kVIDBRC_NUM_PROPERTY_IDENTIFIERS) && (result == false)) - { - if ( name == v_VIDBRCPropertyIdentifiers[i] ) - { - result= true; - } - i++; - } - - return result; -} - - bool VIDBRC_GetProperty(NPObject* obj, NPIdentifier name, NPVariant* result) -{ - TRACEINFO; - bool fctresult = false; - NPObj_VidBrc* vidbrc = (NPObj_VidBrc*)obj; - - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_WIDTH]) { - INT32_TO_NPVARIANT(vidbrc->width,*result); - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_HEIGHT]) { - INT32_TO_NPVARIANT(vidbrc->height,*result); - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_FULLSCREEN]) { - BOOLEAN_TO_NPVARIANT(vidbrc->fullscreen, *result); - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_PLAYSTATE]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONPLAYSTATECHANGE]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONCHANNELCHANGEERROR]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONCHANNELCHANGESUCCEEDED]) { - /* if ( vidbrc->pcArg_onChannelChangeSucceeded != NULL ) - { - char* dup_str = strdup(vidbrc->pcArg_onChannelChangeSucceeded); - NPString npstr = { dup_str, (uint32_t)(strlen(dup_str)) }; - result->type = NPVariantType_String; - result->value.stringValue = npstr; - fctresult = true; - } - else - { - OBJECT_TO_NPVARIANT(vidbrc->onPlayStateChange,*result); - }*/ - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONFULLSCREENCHANGE]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONFOCUS]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONBLUR]) { - fctresult = true; - } - - return fctresult; -} - - bool VIDBRC_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) -{ - TRACEINFO; - bool fctresult = false; - NPObj_VidBrc* vidbrc = (NPObj_VidBrc*)obj; - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_WIDTH]) { - vidbrc->width = NPVARIANT_TO_INT32(*value); - VIDBRC_setsize(vidbrc, vidbrc->width, vidbrc->height); - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_HEIGHT]) { - vidbrc->height = NPVARIANT_TO_INT32(*value); - VIDBRC_setsize(vidbrc, vidbrc->width, vidbrc->height); - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_FULLSCREEN]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_PLAYSTATE]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONPLAYSTATECHANGE]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONCHANNELCHANGEERROR]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONCHANNELCHANGESUCCEEDED]) { - /* if ( vidbrc->onChannelChangeSucceeded != NULL ) - { - sBrowserFuncs->releaseobject(vidbrc->onChannelChangeSucceeded); - vidbrc->onChannelChangeSucceeded = NULL; - } - if ( vidbrc->pcArg_onChannelChangeSucceeded ) - { - MEMFREE( vidbrc->pcArg_onChannelChangeSucceeded ); - vidbrc->pcArg_onChannelChangeSucceeded = NULL; - } - vidbrc->onChannelChangeSucceeded = NPVARIANT_TO_OBJECT(*value); - sBrowserFuncs->retainobject( vidbrc->onChannelChangeSucceeded);*/ - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONFULLSCREENCHANGE]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONFOCUS]) { - fctresult = true; - } else - if (name == v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_ONBLUR]) { - fctresult = true; - } - return fctresult; -} - - bool VIDBRC_RemoveProperty(NPObject *npobj, NPIdentifier name) -{ - TRACEINFO; - return true; -} - - - bool VIDBRC_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) -{ - TRACEINFO; - return true; -} - -/** implementation of methods **/ -void VIDBRC_Invoke_getChannelConfig(NPObj_VidBrc* obj,const NPVariant* args, uint32_t argCount, NPVariant* result) -{ - NOTIMPLEMENTED; - NULL_TO_NPVARIANT(*result); - return; -} - -void VIDBRC_Invoke_setFullScreen(NPObj_VidBrc* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - //NOTIMPLEMENTED; ///inprogress - - NPP npp = obj->npp; - int param; - if (argCount != 1 || !NPVARIANT_IS_BOOLEAN(args[0])) { - return; - } - else { - param = NPVARIANT_TO_BOOLEAN( args[0] ); - if (param != obj->fullscreen) - { - if (param){ - obj->fullscreen = true; - VIDBRC_setsize(obj, FULLSIZE_WIDTH, FULLSIZE_HEIGHT); - } - else{ - obj->fullscreen = false; - } - - HBBTVPluginData* pdata = (HBBTVPluginData*)npp->pdata; - if(pdata){ - if (pdata->window){ - OnVIDBRC_SetFullScreen(param); - } - } - } -} - -} - -void VIDBRC_Invoke_bindToCurrentChannel(NPObject* obj,const NPVariant* args, uint32_t argCount) -{ - TRACEINFO; - NOTIMPLEMENTED; - //OnBindToCurrentChannel(); -} - -/** implementation of intermediary function **/ - -void VIDBRC_setsize(NPObj_VidBrc* obj,int32_t width, int32_t height) -{ - ///set the size - obj->width = width; - obj->height = height; - - /// get the plugin object and his style object - NPIdentifier npIdent; - NPVariant npVar; - NPObject * npObjPlugin = NULL; - NPObject * npObjStyle = NULL; - - if (obj->npp) - { - sBrowserFuncs->getvalue( obj->npp , - NPNVPluginElementNPObject , - &npObjPlugin ); - } - if (npObjPlugin) - { - npIdent = sBrowserFuncs->getstringidentifier( (const NPUTF8 *)"style" ); - sBrowserFuncs->getproperty( obj->npp , - npObjPlugin, - npIdent , - &npVar ); - npObjStyle = NPVARIANT_TO_OBJECT(npVar); - } - if (npObjStyle) - { - INT32_TO_NPVARIANT(width,npVar); - npIdent = v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_WIDTH]; - sBrowserFuncs->setproperty( obj->npp,npObjStyle, npIdent, &npVar); - INT32_TO_NPVARIANT(height,npVar); - npIdent = v_VIDBRCPropertyIdentifiers[kVIDBRC_ID_PROPERTY_HEIGHT]; - sBrowserFuncs->setproperty( obj->npp,npObjStyle, npIdent, &npVar); - } -} - diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.h deleted file mode 100644 index 0027b76..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/videobroadcast.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * Authors: Stanislas Selle - * - */ -#ifndef __VIDEOBROADCAST_H__ -#define __VIDEOBROADCAST_H__ - -#include -#include -#include -#include -#include -#include -#include - -#include "hbbtvbrowserplugin.h" - -#define FULLSIZE_WIDTH 1280 -#define FULLSIZE_HEIGHT 720 - -typedef struct -{ - NPObject header; - NPP npp; - NPBool fullscreen; - int32_t width; - int32_t height; - - - //~ char* pcArg_onChannelChangeSucceeded; - //~ NPObject* onChannelChangeSucceeded; - //NPObject* channelConfig; - -} NPObj_VidBrc; - -NPClass* fillVIDBRCpclass(void); - -NPObject * VIDBRC_Allocate(NPP npp, NPClass *aClass); -void VIDBRC_Deallocate(NPObject *obj); -void VIDBRC_Invalidate(NPObject *obj); -bool VIDBRC_HasMethod(NPObject *obj, NPIdentifier name); -bool VIDBRC_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool VIDBRC_InvokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); -bool VIDBRC_HasProperty(NPObject *obj, NPIdentifier name); -bool VIDBRC_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result); -bool VIDBRC_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value); -bool VIDBRC_RemoveProperty(NPObject *npobj, NPIdentifier name); -bool VIDBRC_Enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); - -void VIDBRC_Invoke_setFullScreen(NPObj_VidBrc* obj,const NPVariant* args, uint32_t argCount); -void VIDBRC_Invoke_bindToCurrentChannel(NPObject* obj,const NPVariant* args, uint32_t argCount); -void VIDBRC_Invoke_getChannelConfig(NPObj_VidBrc* obj,const NPVariant* args, uint32_t argCount, NPVariant* result); - -void VIDBRC_setsize(NPObj_VidBrc* obj,int32_t witdh, int32_t height); -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npapi.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npapi.h deleted file mode 100644 index c217718..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npapi.h +++ /dev/null @@ -1,901 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef npapi_h_ -#define npapi_h_ - -#if defined(__OS2__) -#pragma pack(1) -#endif - -#include "nptypes.h" - -#if defined(__OS2__) || defined(OS2) -#ifndef XP_OS2 -#define XP_OS2 1 -#endif -#endif - -#ifdef INCLUDE_JAVA -#include "jri.h" /* Java Runtime Interface */ -#else -#define jref void * -#define JRIEnv void -#endif - -#if defined(_WIN32) && !defined(__SYMBIAN32__) -#include -#ifndef XP_WIN -#define XP_WIN 1 -#endif -#endif - -#if defined(__SYMBIAN32__) -#ifndef XP_SYMBIAN -#define XP_SYMBIAN 1 -#endif -#endif - -#if defined(__APPLE_CC__) && !defined(XP_UNIX) -#ifndef XP_MACOSX -#define XP_MACOSX 1 -#endif -#endif - -#if defined(XP_MACOSX) && defined(__LP64__) -#define NP_NO_QUICKDRAW -#define NP_NO_CARBON -#endif - -#if defined(XP_MACOSX) -#include -#include -#ifndef NP_NO_CARBON -#include -#endif -#endif - -#if defined(XP_UNIX) -#include -#include -#include -#endif - -#if defined(XP_SYMBIAN) -#include -#include -#endif - -/*----------------------------------------------------------------------*/ -/* Plugin Version Constants */ -/*----------------------------------------------------------------------*/ - -#define NP_VERSION_MAJOR 0 -#define NP_VERSION_MINOR 24 - - -/* The OS/2 version of Netscape uses RC_DATA to define the - mime types, file extensions, etc that are required. - Use a vertical bar to separate types, end types with \0. - FileVersion and ProductVersion are 32bit ints, all other - entries are strings that MUST be terminated with a \0. - -AN EXAMPLE: - -RCDATA NP_INFO_ProductVersion { 1,0,0,1,} - -RCDATA NP_INFO_MIMEType { "video/x-video|", - "video/x-flick\0" } -RCDATA NP_INFO_FileExtents { "avi|", - "flc\0" } -RCDATA NP_INFO_FileOpenName{ "MMOS2 video player(*.avi)|", - "MMOS2 Flc/Fli player(*.flc)\0" } - -RCDATA NP_INFO_FileVersion { 1,0,0,1 } -RCDATA NP_INFO_CompanyName { "Netscape Communications\0" } -RCDATA NP_INFO_FileDescription { "NPAVI32 Extension DLL\0" -RCDATA NP_INFO_InternalName { "NPAVI32\0" ) -RCDATA NP_INFO_LegalCopyright { "Copyright Netscape Communications \251 1996\0" -RCDATA NP_INFO_OriginalFilename { "NVAPI32.DLL" } -RCDATA NP_INFO_ProductName { "NPAVI32 Dynamic Link Library\0" } -*/ -/* RC_DATA types for version info - required */ -#define NP_INFO_ProductVersion 1 -#define NP_INFO_MIMEType 2 -#define NP_INFO_FileOpenName 3 -#define NP_INFO_FileExtents 4 -/* RC_DATA types for version info - used if found */ -#define NP_INFO_FileDescription 5 -#define NP_INFO_ProductName 6 -/* RC_DATA types for version info - optional */ -#define NP_INFO_CompanyName 7 -#define NP_INFO_FileVersion 8 -#define NP_INFO_InternalName 9 -#define NP_INFO_LegalCopyright 10 -#define NP_INFO_OriginalFilename 11 - -#ifndef RC_INVOKED - -/*----------------------------------------------------------------------*/ -/* Definition of Basic Types */ -/*----------------------------------------------------------------------*/ - -#ifndef FALSE -#define FALSE (0) -#endif -#ifndef TRUE -#define TRUE (1) -#endif -#ifndef NULL -#define NULL (0L) -#endif - -typedef unsigned char NPBool; -typedef int16_t NPError; -typedef int16_t NPReason; -typedef char* NPMIMEType; - -/*----------------------------------------------------------------------*/ -/* Structures and definitions */ -/*----------------------------------------------------------------------*/ - -#if !defined(__LP64__) -#if defined(XP_MACOSX) -#pragma options align=mac68k -#endif -#endif /* __LP64__ */ - -/* - * NPP is a plug-in's opaque instance handle - */ -typedef struct _NPP -{ - void* pdata; /* plug-in private data */ - void* ndata; /* netscape private data */ -} NPP_t; - -typedef NPP_t* NPP; - -typedef struct _NPStream -{ - void* pdata; /* plug-in private data */ - void* ndata; /* netscape private data */ - const char* url; - uint32_t end; - uint32_t lastmodified; - void* notifyData; - const char* headers; /* Response headers from host. - * Exists only for >= NPVERS_HAS_RESPONSE_HEADERS. - * Used for HTTP only; NULL for non-HTTP. - * Available from NPP_NewStream onwards. - * Plugin should copy this data before storing it. - * Includes HTTP status line and all headers, - * preferably verbatim as received from server, - * headers formatted as in HTTP ("Header: Value"), - * and newlines (\n, NOT \r\n) separating lines. - * Terminated by \n\0 (NOT \n\n\0). */ -} NPStream; - -typedef struct _NPByteRange -{ - int32_t offset; /* negative offset means from the end */ - uint32_t length; - struct _NPByteRange* next; -} NPByteRange; - -typedef struct _NPSavedData -{ - int32_t len; - void* buf; -} NPSavedData; - -typedef struct _NPRect -{ - uint16_t top; - uint16_t left; - uint16_t bottom; - uint16_t right; -} NPRect; - -typedef struct _NPSize -{ - int32_t width; - int32_t height; -} NPSize; - -typedef enum { - NPFocusNext = 0, - NPFocusPrevious = 1 -} NPFocusDirection; - -/* Return values for NPP_HandleEvent */ -#define kNPEventNotHandled 0 -#define kNPEventHandled 1 -/* Exact meaning must be spec'd in event model. */ -#define kNPEventStartIME 2 - -#if defined(XP_UNIX) -/* - * Unix specific structures and definitions - */ - -/* - * Callback Structures. - * - * These are used to pass additional platform specific information. - */ -enum { - NP_SETWINDOW = 1, - NP_PRINT -}; - -typedef struct -{ - int32_t type; -} NPAnyCallbackStruct; - -typedef struct -{ - int32_t type; - Display* display; - Visual* visual; - Colormap colormap; - unsigned int depth; -} NPSetWindowCallbackStruct; - -typedef struct -{ - int32_t type; - FILE* fp; -} NPPrintCallbackStruct; - -#endif /* XP_UNIX */ - -#if defined(XP_MACOSX) -typedef enum { -#ifndef NP_NO_QUICKDRAW - NPDrawingModelQuickDraw = 0, -#endif - NPDrawingModelCoreGraphics = 1, - NPDrawingModelOpenGL = 2, - NPDrawingModelCoreAnimation = 3 -} NPDrawingModel; - -typedef enum { -#ifndef NP_NO_CARBON - NPEventModelCarbon = 0, -#endif - NPEventModelCocoa = 1 -} NPEventModel; -#endif - -/* - * The following masks are applied on certain platforms to NPNV and - * NPPV selectors that pass around pointers to COM interfaces. Newer - * compilers on some platforms may generate vtables that are not - * compatible with older compilers. To prevent older plugins from - * not understanding a new browser's ABI, these masks change the - * values of those selectors on those platforms. To remain backwards - * compatible with different versions of the browser, plugins can - * use these masks to dynamically determine and use the correct C++ - * ABI that the browser is expecting. This does not apply to Windows - * as Microsoft's COM ABI will likely not change. - */ - -#define NP_ABI_GCC3_MASK 0x10000000 -/* - * gcc 3.x generated vtables on UNIX and OSX are incompatible with - * previous compilers. - */ -#if (defined(XP_UNIX) && defined(__GNUC__) && (__GNUC__ >= 3)) -#define _NP_ABI_MIXIN_FOR_GCC3 NP_ABI_GCC3_MASK -#else -#define _NP_ABI_MIXIN_FOR_GCC3 0 -#endif - -#if defined(XP_MACOSX) -#define NP_ABI_MACHO_MASK 0x01000000 -#define _NP_ABI_MIXIN_FOR_MACHO NP_ABI_MACHO_MASK -#else -#define _NP_ABI_MIXIN_FOR_MACHO 0 -#endif - -#define NP_ABI_MASK (_NP_ABI_MIXIN_FOR_GCC3 | _NP_ABI_MIXIN_FOR_MACHO) - -/* - * List of variable names for which NPP_GetValue shall be implemented - */ -typedef enum { - NPPVpluginNameString = 1, - NPPVpluginDescriptionString, - NPPVpluginWindowBool, - NPPVpluginTransparentBool, - NPPVjavaClass, /* Not implemented in WebKit */ - NPPVpluginWindowSize, /* Not implemented in WebKit */ - NPPVpluginTimerInterval, /* Not implemented in WebKit */ - NPPVpluginScriptableInstance = (10 | NP_ABI_MASK), /* Not implemented in WebKit */ - NPPVpluginScriptableIID = 11, /* Not implemented in WebKit */ - NPPVjavascriptPushCallerBool = 12, /* Not implemented in WebKit */ - NPPVpluginKeepLibraryInMemory = 13, /* Not implemented in WebKit */ - NPPVpluginNeedsXEmbed = 14, /* Not implemented in WebKit */ - - /* Get the NPObject for scripting the plugin. Introduced in NPAPI minor version 14. - */ - NPPVpluginScriptableNPObject = 15, - - /* Get the plugin value (as \0-terminated UTF-8 string data) for - * form submission if the plugin is part of a form. Use - * NPN_MemAlloc() to allocate memory for the string data. Introduced - * in NPAPI minor version 15. - */ - NPPVformValue = 16, /* Not implemented in WebKit */ - - NPPVpluginUrlRequestsDisplayedBool = 17, /* Not implemented in WebKit */ - - /* Checks if the plugin is interested in receiving the http body of - * all http requests (including failed ones, http status != 200). - */ - NPPVpluginWantsAllNetworkStreams = 18, - - /* Browsers can retrieve a native ATK accessibility plug ID via this variable. */ - NPPVpluginNativeAccessibleAtkPlugId = 19, - - /* Checks to see if the plug-in would like the browser to load the "src" attribute. */ - NPPVpluginCancelSrcStream = 20 - -#if defined(XP_MACOSX) - /* Used for negotiating drawing models */ - , NPPVpluginDrawingModel = 1000 - /* Used for negotiating event models */ - , NPPVpluginEventModel = 1001 - /* In the NPDrawingModelCoreAnimation drawing model, the browser asks the plug-in for a Core Animation layer. */ - , NPPVpluginCoreAnimationLayer = 1003 -#endif - -#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5) - , NPPVpluginWindowlessLocalBool = 2002 -#endif -} NPPVariable; - -/* - * List of variable names for which NPN_GetValue should be implemented. - */ -typedef enum { - NPNVxDisplay = 1, - NPNVxtAppContext, - NPNVnetscapeWindow, - NPNVjavascriptEnabledBool, - NPNVasdEnabledBool, - NPNVisOfflineBool, - - NPNVserviceManager = (10 | NP_ABI_MASK), /* Not implemented in WebKit */ - NPNVDOMElement = (11 | NP_ABI_MASK), /* Not implemented in WebKit */ - NPNVDOMWindow = (12 | NP_ABI_MASK), /* Not implemented in WebKit */ - NPNVToolkit = (13 | NP_ABI_MASK), /* Not implemented in WebKit */ - NPNVSupportsXEmbedBool = 14, /* Not implemented in WebKit */ - - /* Get the NPObject wrapper for the browser window. */ - NPNVWindowNPObject = 15, - - /* Get the NPObject wrapper for the plugins DOM element. */ - NPNVPluginElementNPObject = 16, - - NPNVSupportsWindowless = 17, - - NPNVprivateModeBool = 18 - -#if defined(XP_MACOSX) - /* Used for negotiating drawing models */ - , NPNVpluginDrawingModel = 1000 -#ifndef NP_NO_QUICKDRAW - , NPNVsupportsQuickDrawBool = 2000 -#endif - , NPNVsupportsCoreGraphicsBool = 2001 - , NPNVsupportsOpenGLBool = 2002 - , NPNVsupportsCoreAnimationBool = 2003 -#ifndef NP_NO_CARBON - , NPNVsupportsCarbonBool = 3000 /* TRUE if the browser supports the Carbon event model */ -#endif - , NPNVsupportsCocoaBool = 3001 /* TRUE if the browser supports the Cocoa event model */ -#endif /* XP_MACOSX */ -#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5) - , NPNVSupportsWindowlessLocal = 2002 -#endif -} NPNVariable; - -typedef enum { - NPNURLVCookie = 501, - NPNURLVProxy -} NPNURLVariable; - -/* - * The type of Toolkit the widgets use - */ -typedef enum { - NPNVGtk12 = 1, - NPNVGtk2 -} NPNToolkitType; - -/* - * The type of a NPWindow - it specifies the type of the data structure - * returned in the window field. - */ -typedef enum { - NPWindowTypeWindow = 1, - NPWindowTypeDrawable -} NPWindowType; - -typedef struct _NPWindow -{ - void* window; /* Platform specific window handle */ - /* OS/2: x - Position of bottom left corner */ - /* OS/2: y - relative to visible netscape window */ - int32_t x; /* Position of top left corner relative */ - int32_t y; /* to a netscape page. */ - uint32_t width; /* Maximum window size */ - uint32_t height; - NPRect clipRect; /* Clipping rectangle in port coordinates */ -#if defined(XP_UNIX) || defined(XP_SYMBIAN) - void * ws_info; /* Platform-dependent additonal data */ -#endif /* XP_UNIX || XP_SYMBIAN */ - NPWindowType type; /* Is this a window or a drawable? */ -} NPWindow; - -typedef struct _NPImageExpose -{ - char* data; /* image pointer */ - int32_t stride; /* Stride of data image pointer */ - int32_t depth; /* Depth of image pointer */ - int32_t x; /* Expose x */ - int32_t y; /* Expose y */ - uint32_t width; /* Expose width */ - uint32_t height; /* Expose height */ - NPSize dataSize; /* Data buffer size */ - float translateX; /* translate X matrix value */ - float translateY; /* translate Y matrix value */ - float scaleX; /* scale X matrix value */ - float scaleY; /* scale Y matrix value */ -} NPImageExpose; - -typedef struct _NPFullPrint -{ - NPBool pluginPrinted;/* Set TRUE if plugin handled fullscreen printing */ - NPBool printOne; /* TRUE if plugin should print one copy to default - printer */ - void* platformPrint; /* Platform-specific printing info */ -} NPFullPrint; - -typedef struct _NPEmbedPrint -{ - NPWindow window; - void* platformPrint; /* Platform-specific printing info */ -} NPEmbedPrint; - -typedef struct _NPPrint -{ - uint16_t mode; /* NP_FULL or NP_EMBED */ - union - { - NPFullPrint fullPrint; /* if mode is NP_FULL */ - NPEmbedPrint embedPrint; /* if mode is NP_EMBED */ - } print; -} NPPrint; - -#if defined(XP_MACOSX) -#ifndef NP_NO_CARBON -typedef EventRecord NPEvent; -#else -typedef void* NPEvent; -#endif -#elif defined(XP_SYMBIAN) -typedef QEvent NPEvent; -#elif defined(XP_WIN) -typedef struct _NPEvent -{ - uint16_t event; - uintptr_t wParam; - uintptr_t lParam; -} NPEvent; -#elif defined(XP_OS2) -typedef struct _NPEvent -{ - uint32_t event; - uint32_t wParam; - uint32_t lParam; -} NPEvent; -#elif defined(XP_UNIX) -typedef XEvent NPEvent; -#else -typedef void* NPEvent; -#endif - -#if defined(XP_MACOSX) -typedef void* NPRegion; -#ifndef NP_NO_QUICKDRAW -typedef RgnHandle NPQDRegion; -#endif -typedef CGPathRef NPCGRegion; -#elif defined(XP_WIN) -typedef HRGN NPRegion; -#elif defined(XP_UNIX) -typedef Region NPRegion; -#elif defined(XP_SYMBIAN) -typedef QRegion* NPRegion; -#else -typedef void *NPRegion; -#endif - -typedef struct _NPNSString NPNSString; -typedef struct _NPNSWindow NPNSWindow; -typedef struct _NPNSMenu NPNSMenu; - -#if defined(XP_MACOSX) -typedef NPNSMenu NPMenu; -#else -typedef void *NPMenu; -#endif - -typedef enum { - NPCoordinateSpacePlugin = 1, - NPCoordinateSpaceWindow, - NPCoordinateSpaceFlippedWindow, - NPCoordinateSpaceScreen, - NPCoordinateSpaceFlippedScreen -} NPCoordinateSpace; - -#if defined(XP_MACOSX) - -#ifndef NP_NO_QUICKDRAW -typedef struct NP_Port -{ - CGrafPtr port; - int32_t portx; /* position inside the topmost window */ - int32_t porty; -} NP_Port; -#endif /* NP_NO_QUICKDRAW */ - -/* - * NP_CGContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelCoreGraphics - * as its drawing model. - */ - -typedef struct NP_CGContext -{ - CGContextRef context; -#ifdef NP_NO_CARBON - NPNSWindow *window; -#else - void *window; /* A WindowRef or NULL for the Cocoa event model. */ -#endif -} NP_CGContext; - -/* - * NP_GLContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelOpenGL as its - * drawing model. - */ - -typedef struct NP_GLContext -{ - CGLContextObj context; -#ifdef NP_NO_CARBON - NPNSWindow *window; -#else - void *window; /* Can be either an NSWindow or a WindowRef depending on the event model */ -#endif -} NP_GLContext; - -typedef enum { - NPCocoaEventDrawRect = 1, - NPCocoaEventMouseDown, - NPCocoaEventMouseUp, - NPCocoaEventMouseMoved, - NPCocoaEventMouseEntered, - NPCocoaEventMouseExited, - NPCocoaEventMouseDragged, - NPCocoaEventKeyDown, - NPCocoaEventKeyUp, - NPCocoaEventFlagsChanged, - NPCocoaEventFocusChanged, - NPCocoaEventWindowFocusChanged, - NPCocoaEventScrollWheel, - NPCocoaEventTextInput -} NPCocoaEventType; - -typedef struct _NPCocoaEvent { - NPCocoaEventType type; - uint32_t version; - union { - struct { - uint32_t modifierFlags; - double pluginX; - double pluginY; - int32_t buttonNumber; - int32_t clickCount; - double deltaX; - double deltaY; - double deltaZ; - } mouse; - struct { - uint32_t modifierFlags; - NPNSString *characters; - NPNSString *charactersIgnoringModifiers; - NPBool isARepeat; - uint16_t keyCode; - } key; - struct { - CGContextRef context; - double x; - double y; - double width; - double height; - } draw; - struct { - NPBool hasFocus; - } focus; - struct { - NPNSString *text; - } text; - } data; -} NPCocoaEvent; - -#ifndef NP_NO_CARBON -/* Non-standard event types that can be passed to HandleEvent */ -enum NPEventType { - NPEventType_GetFocusEvent = (osEvt + 16), - NPEventType_LoseFocusEvent, - NPEventType_AdjustCursorEvent, - NPEventType_MenuCommandEvent, - NPEventType_ClippingChangedEvent, - NPEventType_ScrollingBeginsEvent = 1000, - NPEventType_ScrollingEndsEvent -}; -#endif /* NP_NO_CARBON */ - -#endif /* XP_MACOSX */ - -/* - * Values for mode passed to NPP_New: - */ -#define NP_EMBED 1 -#define NP_FULL 2 - -/* - * Values for stream type passed to NPP_NewStream: - */ -#define NP_NORMAL 1 -#define NP_SEEK 2 -#define NP_ASFILE 3 -#define NP_ASFILEONLY 4 - -#define NP_MAXREADY (((unsigned)(~0)<<1)>>1) - -/* - * Flags for NPP_ClearSiteData. - */ -#define NP_CLEAR_ALL 0 -#define NP_CLEAR_CACHE (1 << 0) - -#if !defined(__LP64__) -#if defined(XP_MACOSX) -#pragma options align=reset -#endif -#endif /* __LP64__ */ - -/*----------------------------------------------------------------------*/ -/* Error and Reason Code definitions */ -/*----------------------------------------------------------------------*/ - -/* - * Values of type NPError: - */ -#define NPERR_BASE 0 -#define NPERR_NO_ERROR (NPERR_BASE + 0) -#define NPERR_GENERIC_ERROR (NPERR_BASE + 1) -#define NPERR_INVALID_INSTANCE_ERROR (NPERR_BASE + 2) -#define NPERR_INVALID_FUNCTABLE_ERROR (NPERR_BASE + 3) -#define NPERR_MODULE_LOAD_FAILED_ERROR (NPERR_BASE + 4) -#define NPERR_OUT_OF_MEMORY_ERROR (NPERR_BASE + 5) -#define NPERR_INVALID_PLUGIN_ERROR (NPERR_BASE + 6) -#define NPERR_INVALID_PLUGIN_DIR_ERROR (NPERR_BASE + 7) -#define NPERR_INCOMPATIBLE_VERSION_ERROR (NPERR_BASE + 8) -#define NPERR_INVALID_PARAM (NPERR_BASE + 9) -#define NPERR_INVALID_URL (NPERR_BASE + 10) -#define NPERR_FILE_NOT_FOUND (NPERR_BASE + 11) -#define NPERR_NO_DATA (NPERR_BASE + 12) -#define NPERR_STREAM_NOT_SEEKABLE (NPERR_BASE + 13) - -/* - * Values of type NPReason: - */ -#define NPRES_BASE 0 -#define NPRES_DONE (NPRES_BASE + 0) -#define NPRES_NETWORK_ERR (NPRES_BASE + 1) -#define NPRES_USER_BREAK (NPRES_BASE + 2) - -/* - * Don't use these obsolete error codes any more. - */ -#define NP_NOERR NP_NOERR_is_obsolete_use_NPERR_NO_ERROR -#define NP_EINVAL NP_EINVAL_is_obsolete_use_NPERR_GENERIC_ERROR -#define NP_EABORT NP_EABORT_is_obsolete_use_NPRES_USER_BREAK - -/* - * Version feature information - */ -#define NPVERS_HAS_STREAMOUTPUT 8 -#define NPVERS_HAS_NOTIFICATION 9 -#define NPVERS_HAS_LIVECONNECT 9 -#define NPVERS_WIN16_HAS_LIVECONNECT 9 -#define NPVERS_68K_HAS_LIVECONNECT 11 -#define NPVERS_HAS_WINDOWLESS 11 -#define NPVERS_HAS_XPCONNECT_SCRIPTING 13 /* Not implemented in WebKit */ -#define NPVERS_HAS_NPRUNTIME_SCRIPTING 14 -#define NPVERS_HAS_FORM_VALUES 15 /* Not implemented in WebKit; see bug 13061 */ -#define NPVERS_HAS_POPUPS_ENABLED_STATE 16 /* Not implemented in WebKit */ -#define NPVERS_HAS_RESPONSE_HEADERS 17 -#define NPVERS_HAS_NPOBJECT_ENUM 18 -#define NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL 19 -#define NPVERS_HAS_ALL_NETWORK_STREAMS 20 -#define NPVERS_HAS_URL_AND_AUTH_INFO 21 -#define NPVERS_HAS_PRIVATE_MODE 22 -#define NPVERS_MACOSX_HAS_EVENT_MODELS 23 -#define NPVERS_HAS_CANCEL_SRC_STREAM 24 -#define NPVERS_HAS_ADVANCED_KEY_HANDLING 25 -#define NPVERS_HAS_URL_REDIRECT_HANDLING 26 -#define NPVERS_HAS_CLEAR_SITE_DATA 27 - -/*----------------------------------------------------------------------*/ -/* Function Prototypes */ -/*----------------------------------------------------------------------*/ - -#if defined(__OS2__) -#define NP_LOADDS _System -#else -#define NP_LOADDS -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* NPP_* functions are provided by the plugin and called by the navigator. */ - -#if defined(XP_UNIX) -char* NPP_GetMIMEDescription(void); -#endif - -NPError NP_LOADDS NPP_Initialize(void); -void NP_LOADDS NPP_Shutdown(void); -NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance, - uint16_t mode, int16_t argc, char* argn[], - char* argv[], NPSavedData* saved); -NPError NP_LOADDS NPP_Destroy(NPP instance, NPSavedData** save); -NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* window); -NPError NP_LOADDS NPP_NewStream(NPP instance, NPMIMEType type, - NPStream* stream, NPBool seekable, - uint16_t* stype); -NPError NP_LOADDS NPP_DestroyStream(NPP instance, NPStream* stream, - NPReason reason); -int32_t NP_LOADDS NPP_WriteReady(NPP instance, NPStream* stream); -int32_t NP_LOADDS NPP_Write(NPP instance, NPStream* stream, int32_t offset, - int32_t len, void* buffer); -void NP_LOADDS NPP_StreamAsFile(NPP instance, NPStream* stream, - const char* fname); -void NP_LOADDS NPP_Print(NPP instance, NPPrint* platformPrint); -int16_t NP_LOADDS NPP_HandleEvent(NPP instance, void* event); -void NP_LOADDS NPP_URLNotify(NPP instance, const char* url, - NPReason reason, void* notifyData); -jref NP_LOADDS NPP_GetJavaClass(void); -NPError NP_LOADDS NPP_GetValue(NPP instance, NPPVariable variable, void *value); -NPError NP_LOADDS NPP_SetValue(NPP instance, NPNVariable variable, void *value); -NPBool NP_LOADDS NPP_GotFocus(NPP instance, NPFocusDirection direction); -void NP_LOADDS NPP_LostFocus(NPP instance); -void NP_LOADDS NPP_URLRedirectNotify(NPP instance, const char* url, int32_t status, void* notifyData); -NPError NP_LOADDS NPP_ClearSiteData(const char* site, uint64_t flags, uint64_t maxAge); -char** NP_LOADDS NPP_GetSitesWithData(void); - -/* NPN_* functions are provided by the navigator and called by the plugin. */ -void NP_LOADDS NPN_Version(int* plugin_major, int* plugin_minor, - int* netscape_major, int* netscape_minor); -NPError NP_LOADDS NPN_GetURLNotify(NPP instance, const char* url, - const char* target, void* notifyData); -NPError NP_LOADDS NPN_GetURL(NPP instance, const char* url, - const char* target); -NPError NP_LOADDS NPN_PostURLNotify(NPP instance, const char* url, - const char* target, uint32_t len, - const char* buf, NPBool file, - void* notifyData); -NPError NP_LOADDS NPN_PostURL(NPP instance, const char* url, - const char* target, uint32_t len, - const char* buf, NPBool file); -NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* rangeList); -NPError NP_LOADDS NPN_NewStream(NPP instance, NPMIMEType type, - const char* target, NPStream** stream); -int32_t NP_LOADDS NPN_Write(NPP instance, NPStream* stream, int32_t len, - void* buffer); -NPError NP_LOADDS NPN_DestroyStream(NPP instance, NPStream* stream, - NPReason reason); -void NP_LOADDS NPN_Status(NPP instance, const char* message); -const char* NP_LOADDS NPN_UserAgent(NPP instance); -void* NP_LOADDS NPN_MemAlloc(uint32_t size); -void NP_LOADDS NPN_MemFree(void* ptr); -uint32_t NP_LOADDS NPN_MemFlush(uint32_t size); -void NP_LOADDS NPN_ReloadPlugins(NPBool reloadPages); -JRIEnv* NP_LOADDS NPN_GetJavaEnv(void); -jref NP_LOADDS NPN_GetJavaPeer(NPP instance); -NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable, - void *value); -NPError NP_LOADDS NPN_SetValue(NPP instance, NPPVariable variable, - void *value); -void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *invalidRect); -void NP_LOADDS NPN_InvalidateRegion(NPP instance, - NPRegion invalidRegion); -void NP_LOADDS NPN_ForceRedraw(NPP instance); -void NP_LOADDS NPN_PushPopupsEnabledState(NPP instance, NPBool enabled); -void NP_LOADDS NPN_PopPopupsEnabledState(NPP instance); -void NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance, - void (*func) (void *), - void *userData); -NPError NP_LOADDS NPN_GetValueForURL(NPP instance, NPNURLVariable variable, - const char *url, char **value, - uint32_t *len); -NPError NP_LOADDS NPN_SetValueForURL(NPP instance, NPNURLVariable variable, - const char *url, const char *value, - uint32_t len); -NPError NP_LOADDS NPN_GetAuthenticationInfo(NPP instance, - const char *protocol, - const char *host, int32_t port, - const char *scheme, - const char *realm, - char **username, uint32_t *ulen, - char **password, - uint32_t *plen); -uint32_t NP_LOADDS NPN_ScheduleTimer(NPP instance, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID)); -void NP_LOADDS NPN_UnscheduleTimer(NPP instance, uint32_t timerID); -NPError NP_LOADDS NPN_PopUpContextMenu(NPP instance, NPMenu* menu); -NPBool NP_LOADDS NPN_ConvertPoint(NPP instance, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace); - -#ifdef __cplusplus -} /* end extern "C" */ -#endif - -#endif /* RC_INVOKED */ -#if defined(__OS2__) -#pragma pack() -#endif - -#endif /* npapi_h_ */ diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npfunctions.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npfunctions.h deleted file mode 100644 index c54e473..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npfunctions.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2007 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 NPFUNCTIONS_H -#define NPFUNCTIONS_H - - -#include "npruntime.h" -#include "npapi.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(XP_WIN) -#define EXPORTED_CALLBACK(_type, _name) _type (__stdcall * _name) -#else -#define EXPORTED_CALLBACK(_type, _name) _type (* _name) -#endif - -typedef NPError (*NPN_GetURLNotifyProcPtr)(NPP instance, const char* URL, const char* window, void* notifyData); -typedef NPError (*NPN_PostURLNotifyProcPtr)(NPP instance, const char* URL, const char* window, uint32_t len, const char* buf, NPBool file, void* notifyData); -typedef NPError (*NPN_RequestReadProcPtr)(NPStream* stream, NPByteRange* rangeList); -typedef NPError (*NPN_NewStreamProcPtr)(NPP instance, NPMIMEType type, const char* window, NPStream** stream); -typedef int32_t (*NPN_WriteProcPtr)(NPP instance, NPStream* stream, int32_t len, void* buffer); -typedef NPError (*NPN_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason); -typedef void (*NPN_StatusProcPtr)(NPP instance, const char* message); -typedef const char*(*NPN_UserAgentProcPtr)(NPP instance); -typedef void* (*NPN_MemAllocProcPtr)(uint32_t size); -typedef void (*NPN_MemFreeProcPtr)(void* ptr); -typedef uint32_t (*NPN_MemFlushProcPtr)(uint32_t size); -typedef void (*NPN_ReloadPluginsProcPtr)(NPBool reloadPages); -typedef NPError (*NPN_GetValueProcPtr)(NPP instance, NPNVariable variable, void *ret_value); -typedef NPError (*NPN_SetValueProcPtr)(NPP instance, NPPVariable variable, void *value); -typedef void (*NPN_InvalidateRectProcPtr)(NPP instance, NPRect *rect); -typedef void (*NPN_InvalidateRegionProcPtr)(NPP instance, NPRegion region); -typedef void (*NPN_ForceRedrawProcPtr)(NPP instance); -typedef NPError (*NPN_GetURLProcPtr)(NPP instance, const char* URL, const char* window); -typedef NPError (*NPN_PostURLProcPtr)(NPP instance, const char* URL, const char* window, uint32_t len, const char* buf, NPBool file); -typedef void* (*NPN_GetJavaEnvProcPtr)(void); -typedef void* (*NPN_GetJavaPeerProcPtr)(NPP instance); -typedef void (*NPN_PushPopupsEnabledStateProcPtr)(NPP instance, NPBool enabled); -typedef void (*NPN_PopPopupsEnabledStateProcPtr)(NPP instance); -typedef void (*NPN_PluginThreadAsyncCallProcPtr)(NPP npp, void (*func)(void *), void *userData); -typedef NPError (*NPN_GetValueForURLProcPtr)(NPP npp, NPNURLVariable variable, const char* url, char** value, uint32_t* len); -typedef NPError (*NPN_SetValueForURLProcPtr)(NPP npp, NPNURLVariable variable, const char* url, const char* value, uint32_t len); -typedef NPError (*NPN_GetAuthenticationInfoProcPtr)(NPP npp, const char* protocol, const char* host, int32_t port, const char* scheme, const char *realm, char** username, uint32_t* ulen, char** password, uint32_t* plen); - -typedef uint32_t (*NPN_ScheduleTimerProcPtr)(NPP npp, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID)); -typedef void (*NPN_UnscheduleTimerProcPtr)(NPP npp, uint32_t timerID); -typedef NPError (*NPN_PopUpContextMenuProcPtr)(NPP instance, NPMenu* menu); -typedef NPBool (*NPN_ConvertPointProcPtr)(NPP npp, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace); - -typedef void (*NPN_ReleaseVariantValueProcPtr) (NPVariant *variant); - -typedef NPIdentifier (*NPN_GetStringIdentifierProcPtr) (const NPUTF8 *name); -typedef void (*NPN_GetStringIdentifiersProcPtr) (const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers); -typedef NPIdentifier (*NPN_GetIntIdentifierProcPtr) (int32_t intid); -typedef int32_t (*NPN_IntFromIdentifierProcPtr) (NPIdentifier identifier); -typedef bool (*NPN_IdentifierIsStringProcPtr) (NPIdentifier identifier); -typedef NPUTF8 *(*NPN_UTF8FromIdentifierProcPtr) (NPIdentifier identifier); - -typedef NPObject* (*NPN_CreateObjectProcPtr) (NPP, NPClass *aClass); -typedef NPObject* (*NPN_RetainObjectProcPtr) (NPObject *obj); -typedef void (*NPN_ReleaseObjectProcPtr) (NPObject *obj); -typedef bool (*NPN_InvokeProcPtr) (NPP npp, NPObject *obj, NPIdentifier methodName, const NPVariant *args, unsigned argCount, NPVariant *result); -typedef bool (*NPN_InvokeDefaultProcPtr) (NPP npp, NPObject *obj, const NPVariant *args, unsigned argCount, NPVariant *result); -typedef bool (*NPN_EvaluateProcPtr) (NPP npp, NPObject *obj, NPString *script, NPVariant *result); -typedef bool (*NPN_GetPropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier propertyName, NPVariant *result); -typedef bool (*NPN_SetPropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier propertyName, const NPVariant *value); -typedef bool (*NPN_HasPropertyProcPtr) (NPP, NPObject *npobj, NPIdentifier propertyName); -typedef bool (*NPN_HasMethodProcPtr) (NPP npp, NPObject *npobj, NPIdentifier methodName); -typedef bool (*NPN_RemovePropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier propertyName); -typedef void (*NPN_SetExceptionProcPtr) (NPObject *obj, const NPUTF8 *message); -typedef bool (*NPN_EnumerateProcPtr) (NPP npp, NPObject *npobj, NPIdentifier **identifier, uint32_t *count); -typedef bool (*NPN_ConstructProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result); - -typedef NPError (*NPP_NewProcPtr)(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved); -typedef NPError (*NPP_DestroyProcPtr)(NPP instance, NPSavedData** save); -typedef NPError (*NPP_SetWindowProcPtr)(NPP instance, NPWindow* window); -typedef NPError (*NPP_NewStreamProcPtr)(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype); -typedef NPError (*NPP_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason); -typedef void (*NPP_StreamAsFileProcPtr)(NPP instance, NPStream* stream, const char* fname); -typedef int32_t (*NPP_WriteReadyProcPtr)(NPP instance, NPStream* stream); -typedef int32_t (*NPP_WriteProcPtr)(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer); -typedef void (*NPP_PrintProcPtr)(NPP instance, NPPrint* platformPrint); -typedef int16_t (*NPP_HandleEventProcPtr)(NPP instance, void* event); -typedef void (*NPP_URLNotifyProcPtr)(NPP instance, const char* URL, NPReason reason, void* notifyData); -typedef NPError (*NPP_GetValueProcPtr)(NPP instance, NPPVariable variable, void *ret_value); -typedef NPError (*NPP_SetValueProcPtr)(NPP instance, NPNVariable variable, void *value); -typedef NPBool (*NPP_GotFocusPtr)(NPP instance, NPFocusDirection direction); -typedef void (*NPP_LostFocusPtr)(NPP instance); -typedef void (*NPP_URLRedirectNotifyPtr)(NPP instance, const char* url, int32_t status, void* notifyData); -typedef NPError (*NPP_ClearSiteDataPtr)(const char* site, uint64_t flags, uint64_t maxAge); -typedef char** (*NPP_GetSitesWithDataPtr)(void); - -typedef void *(*NPP_GetJavaClassProcPtr)(void); -typedef void* JRIGlobalRef; //not using this right now - -typedef struct _NPNetscapeFuncs { - uint16_t size; - uint16_t version; - - NPN_GetURLProcPtr geturl; - NPN_PostURLProcPtr posturl; - NPN_RequestReadProcPtr requestread; - NPN_NewStreamProcPtr newstream; - NPN_WriteProcPtr write; - NPN_DestroyStreamProcPtr destroystream; - NPN_StatusProcPtr status; - NPN_UserAgentProcPtr uagent; - NPN_MemAllocProcPtr memalloc; - NPN_MemFreeProcPtr memfree; - NPN_MemFlushProcPtr memflush; - NPN_ReloadPluginsProcPtr reloadplugins; - NPN_GetJavaEnvProcPtr getJavaEnv; - NPN_GetJavaPeerProcPtr getJavaPeer; - NPN_GetURLNotifyProcPtr geturlnotify; - NPN_PostURLNotifyProcPtr posturlnotify; - NPN_GetValueProcPtr getvalue; - NPN_SetValueProcPtr setvalue; - NPN_InvalidateRectProcPtr invalidaterect; - NPN_InvalidateRegionProcPtr invalidateregion; - NPN_ForceRedrawProcPtr forceredraw; - - NPN_GetStringIdentifierProcPtr getstringidentifier; - NPN_GetStringIdentifiersProcPtr getstringidentifiers; - NPN_GetIntIdentifierProcPtr getintidentifier; - NPN_IdentifierIsStringProcPtr identifierisstring; - NPN_UTF8FromIdentifierProcPtr utf8fromidentifier; - NPN_IntFromIdentifierProcPtr intfromidentifier; - NPN_CreateObjectProcPtr createobject; - NPN_RetainObjectProcPtr retainobject; - NPN_ReleaseObjectProcPtr releaseobject; - NPN_InvokeProcPtr invoke; - NPN_InvokeDefaultProcPtr invokeDefault; - NPN_EvaluateProcPtr evaluate; - NPN_GetPropertyProcPtr getproperty; - NPN_SetPropertyProcPtr setproperty; - NPN_RemovePropertyProcPtr removeproperty; - NPN_HasPropertyProcPtr hasproperty; - NPN_HasMethodProcPtr hasmethod; - NPN_ReleaseVariantValueProcPtr releasevariantvalue; - NPN_SetExceptionProcPtr setexception; - NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate; - NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate; - NPN_EnumerateProcPtr enumerate; - NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall; - NPN_ConstructProcPtr construct; - NPN_GetValueForURLProcPtr getvalueforurl; - NPN_SetValueForURLProcPtr setvalueforurl; - NPN_GetAuthenticationInfoProcPtr getauthenticationinfo; - NPN_ScheduleTimerProcPtr scheduletimer; - NPN_UnscheduleTimerProcPtr unscheduletimer; - NPN_PopUpContextMenuProcPtr popupcontextmenu; - NPN_ConvertPointProcPtr convertpoint; -} NPNetscapeFuncs; - -typedef struct _NPPluginFuncs { - uint16_t size; - uint16_t version; - NPP_NewProcPtr newp; - NPP_DestroyProcPtr destroy; - NPP_SetWindowProcPtr setwindow; - NPP_NewStreamProcPtr newstream; - NPP_DestroyStreamProcPtr destroystream; - NPP_StreamAsFileProcPtr asfile; - NPP_WriteReadyProcPtr writeready; - NPP_WriteProcPtr write; - NPP_PrintProcPtr print; - NPP_HandleEventProcPtr event; - NPP_URLNotifyProcPtr urlnotify; - JRIGlobalRef javaClass; - NPP_GetValueProcPtr getvalue; - NPP_SetValueProcPtr setvalue; - NPP_GotFocusPtr gotfocus; - NPP_LostFocusPtr lostfocus; - NPP_URLRedirectNotifyPtr urlredirectnotify; - NPP_ClearSiteDataPtr clearsitedata; - NPP_GetSitesWithDataPtr getsiteswithdata; -} NPPluginFuncs; - -typedef EXPORTED_CALLBACK(NPError, NP_GetEntryPointsFuncPtr)(NPPluginFuncs*); -typedef EXPORTED_CALLBACK(void, NPP_ShutdownProcPtr)(void); - -#if defined(XP_MACOSX) -typedef void (*BP_CreatePluginMIMETypesPreferencesFuncPtr)(void); -typedef NPError (*MainFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*, NPP_ShutdownProcPtr*); -#endif - -#if defined(XP_UNIX) -typedef EXPORTED_CALLBACK(NPError, NP_InitializeFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*); -typedef EXPORTED_CALLBACK(char*, NP_GetMIMEDescriptionFuncPtr)(void); -#else -typedef EXPORTED_CALLBACK(NPError, NP_InitializeFuncPtr)(NPNetscapeFuncs*); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npruntime.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npruntime.h deleted file mode 100644 index 828a340..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/npruntime.h +++ /dev/null @@ -1,393 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * Copyright (c) 2004, Apple Computer, Inc. and The Mozilla Foundation. - * 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. - * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla - * Foundation ("Mozilla") nor the names of their contributors may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "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, MOZILLA OR - * THEIR 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 _NP_RUNTIME_H_ -#define _NP_RUNTIME_H_ - -#include "npapi.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - This API is used to facilitate binding code written in C to script - objects. The API in this header does not assume the presence of a - user agent. That is, it can be used to bind C code to scripting - environments outside of the context of a user agent. - - However, the normal use of the this API is in the context of a - scripting environment running in a browser or other user agent. - In particular it is used to support the extended Netscape - script-ability API for plugins (NP-SAP). NP-SAP is an extension - of the Netscape plugin API. As such we have adopted the use of - the "NP" prefix for this API. - - The following NP{N|P}Variables were added to the Netscape plugin - API (in npapi.h): - - NPNVWindowNPObject - NPNVPluginElementNPObject - NPPVpluginScriptableNPObject - - These variables are exposed through NPN_GetValue() and - NPP_GetValue() (respectively) and are used to establish the - initial binding between the user agent and native code. The DOM - objects in the user agent can be examined and manipulated using - the NPN_ functions that operate on NPObjects described in this - header. - - To the extent possible the assumptions about the scripting - language used by the scripting environment have been minimized. -*/ - -#define NP_BEGIN_MACRO do { -#define NP_END_MACRO } while (0) - -/* - Objects (non-primitive data) passed between 'C' and script is - always wrapped in an NPObject. The 'interface' of an NPObject is - described by an NPClass. -*/ -typedef struct NPObject NPObject; -typedef struct NPClass NPClass; - -typedef char NPUTF8; -typedef struct _NPString { - const NPUTF8 *UTF8Characters; - uint32_t UTF8Length; -} NPString; - -typedef enum { - NPVariantType_Void, - NPVariantType_Null, - NPVariantType_Bool, - NPVariantType_Int32, - NPVariantType_Double, - NPVariantType_String, - NPVariantType_Object -} NPVariantType; - -typedef struct _NPVariant { - NPVariantType type; - union { - bool boolValue; - int32_t intValue; - double doubleValue; - NPString stringValue; - NPObject *objectValue; - } value; -} NPVariant; - -/* - NPN_ReleaseVariantValue is called on all 'out' parameters - references. Specifically it is to be called on variants that own - their value, as is the case with all non-const NPVariant* - arguments after a successful call to any methods (except this one) - in this API. - - After calling NPN_ReleaseVariantValue, the type of the variant - will be NPVariantType_Void. -*/ -void NPN_ReleaseVariantValue(NPVariant *variant); - -#define NPVARIANT_IS_VOID(_v) ((_v).type == NPVariantType_Void) -#define NPVARIANT_IS_NULL(_v) ((_v).type == NPVariantType_Null) -#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool) -#define NPVARIANT_IS_INT32(_v) ((_v).type == NPVariantType_Int32) -#define NPVARIANT_IS_DOUBLE(_v) ((_v).type == NPVariantType_Double) -#define NPVARIANT_IS_STRING(_v) ((_v).type == NPVariantType_String) -#define NPVARIANT_IS_OBJECT(_v) ((_v).type == NPVariantType_Object) - -#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue) -#define NPVARIANT_TO_INT32(_v) ((_v).value.intValue) -#define NPVARIANT_TO_DOUBLE(_v) ((_v).value.doubleValue) -#define NPVARIANT_TO_STRING(_v) ((_v).value.stringValue) -#define NPVARIANT_TO_OBJECT(_v) ((_v).value.objectValue) - -#define VOID_TO_NPVARIANT(_v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_Void; \ - (_v).value.objectValue = NULL; \ -NP_END_MACRO - -#define NULL_TO_NPVARIANT(_v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_Null; \ - (_v).value.objectValue = NULL; \ -NP_END_MACRO - -#define BOOLEAN_TO_NPVARIANT(_val, _v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_Bool; \ - (_v).value.boolValue = !!(_val); \ -NP_END_MACRO - -#define INT32_TO_NPVARIANT(_val, _v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_Int32; \ - (_v).value.intValue = _val; \ -NP_END_MACRO - -#define DOUBLE_TO_NPVARIANT(_val, _v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_Double; \ - (_v).value.doubleValue = _val; \ -NP_END_MACRO - -#define STRINGZ_TO_NPVARIANT(_val, _v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_String; \ - NPString str = { _val, uint32_t(strlen(_val)) }; \ - (_v).value.stringValue = str; \ -NP_END_MACRO - -#define STRINGN_TO_NPVARIANT(_val, _len, _v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_String; \ - NPString str = { _val, uint32_t(_len) }; \ - (_v).value.stringValue = str; \ -NP_END_MACRO - -#define OBJECT_TO_NPVARIANT(_val, _v) \ -NP_BEGIN_MACRO \ - (_v).type = NPVariantType_Object; \ - (_v).value.objectValue = _val; \ -NP_END_MACRO - - -/* - Type mappings (JavaScript types have been used for illustration - purposes): - - JavaScript to C (NPVariant with type:) - undefined NPVariantType_Void - null NPVariantType_Null - Boolean NPVariantType_Bool - Number NPVariantType_Double or NPVariantType_Int32 - String NPVariantType_String - Object NPVariantType_Object - - C (NPVariant with type:) to JavaScript - NPVariantType_Void undefined - NPVariantType_Null null - NPVariantType_Bool Boolean - NPVariantType_Int32 Number - NPVariantType_Double Number - NPVariantType_String String - NPVariantType_Object Object -*/ - -typedef void *NPIdentifier; - -/* - NPObjects have methods and properties. Methods and properties are - identified with NPIdentifiers. These identifiers may be reflected - in script. NPIdentifiers can be either strings or integers, IOW, - methods and properties can be identified by either strings or - integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be - compared using ==. In case of any errors, the requested - NPIdentifier(s) will be NULL. NPIdentifier lifetime is controlled - by the browser. Plugins do not need to worry about memory management - with regards to NPIdentifiers. -*/ -NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name); -void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, - NPIdentifier *identifiers); -NPIdentifier NPN_GetIntIdentifier(int32_t intid); -bool NPN_IdentifierIsString(NPIdentifier identifier); - -/* - The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed. -*/ -NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier); - -/* - Get the integer represented by identifier. If identifier is not an - integer identifier, the behaviour is undefined. -*/ -int32_t NPN_IntFromIdentifier(NPIdentifier identifier); - -/* - NPObject behavior is implemented using the following set of - callback functions. - - The NPVariant *result argument of these functions (where - applicable) should be released using NPN_ReleaseVariantValue(). -*/ -typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass); -typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj); -typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj); -typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name); -typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name, - const NPVariant *args, uint32_t argCount, - NPVariant *result); -typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, - const NPVariant *args, - uint32_t argCount, - NPVariant *result); -typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name); -typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name, - NPVariant *result); -typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name, - const NPVariant *value); -typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj, - NPIdentifier name); -typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value, - uint32_t *count); -typedef bool (*NPConstructFunctionPtr)(NPObject *npobj, - const NPVariant *args, - uint32_t argCount, - NPVariant *result); - -/* - NPObjects returned by create, retain, invoke, and getProperty pass - a reference count to the caller. That is, the callee adds a - reference count which passes to the caller. It is the caller's - responsibility to release the returned object. - - NPInvokeFunctionPtr function may return 0 to indicate a void - result. - - NPInvalidateFunctionPtr is called by the scripting environment - when the native code is shutdown. Any attempt to message a - NPObject instance after the invalidate callback has been - called will result in undefined behavior, even if the native code - is still retaining those NPObject instances. (The runtime - will typically return immediately, with 0 or NULL, from an attempt - to dispatch to a NPObject, but this behavior should not be - depended upon.) - - The NPEnumerationFunctionPtr function may pass an array of - NPIdentifiers back to the caller. The callee allocs the memory of - the array using NPN_MemAlloc(), and it's the caller's responsibility - to release it using NPN_MemFree(). -*/ -struct NPClass -{ - uint32_t structVersion; - NPAllocateFunctionPtr allocate; - NPDeallocateFunctionPtr deallocate; - NPInvalidateFunctionPtr invalidate; - NPHasMethodFunctionPtr hasMethod; - NPInvokeFunctionPtr invoke; - NPInvokeDefaultFunctionPtr invokeDefault; - NPHasPropertyFunctionPtr hasProperty; - NPGetPropertyFunctionPtr getProperty; - NPSetPropertyFunctionPtr setProperty; - NPRemovePropertyFunctionPtr removeProperty; - NPEnumerationFunctionPtr enumerate; - NPConstructFunctionPtr construct; -}; - -#define NP_CLASS_STRUCT_VERSION 3 - -#define NP_CLASS_STRUCT_VERSION_ENUM 2 -#define NP_CLASS_STRUCT_VERSION_CTOR 3 - -#define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass) \ - ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM) - -#define NP_CLASS_STRUCT_VERSION_HAS_CTOR(npclass) \ - ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR) - -struct NPObject { - NPClass *_class; - uint32_t referenceCount; - /* - * Additional space may be allocated here by types of NPObjects - */ -}; - -/* - If the class has an allocate function, NPN_CreateObject invokes - that function, otherwise a NPObject is allocated and - returned. This method will initialize the referenceCount member of - the NPObject to 1. -*/ -NPObject *NPN_CreateObject(NPP npp, NPClass *aClass); - -/* - Increment the NPObject's reference count. -*/ -NPObject *NPN_RetainObject(NPObject *npobj); - -/* - Decremented the NPObject's reference count. If the reference - count goes to zero, the class's destroy function is invoke if - specified, otherwise the object is freed directly. -*/ -void NPN_ReleaseObject(NPObject *npobj); - -/* - Functions to access script objects represented by NPObject. - - Calls to script objects are synchronous. If a function returns a - value, it will be supplied via the result NPVariant - argument. Successful calls will return true, false will be - returned in case of an error. - - Calls made from plugin code to script must be made from the thread - on which the plugin was initialized. -*/ - -bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, - const NPVariant *args, uint32_t argCount, NPVariant *result); -bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, - uint32_t argCount, NPVariant *result); -bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, - NPVariant *result); -bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, - NPVariant *result); -bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, - const NPVariant *value); -bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName); -bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName); -bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName); -bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier, - uint32_t *count); -bool NPN_Construct(NPP npp, NPObject *npobj, const NPVariant *args, - uint32_t argCount, NPVariant *result); - -/* - NPN_SetException may be called to trigger a script exception upon - return from entry points into NPObjects. Typical usage: - - NPN_SetException (npobj, message); -*/ -void NPN_SetException(NPObject *npobj, const NPUTF8 *message); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/nptypes.h b/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/nptypes.h deleted file mode 100644 index 4ebeb97..0000000 --- a/applications/hbbtvplayer/hbbtvbrowserplugin/src/webkit-plugin-header/nptypes.h +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * mozilla.org. - * Portions created by the Initial Developer are Copyright (C) 2004 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Johnny Stenback (Original author) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nptypes_h_ -#define nptypes_h_ - -/* - * Header file for ensuring that C99 types ([u]int32_t, [u]int64_t and bool) and - * true/false macros are available. - */ - -#if defined(WIN32) || defined(OS2) - /* - * Win32 and OS/2 don't know C99, so define [u]int_16/32/64 here. The bool - * is predefined tho, both in C and C++. - */ - typedef short int16_t; - typedef unsigned short uint16_t; - typedef int int32_t; - typedef unsigned int uint32_t; - typedef long long int64_t; - typedef unsigned long long uint64_t; - -#elif defined(_AIX) || defined(__sun) || defined(__osf__) || defined(IRIX) || defined(HPUX) - /* - * AIX and SunOS ship a inttypes.h header that defines [u]int32_t, - * but not bool for C. - */ - #include - - #ifndef __cplusplus - typedef int bool; - #define true 1 - #define false 0 - #endif -#elif defined(bsdi) || defined(FREEBSD) || defined(OPENBSD) - /* - * BSD/OS, FreeBSD, and OpenBSD ship sys/types.h that define int32_t and - * u_int32_t. - */ - #include - - /* - * BSD/OS ships no header that defines uint32_t, nor bool (for C) - */ - #if defined(bsdi) - typedef u_int32_t uint32_t; - typedef u_int64_t uint64_t; - - #if !defined(__cplusplus) - typedef int bool; - #define true 1 - #define false 0 - #endif - #else - /* - * FreeBSD and OpenBSD define uint32_t and bool. - */ - #include - #include - #endif -#elif defined(BEOS) - #include -#else - /* - * For those that ship a standard C99 stdint.h header file, include - * it. Can't do the same for stdbool.h tho, since some systems ship - * with a stdbool.h file that doesn't compile! - */ - #include - - #ifndef __cplusplus - #if !defined(__GNUC__) || (__GNUC__ > 2 || __GNUC_MINOR__ > 95) - #include - #else - /* - * GCC 2.91 can't deal with a typedef for bool, but a #define - * works. - */ - #define bool int - #define true 1 - #define false 0 - #endif - #endif -#endif - -#endif /* nptypes_h_ */ diff --git a/applications/hbbtvplayer/hbbtvterminal/autogen.sh b/applications/hbbtvplayer/hbbtvterminal/autogen.sh deleted file mode 100644 index cad4e11..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/autogen.sh +++ /dev/null @@ -1,6 +0,0 @@ - -#! /bin/sh - -autoreconf --install -v - -./configure diff --git a/applications/hbbtvplayer/hbbtvterminal/configure.ac b/applications/hbbtvplayer/hbbtvterminal/configure.ac deleted file mode 100644 index 866a299..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/configure.ac +++ /dev/null @@ -1,40 +0,0 @@ -########################################################################################### -## -## Copyright 2011 Telecom Paristech -## Author : Stanislas Selle -## -########################################################################################### - -### Configure.ac for hbbtvterminal - - -AC_INIT([hbbtvterminal], [0.1.0], [stanislas.selle@telecom-paristech.fr]) - -AC_CONFIG_AUX_DIR([build-aux]) - -AC_CONFIG_MACRO_DIR([m4]) -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - -AM_INIT_AUTOMAKE([foreign -Wall -Werror]) - -#check programs -AC_PROG_CXX - -#check modules -PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.28.0]) -PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.20.1]) -PKG_CHECK_MODULES([WEBKIT], [webkit-1.0 >= 1.5.2]) -PKG_CHECK_MODULES([PIXMAN], [pixman-1 >= 0.16.4]) -PKG_CHECK_MODULES([HBBTVBROWSERPLUGIN], [hbbtvbrowserplugin >= 0.0.3]) - -# Checks for header files. -AC_PATH_X - -# check header -AC_HEADER_STDBOOL - -# makefiles -AC_CONFIG_FILES([makefile src/makefile]) - - -AC_OUTPUT diff --git a/applications/hbbtvplayer/hbbtvterminal/hbbtv_terminal.vcproj b/applications/hbbtvplayer/hbbtvterminal/hbbtv_terminal.vcproj deleted file mode 100644 index 987a985..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/hbbtv_terminal.vcproj +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/hbbtvplayer/hbbtvterminal/makefile.am b/applications/hbbtvplayer/hbbtvterminal/makefile.am deleted file mode 100644 index e21b6f2..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/makefile.am +++ /dev/null @@ -1,17 +0,0 @@ - -SUBDIRS = src - -#TESTTS = /home/selle/ressources/mpeg2-ts-hbbtv/TPT/OpenHbb-ch4.ts -TESTTS = /home/selle/ressources/OpenHbbDemo-3ch2app/OpenHbbDemo-3ch2app.ts - - -TESTURL1 = http://cairhblog.free.fr/menu.html -TESTURL2 = http://aquila.enst.fr:8080/subwebsite/hbbtvtest/oha0005web/index.php -TESTLOG = /tmp/test-err.txt - -test : all - ./src/hbbtvterminal -input=$(TESTTS) -test1 : all - ./src/hbbtvterminal -input=$(TESTTS) -url=$(TESTURL1) -test2 : all - ./src/hbbtvterminal -input=$(TESTTS) -url=$(TESTURL2) diff --git a/applications/hbbtvplayer/hbbtvterminal/makefile.old b/applications/hbbtvplayer/hbbtvterminal/makefile.old deleted file mode 100644 index b56fe1b..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/makefile.old +++ /dev/null @@ -1,81 +0,0 @@ -## -## Copyright : Telecom Paristech - 2011 -## -## Author : Stanislas Selle -## - -############################################################################### -## Programs - -COMPILER = g++ -DELETER = rm -f - - -CFLAGS = -g - -CFLAGS += -DXP_UNIX -CFLAGS += -fPIC - -############################################################################### -## Options, Flags and LinkS - -INCLUDEFLAGS = -I/usr/include/xulrunner-lastest/ \ - -I../../gpac_public/include/ \ - -I../hbbtvbrowserplugin/src/ \ - -I../../gpac_public/ - -LIBRARYPATHS = -L/usr/lib/xulrunner-devel-lastest/sdk/lib/ \ - -L../../gpac_public/bin/gcc/ \ - -L../hbbtvbrowserplugin/bin/ - -LIBRARYNAMES = -lgpac \ - -lmozjs \ - -lxpcom \ - -lxul \ - ../hbbtvbrowserplugin/bin/hbbtvbrowserplugin.so - - -LIBRARYFLAGS = $(LIBRARYPATHS) $(LIBRARYNAMES) - -FROMPKG = webkit-1.0 gtk+-2.0 pixman-1 - -ifneq ($(strip $(FROMPKG)),) -PKGFLAGS = `pkg-config --cflags $(FROMPKG) ` -PKGLIBS = `pkg-config --libs $(FROMPKG) ` -INCLUDEFLAGS += $(PKGFLAGS) -LIBRARYFLAGS += $(PKGLIBS) -endif - - -############################################################################### -## Files - - -MAINTARGET = bin/hbbtvterminal - -OBJ = obj/hbbtvterminal.o \ - obj/hbbtv_demux.o \ - obj/hbbtv_channel.o - -#TESTTS = /home/selle/ressources/OpenHbbDemo-3ch2app/OpenHbbDemo-3ch2app.ts -TESTTS = /home/selle/ressources/mpeg2-ts-hbbtv/TPT/OpenHbb-ch4.ts -TESTURL = http://aquila.enst.fr:8080/subwebsite/hbbtvtest/oha0005web/index.php -TESTLOG = /tmp/test-err.txt - -############################################################################### -## Rules - - -all : $(MAINTARGET) - -$(MAINTARGET) : $(OBJ) - $(COMPILER) $(CFLAGS) $(LIBRARYFLAGS) $(OBJ) -o $(MAINTARGET) - -obj/%.o : src/%.cpp - $(COMPILER) $(CFLAGS) $(INCLUDEFLAGS) -c $^ -o $@ - -test : all - $(MAINTARGET) -input=$(TESTTS) - -clean : - rm -f $(OBJ) $(MAINTARGET) diff --git a/applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.cbp b/applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.cbp deleted file mode 100644 index 8f32993..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.cbp +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - diff --git a/applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.layout b/applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.layout deleted file mode 100644 index c091bfa..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/projectmanager/codeblocks/hbbtvterminal/HbbtvTerminal.layout +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_channel.cpp b/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_channel.cpp deleted file mode 100644 index 37e4427..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_channel.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Jonathan Sillan - * - */ - -#include "hbbtvterminal.h" - -static Bool app_priority_test(GF_M2TS_AIT_APPLICATION*,u8 app_priority,u8 app_transport, u8 MaxPriority); - -/* Constructor */ -Channel::Channel(u32 TSservice_ID, char* TSchannel_name){ - - u8 i; - service_ID = TSservice_ID; - if(TSchannel_name){ - channel_name = gf_strdup(channel_name); - }else{ - channel_name = NULL; - } - - video_ID = 0; - for(i=0 ; i= nb_chan_audio_stream){ - indice = 0; - } - current_audio_index = indice; - return audio_ID[indice]; -} - -u32 Channel::Get_ait_pid(){ - return AIT_PID; -} - -u32 Channel::Get_pmt_pid(){ - return PMT_PID; -} - -Bool Channel::Get_processed(){ - return processed; -} - -u32 Channel::Get_audio_index(){ - return current_audio_index; -} - -u32 Channel::Get_nb_chan_audio_stream(){ - return nb_chan_audio_stream; -} - -GF_M2TS_CHANNEL_APPLICATION_INFO*Channel::Get_App_info(){ - return ChannelApp; -} - -GF_M2TS_AIT_APPLICATION* Channel::App_to_play(Bool isConnected,u8 MaxPriority){ - u32 i; - Bool App_selected; - u32 app_index; - u8 app_priority; - u8 app_transport; - - App_selected = 0; - app_priority = 0; - app_index = 0; - app_transport = 0; - - for(i = 0 ; inb_application; i++){ - GF_M2TS_AIT_APPLICATION* App_info = (GF_M2TS_AIT_APPLICATION*)gf_list_get(ChannelApp->Application,i); - if((isConnected && App_info->broadband) || App_info->broadcast){ - if(App_info->application_control_code == AUTOSTART){ - if(app_priority_test(App_info,app_priority,isConnected,MaxPriority)){ - app_priority = App_info->priority; - app_index = i; - App_selected = 1; - if(!app_transport && App_info->broadband && isConnected){ - app_transport = BROADBAND; - }else{ - app_transport = BROADCAST; - } - - } - } - } - } - if(App_selected){ - GF_M2TS_AIT_APPLICATION* App_info = (GF_M2TS_AIT_APPLICATION*)gf_list_get(ChannelApp->Application,app_index); - return App_info; - } - return NULL; -} - -GF_M2TS_AIT_APPLICATION* Channel::Get_App(u32 application_id){ - u32 i; - - for(i = 0 ; inb_application; i++){ - GF_M2TS_AIT_APPLICATION* App_info = (GF_M2TS_AIT_APPLICATION*)gf_list_get(ChannelApp->Application,i); - if(App_info->application_id == application_id){ - return App_info; - } - } - return NULL; -} - - - -/* Class Fonction */ - -u32 Channel::Add_service_id(u32 service_id){ - if(service_id){ - service_ID = service_id; - return GF_OK; - } - return GF_BAD_PARAM; -} - -u32 Channel::Add_channel_name(char* chan_name){ - if(chan_name != NULL){ - channel_name = gf_strdup(chan_name); - return GF_OK; - } - return GF_BAD_PARAM; -} -u32 Channel::Add_video_ID(u32 video_index){ - if(video_index){ - video_ID = video_index; - return GF_OK; - } - return GF_BAD_PARAM; -} - -u32 Channel::Add_audio_ID(u32 audio_index){ - if(audio_index){ - u32 i; - for(i = 0; ipriority >= MaxPriority && (MaxPriority >0)) && - ((app_priority < App_info->priority) || (app_priority == App_info->priority)) - && ((isConnected && App_info->broadband)||App_info->broadcast)){ - return 1; - } - - return 0; -} diff --git a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_demux.cpp b/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_demux.cpp deleted file mode 100644 index 9bdaebf..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_demux.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Jonathan Sillan - * - */ - -#include "hbbtvterminal.h" - -static u32 New_ait_received(HbbtvDemuxer* hbbtv_demuxer,GF_M2TS_AIT *ait, char *data, u32 data_size, u32 table_id); -static u32 On_hbbtv_ait_section(sPlayerInterface* player_interf, GF_Event *event); -static u32 On_hbbtv_dsmcc_section(sPlayerInterface* player_interf, GF_Event *event); -static u32 On_hbbtv_get_tsdemuxer(sPlayerInterface* player_interf, GF_Event *event); - - - -/* Constructor */ -HbbtvDemuxer::HbbtvDemuxer(char *input_data, char* url, Bool dsmcc, Bool no_url,sPlayerInterface* player_interf) -{ - - Demuxts = NULL; - - Channels = gf_list_new(); - Input_data = gf_strdup(input_data); - user = player_interf; - player_interf->Demuxer = this; - ait_to_process = 0; - nb_prog_pmt_received = 0; - all_prog_pmt_received =0; - No_URL = 0; - Ignore_TS_URL = 0; - if(dsmcc){ - process_dsmcc = 1; - }else{ - process_dsmcc = 0; - } - - if(no_url){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] No URL \n")); - No_URL = 1; - }else if(url){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Forced URL %s \n",url)); - Force_URL = gf_strdup(url); - Ignore_TS_URL = 1; - } - nb_ait = 0; - ts_demux_mutex = gf_mx_new("HBBTV_TS_Demux_Mutex"); - - ts_demux_thread = gf_th_new("HBBTV_TS_Demux_Thread"); - -} - -/* Destructor */ - -/* Getter */ - -GF_M2TS_Demuxer* HbbtvDemuxer::Get_Ts() -{ - return Demuxts; -} - -GF_List* HbbtvDemuxer::Get_AIT_To_Process_list() -{ - return Ait_To_Process; -} - -char* HbbtvDemuxer::Get_Input_data() -{ - return Input_data; -} - -Bool HbbtvDemuxer::Get_if_dsmcc_process() -{ - return process_dsmcc; -} - -GF_Thread * HbbtvDemuxer::Get_Demux_Thread() -{ - return ts_demux_thread; -} - -GF_Mutex * HbbtvDemuxer::Get_Demux_Mutex() -{ - return ts_demux_mutex; -} - -GF_List * HbbtvDemuxer::Get_ChannelList(){ - return Channels; -} - - -Channel* HbbtvDemuxer::Get_Channel(u32 service_id){ - u32 nb_channel,i; - - nb_channel = gf_list_count(Channels); - - for(i=0;iGet_service_id() == service_id){ - return Chan; - } - } - return NULL; -} - -void* HbbtvDemuxer::Get_User(){ - - return user; -} - - -char* HbbtvDemuxer::Get_Force_URL(){ - return Force_URL; -} - -Bool HbbtvDemuxer::Get_Ignore_TS_URL(){ - return Ignore_TS_URL; -} - -Bool HbbtvDemuxer::Get_ait_to_proces(){ - return ait_to_process; -} - - -/* Setter */ -void HbbtvDemuxer::Set_Ts(GF_M2TS_Demuxer *on_ts){ - Demuxts = on_ts; -} - -void HbbtvDemuxer::Set_ait_to_process(Bool on){ - ait_to_process = on; -} - -/* Class Fonction */ -GF_Err HbbtvDemuxer::Get_application_info(GF_M2TS_CHANNEL_APPLICATION_INFO*ChannelApp) -{ - if(!Ignore_TS_URL && !No_URL){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Get application for service %d \n",ChannelApp->service_id)); - return get_app_url((sPlayerInterface*)user,ChannelApp); - }else{ - - if(!No_URL){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Forced URL %s \n",Force_URL)); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] URL blocked by the user. No Application to play \n"));; - } - return GF_OK; - - } -} - -Channel* HbbtvDemuxer::Zap_channel(u32 service_id,int zap){ - u32 count_list; - u32 i ; - - count_list = gf_list_count(Channels); -// GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] list: %d\n",count_list)); - for(i=0;iGet_service_id() == service_id){ - if(zap != 0){ - /* zap is use for changing channel. It could be +1 or -1 in order to take the next/previous service */ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] i: %d zap %d\n",i,zap)); - - i= (i+zap+count_list)%count_list; /* loop on the channels */ - - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] i: %d list %d\n",i,count_list)); - } - Channel* chan = ( Channel*)gf_list_get(Channels,i); - return chan; - } - } - - /* If the prog goes here that means Channels list is empty or - no object from this current service_id has already been processed */ -// GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] add service_id: %d \n",service_id)); - Channel* chan = new Channel(service_id,NULL); - gf_list_add(Channels,chan); - return chan; -} - -void HbbtvDemuxer::Channel_check(){ - u32 count_list; - u32 i ; - - count_list = gf_list_count(Channels); - for(i=0;iCheck_Info_Done(); - } - } - - -int HbbtvDemuxer::Check_all_channel_info_received(int Timer){ - - if(!Demuxts){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTV]No PAT received \n")); - return 0; - } - /* Check if all the PMT have been processed or wait until 5 secondes to starts the program */ - if(all_prog_pmt_received || Timer == 5){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] nb_prog_pmt_received %d\n",nb_prog_pmt_received)); - return 1; - } - return 0; -} - -void HbbtvDemuxer::Create_Channel(GF_M2TS_Program *prog){ - - Channel* chan = new Channel(prog->number,NULL); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal]Service number:%d\n",prog->number)); - chan->Add_pmt_pid(prog->pmt_pid); - gf_list_add(Channels,chan); - -} - -void HbbtvDemuxer::Check_PMT_Processing(){ - nb_prog_pmt_received++; - GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("Demuxts->programs %d\n",gf_list_count(Demuxts->programs))); - if(nb_prog_pmt_received == gf_list_count(Demuxts->programs)){ - all_prog_pmt_received = 1; - } -} - - -/* Global Functions */ - -u32 DemuxThreadStart(HbbtvDemuxer *hbbtv_demuxer){ - - return gf_th_run(hbbtv_demuxer->Get_Demux_Thread(),DemuxStart,(void*)hbbtv_demuxer); -} - -u32 On_hbbtv_received_section(void *ptr, GF_Event *event){ - u32 e; - - e = GF_OK; - HbbtvDemuxer* hbbtv_demuxer = (HbbtvDemuxer*)ptr; - sPlayerInterface* player_interf = (sPlayerInterface*)hbbtv_demuxer->Get_User(); - - - if (event->type == GF_EVENT_FORWARDED) - { - if(event->forwarded_event.service_event_type == GF_M2TS_EVT_PAT_FOUND && hbbtv_demuxer->Get_Ts() == NULL){ - e = On_hbbtv_get_tsdemuxer(player_interf,event); - if(e != 0){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Error in receiving the TS Demuxer \n")); - - } - } - if(event->forwarded_event.service_event_type == GF_M2TS_EVT_AIT_FOUND){ - e = On_hbbtv_ait_section(player_interf,event); - } - if(event->forwarded_event.service_event_type == GF_M2TS_EVT_DSMCC_FOUND){ - e = On_hbbtv_dsmcc_section(player_interf,event); - } - if(event->forwarded_event.service_event_type == GF_M2TS_EVT_PMT_FOUND){ - gf_mx_p(hbbtv_demuxer->Get_Demux_Mutex()); - GF_M2TS_Program * prog = (GF_M2TS_Program*)event->forwarded_event.param; - GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("PMT PID %d \n",prog->pmt_pid)); - hbbtv_demuxer->Create_Channel(prog); - hbbtv_demuxer->Check_PMT_Processing(); - gf_mx_v(hbbtv_demuxer->Get_Demux_Mutex()); - } - } - return e; - - -} - -static u32 On_hbbtv_ait_section(sPlayerInterface* player_interf, GF_Event *event) -{ - HbbtvDemuxer* hbbtv_demuxer = (HbbtvDemuxer*)player_interf->Demuxer; - GF_M2TS_AIT_CARRY* ait_carry; - - - ait_carry = (GF_M2TS_AIT_CARRY*)event->forwarded_event.param; - - /* Make sure we are not modifying the AIT List at the same time */ - gf_mx_p(hbbtv_demuxer->Get_Demux_Mutex()); - if(player_interf->init){ - Get_application_for_channel(hbbtv_demuxer,ait_carry->service_id); - } - - /* Unlock the mutex */ - gf_mx_v(hbbtv_demuxer->Get_Demux_Mutex()); - - return 0; -} - -u32 Get_application_for_channel(HbbtvDemuxer* hbbtv_demuxer,u32 service_id){ - u32 nb_channel; - Channel* Chan; - GF_M2TS_CHANNEL_APPLICATION_INFO* ChanAppInfo; - GF_Err e; - - Chan = hbbtv_demuxer->Get_Channel(service_id); - if(!Chan){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] service ID %d is not available\n",service_id)); - return GF_BAD_PARAM; - } - - ChanAppInfo = gf_m2ts_get_channel_application_info(hbbtv_demuxer->Get_Ts()->ChannelAppList,service_id); - - if(!ChanAppInfo){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] service ID %d no application available\n",service_id)); - return GF_BAD_PARAM; - } - - Chan->Add_App_info(ChanAppInfo); - e = hbbtv_demuxer->Get_application_info(ChanAppInfo); - if(e == GF_OK){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Application found for the service ID %d is ON\n",ChanAppInfo->service_id)); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] This application for this service ID %d does not belong to the current one.\n\n",ChanAppInfo->service_id)); - } - - return GF_OK; - -} - -static u32 On_hbbtv_dsmcc_section(sPlayerInterface* player_interf, GF_Event *event) -{ - HbbtvDemuxer* hbbtv_demuxer = (HbbtvDemuxer*)player_interf->Demuxer; - GF_M2TS_Demuxer* ts = hbbtv_demuxer->Get_Ts(); - GF_M2TS_DSMCC_OVERLORD* dsmcc_overlord; - - GF_M2TS_SL_PCK* pck = (GF_M2TS_SL_PCK*)event->forwarded_event.param; - - dsmcc_overlord = gf_m2ts_get_dmscc_overlord(ts->dsmcc_controler,pck->stream->service_id); - - if (dsmcc_overlord && dsmcc_overlord->get_index){ - GF_M2TS_AIT_APPLICATION* Application; - Channel* Chan; - Chan = (Channel*)hbbtv_demuxer->Get_Channel(dsmcc_overlord->service_id); - //if(!Chan) - Application = Chan->Get_App(dsmcc_overlord->application_id); - Application->url_received = 1; - put_app_url(player_interf); - } - - return 0; -} - -static u32 On_hbbtv_get_tsdemuxer(sPlayerInterface* player_interf, GF_Event *event) -{ - HbbtvDemuxer* hbbtv_demuxer = (HbbtvDemuxer*)player_interf->Demuxer; - GF_M2TS_Demuxer *ts = (GF_M2TS_Demuxer*)event->forwarded_event.param; - hbbtv_demuxer->Set_Ts(ts); - if(hbbtv_demuxer->Get_Ts() != NULL){ - if(hbbtv_demuxer->Get_if_dsmcc_process() && !ts->process_dmscc){ - gf_m2ts_demux_dmscc_init(ts); - } - return GF_OK; - } - - return GF_BAD_PARAM; -} - -u32 DemuxStart(void *par){ - - GF_Err e; - HbbtvDemuxer* hbbtv_demuxer = (HbbtvDemuxer*) par; - e = TSDemux_Demux_Setup(hbbtv_demuxer->Get_Ts(), hbbtv_demuxer->Get_Input_data(), 0); - if(e) - { - GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("[HBBTV] Error during TS demux \n")); - } - return e; - -} - -Channel* ZapChannel(HbbtvDemuxer *hbbtv_demuxer,u32 service_id,int zap){ - return hbbtv_demuxer->Zap_channel(service_id,zap); -} diff --git a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_keycontrol.cpp b/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_keycontrol.cpp deleted file mode 100644 index b6108e6..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_keycontrol.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Stanislas Selle - Jonathan Sillan - * - */ -#include "hbbtvterminal.h" - - - -void gtksendkey(sPlayerInterface* player_interf,int keycode); - -void gtksendkey(sPlayerInterface* player_interf,int keycode) -{ - TRACEINFO; - GdkEvent *KeyEvent; - - fprintf(stderr, "\x1b[%i;3%imKeyCode\x1b[0m: %d\n",1, 4,keycode); - - KeyEvent = gdk_event_new (GDK_KEY_PRESS); - /* Key Value */ - KeyEvent->key.keyval = gdk_unicode_to_keyval(keycode); - /* GDK_BUTTON1_MASK refers to left mouse button */ - KeyEvent->key.state = GDK_BUTTON1_MASK; - /* Send the key event to Web Window */ - - KeyEvent->key.window = player_interf->ui->pWebWindow->window; - gtk_main_do_event (KeyEvent); - //gdk_event_free(KeyEvent); -} - -/* HBBTV Button */ - -void on_redbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - fprintf(stderr, "\x1b[%i;3%imBOUTON PRESSED\n\x1b[0m", 1, 5); - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_RED]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("RED is registered by the application : send HBBTV_VK_RED to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_RED); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("RED is not registered by the application\n")); - } - -} - -void on_greenbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_GREEN]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("GREEN is registered by the application : send HBBTV_VK_GREEN to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_GREEN); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("GREEN is not registered by the application\n")); - } -} - -void on_yellowbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_YELLOW]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("YELLOW is registered by the application : send HBBTV_VK_YELLOW to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_YELLOW); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("YELLOW is not registered by the application\n")); - } -} - -void on_bluebuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_BLUE]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("BLUE is registered by the application : send HBBTV_VK_BLUE to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_BLUE); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("BLUE is not registered by the application\n")); - } -} - -/* Navigation */ - -void on_returnbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_NAVIGATION]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is registered by the application : send HBBTV_VK_ENTER to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_ENTER); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is not registered by the application\n")); - } -} - -void on_exitbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - int posx,posy; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - //~ gtk_window_set_transient_for(GTK_WINDOW(player_interf->ui->pWebWindow),GTK_WINDOW(player_interf->ui->pTVWindow)); - get_window_position(player_interf->ui->pWebWindow, &posx, &posy); - resizevideoplayer(player_interf, HBBTV_VIDEO_WIDTH, HBBTV_VIDEO_HEIGHT); - set_window_position(player_interf->ui->pTVWindow, posx, posy); - gtk_window_set_position(GTK_WINDOW(player_interf->ui->pTVWindow),GTK_WIN_POS_CENTER_ALWAYS); - webkit_web_view_load_uri(player_interf->ui->pWebView, player_interf->url); -} - -void on_upbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_NAVIGATION]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is registered by the application : send HBBTV_VK_UP to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_UP); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is not registered by the application\n")); - } -} - -void on_downbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_NAVIGATION]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is registered by the application : send HBBTV_VK_DOWN to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_DOWN); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is not registered by the application\n")); - } -} - -void on_leftbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_NAVIGATION]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is registered by the application : send HBBTV_VK_LEFT to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_LEFT); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE,("NAVIGATION is not registered by the application\n")); - } -} - -void on_rightbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_NAVIGATION]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is registered by the application : send HBBTV_VK_RIGHT to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_RIGHT); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NAVIGATION is not registered by the application\n")); - } -} - - - -/* Control */ - -void on_playpausebuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - set_window_position(player_interf->ui->pTVWindow, 0, 0); -} - -void on_playbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_VCR]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("VCR is registered by the application : send HBBTV_VK_PLAY to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_PLAY); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("VCR is not registered by the application\n")); - } - -} - -void on_pausebuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf = (sPlayerInterface*)data; - if (player_interf->keyregistered[RK_VCR]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("VCR is registered by the application : send HBBTV_VK_PAUSE to the Application\n")); - gtksendkey(player_interf,HBBTV_VK_PAUSE); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("VCR is not registered by the application\n")); - } -} - -void on_onoffbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf; - player_interf = (sPlayerInterface*)data; - - if (player_interf->TVwake == FALSE) { - init_gpac(player_interf); - player_interf->TVwake = TRUE; - } - else { - stop_gpac(player_interf); - player_interf->TVwake = FALSE; - } - TRACEINFO; -} - -void on_langbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf; - u32 current_service_id; - HbbtvDemuxer *hbbtvdemuxer; - GF_MediaInfo odi; - u32 index_audio,audio_ID; - - player_interf = (sPlayerInterface*)data; - hbbtvdemuxer = ( HbbtvDemuxer *)player_interf->Demuxer; - current_service_id = index_audio = audio_ID = 0; - - /* Get the current channel struct */ - current_service_id = gf_term_get_current_service_id(player_interf->m_term); - Channel* chan = (Channel*)ZapChannel(hbbtvdemuxer,current_service_id,0); - if(chan->Get_nb_chan_audio_stream() > 1){ - GF_ObjectManager *root_odm = gf_term_get_root_object(player_interf->m_term); - if (root_odm){ - if (gf_term_get_object_info(player_interf->m_term, root_odm, &odi) == GF_OK){ - if (odi.od) { - /* Increment the audio index to get the next audio stream */ - chan->Incr_audio_index(0); - gf_term_select_object(player_interf->m_term, gf_term_get_object(player_interf->m_term, root_odm, chan->Get_audio_ID(chan->Get_audio_index()))); - } - } - } - } -} - -void on_teletextbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf; - player_interf = (sPlayerInterface*)data; - gtksendkey(player_interf,HBBTV_VK_TELETEXT); - -} - -void on_channelbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf; - GtkButton* button; - int key_code; - char* label; - player_interf = (sPlayerInterface*)data; - button = (GtkButton*) widget; - label = (char*)gtk_button_get_label(button); - - switch(atoi(label)){ - case 0: - key_code = HBBTV_VK_0; - break; - case 1: - key_code = HBBTV_VK_1; - break; - case 2: - key_code = HBBTV_VK_2; - break; - case 3: - key_code = HBBTV_VK_3; - break; - case 4: - key_code = HBBTV_VK_4; - break; - case 5: - key_code = HBBTV_VK_5; - break; - case 6: - key_code = HBBTV_VK_6; - break; - case 7: - key_code = HBBTV_VK_7; - break; - case 8: - key_code = HBBTV_VK_8; - break; - case 9: - key_code = HBBTV_VK_9; - break; - default: - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("Wrong Key Code %d Defaut channel 1 \n",atoi(label))); - key_code = HBBTV_VK_1; - break; - } - if (player_interf->keyregistered[RK_NUMERIC]){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NUMERIC is registered by the application : send HBBTV_VK_%i to the Application\n",atoi(label))); - gtksendkey(player_interf,key_code); - }else{ - hbbtvterm_get_channel_on_air(player_interf,atoi(label),0); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("NUMERIC is not registered by the application, change channel function\n")); - } - - -} - - -void on_chanupbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf; - player_interf = (sPlayerInterface*)data; - - hbbtvterm_channel_zap(player_interf,1); - - TRACEINFO; -} - - -void on_chandownbuttonclicked(GtkWidget *widget, gpointer data) -{ - TRACEINFO; - sPlayerInterface* player_interf; - player_interf = (sPlayerInterface*)data; - - hbbtvterm_channel_zap(player_interf,-1); - - TRACEINFO; -} - -int playpause(sPlayerInterface* player_interf) -{ - int is_pause = gf_term_get_option( player_interf->m_term, GF_OPT_PLAY_STATE); - fprintf(stdout, "[Status: %s]\n", is_pause ? "Playing" : "Paused"); - gf_term_set_option( player_interf->m_term, GF_OPT_PLAY_STATE, is_pause ? GF_STATE_PLAYING : GF_STATE_PAUSED); - return 1; -} - diff --git a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_tools.cpp b/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_tools.cpp deleted file mode 100644 index ddf8cad..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/src/hbbtv_tools.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Jonathan Sillan - * - */ -#include "hbbtvterminal.h" - - -GF_Config* check_config_file(){ - Bool firstlaunch; - - firstlaunch = 0; - /*init config and modules*/ - return gf_cfg_init(NULL,&firstlaunch); -} - -Bool is_connected(){ - GF_Err e; - - GF_Socket* sock; - - sock = gf_sk_new(GF_SOCK_TYPE_UDP); - if (sock == NULL) { - return 0; - } - e = gf_sk_connect(sock, "www.google.fr", 4096, NULL); - gf_sk_del(sock); - - if(e){ - return 0; - }else{ - return 1; - } -} - - diff --git a/applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.cpp b/applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.cpp deleted file mode 100644 index f44a95c..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.cpp +++ /dev/null @@ -1,1081 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Stanislas Selle - Jonathan Sillan - * - */ - -#include "hbbtvterminal.h" -#ifdef XP_UNIX -#include -#include -#else -#include -#include -#endif - -#include -#include - -//static XID handler; -static void activate_uri_entry_cb (GtkWidget* entry, gpointer data); - -sPlayerInterface* player_interf; - -static gboolean on_deleteevent( GtkWidget *widget, GdkEvent *event, gpointer data) -{ - g_print ("delete event occurred\n"); - TRACEINFO; - return TRUE; -} - -static gboolean on_windowconfigure(GtkWidget * widget, GdkEvent *event, gpointer data) -{ - TRACEINFO; - - static int oldx = 0; - static int oldy = 0; - int x, y, olddatax, olddatay; - - sPlayerInterface* player_interf = (sPlayerInterface*)data; - - gtk_window_get_position(GTK_WINDOW(player_interf->ui->pWebWindow), &olddatax, &olddatay); - - x = event->configure.x; - y = event->configure.y; - - int deltax = x - oldx; - int deltay = y - oldy; - - gtk_window_move(GTK_WINDOW(player_interf->ui->pTVWindow),olddatax + deltax, olddatay + deltay); - gtk_window_move(GTK_WINDOW(player_interf->ui->pBackgroundWindow),olddatax + deltax, olddatay + deltay); - - oldx = x; - oldy = y; - return TRUE; -} - - -static void on_destroyevent(GtkWidget *widget, gpointer data) -{ - gtk_main_quit(); - TRACEINFO; -} - - -int ui_init(sPlayerInterface* player_interf) -{ - GtkWidget *pWindow; - GtkWidget *pTVWindow; - GtkWidget *pWebWindow; - GtkWidget *pMainPositionTable; - GtkWidget *pBrowserPositionTable; - GtkWidget *pRCUPositionTable; - GtkWidget *pColorButtonTable; - GtkWidget *pRedButton; - GtkWidget *pGreenButton; - GtkWidget *pYellowButton; - GtkWidget *pBlueButton; - GtkWidget *pArrowButtonTable; - GtkWidget *pUpButton; - GtkWidget *pDownButton; - GtkWidget *pLeftButton; - GtkWidget *pRightButton; - GtkWidget *pUpArrow; - GtkWidget *pDownArrow; - GtkWidget *pLeftArrow; - GtkWidget *pRightArrow; - GtkWidget *pEnterButton; - GtkWidget *pBackButton; - GtkWidget *pEntry; - GtkWidget *pNumPadTable; - GtkWidget *pNumber[10]; - GtkWidget *pPlayButton; - GtkWidget *pStopButton; - GtkWidget *pPauseButton; - GtkWidget *pPlayPauseButton; - GtkWidget *pFastMoveTable; - GtkWidget *pFastForwardButton; - GtkWidget *pFastRewindButton; - GtkWidget *pLangButton; - GtkWidget *pExitButton; - GtkWidget *pOnOffButton; - GtkWidget *pTeletextButton; - GtkWidget *pProgramSelectionTable; - GtkWidget *pPreviousProgramButton; - GtkWidget *pNextProgramButton; - GtkWidget *pQuitButton; - GtkWidget *pTestButton; - GtkWidget *pTest2Button; - GtkWidget *pGoButton; - GtkWidget *pWebScrollWindow; - GtkWidget *pBackgroundWindow; - - GdkColor color; - int Error,posx,posy; - - TRACEINFO; - - sGraphicInterface* ui = player_interf->ui; - - /** Main window **/ - pBackgroundWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - pTVWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - pWebWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); - - ui->pMainWindow = pWindow; - ui->pTVWindow = pTVWindow; - ui->pWebWindow = pWebWindow; - ui->pBackgroundWindow = pBackgroundWindow; - - gtk_window_set_title(GTK_WINDOW(pWindow), "RCU"); - gtk_window_set_title(GTK_WINDOW(pTVWindow), "TV"); - gtk_window_set_title(GTK_WINDOW(pWebWindow), "WEB"); - gtk_window_set_title(GTK_WINDOW(pBackgroundWindow), "BACK"); - - gtk_window_set_decorated(GTK_WINDOW(pWebWindow), false); - gtk_window_set_decorated(GTK_WINDOW(pTVWindow), false); - gtk_window_set_decorated(GTK_WINDOW(pBackgroundWindow), false); - gtk_window_set_transient_for(GTK_WINDOW(pTVWindow),GTK_WINDOW(pBackgroundWindow)); - gtk_window_set_transient_for(GTK_WINDOW(pWebWindow),GTK_WINDOW(pTVWindow)); - - gtk_window_set_resizable(GTK_WINDOW(pTVWindow), false); - gtk_window_set_resizable(GTK_WINDOW(pWebWindow), false); - gtk_window_set_resizable(GTK_WINDOW(pBackgroundWindow), false); - - /** Quit button **/ - pQuitButton = gtk_button_new_with_label("Quit"); - - /** Tests button **/ - pTestButton = gtk_button_new_with_label("Test"); - pTest2Button = gtk_button_new_with_label("Test2"); - - /** Entry bar for URL **/ - pEntry = gtk_entry_new(); - ui->pEntry = pEntry; - - /** GO Button **/ - pGoButton = gtk_button_new_with_label("Go"); - - /** Browser Zone **/ - pWebScrollWindow = gtk_scrolled_window_new(NULL, NULL); - //gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pWebScrollWindow), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS); - - ui->pWebView = WEBKIT_WEB_VIEW(webkit_web_view_new()); - - webkit_web_view_set_transparent(ui->pWebView, TRUE); - - if (ui->pWebView) - gtk_container_add(GTK_CONTAINER(pWebScrollWindow), GTK_WIDGET(ui->pWebView)); - - /** Background Zone **/ - ui->pBackgroundView = gtk_drawing_area_new(); - gdk_color_parse("#000044", &color); - gtk_widget_modify_bg ( GTK_WIDGET(ui->pBackgroundView), GTK_STATE_NORMAL, &color); - - /** TV zone **/ - ui->pTVView = gtk_drawing_area_new(); - - /** RCU zone **/ - - /* create Red color */ - gdk_color_parse("#FF0000", &color); - pRedButton = gtk_button_new(); - gtk_widget_modify_bg ( GTK_WIDGET(pRedButton), GTK_STATE_NORMAL, &color); - gtk_button_set_label(GTK_BUTTON(pRedButton)," "); - /* create Green color */ - gdk_color_parse("#00FF00", &color); - pGreenButton = gtk_button_new(); - gtk_widget_modify_bg ( GTK_WIDGET(pGreenButton), GTK_STATE_NORMAL, &color); - gtk_button_set_label(GTK_BUTTON(pGreenButton)," "); - /* create Yellow color */ - gdk_color_parse("#FFFF00", &color); - pYellowButton = gtk_button_new(); - gtk_widget_modify_bg ( GTK_WIDGET(pYellowButton), GTK_STATE_NORMAL, &color); - gtk_button_set_label(GTK_BUTTON(pYellowButton)," "); - /* create Blue color */ - gdk_color_parse("#0000FF", &color); - pBlueButton = gtk_button_new(); - gtk_widget_modify_bg ( GTK_WIDGET(pBlueButton), GTK_STATE_NORMAL, &color); - gtk_button_set_label(GTK_BUTTON(pBlueButton)," "); - - pUpButton = gtk_button_new(); - pDownButton = gtk_button_new(); - pLeftButton = gtk_button_new(); - pRightButton = gtk_button_new(); - - pUpArrow = gtk_arrow_new(GTK_ARROW_UP,GTK_SHADOW_OUT); - pDownArrow = gtk_arrow_new(GTK_ARROW_DOWN,GTK_SHADOW_OUT); - pLeftArrow = gtk_arrow_new(GTK_ARROW_LEFT,GTK_SHADOW_OUT); - pRightArrow = gtk_arrow_new(GTK_ARROW_RIGHT,GTK_SHADOW_OUT); - - gtk_container_add(GTK_CONTAINER(pUpButton), pUpArrow); - gtk_container_add(GTK_CONTAINER(pDownButton), pDownArrow); - gtk_container_add(GTK_CONTAINER(pLeftButton), pLeftArrow); - gtk_container_add(GTK_CONTAINER(pRightButton), pRightArrow); - - pEnterButton = gtk_button_new_with_label("Enter"); - pBackButton = gtk_button_new_with_label("Back"); - - pNumber[0] = gtk_button_new_with_label("0"); - pNumber[1] = gtk_button_new_with_label("1"); - pNumber[2] = gtk_button_new_with_label("2"); - pNumber[3] = gtk_button_new_with_label("3"); - pNumber[4] = gtk_button_new_with_label("4"); - pNumber[5] = gtk_button_new_with_label("5"); - pNumber[6] = gtk_button_new_with_label("6"); - pNumber[7] = gtk_button_new_with_label("7"); - pNumber[8] = gtk_button_new_with_label("8"); - pNumber[9] = gtk_button_new_with_label("9"); - - pPreviousProgramButton = gtk_button_new_with_label("P-"); - pNextProgramButton = gtk_button_new_with_label("P+"); - - pPlayButton = gtk_button_new_with_label("Play"); - pStopButton = gtk_button_new_with_label("Stop"); - pPauseButton = gtk_button_new_with_label("Pause"); - pPlayPauseButton = gtk_button_new_with_label("PlayPause"); - - pFastForwardButton = gtk_button_new_with_label(">>"); - pFastRewindButton = gtk_button_new_with_label("<<"); - pTeletextButton = gtk_button_new_with_label("Teletext"); - pLangButton = gtk_button_new_with_label("Language"); - pExitButton = gtk_button_new_with_label("Exit"); - pOnOffButton = gtk_button_new_with_label("OnOff"); - - pColorButtonTable = gtk_table_new(4,1,false); - gtk_table_attach(GTK_TABLE(pColorButtonTable),pRedButton, 0,1,0,1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - gtk_table_attach(GTK_TABLE(pColorButtonTable),pGreenButton, 0,1,1,2, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - gtk_table_attach(GTK_TABLE(pColorButtonTable),pYellowButton, 0,1,2,3, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - gtk_table_attach(GTK_TABLE(pColorButtonTable),pBlueButton, 0,1,3,4, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - - pArrowButtonTable = gtk_table_new(3,3, false); - gtk_table_attach(GTK_TABLE(pArrowButtonTable), pUpButton, 1,2,0,1,GtkAttachOptions(GTK_FILL|GTK_EXPAND), GtkAttachOptions(GTK_FILL|GTK_EXPAND), 0,0 ); - gtk_table_attach(GTK_TABLE(pArrowButtonTable), pDownButton, 1,2,2,3,GtkAttachOptions(GTK_FILL|GTK_EXPAND), GtkAttachOptions(GTK_FILL|GTK_EXPAND), 0,0 ); - gtk_table_attach(GTK_TABLE(pArrowButtonTable), pLeftButton, 0,1,1,2,GtkAttachOptions(GTK_FILL|GTK_EXPAND), GtkAttachOptions(GTK_FILL|GTK_EXPAND), 0,0 ); - gtk_table_attach(GTK_TABLE(pArrowButtonTable), pRightButton, 2,3,1,2,GtkAttachOptions(GTK_FILL|GTK_EXPAND), GtkAttachOptions(GTK_FILL|GTK_EXPAND), 0,0 ); - - pNumPadTable = gtk_table_new(4,3,false); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[0], 1, 2, 3, 4, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[1], 0, 1, 0, 1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[2], 1, 2, 0, 1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[3], 2, 3, 0, 1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[4], 0, 1, 1, 2, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[5], 1, 2, 1, 2, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[6], 2, 3, 1, 2, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[7], 0, 1, 2, 3, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[8], 1, 2, 2, 3, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pNumPadTable), pNumber[9], 2, 3, 2, 3, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - - pFastMoveTable = gtk_table_new(1,2,false); - gtk_table_attach(GTK_TABLE(pFastMoveTable), pFastRewindButton, 0,1,0,1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - gtk_table_attach(GTK_TABLE(pFastMoveTable), pFastForwardButton, 1,2,0,1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - - pProgramSelectionTable = gtk_table_new(1,2, false); - gtk_table_attach(GTK_TABLE(pProgramSelectionTable), pPreviousProgramButton, 0,1,0,1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - gtk_table_attach(GTK_TABLE(pProgramSelectionTable), pNextProgramButton, 1,2,0,1, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL),0,0); - - /** create the toplevel tables **/ - pRCUPositionTable = gtk_table_new(24,1,false); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pColorButtonTable, 0, 1, 0, 4, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pArrowButtonTable, 0, 1, 4, 7, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pEnterButton, 0, 1, 7, 8, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pBackButton, 0, 1, 8, 9, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pNumPadTable, 0, 1, 9, 13, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pPlayButton, 0, 1, 13, 14, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pStopButton, 0, 1, 14, 15, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pPauseButton, 0, 1, 15, 16, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pPlayPauseButton, 0, 1, 16, 17, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pFastMoveTable, 0, 1, 17, 18, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pProgramSelectionTable, 0, 1, 18, 19, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pTeletextButton, 0, 1, 19, 20, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pLangButton, 0, 1, 20, 21, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pExitButton, 0, 1, 21, 22, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pOnOffButton, 0, 1, 22, 23, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - gtk_table_attach(GTK_TABLE(pRCUPositionTable), pQuitButton, 0, 1, 23, 24, GtkAttachOptions(GTK_FILL|GTK_EXPAND),GtkAttachOptions(GTK_FILL|GTK_EXPAND),0,0); - - pBrowserPositionTable = gtk_table_new(3,3,false); - //gtk_table_attach(GTK_TABLE(pBrowserPositionTable), pEntry, 0, 2, 0, 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GTK_FILL, 0,0); - //gtk_table_attach(GTK_TABLE(pBrowserPositionTable), pGoButton, 2, 3, 0, 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GTK_FILL, 0,0); - gtk_table_attach(GTK_TABLE(pBrowserPositionTable), pWebScrollWindow, 0, 3, 1, 3, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0,0); - - /** Group toplevel tables in the main table **/ - pMainPositionTable = gtk_table_new(4,7,false); - gtk_table_attach(GTK_TABLE(pMainPositionTable), pRCUPositionTable, 6, 7, 0, 3, GtkAttachOptions(NULL), GtkAttachOptions(NULL), 0,0); - //gtk_table_attach(GTK_TABLE(pMainPositionTable), pBottomBarTable, 0, 7, 3, 4, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0,0); - - gtk_container_add(GTK_CONTAINER(pWindow), pMainPositionTable); - gtk_container_add(GTK_CONTAINER(pTVWindow), ui->pTVView); - gtk_container_add(GTK_CONTAINER(pBackgroundWindow), ui->pBackgroundView); - //~ gtk_container_add(GTK_CONTAINER(pWebWindow), ui->pWebView); - gtk_container_add(GTK_CONTAINER(pWebWindow), pBrowserPositionTable); - - /** SET SIZE **/ - gtk_widget_set_size_request(GTK_WIDGET(ui->pTVView), HBBTV_VIDEO_WIDTH,HBBTV_VIDEO_HEIGHT); - gtk_widget_set_size_request(GTK_WIDGET(ui->pBackgroundView), HBBTV_VIDEO_WIDTH,HBBTV_VIDEO_HEIGHT); - gtk_widget_set_size_request(GTK_WIDGET(pBrowserPositionTable), HBBTV_VIDEO_WIDTH,HBBTV_VIDEO_HEIGHT); - - gtk_window_set_position(GTK_WINDOW(pWebWindow), GTK_WIN_POS_CENTER_ALWAYS); - gtk_window_set_position(GTK_WINDOW(pBackgroundWindow), GTK_WIN_POS_CENTER_ALWAYS); - gtk_window_set_position(GTK_WINDOW(pTVWindow), GTK_WIN_POS_CENTER_ALWAYS); - - /** Connect Callback **/ - //** expose drawable - - // connect to deleteevent function - g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(on_deleteevent), NULL); - - // connect to destroy function - g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(on_destroyevent), NULL); - g_signal_connect(G_OBJECT(pWebWindow), "destroy", G_CALLBACK(on_destroyevent), NULL); - g_signal_connect(G_OBJECT(pQuitButton), "clicked", G_CALLBACK(on_destroyevent), NULL); - - //connect button and entry - /* Control */ - g_signal_connect (G_OBJECT(pEntry), "activate", G_CALLBACK (activate_uri_entry_cb), ui); - g_signal_connect (G_OBJECT(pGoButton), "clicked", G_CALLBACK (activate_uri_entry_cb), ui); - g_signal_connect (G_OBJECT(pOnOffButton), "clicked", G_CALLBACK (on_onoffbuttonclicked), player_interf ); - g_signal_connect (G_OBJECT(pPlayPauseButton), "clicked", G_CALLBACK (on_playpausebuttonclicked), player_interf ); - g_signal_connect (G_OBJECT(pPlayButton), "clicked", G_CALLBACK (on_playbuttonclicked), player_interf ); - g_signal_connect (G_OBJECT(pPauseButton), "clicked", G_CALLBACK (on_pausebuttonclicked), player_interf ); - g_signal_connect (G_OBJECT(pLangButton), "clicked", G_CALLBACK (on_langbuttonclicked), player_interf ); - g_signal_connect (G_OBJECT(pNextProgramButton), "clicked", G_CALLBACK (on_chanupbuttonclicked), player_interf ); - g_signal_connect (G_OBJECT(pPreviousProgramButton), "clicked", G_CALLBACK (on_chandownbuttonclicked), player_interf ); - g_signal_connect (G_OBJECT(pNumber[1]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[2]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[3]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[4]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[5]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[6]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[7]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[8]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[9]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pNumber[0]), "clicked", G_CALLBACK (on_channelbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pTeletextButton), "clicked", G_CALLBACK (on_teletextbuttonclicked), player_interf); - - - /* HBBTV Button */ - g_signal_connect (G_OBJECT(pRedButton), "clicked", G_CALLBACK (on_redbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pGreenButton), "clicked", G_CALLBACK (on_greenbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pYellowButton), "clicked", G_CALLBACK (on_yellowbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pBlueButton), "clicked", G_CALLBACK (on_bluebuttonclicked), player_interf); - - /* Navigation */ - g_signal_connect (G_OBJECT(pUpButton), "clicked", G_CALLBACK (on_upbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pDownButton), "clicked", G_CALLBACK (on_downbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pLeftButton), "clicked", G_CALLBACK (on_leftbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pRightButton), "clicked", G_CALLBACK (on_rightbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pEnterButton), "clicked", G_CALLBACK (on_returnbuttonclicked), player_interf); - g_signal_connect (G_OBJECT(pExitButton), "clicked", G_CALLBACK (on_exitbuttonclicked), player_interf); - - - // gtk_widget_add_events(GTK_WIDGET(pWebWindow), GDK_CONFIGURE); - // g_signal_connect(G_OBJECT(pTVWindow), "configure-event", G_CALLBACK(on_windowconfigure), pBackgroundWindow); - // g_signal_connect(G_OBJECT(pWebWindow), "configure-event", G_CALLBACK(on_windowconfigure), player_interf); - - /** realisation, map and show **/ - gtk_widget_realize(ui->pBackgroundView); - gtk_widget_realize(ui->pTVView); - - Error = init_gpac(player_interf); - if(Error){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Error during gpac intialization \n")); - return GF_IO_ERR; - } - - GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(ui->pWebView)); - GdkColormap *rgba = gdk_screen_get_rgba_colormap (screen); - - gtk_widget_set_colormap(GTK_WIDGET(ui->pWebView), rgba); - gtk_widget_set_colormap(GTK_WIDGET(pBrowserPositionTable), rgba); - - /** center the windows **/ - - gtk_widget_set_default_colormap(rgba); - gtk_widget_show_all(pWindow); - gtk_widget_show_all(pBackgroundWindow); - gtk_widget_show_all(pTVWindow); - gtk_widget_show_all(pWebWindow); - gtk_window_present (GTK_WINDOW(pWebWindow)); - - return GF_OK; -} - - -int init_playerinterface(sPlayerInterface* player_interf, char* input_data, char* url, Bool no_url) -{ - - HbbtvDemuxer *hbbtv_demuxer; - int Error; - int ChannelScanTimer; - u32 i,nb_chan; - - hbbtv_demuxer = ( HbbtvDemuxer *)player_interf->Demuxer; - ChannelScanTimer = 0; - - player_interf->ui = (sGraphicInterface*) gf_calloc(1,sizeof(sGraphicInterface)); - - - player_interf->input_data = (char*)gf_calloc(strlen(input_data)+1,sizeof(char)); - sprintf(player_interf->input_data,"%s",input_data); - player_interf->input_data[strlen(input_data)] = 0; - - player_interf->url = url; - player_interf->no_url = no_url; - player_interf->TVwake = FALSE; - player_interf->is_connected = is_connected(); - GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("player_interf->is_connected %d\n",player_interf->is_connected)); - - - Error = ui_init(player_interf); - if(Error){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Initialization error \n")); - return GF_IO_ERR; - } - - if(player_interf->url) { - init_browser(player_interf); - } - - while(!hbbtv_demuxer->Check_all_channel_info_received(ChannelScanTimer)) { - ChannelScanTimer++; - gf_sleep(1000); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Wainting for the PMTs \n")); - } - - hbbtvterm_scan_channel(player_interf); - - /* The check for init is made inside this function. AIT received have to be processed before getting new ones */ - - nb_chan = gf_list_count(hbbtv_demuxer->Get_ChannelList()); - - for(i=0;iGet_ChannelList(),i); - Get_application_for_channel(hbbtv_demuxer,chan->Get_service_id()); - } - player_interf->init = 1; - - put_app_url(player_interf); - - - - return GF_OK; - -} - - -int init_gpac(sPlayerInterface* player_interf) -{ - TRACEINFO; - char config_path[GF_MAX_PATH]; - const char *str; - const char *gpac_cfg; - sGraphicInterface *ui = player_interf->ui; - - -#ifdef XP_UNIX - gpac_cfg = (char *) ".gpacrc"; - strcpy((char *) config_path, getenv("HOME")); -#else - gpac_cfg = "GPAC.cfg"; - strcpy((char*)config_path,"D:\\code\\trunk\\gpac_public\\bin\\win32\\debug"); -#endif - - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Configuration path : %s/%s \n",config_path,gpac_cfg)); - - player_interf->m_user = (GF_User*)gf_malloc(sizeof(GF_User)); - memset(player_interf->m_user, 0, sizeof(GF_User)); - //~ player_interf->m_user->config = gf_cfg_new((const char *) config_path, gpac_cfg); - - /*init config and modules*/ - player_interf->m_user->config = check_config_file(); - if(!player_interf->m_user->config){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Configuration failed. COnfiguration file not found \n")); - return GF_BAD_PARAM; - } - - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Configuration initialized \n")); - - str = gf_cfg_get_key( player_interf->m_user->config, "General", "ModulesDirectory"); - player_interf->m_user->modules = gf_modules_new(str, player_interf->m_user->config); - - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] %d modules loaded \n",gf_modules_get_count( player_interf->m_user->modules))); - - player_interf->m_user->opaque = player_interf->Demuxer; - player_interf->m_user->EventProc = On_hbbtv_received_section; - -#ifdef XP_UNIX - player_interf->m_user->os_window_handler = (void*)GDK_WINDOW_XID(gtk_widget_get_window(ui->pTVView)); - player_interf->m_user->os_display = GDK_WINDOW_XDISPLAY(gtk_widget_get_window(ui->pTVView)); - XSynchronize((Display *) player_interf->m_user->os_display, True); -#else - player_interf->m_user->os_window_handler = (void*)GDK_WINDOW_HWND(gtk_widget_get_window(ui->pTVView)); - player_interf->m_user->os_display = gdk_drawable_get_display (gtk_widget_get_window(ui->pTVView)); - gdk_display_sync((GdkDisplay *)player_interf->m_user->os_display); -#endif - - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] User initialized \n")); - - if (( player_interf->m_term = gf_term_new(player_interf->m_user))) { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Terminal created.\n")); - } - else { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Error when creating terminal\n")); - return GF_IO_ERR; - } - - gf_term_set_size( player_interf->m_term, HBBTV_VIDEO_WIDTH,HBBTV_VIDEO_HEIGHT); - - - if (strnicmp(player_interf->input_data, "udp://", 6) - && strnicmp(player_interf->input_data, "mpegts-udp://", 13) - && strnicmp(player_interf->input_data, "mpegts-tcp://", 13) - && strnicmp(player_interf->input_data, "dvb://", 6) - && strnicmp(player_interf->input_data, "http://", 6)) { - - FILE *test = fopen(player_interf->input_data, "rb"); - if (!test) { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] %s file cannot be oppened \n",player_interf->input_data)); - return GF_BAD_PARAM; - } - else { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] %s file oppened successfully \n", player_interf->input_data)); - fclose(test); - } - - } - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Input URL : %s\n", player_interf->input_data)); - gf_term_connect( player_interf->m_term, (const char*)player_interf->input_data ); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Terminal connected\n")); - - return GF_OK; -} - - -int stop_gpac(sPlayerInterface* player_interf) -{ - TRACEINFO; - gf_term_disconnect( player_interf->m_term); - gf_term_del( player_interf->m_term); - gf_modules_del( player_interf->m_user->modules); - gf_cfg_del( player_interf->m_user->config); - - return TRUE; -} - - -static void activate_uri_entry_cb (GtkWidget* entry, gpointer data) -{ - TRACEINFO; - sGraphicInterface *pUI; - - pUI = (sGraphicInterface*)data; - const gchar* uri = gtk_entry_get_text (GTK_ENTRY(pUI->pEntry)); - g_assert (uri); - webkit_web_view_load_uri (pUI->pWebView, uri); -} - -int term_play(sPlayerInterface* player_interf) -{ - gf_term_set_option(player_interf->m_term, GF_OPT_PLAY_STATE, GF_STATE_PLAYING); - return 1; -} - - -int term_pause(sPlayerInterface* player_interf) -{ - gf_term_set_option(player_interf->m_term, GF_OPT_PLAY_STATE, GF_STATE_PAUSED); - return 1; -} - - -int init_browser(sPlayerInterface* player_interf) -{ - if(!player_interf->no_url) { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Initialized the browser with HBBTV Application URL : %s \n",player_interf->url)); - webkit_web_view_load_uri(player_interf->ui->pWebView, player_interf->url); - return GF_OK; - } - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] URL blocked by the user. No Application to play \n")); - return GF_OK; -} - - -int init_player(sPlayerInterface* player_interf) -{ - /* Init the player with the fisrt channel of the stream */ - - HbbtvDemuxer* hbbtvdemuxer = (HbbtvDemuxer*)player_interf->Demuxer; - Channel* chan = (Channel*)gf_list_get(hbbtvdemuxer->Get_ChannelList(),0); - hbbtvterm_get_channel_on_air(player_interf,chan->Get_service_id(),0); - - return GF_OK; -} - -GF_Err get_app_url(sPlayerInterface* player_interf, GF_M2TS_CHANNEL_APPLICATION_INFO*ChannelApp) -{ - u32 current_service_id; - - current_service_id = player_interf->m_term->root_scene->selected_service_id; - - if(!ChannelApp){ - return GF_IO_ERR; - } - - if((ChannelApp->service_id == current_service_id)) { - GF_M2TS_AIT_APPLICATION* app_info; - Channel* Chan; - - HbbtvDemuxer* hbbtvdemuxer = (HbbtvDemuxer*)player_interf->Demuxer; - Chan = (Channel*)ZapChannel(hbbtvdemuxer,current_service_id,0); - - app_info = Chan->App_to_play(player_interf->is_connected,0); - - if(!app_info){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] This service id %d does not have an autostart application. \n",ChannelApp->service_id,current_service_id)); - return GF_IO_ERR; - } - - if(player_interf->init){ - if(app_info->broadband){ - player_interf->url = app_info->http_url; - }else if(app_info->broadcast){ - player_interf->url = app_info->carousel_url; - } - webkit_web_view_load_uri(player_interf->ui->pWebView, player_interf->url); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] HBBTV Application URL : %s \n",player_interf->url)); - return GF_OK; - } - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Cannot start the application until player initialization is finished \n")); - return GF_IO_ERR; - } - GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("ChannelApp->service_id %d is wrong current_service_id %d !!\n",ChannelApp->service_id,current_service_id)); - return GF_IO_ERR; - - -} - -int put_app_url(sPlayerInterface* player_interf) -{ - u32 current_service_id; - Bool ignore_TS_url; - GF_Err e; - HbbtvDemuxer* hbbtvdemux = (HbbtvDemuxer*)player_interf->Demuxer; - - ignore_TS_url = hbbtvdemux->Get_Ignore_TS_URL(); - e = GF_OK; - - if(!ignore_TS_url && !player_interf->no_url){ - - current_service_id = player_interf->m_term->root_scene->selected_service_id; - Channel* chan = (Channel*)ZapChannel(hbbtvdemux,current_service_id,0); - e = get_app_url(player_interf,chan->Get_App_info()); - if(e == GF_OK) { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Application started\n")); - return GF_OK; - } - player_interf->url = ""; - webkit_web_view_load_uri(player_interf->ui->pWebView, player_interf->url); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal]No Application found for this service ID %d \n",current_service_id)); - return GF_IO_ERR; - - }else{ - - if(!player_interf->no_url){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Forced URL %s Reaload Application \n",player_interf->url)); - webkit_web_view_load_uri(player_interf->ui->pWebView, player_interf->url); - }else{ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] URL blocked by the user. \n")); - } - return GF_OK; - } -} - - -int hbbtvterm_scan_channel(sPlayerInterface* player_interf) -{ - - GF_MediaInfo odi; - u32 i, count; - - HbbtvDemuxer* HbbtvDemux = (HbbtvDemuxer*)player_interf->Demuxer; - - GF_ObjectManager *root_odm = gf_term_get_root_object(player_interf->m_term); - if (!root_odm){ - return GF_IO_ERR; - } - - if (gf_term_get_object_info(player_interf->m_term, root_odm, &odi) != GF_OK) return GF_IO_ERR; - if (!odi.od) { - return GF_IO_ERR; - } - count = gf_term_get_object_count(player_interf->m_term, root_odm); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Count: %d \n",count)); - - for (i=0; im_term, root_odm, i); - if (!odm) break; - if (gf_term_get_object_info(player_interf->m_term, odm, &odi) == GF_OK) { - u32 service_id = odi.od->ServiceID; - Channel* chan = (Channel*)ZapChannel(HbbtvDemux,service_id,0); - - if (odi.od_type==GF_STREAM_VISUAL && !chan->Get_processed()) { - chan->Add_video_ID(i); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Service: %d chan->video_index : %d \n",service_id,chan->Get_video_ID())); - }else if(odi.od_type==GF_STREAM_AUDIO && !chan->Get_processed()) { - chan->Add_audio_ID(i); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal]Service:%d chan->current_audio_index : %d \n",service_id,chan->Get_audio_ID(0)));; - } - - } - } - HbbtvDemux->Channel_check(); - - return GF_OK; - -} - - -int hbbtvterm_channel_zap(sPlayerInterface* player_interf,int up_down) -{ - - u32 current_service_id; - - current_service_id = gf_term_get_current_service_id(player_interf->m_term); - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Current_service_id : %d \n",current_service_id)); - hbbtvterm_get_channel_on_air(player_interf,current_service_id,up_down); - - return GF_OK; - -} - - -int hbbtvterm_get_channel_on_air(sPlayerInterface* player_interf, u32 service_id, int zap) -{ - - GF_MediaInfo odi; - - HbbtvDemuxer* hbbtvdemuxer = (HbbtvDemuxer*)player_interf->Demuxer; - Channel* chan = (Channel*)ZapChannel(hbbtvdemuxer,service_id,zap); - GF_ObjectManager *root_odm = gf_term_get_root_object(player_interf->m_term); - if (!root_odm) return GF_IO_ERR; - - if (gf_term_get_object_info(player_interf->m_term, root_odm, &odi) != GF_OK) return GF_IO_ERR; - if (!odi.od) { - return GF_IO_ERR; - } - - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal]service_id:%d video pid : %d audio pid:%d\n",chan->Get_service_id(),chan->Get_video_ID(),chan->Get_audio_ID(0))); - - gf_term_select_object(player_interf->m_term, gf_term_get_object(player_interf->m_term, root_odm, chan->Get_video_ID())); - gf_term_select_object(player_interf->m_term, gf_term_get_object(player_interf->m_term, root_odm, chan->Get_audio_ID(0))); - - put_app_url(player_interf); - - return GF_OK; - -} - -/** On Windows Functions **/ - -void resizevideoplayer(sPlayerInterface* player_interf, int width, int height) -{ - TRACEINFO; - gf_term_set_size(player_interf->m_term,width,height); - gtk_widget_set_size_request(GTK_WIDGET(player_interf->ui->pTVWindow),width,height); - -} - -void get_window_position(GtkWidget* Widget, int* x, int* y) -{ - //TRACEINFO; - gtk_window_get_position(GTK_WINDOW(Widget), &(*x), &(*y)); -} - -void set_window_position(GtkWidget* Widget, int x, int y) -{ - //~ //TRACEINFO; - gtk_window_move(GTK_WINDOW(Widget), x, y); -} - - -void OnAPPLICATION_Show() -{ - TRACEINFO; - gtk_window_set_opacity(GTK_WINDOW(player_interf->ui->pWebWindow),1); -} - -void OnAPPLICATION_Hide() -{ - TRACEINFO; - gtk_window_set_opacity(GTK_WINDOW(player_interf->ui->pWebWindow),0); -} - - -void OnVIBRC_SetChannel(int channel_number){ - //~ hbbtvterm_get_channel_on_air(player_interf, service_id, 0); -} - -void OnKEYSET_SetValue(double param) -{ - TRACEINFO; - fprintf(stderr, "\t param transmitted : %i\n", (int)param); - - int KEYMASK_RED = 0x1; - int KEYMASK_GREEN = 0x2; - int KEYMASK_YELLOW = 0x4; - int KEYMASK_BLUE = 0x8; - int KEYMASK_NAVIGATION = 0x10; - int KEYMASK_VCR = 0x20; - int KEYMASK_SCROLL = 0x40; - int KEYMASK_INFO = 0x80; - int KEYMASK_NUMERIC = 0x100; - int KEYMASK_ALPHA = 0x200; - int KEYMASK_OTHER = 0x400; - - player_interf->keyregistered[RK_RED] = (((int)param & KEYMASK_RED)) ? true : false; - player_interf->keyregistered[RK_GREEN] = (((int)param & KEYMASK_GREEN)) ? true : false; - player_interf->keyregistered[RK_YELLOW] = (((int)param & KEYMASK_YELLOW)) ? true : false; - player_interf->keyregistered[RK_BLUE] = (((int)param & KEYMASK_BLUE)) ? true : false; - player_interf->keyregistered[RK_NAVIGATION] = (((int)param & KEYMASK_NAVIGATION)) ? true : false; - player_interf->keyregistered[RK_VCR] = (((int)param & KEYMASK_VCR)) ? true : false; - player_interf->keyregistered[RK_SCROLL] = (((int)param & KEYMASK_SCROLL)) ? true : false; - player_interf->keyregistered[RK_INFO] = (((int)param & KEYMASK_INFO)) ? true : false; - player_interf->keyregistered[RK_NUMERIC] = (((int)param & KEYMASK_NUMERIC)) ? true : false; - player_interf->keyregistered[RK_ALPHA] = (((int)param & KEYMASK_ALPHA)) ? true : false; - player_interf->keyregistered[RK_OTHER] = (((int)param & KEYMASK_OTHER)) ? true : false; -} - -void OnNoFullscreenSetWindow(int x, int y, int width, int height) -{ - TRACEINFO; - OnVIDBRC_SetFullScreen(false); -} -void OnVIDBRC_SetFullScreen(int fullscreenparam) -{ - TRACEINFO; - fprintf(stderr,"SET FULLSCREEN OnVIDBRC_SetFullScreen Param : %d\n",fullscreenparam); - - ///Getting the videobroadcast element. - WebKitDOMDocument *pDOMdoc = webkit_web_view_get_dom_document(player_interf->ui->pWebView); - WebKitDOMNodeList *objectslist = webkit_dom_document_get_elements_by_tag_name(pDOMdoc,"object"); - gulong l = webkit_dom_node_list_get_length(objectslist); - gulong i = 0; - bool videofound = false; - WebKitDOMNode* videonode; - char *videonodetype; - while ((i < l) && !videofound) - { - videonode = webkit_dom_node_list_item(objectslist,i); - videonodetype = webkit_dom_element_get_attribute(WEBKIT_DOM_ELEMENT(videonode),"type"); - if (!(strcmp(videonodetype, "video/broadcast"))) - videofound = true; - else - i++; - } - - if (!videofound) - { - fprintf(stderr,"object video broadcast not found \n"); - return; - } - else - { - fprintf(stderr,"object video broadcast found \n"); - WebKitDOMElement* videoelt = WEBKIT_DOM_ELEMENT(videonode); - - ///Getting the position of the WebView - gint posx, posy; - get_window_position(player_interf->ui->pWebWindow, &posx, &posy); - fprintf(stderr,"WebWindow Left : %d , WebWindow Top : %d \n", posx, posy); - - ///Getting the videobroadcast geometry - glong left, top; - glong eltwidth, eltheight ; - ///Setting the new size and position of the TVWindow broadcast - int newx; - int newy; - - if (fullscreenparam){ - left = 0; - top = 0; - eltwidth = HBBTV_VIDEO_WIDTH; - eltheight = HBBTV_VIDEO_HEIGHT; - get_window_position(player_interf->ui->pWebWindow, &newx, &newy); - }else{ - gtk_window_set_position(GTK_WINDOW(player_interf->ui->pTVWindow), GTK_WIN_POS_NONE); - ///Getting the top and left values of the video/broadcast element . - left = webkit_dom_element_get_offset_left(videoelt); - top = webkit_dom_element_get_offset_top(videoelt); - ///Getting the width and height values of the video/broadcast element . - eltwidth = webkit_dom_element_get_offset_width(videoelt); - eltheight = webkit_dom_element_get_offset_height(videoelt); - newx = posx + left; - newy = posy + top; - } - - fprintf(stderr,"Videoelt offset : Left : %d , Top : %d, ", left, top); - fprintf(stderr,"EltWidth : %d , EltHeight : %d \n", eltwidth, eltheight); - set_window_position(player_interf->ui->pTVWindow, newx, newy); - fprintf(stderr,"Supposed TVWindow new position : %d x %d \n", newx, newy); - resizevideoplayer(player_interf, eltwidth, eltheight); - if(fullscreenparam){ - gtk_window_set_position(GTK_WINDOW(player_interf->ui->pTVWindow), GTK_WIN_POS_CENTER_ALWAYS); - } - fprintf(stderr,"Checking position : \n "); - gint checkx, checky; - get_window_position(player_interf->ui->pTVWindow, &checkx, &checky); - fprintf(stderr,"CHECK TVWindow Left : %d , CHECK TVWindow Top : %d \n", checkx, checky); - } - -} - -void OnKEYSET_Allocate() -{ - webkit_web_view_execute_script(player_interf->ui->pWebView, - " var KeyEvent = new Object(); \ - KeyEvent.VK_RED = 403; \ - KeyEvent.VK_YELLOW = 405;\ - KeyEvent.VK_GREEN = 404;\ - KeyEvent.VK_BLUE = 406;\ - KeyEvent.VK_UP = 38;\ - KeyEvent.VK_DOWN = 40;\ - KeyEvent.VK_LEFT = 37;\ - KeyEvent.VK_RIGHT = 39;\ - KeyEvent.VK_PLAY = 415;\ - KeyEvent.VK_STOP = 413;\ - KeyEvent.VK_PAUSE = 19;\ - KeyEvent.VK_FAST_FWD = 417;\ - KeyEvent.VK_REWIND = 412;\ - KeyEvent.VK_TELETEXT = 459;\ - KeyEvent.VK_ESCAPE = 27;\ - KeyEvent.VK_ENTER = 13;\ - KeyEvent.VK_0 = 48;\ - KeyEvent.VK_1 = 49;\ - KeyEvent.VK_2 = 50;\ - KeyEvent.VK_3 = 51;\ - KeyEvent.VK_4 = 52;\ - KeyEvent.VK_5 = 53;\ - KeyEvent.VK_6 = 54;\ - KeyEvent.VK_7 = 55;\ - KeyEvent.VK_8 = 56;\ - KeyEvent.VK_9 = 57; "); -} - - -static void usage() -{ - printf("\nUsage: hbbtvterminal -input=input_data [-url=url] [-no_url]\n"); - printf("-input=input_data : input data to process (dvb://, udp://, or file)\n"); - printf("-url=url : force the player to connect to an url. Ignore the url(s) found in the input data\n"); - printf("-no_url : the player will not connect to HBBTV services \n"); - printf("-dsmcc : enable the DSMCC data carousel processing \n"); -} - - -/****************************************************************************/ -/** getargs */ -/** @author Stanislas Selle */ -/** @date 2011/06/15 */ -/** gets args from agrv and set the options into the arguments */ -/****************************************************************************/ - -static void getargs(int argc, char *argv[], char* &input_data, Bool* dsmcc, char* &url, Bool* no_url) -{ - u32 i; - - no_url = 0; - i = 0; - input_data = NULL; - url = NULL; - - for (i=1; i<(u32) argc; i++) { - char *arg = argv[i]; - if (arg[0]=='-') { - if (!strnicmp(arg, "-input=", 7)) { - input_data = arg+7; - }else if (!strnicmp(arg, "-url=", 5)) { - url = arg+5; - }else if (!strnicmp(arg, "-no_url", 7)) { - *no_url = 1; - }else if (!strnicmp(arg, "-dsmcc", 6)) { - *dsmcc = 1; - }else { - usage(); - exit(0); - } - }else { - usage(); - exit(0); - } - } - - if( !input_data && (!url || *no_url)) { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Input data is needed if no URL is given.\n")); - usage(); - exit(0); - } - if( !*dsmcc) { - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Ignoring DSMCC data !! \n")); - } - - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Starting the processing of the TS file %s \n",input_data)); - -} - -int main (int argc, char* argv[]) -{ - char* input_data; - char* url; - Bool dsmcc; - Bool no_url; - int Error; - - dsmcc = no_url = 0; - - url = input_data = NULL; - - //TRACEINFO; - gf_sys_init(1); - gf_log_set_tool_level(GF_LOG_MODULE,GF_LOG_INFO); - printf("GPAC HBBTV Terminal (c) Telecom ParisTech 2011\n"); - - getargs(argc, argv, input_data , &dsmcc, url, &no_url); - - GF_SAFEALLOC(player_interf, sPlayerInterface); - - HbbtvDemuxer* hbbtv_demuxer = new HbbtvDemuxer(input_data, url,dsmcc, no_url, player_interf); - - gtk_init(&argc, &argv); - - if (!g_thread_supported()) { - g_thread_init(NULL); - } - - Error = init_playerinterface(player_interf,input_data,url,no_url); - if(Error){ - GF_LOG(GF_LOG_INFO, GF_LOG_MODULE, ("[HBBTVTerminal] Error - Aborting the processing \n")); - return 0; - } - //~ gf_term_set_option(player_interf->m_term, GF_OPT_PLAY_STATE, GF_STATE_PLAYING); - - gtk_main(); - //free(ui); -} - diff --git a/applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.h b/applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.h deleted file mode 100644 index a258002..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/src/hbbtvterminal.h +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 2010-2011 Telecom-Paristech - * All Rights Reserved - * 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. - * - * Authors: Stanislas Selle - Jonathan Sillan - * - */ - -#ifndef __HBBTVTERMINAL__ -#define __HBBTVTERMINAL__ - -#define _WIN32_WINNT 0x0510 - -#ifdef __cplusplus -extern "C" { -#endif - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -} -#endif - -#include - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define DEBUG true -#define PROJECTNAME "HbbTVTerminal" -#define TRACEINFO if (DEBUG) { fprintf(stderr, " BOB \x1b[%i;3%im%s\x1b[0m : call %s\n", 1, 4, PROJECTNAME, __FUNCTION__); } -#define NOTIMPLEMENTED if (DEBUG) { printf("SEGAR %s : %s is NOT IMPLEMENTED : TODO \n", PROJECTNAME, __FUNCTION__); } - -#define TRANSPARENCE true - -#define HBBTV_VIDEO_WIDTH 1280 -#define HBBTV_VIDEO_HEIGHT 720 - -typedef struct GraphicInterface -{ - WebKitWebView *pWebView; - GtkWidget *pTVView; - GtkWidget *pBackgroundView; - GtkWidget *pMainWindow; - GtkWidget *pTVWindow; - GtkWidget *pWebWindow; - GtkWidget *pBackgroundWindow; - GtkWidget *pEntry; -} sGraphicInterface; - - -enum listHBBTVKeys{ - HBBTV_VK_ENTER = 13, - HBBTV_VK_PAUSE = 19, - HBBTV_VK_ESCAPE = 27, - HBBTV_VK_LEFT = 37, - HBBTV_VK_RIGHT = 39, - HBBTV_VK_UP = 38, - HBBTV_VK_DOWN = 40, - HBBTV_VK_0 = 48, - HBBTV_VK_1 = 49, - HBBTV_VK_2 = 50, - HBBTV_VK_3 = 51, - HBBTV_VK_4 = 52, - HBBTV_VK_5 = 53, - HBBTV_VK_6 = 54, - HBBTV_VK_7 = 55, - HBBTV_VK_8 = 56, - HBBTV_VK_9 = 57, - HBBTV_VK_RED = 403, - HBBTV_VK_YELLOW = 405, - HBBTV_VK_GREEN = 404, - HBBTV_VK_BLUE = 406, - HBBTV_VK_REWIND = 412, - HBBTV_VK_STOP = 413, - HBBTV_VK_PLAY = 415, - HBBTV_VK_FAST_FWD = 417, - HBBTV_VK_TELETEXT = 459 -}; - - -enum listRegisteredKeys { - RK_OTHER = 0, - RK_RED = 1, - RK_GREEN = 2, - RK_YELLOW = 3, - RK_BLUE = 4, - RK_NAVIGATION = 5, - RK_VCR = 6, - RK_SCROLL = 7, - RK_INFO = 8, - RK_NUMERIC = 9, - RK_ALPHA = 10 -}; - -typedef struct PlayerInterface -{ - sGraphicInterface* ui; - Bool no_url; - char* input_data; - char* url; - GF_Terminal *m_term; - GF_User *m_user; - void* Demuxer; - GF_Mutex *Get_demux_info_mutex; - int TVwake; - Bool keyregistered[11]; - Bool init; - Bool is_connected; - Bool app_in_action; - -} sPlayerInterface; - -int ui_init(sGraphicInterface *ui); - -int init_gpac(sPlayerInterface* player_interf); -int init_browser(sPlayerInterface* player_interf); -int stop_gpac(sPlayerInterface *player_interf); -int playpause(sPlayerInterface *player_interf); -int term_play(sPlayerInterface *player_interf); -int term_pause(sPlayerInterface *player_interf); -int init_player(sPlayerInterface* player_interf); - - -typedef struct -{ - GF_M2TS_AIT* ait; - - char* data; - u32 table_id; - u32 data_size; -} AIT_TO_PROCESS; - - -typedef struct -{ - GF_M2TS_DSMCC_SECTION* dsmcc_sections; - char* buff; - - /*added not in the spec*/ - u8 first_section_received; -}GF_M2TS_GATHER_DSMCC_SECTION; - -#define MAX_audio_index 16 - -class Channel -{ -public: - /* Constructor */ - Channel(u32 TSservice_ID, char* TSchannel_name); - /* Destructor */ - void Destroy_Channel(); - /* Fonctions */ - u32 Add_service_id(u32 service_id); - u32 Add_channel_name(char* chan_name); - u32 Add_video_ID(u32 video_index); - u32 Add_audio_ID(u32 current_audio_index); - u32 Add_ait_pid(u32 ait_pid); - u32 Add_pmt_pid(u32 pmt_pid); - u32 Add_App_info(GF_M2TS_CHANNEL_APPLICATION_INFO*add_ait); - void Check_Info_Done(); - void Incr_audio_index(int index); - void Set_audio_index(u32 index); - /* Getter */ - u32 Get_service_id(); - char* Get_channel_name(); - u32 Get_video_ID(); - u32 Get_audio_ID(u32 indice); - u32 Get_ait_pid(); - u32 Get_pmt_pid(); - Bool Get_processed(); - u32 Get_audio_index(); - u32 Get_nb_chan_audio_stream(); - GF_M2TS_CHANNEL_APPLICATION_INFO* Get_App_info(); - GF_M2TS_AIT_APPLICATION* App_to_play(Bool isConnected,u8 MaxPriority); - GF_M2TS_AIT_APPLICATION* Get_App(u32 application_id); - -private: - u32 service_ID; - u32 number; - char* channel_name; - u32 video_ID; - u32 audio_ID[MAX_audio_index]; - u32 AIT_PID; - u32 PMT_PID; - Bool processed; - u32 current_audio_index; - u32 nb_chan_audio_stream; - GF_M2TS_CHANNEL_APPLICATION_INFO* ChannelApp; - -}; - -class HbbtvDemuxer -{ -public: - /* Constructeur */ - HbbtvDemuxer(char *input_data, char* url, Bool dsmcc, Bool no_url,sPlayerInterface* player_interf); - - /* Destructeur */ - - /* Fonction */ - u32 HbbtvDemuxer_DemuxStart(); - Bool ait_already_received(char *data,u32 pid); - void GetAppInfoFromAit(GF_M2TS_AIT* ait); - Channel* Zap_channel(u32 service_id,int zap); - void Create_Channel(GF_M2TS_Program* pmt); - void Check_PMT_Processing(); - void Channel_check(); - u32 Check_application_priority(Channel* chan, GF_M2TS_AIT* ait); - /* Getter */ - GF_M2TS_Demuxer* Get_Ts(); - GF_List* Get_ChannelList(); - GF_List* Get_AIT_To_Process_list(); - char* Get_Input_data(); - Bool Get_if_dsmcc_process(); - GF_Thread * Get_Demux_Thread(); - GF_Mutex * Get_Demux_Mutex(); - void* Get_User(); - int Check_all_channel_info_received(int Timer); - char* Get_Force_URL(); - Bool Get_Ignore_TS_URL(); - Bool Get_ait_to_proces(); - Channel* Get_Channel(u32 service_id); - GF_Err Get_application_info(GF_M2TS_CHANNEL_APPLICATION_INFO*app_info); - /* Setter */ - void Set_Ts(GF_M2TS_Demuxer* ts); - void Set_ait_to_process(Bool on); - -private: - /* Fonction */ - - u32 GetDemuxStartFunction(); - - /* Attribut */ - GF_M2TS_Demuxer *Demuxts; - GF_List* Channels; - GF_List* Ait_To_Process; - - /* Thread for Demux */ - GF_Thread *ts_demux_thread; - /* Mutex for Demux */ - GF_Mutex *ts_demux_mutex; - - /*local file playing*/ - char *Input_data; - char *Service_URL; - char *Force_URL; - Bool process_dsmcc; - Bool Ignore_TS_URL; - Bool No_URL; - u32 nb_ait; - u32 file_size; - Bool ait_to_process; - u32 nb_prog_pmt_received; - Bool all_prog_pmt_received; - - /*callback to push AIT information when a AIT is received*/ - void (*on_ait_event)(void *player_interf, GF_M2TS_CHANNEL_APPLICATION_INFO*app_info); - /*private user data - To the PlayerInterface*/ - void *user; - -}; - - -/* Global Functions */ - -u32 On_hbbtv_received_section(void *ptr, GF_Event *event); -u32 DemuxThreadStart(HbbtvDemuxer *hbbtv_demuxer); -u32 DemuxStart(void *par); -GF_Err get_app_url(sPlayerInterface* player_interf, GF_M2TS_CHANNEL_APPLICATION_INFO*app_info); -int put_app_url(sPlayerInterface* player_interf); -u32 Get_application_for_channel(HbbtvDemuxer* hbbtv_demuxer,u32 service_id); - -int change_geometry( int width, int height); -int hbbtvterm_scan_channel(sPlayerInterface* player_interf); -Channel* ZapChannel(HbbtvDemuxer *hbbtv_demuxer,u32 service_id,int zap); -int hbbtvterm_channel_zap(sPlayerInterface* player_interf,int up_down); -int hbbtvterm_get_channel_on_air(sPlayerInterface* player_interf, u32 service_id, int zap); -void resizevideoplayer(sPlayerInterface* player_interf, int width, int height); - -void get_window_position(GtkWidget* Widget, int* x, int* y); -void set_window_position(GtkWidget* Widget, int x, int y); - -GF_Config* check_config_file(); -Bool is_connected(); - -/* HBBTV Functions */ - - -/* HBBTV Button */ -void on_redbuttonclicked(GtkWidget *widget, gpointer data); -void on_greenbuttonclicked(GtkWidget *widget, gpointer data); -void on_yellowbuttonclicked(GtkWidget *widget, gpointer data); -void on_bluebuttonclicked(GtkWidget *widget, gpointer data); - -/*Navigation */ -void on_upbuttonclicked(GtkWidget *widget, gpointer data); -void on_downbuttonclicked(GtkWidget *widget, gpointer data); -void on_leftbuttonclicked(GtkWidget *widget, gpointer data); -void on_rightbuttonclicked(GtkWidget *widget, gpointer data); -void on_returnbuttonclicked(GtkWidget *widget, gpointer data); -void on_exitbuttonclicked(GtkWidget *widget, gpointer data); -void on_2buttonclicked(GtkWidget *widget, gpointer data); - -/* Control */ -void on_onoffbuttonclicked(GtkWidget *widget, gpointer data); -void on_playpausebuttonclicked(GtkWidget *widget, gpointer data); -void on_playbuttonclicked(GtkWidget *widget, gpointer data); -void on_pausebuttonclicked(GtkWidget *widget, gpointer data); -void on_langbuttonclicked(GtkWidget *widget, gpointer data); -void on_chanupbuttonclicked(GtkWidget *widget, gpointer data); -void on_chandownbuttonclicked(GtkWidget *widget, gpointer data); -void on_channelbuttonclicked(GtkWidget *widget, gpointer data); -void on_teletextbuttonclicked(GtkWidget *widget, gpointer data); - - - -#ifdef __cplusplus -} -#endif - -#endif // __HBBTVTERMINAL__ diff --git a/applications/hbbtvplayer/hbbtvterminal/src/makefile.am b/applications/hbbtvplayer/hbbtvterminal/src/makefile.am deleted file mode 100644 index 65c35f3..0000000 --- a/applications/hbbtvplayer/hbbtvterminal/src/makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -########################################################################################### -## -## Copyright 2011 Telecom Paristech -## Author : Stanislas Selle -## -########################################################################################### - -bin_PROGRAMS = hbbtvterminal -hbbtvterminal_SOURCES = hbbtvterminal.cpp hbbtv_demux.cpp hbbtv_channel.cpp hbbtv_keycontrol.cpp hbbtv_tools.cpp hbbtvterminal.h - -SPECIALCFLAGS = -g -DXP_UNIX=1 -DMOZ_X11=1 -fPIC - -hbbtvterminal_CPPFLAGS = $(SPECIALCFLAGS) $(HBBTVBROWSERPLUGIN_CFLAGS) $(GLIB_CFLAGS) $(GTK_CFLAGS) $(WEBKIT_CFLAGS) $(PIXMAN_CFLAGS) $(NPAPI_CFLAGS)\ - -g -DXP_UNIX -fPIC \ - -I /usr/include\ - -I /usr/include/gpac/\ - -I /usr/local/include\ - -I /usr/local/include/gpac/ - - -hbbtvterminal_LDFLAGS = $(SPECIALCFLAGS) - -hbbtvterminal_LDADD = $(GLIB_LIBS) $(GTK_LIBS) $(WEBKIT_LIBS) $(PIXMAN_LIBS) $(NPAPI_LIBS) $(MOZILLAJS_LIBS) $(HBBTVBROWSERPLUGIN_LIBS) \ - -L/usr/local/lib -lgpac - diff --git a/applications/hbbtvplayer/install.sh b/applications/hbbtvplayer/install.sh deleted file mode 100644 index a5c9883..0000000 --- a/applications/hbbtvplayer/install.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh -e - -PLAYER=0 -DEPENDENCIES=0 -WEBKIT=0 -GPAC=0 - -if [ -z $1 ] ; then - echo "\nUsage: You must choose options :" - echo "\n\033[31m full - build the whole package (gpac+webkit+hbbtvplayer) Recommanded for computer without gpac \033[0m" - echo "\n\033[32m player - build the HBBTV player \033[0m" - echo "\n\033[33m webkit - download Webkit sources and install it\033[0m" - echo "\n\033[33m gpac - download gpac sources and install it\033[0m" - echo "\n\033[34m dependencies - get the dependencies needed to build the HBBTVPlayer \033[0m" - exit 1 -fi - -for i in $* ; do - if [ "$i" = "full" ] ; then - echo -e "\033[31m Usage: $0 Full Building : Activated \033[0m" - PLAYER=1 - DEPENDENCIES=1 - WEBKIT=1 - GPAC=1 - fi - - if [ "$i" = "player" ] ; then - echo -e "\033[32m Usage: $0 Player Building : Activated \033[0m" - PLAYER=1 - fi - - if [ "$i" = "dependencies" ] ; then - echo -e "\033[34m Usage: $0 Dependecies Building : Activated \033[0m" - DEPENDENCIES=1 - fi - - if [ "$i" = "webkit" ] ; then - echo -e "\033[33m Usage: $0 Webkit Building : Activated \033[0m" - WEBKIT=1 - fi - - if [ "$i" = "gpac" ] ; then - echo -e "\033[33m Usage: $0 gpac Building : Activated \033[0m" - WEBKIT=1 - fi -done - -if [ $DEPENDENCIES -eq 1 ] ; then - sudo apt-get install `cat listdependencies` -fi - -if [ $GPAC -eq 1 ] ; then - cd gpac - ./configure --use-js=no - make -j2 - sudo make install - sudo make install-lib - cd .. -fi - -if [ $WEBKIT -eq 1 ] ; then - ./WebKit/Tools/Scripts/build-webkit --gtk --with-gtk=2.0 --no-webkit2 --makeargs="-j2 install" -fi - - -if [ $PLAYER -eq 1 ] ; then - cd hbbtvbrowserplugin - ./autogen.sh - sudo make install - cd .. - - cd hbbtvterminal - ./autogen.sh - sudo make install - cd .. -fi - - diff --git a/applications/hbbtvplayer/listdependencies b/applications/hbbtvplayer/listdependencies deleted file mode 100644 index 58c74a3..0000000 --- a/applications/hbbtvplayer/listdependencies +++ /dev/null @@ -1,79 +0,0 @@ -autoconf -automake -autotools-dev -bison -build-essential -dvb-apps -flex -gail-3.0 -glib-networking -gperf -gtk-doc-tools -liba52-0.7.4-dev -libasound2-dev -libatk1.0-0 -libavcodec52 -libavcodec-dev -libavformat52 -libavformat-dev -libavutil-dev -libc6 -libcairo2 -libenchant1c2a -libenchant-dev -libfaad2 -libfaad-dev -libfontconfig1 -libfreetype6 -libfreetype6-dev -libgail18 -libgail-3-dev -libgail-dev -libgcc1 -libgdk-pixbuf2.0-0 -libgl1-mesa-dev -libglib2.0-0 -libglib2.0-dev -libgpac0.4.5 -libgstreamer0.10-0 -libgstreamer-plugins-base0.10-0 -libgtk2.0-dev -libicu44 -libjpeg62-dev -libmad0-dev -libogg-dev -libopenjpeg-dev -libpango1.0-0 -libpng12-dev -libpulse-dev -libsdl1.2debian -libsdl1.2-dev -libsoup2.4-dev -libsqlite3-dev -libssl-dev -libstdc++6 -libswscale-dev -libtheora-dev -libtool -libvorbis-dev -libwxbase2.8-dev -libwxgtk2.8-dev -libx11-6 -libxml2 -libxslt-dev -libxt6 -libxv-dev -libxvidcore-dev -linux-sound-base -subversion -wx2.8-headers -x11proto-gl-dev -x11proto-video-dev -xulrunner-2.0-dev -zlib1g-dev -libgeoclue-dev -icu-doc -libicu-dev -libgstreamer0.10-dev -libgstreamer-plugins-base0.10-dev - diff --git a/applications/hbbtvplayer/projectmanager/codeblocks/hbbtvplayer.workspace b/applications/hbbtvplayer/projectmanager/codeblocks/hbbtvplayer.workspace deleted file mode 100644 index ab6eb5a..0000000 --- a/applications/hbbtvplayer/projectmanager/codeblocks/hbbtvplayer.workspace +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - -- 2.30.2