CVSROOT: /sources/gnash Module name: gnash Changes by: Rob Savoye <rsavoye> 08/02/07 02:43:58
Modified files: . : ChangeLog Added files: packaging : install-gnash.sh extensions/launcher: Makefile.am launcher.cpp launcher_ext.cpp launcher_ext.h md5.cpp md5.h test.as Log message: * packaging/install-gnash.sh: Install script for installting binary tarballs. * extensions/launcher: New extension for launching application from a swf file. Very handy for a swf basd UI for mobile devices that use graphical menus. * extensions/launcher/launcher.cpp: Launcher support, which uses an MD5 checksum to make sure it only launches the application that's compiled in. * extensions/launcher/launcher_ext.{cpp,h}: Wrappers for the Launcher AS class. * extensions/launcher/md5.{cpp,h}: md5 calculations. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/packaging/install-gnash.sh?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5579&r2=1.5580 http://cvs.savannah.gnu.org/viewcvs/gnash/extensions/launcher/Makefile.am?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/extensions/launcher/launcher.cpp?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/extensions/launcher/launcher_ext.cpp?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/extensions/launcher/launcher_ext.h?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/extensions/launcher/md5.cpp?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/extensions/launcher/md5.h?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/extensions/launcher/test.as?cvsroot=gnash&rev=1.1 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.5579 retrieving revision 1.5580 diff -u -b -r1.5579 -r1.5580 --- ChangeLog 6 Feb 2008 17:00:00 -0000 1.5579 +++ ChangeLog 7 Feb 2008 02:43:56 -0000 1.5580 @@ -1,3 +1,17 @@ +2008-02-06 Rob Savoye <[EMAIL PROTECTED]> + + * packaging/install-gnash.sh: Install script for installting + binary tarballs. + * extensions/launcher: New extension for launching application + from a swf file. Very handy for a swf basd UI for mobile devices + that use graphical menus. + * extensions/launcher/launcher.cpp: Launcher support, which uses + an MD5 checksum to make sure it only launches the application + that's compiled in. + * extensions/launcher/launcher_ext.{cpp,h}: Wrappers for the + Launcher AS class. + * extensions/launcher/md5.{cpp,h}: md5 calculations. + 2008-02-06 Sandro Santilli <[EMAIL PROTECTED]> * testsuite/actionscript.all/array.as: another insane test.. Index: packaging/install-gnash.sh =================================================================== RCS file: packaging/install-gnash.sh diff -N packaging/install-gnash.sh --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ packaging/install-gnash.sh 7 Feb 2008 02:43:56 -0000 1.1 @@ -0,0 +1,457 @@ +#!/bin/sh +# +# Copyright (C) 2008 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# +# install script for Gnash binary tarballs. +# + +# set to any command to execute to make the shell commands not +# make any actual changes on disk. 'echo' is the usual value here +# for this, as it just displays the commands to the screen. +debug=echo + +# set 'yes' to 'yes', and you don't get asked for prompts. +# Use with care!!! Note that setting this to yes obligates the user +# to having agreed to the GPLv3 license when executing this script. +yes=yes + +# aliases for a few commands to force debug mode while still leaving +# the rest of this code readable. +COPY="$debug cp -f" +REMOVE="$debug rm -f" +MOVE="$debug mv -f" + +# +# Display the GPLv3, and get the users agreement before proceeding +# +gpl () +{ + # display the GPLv3 + cat COPYING + + # make sure the user agrees + if [ x$yes = xno ]; then + read -p "Do you agree to the terms of this license? (yes or no) " answer + else + answer="$yes" + echo "NOTE: You have the install script set to \"yes always\" mode" + echo "NOTE: This means by default you have agree to the terms of the GPLv3" + fi + + if [ x$answer != xyes ] ; then + echo "Sorry, then you can't install Gnash..." + exit + fi +} + +# This script has a split personality in that it works in an +# unconfigured tree, as well as a version with the paths munged +# by the normal Gnash configuration process. This way we can +# have the final version as included in the tarball have the +# paths Gnash was configured with for that build, which seems +# a good idea. Running this unconfigured is mostly a maintainer +# feature, it's much faster to be avbke to rerun this script than +# constantely reconfiguring gnash, which isn't real fast... + +checkdirs () +{ + # Root directory used to look for pre existing installations, + # as well as were these files get installed to. + rootdir="@prefix@" + if [ x"${rootdir}" = x"@prefix@" ]; then + rootdir="/usr/local" + fi + + # This is where the NSAPI (any Geeko based browser like Mozilla, + # Netscape, Firefox, Galeon, Ephipany, XO Web Activity, gets + # installed. Most browsers, whether proprietary or open software + # support NSAPI, but your mileage may vary... + nsapidir="@FIREFOX_PLUGINS@" + if [ x"${nsapidir}" = x"@FIREFOX_PLUGINS@" ]; then + nsapidir="/usr/lib/mozilla/plugins" # + fi + if [ ! -w ${nsapidir} ]; then + needstobe="`ls -ld ${nsapidir} | cut -f 3 -d ' ' 2>&1`" + echo "Sorry, you need to be have write permissions to \"${nsapidir}\" to install the Gnash NSAPI plugin" + echo "Or be the user \"${needstobe}\"" + $debug exit + fi + + # This is where the Kparts plugin gets installed. + kpartsplugindir="@KDE_PLUGINDIR@" + if [ x"${kpartsplugindir}" = x"@KDE_PLUGINDIR@" ]; then + kpartsplugindir="/usr/lib/kde3" + fi + if [ -d ${kpartsplugindir} -a ! -w ${kpartsplugindir} ]; then + needstobe="`ls -ld ${kpartsplugindir} | cut -f 3 -d ' ' 2>&1`" + echo "Sorry, you need to be have write permissions to \"${kpartsplugindir}\" to install the Gnash Kparts plugin" + echo "Or be the user \"${needstobe}\"" + $debug exit + fi + + # This is where the Kparts services gets installed. + kpartsservicesdir="@KDE_SERVICESDIR@" + if [ x"${kpartsservicesdir}" = x"@KDE_SERVICESDIR@" ]; then + kpartsservicesdir="/usr/share/services" + fi + if [ -d ${kpartsservicesdir} -a ! -w ${kpartsservicesdir} ]; then + needstobe="`ls -ld ${kpartsservicesdir} | cut -f 3 -d ' ' 2>&1`" + echo "Sorry, you need to be have write permissions to \"${kpartsservicesdir}\" to install the Gnash Kparts services" + echo "Or be the user \"${needstobe}\"" + $debug exit + fi + + # This is where the Kparts config gets installed. + kpartsconfigdir="@KDE_CONFIGDIR@" + if [ x"${kpartsconfigdir}" = x"@KDE_CONFIGDIR@" ]; then + kpartsconfigdir="/etc/kde3" + fi + if [ -d ${kpartsconfigdir} -a ! -w ${kpartsconfigdir} ]; then + needstobe="`ls -ld ${kpartsconfigdir} | cut -f 3 -d ' ' 2>&1`" + echo "Sorry, you need to be have write permissions to \"${kpartsconfigdir}\" to install the Gnash Kparts Config Data" + echo "Or be the user \"${needstobe}\"" + $debug exit + fi + + # This is where the Kparts appdata gets installed. + kpartappsdir="@KDE_APPSDATADIR@" + if [ x"${kpartappsdir}" = x"@KDE_APPSDATADIR@" ]; then + kpartappsdir="/usr/share/apps/klash" + fi + if [ -d ${kpartappsdir} -a ! -w ${kpartappsdir} ]; then + needstobe="`ls -ld ${kpartappsdir} | cut -f 3 -d ' ' 2>&1`" + echo "Sorry, you need to be have write permissions to \"${kpartappsdir}\" to install the Gnash Kparts Application Data" + echo "Or be the user \"${needstobe}\"" + $debug exit + fi + + if [ x"${debug}" != x ]; then + echo "NOTE: You have debug mode set to \"${debug}\", no real commands will be executed" + fi + + if [ ! -w ${rootdir} ]; then + needstobe="`ls -ld ${rootdir} | cut -f 3 -d ' ' 2>&1`" + if [ x`whoami` != xroot ]; then + echo "Sorry dude, you need to be have write permissions to \"${rootdir}\" to install Gnash" + echo "Or be the user \"${needstobe}\"" + $debug exit + fi + fi + + # dopcumentation gets installed here + docdir="/usr/share/doc" + + if [ ! -w ${docdir} ]; then + needstobe="`ls -ld ${docdir} | cut -f 3 -d ' ' 2>&1`" + if [ x`whoami` != xroot ]; then + echo "Sorry dude, you need to be have write permissions to \"${docdir}\" to install Gnash" + echo "Or be the user \"${needstobe}\"" + $debug exit + fi + fi +} + +# look for existing installtions of snapshots. As these are date stamped, +# it's possible to get many of them from repeated weekly installs of +# these Gnash snapshots. So Look for them, and let the user remove pieces +# of them to return to a stable state. +preexisting () +{ + if [ -d ${rootdir}/lib/gnash ]; then + existing=`ls -d ${rootdir}/lib/gnash/libgnashbase-*.so 2> /dev/null` + if [ -n "${existing}" ]; then + echo "" + echo "You have previous installations of Gnash" + file="" + for i in $existing; do + files="$files `echo $i | sed -e 's:.*gnashbase-::' -e 's:.so::'`" + done + echo "version: $files" + echo "These should to be removed for the best stability of Gnash" + if [ x$yes = xno ]; then + read -p "Do you wish to remove these old versions ? " answer + else + answer="$yes" + fi + if [ x$answer = xyes ]; then + for i in $files; do + if [ x$yes = xno ]; then + read -p "Remove Gnash version \"$i\"? " answer + else + answer="$yes" + fi + if [ x$answer = xyes ]; then + ${REMOVE} $rootdir/lib/gnash/libgnash*-$i.* + fi + done + fi + fi + existing=`ls -d ${rootdir}/bin/*-gnash 2> /dev/null` + if [ -n "${existing}" ]; then + echo "You have previous installations of the Gnash GUI" + files="" + for i in $existing; do + files="$files `echo $i | sed -e 's:-gnash::' -e "s:${rootdir}/bin/::"`" + done + echo "GUIS: $files" + echo "These should to be removed for the best stability of Gnash" + if [ x$yes = xno ]; then + read -p "Do you wish to remove these old versions ? " answer + else + answer="$yes" + fi + if [ x$answer = xyes ]; then + for i in $files; do + if [ x$yes = xno ]; then + read -p "Remove Gnash GUI \"$i\"? " answer + else + answer="$yes" + fi + if [ x$answer = xyes ]; then + ${REMOVE} $rootdir/bin/gnash/$i-gnash + fi + done + fi + if [ x$yes = xno ]; then + read -p "Do you wish to remove the gnash shell script too ? " answer + else + answer="$yes" + fi + if [ x$answer = xyes ]; then + ${REMOVE} $rootdir/bin/gnash/gnash + fi + fi + else + echo "Cool, you don't have any preexisting installations of Gnash" + fi + + return `true` +} + +# install all the files to their proper location. +# this basically dumplicates what "make install install-plugin" +# does, but it's more oriented towards developers than end users. +# so this is the more user friendly way to install a binary tarball. +install () +{ + # install the NSAPI (Mozilla/Firefox) plugin + if [ -e plugins/libgnashplugin.so -o x$yes = xyes ]; then + ${COPY} libgnashplugin.so ${nsapidir} + else + echo "You don't have the NSAPI plugin, installation can't continue" + exit + fi + + # install the Kparts (KDE/Konqueror) plugin + if [ -e plugins/libklashpart.so -o x$yes = xyes ]; then + ${COPY} plugins/libklashpart.so ${kpartsplugindir} + else + echo "You don't have the Kparts plugin, installation can't continue" + exit + fi + + # install the libraries + if [ -e lib/libgnashbase.so -o x$yes = xyes ]; then + ${COPY} lib/libgnash*.so /usr/lib/ + else + echo "You don't have the Gnash libraries, installation can't continue" + exit + fi + + # install the executables + if [ -e bin/gtk-gnash -o x$yes = xyes ]; then + ${COPY} bin/*gnash bin/gprocessor bin/dumpshm bin/soldumper /usr/bin/ + else + echo "You don't have the Gnash executable, installation can't continue" + exit + fi + + if [ -e dumpshm -o x$yes = xyes ]; then + ${COPY} gprocessor dumpshm soldumper /usr/bin/ + else + echo "You don't have the Gnsh utilities, installation can't continue" + exit + fi + + # install the documentation + if [ -e gnash.pdf -o x$yes = xyes ]; then + mkdir -p /usr/share/doc/gnash + ${COPY} gnash.pdf /usr/share/doc/gnash + fi +} + +# +# Here's where we make an attempt to see if the dependant +# packages Gnash needs are installed. This has a pile of +# system dependant code in it, so for now we can only support +# the more popular packaging types, namely rpm,.deb, ipkg, and +# BSD packages. +# +checkdeps() +{ + genericdeps="boost gstreamer libpng libjpeg libxml2 libstdc++ curl agg fixme" + gtkdeps="gtk2 gtkglext pango atk" + kdedeps="kdebase qt" + missing="" + # first see which packaging system we have to deal with. + # First we go through and see what program we can use to + # check for installed packages. Note that this does not + # currently support finding packages you've built from + # source, or installed via a tarball, because neither will + # have entries into the package DB. + pkginfo="rpm dpkg ipkg pkg_info" + for i in $pkginfo; do + if [ `which $i` ]; then + pkginfo=$i + echo "Yes, found $i, so we'll use that for listing packages" + break + fi + done + + # BSD needs PKG_PATH set to load anything over the net. + if [ ${pkginfo} = "pkg_info" ]; then + if [ x${PKG_PATH} = x ]; then + echo "Pleaase set the environment variable PKG_PATH and try again." + exit 1 + fi + fi + # Usually the program that installs packages isn't the same one + # that we can use to check the packaging DB. + pkgnet="yum apt-get ipkg pkg_add" + for i in ${pkgnet}; do + if [ `which $i` ]; then + pkgnet=$i + echo "Yes, found $i, so we'll use that to install packages" + break + fi + done + + echo "Looking for dependent packages for GTK2 and KDE..." + # first find the packages all configurations of Gnash need + for i in ${genericdeps} ${gtkdeps} ${kdedeps}; do + case $pkginfo in + dpkg) + deps="`dpkg -l "*$i*" | grep -- "^ii" | cut -d ' ' -f 3`" + ;; + rpm) + deps="`rpm -q "$i"`" + ;; + pkg_info) + deps="fixme" + ;; + ipkg) + deps="fixme" + ;; + *) + echo "ERROR: No package manager found!" + exit 1 + ;; + esac + found=`echo ${deps} | grep -v 'not installed' | grep -c "${i}" 2>&1` + if [ $found -gt 0 ]; then + echo "Yes, found $i" + else + echo "Nope, $i appears to not be installed" + missing="${missing} $i" + fi + done + + if [ -n "${missing}" ]; then + echo "package(s)\"${missing}\" are missing!" + echo "You will need sudo priviledges to install the packages" + if [ x$yes = xno ]; then + $debug sudo ${pkgnet} install ${missing} + else + $debug sudo ${pkgnet} -y install ${missing} + fi + fi +} + +# +# Get codecs +# +getcodecs() +{ + # sudo apt-get install gstreamer0.10-ffmpegsudo apt-get install gstreamer0.10-ffmpeg gstreamer0.10-gl gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse libxine-extracodecs w32codecs + # deb http://archive.ubuntu.com/ubuntu dapper universe multiverse + # deb-src http://archive.ubuntu.com/ubuntu dapper universe multiverse + + + + echo $0 +} + +# +# Here's where all the actions happens +# + +# if we have any argument, process them +while [ ! -z $1 ]; do + case "$1" in + rootdir=*) + rootdir=`echo $1 | sed -e 's:rootdir=::'` + if [ -z "${rootdir}" ]; then + echo "ERROR: You need to specify an argument for rootdir=" + fi + ;; + dump) + yes=yes + checkdirs + echo "" + echo "Default paths are: " + echo " Root directory is: ${rootdir}" + echo " NSAPI directory is: ${nsapidir}" + echo " Kparts plugin directory is: ${kpartsplugindir}" + echo " Kparts services directory is: ${kpartsservicesdir}" + echo " Kparts config data directory is: ${kpartsconfigdir}" + echo " Kparts application data directory is: ${kpartappsdir}" + echo "" + echo "The 'debug' option is set to: \"${debug}\"" + echo "The 'yes' option is set to: \"${yes}\"" + echo "The 'COPY' command is set to: \"${COPY}\"" + echo "The 'REMOVE' command is set to: \"${REMOVE}\"" + echo "The 'MOVE' command is set to: \"${MOVE}\"" + exit 0 + ;; + deps) + checkdeps + exit 1 + ;; + *) + echo "Usage: $0 [rootdir=path]" + echo " \"$1\" isn't a supported option" + exit 1 + ;; + esac +done + +# +# Here's where everything actually gets executed +# +# Go through the license agreement +gpl + +# Check the directory permissions first +checkdirs + +# Look for preexisting installations of Gnash. letting the user +# remove them if they so choose +preexisting + +# Install Gnash +install Index: extensions/launcher/Makefile.am =================================================================== RCS file: extensions/launcher/Makefile.am diff -N extensions/launcher/Makefile.am --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ extensions/launcher/Makefile.am 7 Feb 2008 02:43:57 -0000 1.1 @@ -0,0 +1,95 @@ +## Process this file with automake to generate Makefile.in +# +# Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +AUTOMAKE_OPTIONS = + +# this is where Gnash plugins get installed +pluginsdir = $(libdir)/gnash/plugins + +plugins_LTLIBRARIES = launcher_ext.la +bin_PROGRAMS = launcher-gnash + +AM_CPPFLAGS = -DGNASHBINDIR=\"${bindir}\" +INCLUDES = -I$(srcdir) \ + -I$(top_srcdir)/libbase \ + -I$(top_srcdir)/server \ + -I$(top_srcdir)/server/vm \ + -I$(top_srcdir)/asobjs \ + $(BOOST_CFLAGS) \ + $(NULL) + +launcher_ext_la_SOURCES = launcher_ext.cpp launcher_ext.h +launcher_ext_la_LDFLAGS = -module -avoid-version -no-undefined +launcher_ext_la_LIBDADD = $(LIBADD_DL) $(LIBLTDL) \ + $(top_builddir)/libbase/libgnashbase.la \ + $(top_builddir)/server/libgnashserver.la \ + $(PTHREAD_LIBS) \ + $(NULL) + +launcher_gnash_SOURCES = \ + launcher.cpp \ + md5.cpp md5.h +launcher_gnash_LDADD = $(top_builddir)/libbase/libgnashbase.la +launcher_gnash_DEPENDENCIES = sums + +CLEANFILES = gnash-dbg.log + +# this is a list of Gnash executables that we're allowed to execute +PROGS = + +if BUILD_GTK_GUI +PROGS += gui/.libs/gtk-gnash +endif + +if BUILD_HILDON_GUI +PROGS += gui/.libs/hildon-gnash +endif + +if BUILD_ALP_GUI +PROGS += gui/.libs/alp-gnash +endif + +if BUILD_KDE_GUI +PROGS += gui/.libs/kde-gnash +endif + +if BUILD_SDL_GUI +PROGS += gui/.libs/sdl-gnash +endif + +if BUILD_FLTK_GUI +PROGS += gui/.libs/fltk-gnash +endif + +# we don't use a dependency here, as it's too messy for make. Instead, we just +# check to make sure the file exists, and is an executable +sums: + for i in $(PROGS); do \ + if test -x ../../$$i; then \ + file=`basename $$i | tr '-' '_' `; \ + rm -f $$file; \ + md5=`$(MD5SUM) ../../$$i | cut -d ' ' -f 1`; \ + echo "const char *$$file = \"$$md5\";" > $$file.h; \ + fi; \ + done + +check_PROGRAMS = # SharedTest + +install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) + test -d "$(DESTDIR)$(pluginsdir)" || $(mkinstalldirs) "$(DESTDIR)$(pluginsdir)" + $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $(plugins_LTLIBRARIES) "$(DESTDIR)$(pluginsdir)/$(plugins_LTLIBRARIES)" + $(RM) $(DESTDIR)$(pluginsdir)/*.a Index: extensions/launcher/launcher.cpp =================================================================== RCS file: extensions/launcher/launcher.cpp diff -N extensions/launcher/launcher.cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ extensions/launcher/launcher.cpp 7 Feb 2008 02:43:57 -0000 1.1 @@ -0,0 +1,162 @@ +// +// Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#ifdef HAVE_CONFIG_H +#include "gnashconfig.h" +#endif + +#include <iostream> +#include <cerrno> +#include <cstring> +#include <cassert> +#include <sys/types.h> +#include <sys/stat.h> + +#ifdef USE_GTK +#include "gtk_gnash.h" +#endif + +#ifdef USE_HILDON +#include "hildon_gnash.h" +#endif + +#ifdef USE_ALP +#include "alp_gnash.h" +#endif + +#ifdef USE_KDE +#include "kde_gnash.h" +#endif + +#ifdef USE_SDL +#include "sdl_gnash.h" +#endif + +#ifdef USE_FLTK +#include "fltk_gnash.h" +#endif + +#include "md5.h" + +using namespace std; + +int +main(int argc, char *argv[]) +{ + string procname; + pid_t childpid; + + char *gnash_env = getenv("GNASH_PLAYER"); + if (!gnash_env) { + procname = GNASHBINDIR; + procname += "/hildon-gnash"; + } else { + procname = gnash_env; + } + + struct stat procstats; + + // See if the file actually exists, otherwise we can't spawn it + if (stat(procname.c_str(), &procstats) == -1) { + cout << "Invalid filename: " << procname << endl; + exit(-1); + } + + // Check the MD5, as a minimal security check + string md5 = hildon_gnash; + if (md5_filespec_check(procname, md5)) { + cout << "MD5 matches for " << procname << endl; + } else { + cout << "ERROR: MD5 doesn't match! for " << procname << endl; + exit(-1); + } + + // make a copy of ourself, the child gets replaced by the file to + // be executed, and the parent goes away. + childpid = fork(); + + // childpid is -1, if the fork failed, so print out an error message + if (childpid == -1) { + cout << "ERROR: dup2() failed: " << strerror(errno) << endl; + exit(-1); + } + + // childpid is a positive integer, if we are the parent, and + // fork() worked, so exit cleanly + if (childpid > 0) { + cout << "Forked sucessfully, child process PID is " << childpid << endl; + exit(0); + } + + // setup the command line for the executable we want to launch + long win_xid; + int win_height, win_width; + string base_url = "."; + + const size_t buf_size = 30; + char xid[buf_size], width[buf_size], height[buf_size]; + snprintf(xid, buf_size, "%ld", win_xid); + snprintf(width, buf_size, "%d", win_width); + snprintf(height, buf_size, "%d", win_height); + + // REMEMBER TO INCREMENT THE maxargc COUNT IF YOU + // ADD NEW ARGUMENTS + const size_t maxargc = 16; + char **sub_argv = new char *[maxargc]; + + size_t sub_argc = 0; + sub_argv[sub_argc++] = const_cast<char*>( procname.c_str() ); + // don't specify rendering flags, so that the rcfile + // will control that + // sub_argv[sub_argc++] = "-r"; + // sub_argv[sub_argc++] = "3"; + sub_argv[sub_argc++] = "-v"; + sub_argv[sub_argc++] = "-x"; + sub_argv[sub_argc++] = xid; + sub_argv[sub_argc++] = "-j"; + sub_argv[sub_argc++] = width; + sub_argv[sub_argc++] = "-k"; + sub_argv[sub_argc++] = height; + sub_argv[sub_argc++] = "-u"; + sub_argv[sub_argc++] = const_cast<char*>( base_url.c_str() ); + sub_argv[sub_argc++] = "--version"; + sub_argv[sub_argc++] = 0; + + assert(sub_argc <= maxargc); + + // Start the desired executable and go away + cout << "Starting process: "; + + for (int i=0; sub_argv[i] != 0; ++i) { + cout << sub_argv[i] << " "; + } + cout << endl; + + execv(sub_argv[0], sub_argv); + // if execv returns, an error has occurred. + perror(strerror(errno)); + + delete[] sub_argv; + + exit (0); +} + +// Local Variables: +// mode: C++ +// indent-tabs-mode: t +// End: Index: extensions/launcher/launcher_ext.cpp =================================================================== RCS file: extensions/launcher/launcher_ext.cpp diff -N extensions/launcher/launcher_ext.cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ extensions/launcher/launcher_ext.cpp 7 Feb 2008 02:43:57 -0000 1.1 @@ -0,0 +1,168 @@ +// +// Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#ifdef HAVE_CONFIG_H +#include "gnashconfig.h" +#endif + +#include <iostream> + +#include <cstdarg> +#include <cstdio> +#include <cstdlib> + +#include <string> +#include "log.h" +#include "launcher_ext.h" +#include "fn_call.h" +#include "as_object.h" +#include "builtin_function.h" // need builtin_function + +using namespace std; + +namespace gnash +{ + +as_value launcher_create_md5sum(const fn_call& fn); +as_value launcher_verify_md5sum(const fn_call& fn); + +Launcher::Launcher() + : _name(0) +{ + GNASH_REPORT_FUNCTION; +} + + +Launcher::~Launcher() +{ + GNASH_REPORT_FUNCTION; +} + + +void +Launcher::launch(const char *filespec) +{ + GNASH_REPORT_FUNCTION; +} + +const char * +Launcher::create_md5sum(const char *filespec) +{ + GNASH_REPORT_FUNCTION; +} + +bool +Launcher::verify_md5sum(const char *filespec, const char *md5) +{ + GNASH_REPORT_FUNCTION; +} + +class launcher_as_object : public as_object +{ +public: + Launcher obj; +}; + +static void +attachInterface(as_object *obj) +{ + GNASH_REPORT_FUNCTION; + obj->init_member("CreateMD5sum", new builtin_function(launcher_create_md5sum)); + obj->init_member("VerifyMD5sum", new builtin_function(launcher_verify_md5sum)); +} + +static as_object* +getInterface() +{ + GNASH_REPORT_FUNCTION; + static boost::intrusive_ptr<as_object> o; + if (o == NULL) { + o = new as_object(); + } + return o.get(); +} + +static as_value +launcher_ctor(const fn_call& /* fn */) +{ + GNASH_REPORT_FUNCTION; + launcher_as_object* obj = new launcher_as_object(); + + attachInterface(obj); + return as_value(obj); // will keep alive +// printf ("Hello World from %s !!!\n", __PRETTY_FUNCTION__); +} + +as_value +launcher_create_md5sum(const fn_call& fn) +{ + GNASH_REPORT_FUNCTION; + boost::intrusive_ptr<launcher_as_object> ptr = ensureType<launcher_as_object>(fn.this_ptr); + + if (fn.nargs > 0) { + string filespec = fn.arg(0).to_string(); + return as_value(ptr->obj.create_md5sum(filespec.c_str())); + } + return as_value(""); +} + +as_value +launcher_verify_md5sum(const fn_call& fn) +{ + GNASH_REPORT_FUNCTION; + boost::intrusive_ptr<launcher_as_object> ptr = ensureType<launcher_as_object>(fn.this_ptr); + + if (fn.nargs > 0) { + string filespec = fn.arg(0).to_string(); + string md5 = fn.arg(1).to_string(); + return as_value(ptr->obj.verify_md5sum(filespec.c_str(), md5.c_str())); + } + return as_value(true); +} + +std::auto_ptr<as_object> +init_launcher_instance() +{ + return std::auto_ptr<as_object>(new launcher_as_object()); +} + +extern "C" { + void + launcher_class_init(as_object &obj) + { +// GNASH_REPORT_FUNCTION; + // This is going to be the global "class"/"function" + static boost::intrusive_ptr<builtin_function> cl; + if (cl == NULL) { + cl = new builtin_function(&launcher_ctor, getInterface()); +// // replicate all interface to class, to be able to access +// // all methods as static functions + attachInterface(cl.get()); + } + + obj.init_member("Launcher", cl.get()); + } +} // end of extern C + + +} // end of gnash namespace + +// Local Variables: +// mode: C++ +// indent-tabs-mode: t +// End: Index: extensions/launcher/launcher_ext.h =================================================================== RCS file: extensions/launcher/launcher_ext.h diff -N extensions/launcher/launcher_ext.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ extensions/launcher/launcher_ext.h 7 Feb 2008 02:43:57 -0000 1.1 @@ -0,0 +1,57 @@ +// +// Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +#ifndef __LAUNCHER_PLUGIN_H__ +#define __LAUNCHER_PLUGIN_H__ + +#ifdef HAVE_CONFIG_H +#include "gnashconfig.h" +#endif + +#include <memory> // for auto_ptr +#include "as_object.h" + +namespace gnash +{ + +class Launcher { +public: + Launcher(); + ~Launcher(); + void launch(const char *filespec); + const char *create_md5sum(const char *filespec); + bool verify_md5sum(const char *filespec, const char *md5); +private: + const char *_name; +}; + +extern "C" { + void launcher_class_init(as_object &obj); + /// Return an instance +} + +std::auto_ptr<as_object> init_launcher_instance(); + +} // end of gnash namespace + +// __LAUNCHER_PLUGIN_H__ +#endif + +// Local Variables: +// mode: C++ +// indent-tabs-mode: t +// End: Index: extensions/launcher/md5.cpp =================================================================== RCS file: extensions/launcher/md5.cpp diff -N extensions/launcher/md5.cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ extensions/launcher/md5.cpp 7 Feb 2008 02:43:57 -0000 1.1 @@ -0,0 +1,507 @@ +/* Functions to compute MD5 message digest of files or memory blocks. + according to the definition of MD5 in RFC 1321 from April 1992. + Copyright (C) 1995,1996,1997,1999,2000,2001,2005 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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.1 of the License, or (at your option) any later version. + + The GNU C Library 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Written by Ulrich Drepper <[EMAIL PROTECTED]>, 1995. */ +/* Trimmed by Rob Savoye for Gnash, and converted to C++ <[EMAIL PROTECTED]>, 2007. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <cstdlib> +#include <cstring> +#include <string> + +#include "md5.h" +#include "log.h" + +using namespace gnash; +using namespace std; + +#ifdef WORDS_BIGENDIAN +# define SWAP(n) \ + (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) +#else +# define SWAP(n) (n) +#endif + + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (RFC 1321, 3.1: Step 1) */ +static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; + + +/* Initialize structure containing state of computation. + (RFC 1321, 3.3: Step 3) */ +void +md5_init_ctx (struct md5_ctx *ctx) +{ + ctx->A = 0x67452301; + ctx->B = 0xefcdab89; + ctx->C = 0x98badcfe; + ctx->D = 0x10325476; + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + +/* Put result from CTX in first 16 bytes following RESBUF. The result + must be in little endian byte order. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +void * +md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) +{ + ((uint32_t *) resbuf)[0] = SWAP (ctx->A); + ((uint32_t *) resbuf)[1] = SWAP (ctx->B); + ((uint32_t *) resbuf)[2] = SWAP (ctx->C); + ((uint32_t *) resbuf)[3] = SWAP (ctx->D); + + return resbuf; +} + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +void * +md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) +{ + /* Take yet unprocessed bytes into account. */ + uint32_t bytes = ctx->buflen; + size_t pad; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) + ++ctx->total[1]; + + pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; + memcpy (&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 64-bit file length in *bits* at the end of the buffer. */ + *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); + *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) | + (ctx->total[0] >> 29)); + + /* Process last bytes. */ + md5_process_block (ctx->buffer, bytes + pad + 8, ctx); + + return md5_read_ctx (ctx, resbuf); +} + +/* Compute MD5 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +int +md5_stream (FILE *stream, void *resblock) +{ + /* Important: BLOCKSIZE must be a multiple of 64. */ +#define BLOCKSIZE 4096 + struct md5_ctx ctx; + char buffer[BLOCKSIZE + 72]; + size_t sum; + + /* Initialize the computation context. */ + md5_init_ctx (&ctx); + + /* Iterate over full file contents. */ + while (1) + { + /* We read the file in blocks of BLOCKSIZE bytes. One call of the + computation function processes the whole buffer so that with the + next round of the loop another block can be read. */ + size_t n; + sum = 0; + + /* Read block. Take care for partial reads. */ + do + { + n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); + + sum += n; + } + while (sum < BLOCKSIZE && n != 0); + if (n == 0 && ferror (stream)) + return 1; + + /* If end of file is reached, end the loop. */ + if (n == 0) + break; + + /* Process buffer with BLOCKSIZE bytes. Note that + BLOCKSIZE % 64 == 0 + */ + md5_process_block (buffer, BLOCKSIZE, &ctx); + } + + /* Add the last bytes if necessary. */ + if (sum > 0) + md5_process_bytes (buffer, sum, &ctx); + + /* Construct result in desired memory. */ + md5_finish_ctx (&ctx, resblock); + return 0; +} + +/* Compute MD5 message digest for bytes read from filespec. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +bool +md5_filespec (string &filespec, void *resblock) +{ + /* Important: BLOCKSIZE must be a multiple of 64. */ +#define BLOCKSIZE 4096 + struct md5_ctx ctx; + char buffer[BLOCKSIZE + 72]; + size_t sum; + + /* Initialize the computation context. */ + md5_init_ctx (&ctx); + + FILE *fp; + fp = fopen (filespec.c_str(), "rb"); + + /* Iterate over full file contents. */ + while (1) { + /* We read the file in blocks of BLOCKSIZE bytes. One call of the + computation function processes the whole buffer so that with the + next round of the loop another block can be read. */ + size_t n; + sum = 0; + + /* Read block. Take care for partial reads. */ + do + { + n = fread (buffer + sum, 1, BLOCKSIZE - sum, fp); + + sum += n; + } + while (sum < BLOCKSIZE && n != 0); + if (n == 0 && ferror (fp)) + return false; + + /* If end of file is reached, end the loop. */ + if (n == 0) + break; + + /* Process buffer with BLOCKSIZE bytes. Note that + BLOCKSIZE % 64 == 0 + */ + md5_process_block (buffer, BLOCKSIZE, &ctx); + } + + /* Add the last bytes if necessary. */ + if (sum > 0) + md5_process_bytes (buffer, sum, &ctx); + + /* Construct result in desired memory. */ + md5_finish_ctx (&ctx, resblock); + return true; +} + +// Compute MD5 message digest for bytes read from filespec. The result +// is compared to the ascii version of the MD5 (as produced by the +// shell utility md5sum). +bool +md5_filespec_check(std::string &filespec, std::string &md5) +{ + unsigned char resblock[MD5_DIGEST_SIZE+1]; + char result[(MD5_DIGEST_SIZE*2)+1]; + memset(resblock, 0, MD5_DIGEST_SIZE+1); + memset(result, 0, (MD5_DIGEST_SIZE*2)+1); + md5_filespec(filespec, resblock); + + hexify((unsigned char *)result, resblock, MD5_DIGEST_SIZE, false); +// printf("FIXME: %s == \n %s\n", result, md5.c_str()); + if (memcmp(result, md5.c_str(), MD5_DIGEST_SIZE) == 0) { + return true; + } else { + return false; + } +} + +/* compute MD5 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +void * +md5_buffer (const char *buffer, size_t len, void *resblock) +{ + struct md5_ctx ctx; + + /* Initialize the computation context. */ + md5_init_ctx (&ctx); + + /* Process whole buffer but last len % 64 bytes. */ + md5_process_bytes (buffer, len, &ctx); + + /* Put result in desired memory area. */ + return md5_finish_ctx (&ctx, resblock); +} + + +void +md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) +{ + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) + { + size_t left_over = ctx->buflen; + size_t add = 128 - left_over > len ? len : 128 - left_over; + + memcpy (&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + + if (ctx->buflen > 64) + { + md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx); + + ctx->buflen &= 63; + /* The regions in the following copy operation cannot overlap. */ + memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], + ctx->buflen); + } + + buffer = (const char *) buffer + add; + len -= add; + } + + /* Process available complete blocks. */ + if (len >= 64) + { +#if !_STRING_ARCH_unaligned +/* To check alignment gcc has an appropriate operator. Other + compilers don't. */ +# if __GNUC__ >= 2 +# define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (uint32_t) != 0) +# else +# define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (uint32_t) != 0) +# endif + if (UNALIGNED_P (buffer)) + while (len > 64) + { + md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); + buffer = (const char *) buffer + 64; + len -= 64; + } + else +#endif + { + md5_process_block (buffer, len & ~63, ctx); + buffer = (const char *) buffer + (len & ~63); + len &= 63; + } + } + + /* Move remaining bytes in internal buffer. */ + if (len > 0) + { + size_t left_over = ctx->buflen; + + memcpy (&ctx->buffer[left_over], buffer, len); + left_over += len; + if (left_over >= 64) + { + md5_process_block (ctx->buffer, 64, ctx); + left_over -= 64; + memcpy (ctx->buffer, &ctx->buffer[64], left_over); + } + ctx->buflen = left_over; + } +} + + +/* These are the four functions used in the four steps of the MD5 algorithm + and defined in the RFC 1321. The first function is a little bit optimized + (as found in Colin Plumbs public domain implementation). */ +/* #define FF(b, c, d) ((b & c) | (~b & d)) */ +#define FF(b, c, d) (d ^ (b & (c ^ d))) +#define FG(b, c, d) FF (d, b, c) +#define FH(b, c, d) (b ^ c ^ d) +#define FI(b, c, d) (c ^ (b | ~d)) + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 64 == 0. */ + +void +md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) +{ + uint32_t correct_words[16]; + const uint32_t *words = (uint32_t *)buffer; + size_t nwords = len / sizeof (uint32_t); + const uint32_t *endp = words + nwords; + uint32_t A = ctx->A; + uint32_t B = ctx->B; + uint32_t C = ctx->C; + uint32_t D = ctx->D; + + /* First increment the byte count. RFC 1321 specifies the possible + length of the file up to 2^64 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) + ++ctx->total[1]; + + /* Process all bytes in the buffer with 64 bytes in each round of + the loop. */ + while (words < endp) + { + uint32_t *cwp = correct_words; + uint32_t A_save = A; + uint32_t B_save = B; + uint32_t C_save = C; + uint32_t D_save = D; + + /* First round: using the given function, the context and a constant + the next context is computed. Because the algorithms processing + unit is a 32-bit word and it is determined to work on words in + little endian byte order we perhaps have to change the byte order + before the computation. To reduce the work for the next steps + we store the swapped words in the array CORRECT_WORDS. */ + +#define OP(a, b, c, d, s, T) \ + do \ + { \ + a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ + ++words; \ + CYCLIC (a, s); \ + a += b; \ + } \ + while (0) + + /* It is unfortunate that C does not provide an operator for + cyclic rotation. Hope the C compiler is smart enough. */ +#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) + + /* Before we start, one word to the strange constants. + They are defined in RFC 1321 as + + T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 + */ + + /* Round 1. */ + OP (A, B, C, D, 7, 0xd76aa478); + OP (D, A, B, C, 12, 0xe8c7b756); + OP (C, D, A, B, 17, 0x242070db); + OP (B, C, D, A, 22, 0xc1bdceee); + OP (A, B, C, D, 7, 0xf57c0faf); + OP (D, A, B, C, 12, 0x4787c62a); + OP (C, D, A, B, 17, 0xa8304613); + OP (B, C, D, A, 22, 0xfd469501); + OP (A, B, C, D, 7, 0x698098d8); + OP (D, A, B, C, 12, 0x8b44f7af); + OP (C, D, A, B, 17, 0xffff5bb1); + OP (B, C, D, A, 22, 0x895cd7be); + OP (A, B, C, D, 7, 0x6b901122); + OP (D, A, B, C, 12, 0xfd987193); + OP (C, D, A, B, 17, 0xa679438e); + OP (B, C, D, A, 22, 0x49b40821); + + /* For the second to fourth round we have the possibly swapped words + in CORRECT_WORDS. Redefine the macro to take an additional first + argument specifying the function to use. */ +#undef OP +#define OP(f, a, b, c, d, k, s, T) \ + do \ + { \ + a += f (b, c, d) + correct_words[k] + T; \ + CYCLIC (a, s); \ + a += b; \ + } \ + while (0) + + /* Round 2. */ + OP (FG, A, B, C, D, 1, 5, 0xf61e2562); + OP (FG, D, A, B, C, 6, 9, 0xc040b340); + OP (FG, C, D, A, B, 11, 14, 0x265e5a51); + OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); + OP (FG, A, B, C, D, 5, 5, 0xd62f105d); + OP (FG, D, A, B, C, 10, 9, 0x02441453); + OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); + OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); + OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); + OP (FG, D, A, B, C, 14, 9, 0xc33707d6); + OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); + OP (FG, B, C, D, A, 8, 20, 0x455a14ed); + OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); + OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); + OP (FG, C, D, A, B, 7, 14, 0x676f02d9); + OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); + + /* Round 3. */ + OP (FH, A, B, C, D, 5, 4, 0xfffa3942); + OP (FH, D, A, B, C, 8, 11, 0x8771f681); + OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); + OP (FH, B, C, D, A, 14, 23, 0xfde5380c); + OP (FH, A, B, C, D, 1, 4, 0xa4beea44); + OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); + OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); + OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); + OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); + OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); + OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); + OP (FH, B, C, D, A, 6, 23, 0x04881d05); + OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); + OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); + OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); + OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); + + /* Round 4. */ + OP (FI, A, B, C, D, 0, 6, 0xf4292244); + OP (FI, D, A, B, C, 7, 10, 0x432aff97); + OP (FI, C, D, A, B, 14, 15, 0xab9423a7); + OP (FI, B, C, D, A, 5, 21, 0xfc93a039); + OP (FI, A, B, C, D, 12, 6, 0x655b59c3); + OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); + OP (FI, C, D, A, B, 10, 15, 0xffeff47d); + OP (FI, B, C, D, A, 1, 21, 0x85845dd1); + OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); + OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); + OP (FI, C, D, A, B, 6, 15, 0xa3014314); + OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); + OP (FI, A, B, C, D, 4, 6, 0xf7537e82); + OP (FI, D, A, B, C, 11, 10, 0xbd3af235); + OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); + OP (FI, B, C, D, A, 9, 21, 0xeb86d391); + + /* Add the starting values of the context. */ + A += A_save; + B += B_save; + C += C_save; + D += D_save; + } + + /* Put checksum in context given as argument. */ + ctx->A = A; + ctx->B = B; + ctx->C = C; + ctx->D = D; +} + +// Local Variables: +// mode: C++ +// indent-tabs-mode: t +// End: Index: extensions/launcher/md5.h =================================================================== RCS file: extensions/launcher/md5.h diff -N extensions/launcher/md5.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ extensions/launcher/md5.h 7 Feb 2008 02:43:57 -0000 1.1 @@ -0,0 +1,118 @@ +// Declaration of functions and data types used for MD5 sum computing +// library functions. +// Copyright (C) 1995-1997,1999,2000,2001,2004,2005 +// Free Software Foundation, Inc. +// This file is part of the GNU C Library. +// The GNU C Library 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.1 of the License, or (at your option) any later version. + +// The GNU C Library 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 the GNU C Library; if not, write to the Free +// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +// 02111-1307 USA. + +// Written by Ulrich Drepper <[EMAIL PROTECTED]>, 1995. +// Trimmed by Rob Savoye for Gnash, and converted to C++ <[EMAIL PROTECTED]>, 2007. + +#ifndef _MD5_H +#define _MD5_H 1 + +#include <cstdio> +#include <string> +#include <boost/cstdint.hpp> + +// #if defined HAVE_LIMITS_H +// # include <limits.h> +// #endif + +#define MD5_DIGEST_SIZE 16 +#define MD5_BLOCK_SIZE 64 + +typedef unsigned long md5_uintptr; + +// Structure to save state of computation between the single steps. +struct md5_ctx +{ + uint32_t A; + uint32_t B; + uint32_t C; + uint32_t D; + + uint32_t total[2]; + uint32_t buflen; + char buffer[128] __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); +}; + +// The following three functions are build up the low level used in +// the functions `md5_stream' and `md5_buffer'. + +// Initialize structure containing state of computation. +// (RFC 1321, 3.3: Step 3) +void md5_init_ctx (struct md5_ctx *ctx); + +// Starting with the result of former calls of this function (or the +// initialization function update the context for the next LEN bytes +// starting at BUFFER. +// It is necessary that LEN is a multiple of 64!!! +void md5_process_block (const void *buffer, size_t len, + struct md5_ctx *ctx); + +// Starting with the result of former calls of this function (or the +// initialization function update the context for the next LEN bytes +// starting at BUFFER. +// It is NOT required that LEN is a multiple of 64. +void md5_process_bytes (const void *buffer, size_t len, + struct md5_ctx *ctx); + +// Process the remaining bytes in the buffer and put result from CTX +// in first 16 bytes following RESBUF. The result is always in little +// endian byte order, so that a byte-wise output yields to the wanted +// ASCII representation of the message digest. + +// IMPORTANT: On some systems it is required that RESBUF is correctly +// aligned for a 32 bits value. +void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf); + + +// Put result from CTX in first 16 bytes following RESBUF. The result is +// always in little endian byte order, so that a byte-wise output yields +// to the wanted ASCII representation of the message digest. + +// IMPORTANT: On some systems it is required that RESBUF is correctly +// aligned for a 32 bits value. +void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf); + +// Compute MD5 message digest for bytes read from STREAM. The +// resulting message digest number will be written into the 16 bytes +// beginning at RESBLOCK. +int md5_stream (FILE *stream, void *resblock); + +// Compute MD5 message digest for bytes read from filespec. The +// resulting message digest number will be written into the 16 bytes +// beginning at RESBLOCK. +bool md5_filespec(std::string &filespec, void *resblock); + +// Compute MD5 message digest for bytes read from filespec. The result +// is compared to the ascii version of the MD5 (as produced by the +// shell utility md5sum). +bool md5_filespec_check(std::string &filespec, std::string &md5); + +// Compute MD5 message digest for LEN bytes beginning at BUFFER. The +// result is always in little endian byte order, so that a byte-wise +// output yields to the wanted ASCII representation of the message +// digest. +void *md5_buffer (const char *buffer, size_t len, + void *resblock); + +#endif /* md5.h */ +// Local Variables: +// mode: C++ +// indent-tabs-mode: t +// End: Index: extensions/launcher/test.as =================================================================== RCS file: extensions/launcher/test.as diff -N extensions/launcher/test.as --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ extensions/launcher/test.as 7 Feb 2008 02:43:57 -0000 1.1 @@ -0,0 +1,43 @@ +// +// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +// Test case for lirc ActionScript class +// compile this test case with Ming makeswf, and then +// execute it like this gnash -1 -r 0 -v out.swf + +rcsid="$Id: test.as,v 1.1 2008/02/07 02:43:57 rsavoye Exp $"; + +var exe = new Launcher(); + +// test the constuctor +if (exe) { + trace("Launcher() constructor works"); +} else { + trace("Launcher() constructor failed"); +} + +if (!exe) { + trace("UNTESTED: extensions not built!"); +} + +// If the extension doesn't load, don't do anything. +if (exe) { + trace("ERROR: Launcher: UNIMPLEMENTED"); +} + + _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit