├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── bin └── pipelight-plugin.in ├── configure ├── debian ├── README-pipelight ├── changelog ├── compat ├── control ├── copyright ├── pipelight-multi.postinst ├── pipelight-multi.prerm ├── rules └── source │ ├── format │ └── options ├── include ├── common │ └── common.h └── npapi-headers │ ├── npapi.h │ ├── npfunctions.h │ ├── npruntime.h │ └── nptypes.h ├── licenses ├── gpl-2.0.txt ├── lgpl-2.1.txt └── mpl-1.1.txt ├── patches └── 0001-Workaround-for-Qt5.2-Invalidate-always-whole-drawing-a.patch ├── pipelight-plugin.1.in ├── share ├── configs │ ├── pipelight-flash │ ├── pipelight-shockwave │ ├── pipelight-silverlight5.0 │ ├── pipelight-silverlight5.1 │ ├── pipelight-unity3d │ ├── pipelight-widevine │ ├── pipelight-x64-flash │ └── pipelight-x64-unity3d ├── install-dependency ├── install-dependency-1434FC73.sig ├── install-dependency.sig ├── install-plugin ├── licenses │ ├── license-adobereader.txt.in │ ├── license-flash.txt.in │ ├── license-foxitpdf.txt.in │ ├── license-grandstream.txt.in │ ├── license-hikvision.txt.in │ ├── license-mpg2splt.txt.in │ ├── license-mspatcha.txt.in │ ├── license-roblox.txt.in │ ├── license-shockwave.txt.in │ ├── license-silverlight4.txt.in │ ├── license-silverlight5.0.txt.in │ ├── license-silverlight5.1.txt.in │ ├── license-unity3d.txt.in │ ├── license-viewright-caiway.txt.in │ ├── license-widevine.txt.in │ └── license-wininet.txt.in ├── scripts │ ├── configure-flash.in │ └── configure-silverlight.in ├── sig-install-dependency.gpg └── sig-pluginloader.gpg ├── src ├── common │ ├── Makefile │ └── common.c ├── linux │ ├── Makefile │ └── libpipelight │ │ ├── Makefile │ │ ├── basicplugin.c │ │ ├── basicplugin.h │ │ ├── configloader.c │ │ ├── configloader.h │ │ ├── npclass.c │ │ └── nppfunctions.c └── windows │ ├── Makefile │ ├── pluginloader │ ├── Makefile │ ├── apihook.c │ ├── apihook.h.in │ ├── npclass.c │ ├── npnfunctions.c │ ├── pluginloader.c │ └── pluginloader.h │ └── winecheck │ ├── Makefile │ └── check.c └── wine-patches └── README /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.o 3 | *.exe 4 | *.so 5 | *.d 6 | apihook.h 7 | config.make 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The code is licensed under the MPL 1.1/GPL 2.0/LGPL 2.1. 2 | For more information take a look at the license block in linux/basicplugin.c 3 | and the license-text-files located in licenses/. 4 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | -include config.make 2 | 3 | PLUGIN_CONFIGS=$(wildcard share/configs/*) 4 | PLUGIN_SCRIPTS=$(wildcard share/scripts/*.in) 5 | PLUGIN_LICENSES=$(wildcard share/licenses/*.in) 6 | 7 | PROGRAMS := 8 | 9 | ifeq ($(win32_cxx),prebuilt) 10 | PROGRAMS := $(PROGRAMS) prebuilt32 11 | else 12 | PROGRAMS := $(PROGRAMS) windows32 13 | endif 14 | 15 | ifeq ($(with_win64),true) 16 | ifeq ($(win64_cxx),prebuilt) 17 | PROGRAMS := $(PROGRAMS) prebuilt64 18 | else 19 | PROGRAMS := $(PROGRAMS) windows64 20 | endif 21 | endif 22 | 23 | ifeq ($(debug),true) 24 | cxxflags := $(cxxflags) -DPIPELIGHT_DEBUG 25 | win32_flags := $(win32_flags) -DPIPELIGHT_DEBUG 26 | win64_flags := $(win64_flags) -DPIPELIGHT_DEBUG 27 | endif 28 | 29 | repo = $(patsubst %.git,%,$(subst git@,https://,$(subst :,/,$(shell git remote get-url origin)))) 30 | REPO = $(if $(filter https://%,$(repo)),$(repo),https://launchpad.net/pipelight) 31 | 32 | SED_OPTS := -e 's|@@BASH@@|$(bash_interp)|g' \ 33 | -e '1s|/usr/bin/env bash|$(bash_interp)|' \ 34 | -e 's|@@BINDIR@@|$(bindir)|g' \ 35 | -e 's|@@DATADIR@@|$(datadir)|g' \ 36 | -e 's|@@GPG@@|$(gpg_exec)|g' \ 37 | -e 's|@@LIBDIR@@|$(libdir)|g' \ 38 | -e 's|@@MANDIR@@|$(mandir)|g' \ 39 | -e 's|@@MOZ_PLUGIN_PATH@@|$(moz_plugin_path)|g' \ 40 | -e 's|@@PIPELIGHT_LIBRARY_PATH@@|$(libdir)/pipelight|g' \ 41 | -e 's|@@PIPELIGHT_SHARE_PATH@@|$(datadir)/pipelight|g' \ 42 | -e 's|@@PREFIX@@|$(prefix)|g' \ 43 | -e 's|@@REPO@@|$(REPO)|g' \ 44 | -e 's|@@VERSION@@|$(version)|g' 45 | 46 | export 47 | 48 | .PHONY: all 49 | all: linux $(PROGRAMS) 50 | 51 | config.make: 52 | @echo "" 53 | @echo "You need to call ./configure first." >&2 54 | @echo "" 55 | @exit 1 56 | 57 | 58 | pluginloader-$(git_commit).tar.gz: 59 | $(downloader) "pluginloader-$(git_commit).tar.gz" "http://repos.fds-team.de/pluginloader/$(git_commit)/pluginloader.tar.gz" 60 | 61 | pluginloader-$(git_commit).tar.gz.sig: 62 | $(downloader) "pluginloader-$(git_commit).tar.gz.sig" "http://repos.fds-team.de/pluginloader/$(git_commit)/pluginloader.tar.gz.sig" 63 | 64 | .PHONY: linux 65 | linux: config.make 66 | CXX="$(cxx)" CXXFLAGS="$(cxxflags)" $(MAKE) -C src/linux 67 | 68 | .PHONY: prebuilt32 69 | prebuilt32: config.make pluginloader-$(git_commit).tar.gz pluginloader-$(git_commit).tar.gz.sig 70 | $(gpg_exec) --batch --no-default-keyring --keyring "share/sig-pluginloader.gpg" --verify "pluginloader-$(git_commit).tar.gz.sig" "pluginloader-$(git_commit).tar.gz" 71 | tar -xvf "pluginloader-$(git_commit).tar.gz" src/windows/pluginloader/pluginloader.exe src/windows/winecheck/winecheck.exe 72 | 73 | .PHONY: prebuilt64 74 | prebuilt64: config.make pluginloader-$(git_commit).tar.gz pluginloader-$(git_commit).tar.gz.sig 75 | $(gpg_exec) --batch --no-default-keyring --keyring "share/sig-pluginloader.gpg" --verify "pluginloader-$(git_commit).tar.gz.sig" "pluginloader-$(git_commit).tar.gz" 76 | tar -xvf "pluginloader-$(git_commit).tar.gz" src/windows/pluginloader/pluginloader64.exe src/windows/winecheck/winecheck64.exe 77 | 78 | .PHONY: windows32 79 | windows32: config.make 80 | CXX="$(win32_cxx)" CXXFLAGS="$(win32_flags)" $(MAKE) -C src/windows suffix="" 81 | 82 | .PHONY: windows64 83 | windows64: config.make 84 | CXX="$(win64_cxx)" CXXFLAGS="$(win64_flags)" $(MAKE) -C src/windows suffix="64" 85 | 86 | 87 | .PHONY: install 88 | install: config.make all 89 | mkdir -p \ 90 | "$(DESTDIR)$(bindir)" \ 91 | "$(DESTDIR)$(datadir)/pipelight/configs" \ 92 | "$(DESTDIR)$(datadir)/pipelight/licenses" \ 93 | "$(DESTDIR)$(datadir)/pipelight/scripts" \ 94 | "$(DESTDIR)$(libdir)/pipelight" \ 95 | "$(DESTDIR)$(mandir)/man1" \ 96 | "$(DESTDIR)$(moz_plugin_path)" 97 | 98 | install -pm 0644 share/sig-install-dependency.gpg "$(DESTDIR)$(datadir)/pipelight/sig-install-dependency.gpg" 99 | 100 | install -pm 0755 "src/windows/pluginloader/pluginloader.exe" "$(DESTDIR)$(datadir)/pipelight/pluginloader.exe" 101 | if [ "$(with_win64)" = "true" ]; then \ 102 | install -pm 0755 "src/windows/pluginloader/pluginloader64.exe" "$(DESTDIR)$(datadir)/pipelight/pluginloader64.exe"; \ 103 | fi 104 | 105 | install -pm 0755 "src/windows/winecheck/winecheck.exe" "$(DESTDIR)$(datadir)/pipelight/winecheck.exe" 106 | if [ "$(with_win64)" = "true" ]; then \ 107 | install -pm 0755 "src/windows/winecheck/winecheck64.exe" "$(DESTDIR)$(datadir)/pipelight/winecheck64.exe"; \ 108 | fi 109 | 110 | rm -f "$(DESTDIR)$(datadir)/pipelight/wine" 111 | ln -s "$(wine_path)" "$(DESTDIR)$(datadir)/pipelight/wine" 112 | if [ "$(with_win64)" = "true" ]; then \ 113 | rm -f "$(DESTDIR)$(datadir)/pipelight/wine64"; \ 114 | ln -s "$(wine64_path)" "$(DESTDIR)$(datadir)/pipelight/wine64"; \ 115 | fi 116 | 117 | sed $(SED_OPTS) share/install-plugin > install-plugin.tmp 118 | touch -r share/install-plugin install-plugin.tmp 119 | install -pm 0755 install-plugin.tmp "$(DESTDIR)$(datadir)/pipelight/install-plugin" 120 | rm install-plugin.tmp 121 | 122 | for script in $(notdir $(PLUGIN_SCRIPTS)); do \ 123 | sed $(SED_OPTS) share/scripts/$${script} > pipelight-script.tmp; \ 124 | touch -r share/scripts/$${script} pipelight-script.tmp; \ 125 | install -pm 0755 pipelight-script.tmp "$(DESTDIR)$(datadir)/pipelight/scripts/$${script%.*}" || exit 1; \ 126 | rm pipelight-script.tmp; \ 127 | done 128 | 129 | for config in $(notdir $(PLUGIN_CONFIGS)); do \ 130 | install -pm 0644 share/configs/$${config} "$(DESTDIR)$(datadir)/pipelight/configs/$${config}" || exit 1; \ 131 | done 132 | 133 | for license in $(notdir $(PLUGIN_LICENSES)); do \ 134 | sed $(SED_OPTS) share/licenses/$${license} > pipelight-license.tmp; \ 135 | touch -r share/licenses/$${license} pipelight-license.tmp; \ 136 | install -pm 0644 pipelight-license.tmp "$(DESTDIR)$(datadir)/pipelight/licenses/$${license%.*}" || exit 1; \ 137 | rm pipelight-license.tmp; \ 138 | done 139 | 140 | install -pm $(so_mode) src/linux/libpipelight/libpipelight.so "$(DESTDIR)$(libdir)/pipelight/libpipelight.so" 141 | 142 | sed $(SED_OPTS) bin/pipelight-plugin.in > pipelight-plugin.tmp 143 | touch -r bin/pipelight-plugin.in pipelight-plugin.tmp 144 | install -pm 0755 pipelight-plugin.tmp "$(DESTDIR)$(bindir)/pipelight-plugin" 145 | rm pipelight-plugin.tmp 146 | 147 | sed $(SED_OPTS) pipelight-plugin.1.in > pipelight-manpage.tmp 148 | touch -r pipelight-plugin.1.in pipelight-manpage.tmp 149 | install -pm 0644 pipelight-manpage.tmp "$(DESTDIR)$(mandir)/man1/pipelight-plugin.1" 150 | rm pipelight-manpage.tmp 151 | 152 | .PHONY: uninstall 153 | uninstall: config.make 154 | rm -f "$(DESTDIR)$(bindir)/pipelight-plugin" \ 155 | $(DESTDIR)$(datadir)/pipelight/configs/pipelight-* \ 156 | "$(DESTDIR)$(datadir)/pipelight/install-plugin" \ 157 | $(DESTDIR)$(datadir)/pipelight/licenses/license-* \ 158 | "$(DESTDIR)$(datadir)/pipelight/pluginloader.exe" \ 159 | "$(DESTDIR)$(datadir)/pipelight/pluginloader64.exe" \ 160 | $(DESTDIR)$(datadir)/pipelight/scripts/configure-* \ 161 | "$(DESTDIR)$(datadir)/pipelight/sig-install-dependency.gpg" \ 162 | "$(DESTDIR)$(datadir)/pipelight/wine" \ 163 | "$(DESTDIR)$(datadir)/pipelight/wine64" \ 164 | "$(DESTDIR)$(datadir)/pipelight/winecheck.exe" \ 165 | "$(DESTDIR)$(datadir)/pipelight/winecheck64.exe" \ 166 | "$(DESTDIR)$(libdir)/pipelight/libpipelight.so" \ 167 | "$(DESTDIR)$(mandir)/man1/pipelight-plugin.1" 168 | 169 | rmdir --ignore-fail-on-non-empty \ 170 | "$(DESTDIR)$(datadir)/pipelight/configs" \ 171 | "$(DESTDIR)$(datadir)/pipelight/licenses" \ 172 | "$(DESTDIR)$(datadir)/pipelight/scripts" \ 173 | "$(DESTDIR)$(datadir)/pipelight" \ 174 | "$(DESTDIR)$(libdir)/pipelight" \ 175 | "$(DESTDIR)$(moz_plugin_path)" 176 | 177 | .PHONY: clean 178 | clean: 179 | for dir in src/linux src/windows src/common; do \ 180 | $(MAKE) -C $$dir $@; \ 181 | done 182 | 183 | .PHONY: dist-clean 184 | dist-clean: clean 185 | rm -f config.make 186 | 187 | .PHONY: pluginloader-tarball 188 | pluginloader-tarball: config.make all 189 | mkdir -p "$(DESTDIR)/src/windows/pluginloader" 190 | mkdir -p "$(DESTDIR)/src/windows/winecheck" 191 | 192 | install -pm 0755 "src/windows/pluginloader/pluginloader.exe" "$(DESTDIR)/src/windows/pluginloader/pluginloader.exe" 193 | if [ "$(with_win64)" = "true" ]; then \ 194 | install -pm 0755 "src/windows/pluginloader/pluginloader64.exe" "$(DESTDIR)/src/windows/pluginloader/pluginloader64.exe"; \ 195 | fi 196 | 197 | install -pm 0755 "src/windows/winecheck/winecheck.exe" "$(DESTDIR)/src/windows/winecheck/winecheck.exe" 198 | if [ "$(with_win64)" = "true" ]; then \ 199 | install -pm 0755 "src/windows/winecheck/winecheck64.exe" "$(DESTDIR)/src/windows/winecheck/winecheck64.exe"; \ 200 | fi 201 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pipelight 2 | 3 | Pipelight is a special browser plugin which allows one to use Windows-only plugins inside NPAPI plugin-compatible \*nix browsers. We are currently focusing on Silverlight, Flash, Shockwave and the Unity Webplayer. The project needs a patched version of WINE to execute the plugins. 4 | 5 | ## Requirements 6 | 7 | ### Platform 8 | Pipelight requires a \*nix operating system (such as Linux or FreeBSD) running on an x86 (e.g. AMD or Intel) processor. Most non-mobile computers use an x86 processor. 9 | 10 | ### Browser 11 | Pipelight Requires a browser that supports NPAPI plugins. 12 | 13 | #### Gecko 14 | ##### Firefox 15 | Firefox versions under 52 work (as does the Firefox 52 ESR). After that, [NPAPI plugins are disabled](https://blog.mozilla.org/futurereleases/2015/10/08/npapi-plugins-in-firefox/) for everything but Flash. 16 | 17 | #### SeaMonkey 18 | [SeaMonkey](https://www.seamonkey-project.org/) versions under 2.50 support NPAPI plugins. SeaMonkey 2.50 nightlies still support both Flash and Silverlight plugins. 19 | 20 | #### Palemoon 21 | [Palemoon](http://www.palemoon.org/) pledges to support NPAPI plugins indefinitely. 22 | 23 | ### WebKit 24 | Webkit still supports NPAPI plugins, so you can use browsers such as [Midori](http://midori-browser.org/) and [Uzbl](https://www.uzbl.org/) without a problem. However, these browsers may need to run the plugins in external windows (put embed = no in your configuration file or set the PIPELIGHT_EMBED environment variable to 0). 25 | 26 | ### Blink 27 | Chrome/Chromium versions under 34 work. You'll have to apply [a couple patches](https://bugs.launchpad.net/pipelight/+bug/1307989) to get Chromium versions 34 or higher to work. Similarly, other browsers based on Chromium 34+, like Opera 15+ and Vivaldi, won't work. 28 | 29 | ### Presto 30 | Older versions of Opera use Presto rather than Blink, so you can use Opera versions under 15 without a problem. 31 | 32 | ## Installation 33 | To install, you must [compile WINE with the WINE Staging patches](http://web.archive.org/web/20160815170857/http://pipelight.net:80/cms/page-wine.html), [compile Pipelight](http://web.archive.org/web/20160815170857/http://pipelight.net:80/cms/install/compile-pipelight.html), and [enable the required plugins](http://web.archive.org/web/20160815170857/http://pipelight.net:80/cms/installation.html#section_2). 34 | 35 | See also [Gentoo's Netflix/Pipelight Wiki page](https://wiki.gentoo.org/wiki/Netflix/Pipelight) for some tips and troubleshooting advice. 36 | 37 | ### Pre-compiled binaries 38 | Unfortunately, Michael Müller, the initiator of the project, has given up on the project and has removed the repositories for supported distributions. One must now compile from source, which isn't difficult. 39 | 40 | ### Browser spoofing 41 | Unfortunately, services like Netflix detect one's browser instead of the browser's capabilities, so you may need to install a [user-agent switcher](https://github.com/keithbowes/user-agent-switcher). 42 | 43 | #### Uzbl 44 | If you use Uzbl and have the per-site settings script loaded, you can add this to $XDG\_DATA\_HOME/uzbl/per-site-settings: 45 |
.netflix.com
46 |     .*
47 |         set useragent Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0 @(+sh -c "pipelight-plugin --version | sed -e 's/\\s\\+/\\//g'")@
48 | 49 | #### Standalone programs 50 | 51 | If your interest is merely to watch Netflix (the original purpose of Pipelight), you can try an app like [Netflix Penguin](https://github.com/ergoithz/netflix-penguin), so that you won't have to install such an extension in your browser. 52 | 53 | ## Alternatives 54 | Microsoft has deprecated Silverlight and now streaming services are increasingly using HTML5 with EME. For such streaming services to work, you must use a browser that supports EME with the proper DRM plugin (usually Widevine). Such browsers include [Google Chrome](https://www.google.com/chrome/index.html) (37 or higher) and official builds of [Firefox](https://mozilla.com/) (52 or higher). Unfortunately, Chromium and other browsers based on it (Vivaldi, Opera, etc.) don't support EME, as they lack Google's proprietary DRM code. Similarly, only the prebuilt versions of Firefox from the Mozilla website support EME, but those built by yourself or by your distribution don't. 55 | -------------------------------------------------------------------------------- /configure: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | init_dirs() 4 | { 5 | [[ -z "$moz_plugin_path" && ! -z "$libdir" ]] && moz_plugin_path="$libdir/mozilla/plugins" 6 | [[ -z "$moz_plugin_path" ]] && moz_plugin_path="/usr/lib/mozilla/plugins" 7 | [[ -z "$bindir" ]] && bindir="$1/bin" 8 | [[ -z "$datadir" ]] && datadir="$1/share" 9 | [[ -z "$libdir" ]] && libdir="$1/lib" 10 | [[ -z "$mandir" ]] && mandir="$1/share/man" 11 | } 12 | 13 | resolvepath() 14 | { 15 | if [ ! -z "$1" ]; then 16 | local path=$(echo "$1/" | sed -e "s|\${prefix}|$prefix|g") 17 | if [ "${path:0:1}" != "/" ]; then 18 | path="$(pwd)/$path" 19 | fi 20 | local oldpath="$path" 21 | while true; do 22 | path=$(echo "$path" | sed -e 's!/\.\{0,1\}/!/!') 23 | if [ "$path" == "$oldpath" ]; then break; fi 24 | oldpath="$path" 25 | done 26 | while true; do 27 | path=$(echo "$path" | sed -e 's!/\([^/]\{1,\}\)/\.\./!/!') 28 | if [ "$path" == "$oldpath" ]; then break; fi 29 | oldpath="$path" 30 | done 31 | if [ "$path" != "/" ] && [ "${path: -1}" == "/" ]; then 32 | path="${path%/}" 33 | fi 34 | echo "$path" 35 | fi 36 | return 0 37 | } 38 | 39 | usage() 40 | { 41 | echo "" 42 | echo "Usage: ./configure [--prefix=PREFIX] [--bindir=PATH] [--datadir=PATH]" 43 | echo " [--libdir=PATH] [--mandir=PATH] [--bash-interp=PATH]" 44 | echo " [--moz-plugin-path=PATH] [--gpg-exec=PATH]" 45 | echo " [--so-mode=OCTAL] [--debug] [--cxx=COMPILER]" 46 | echo " [--cxxflags=FLAGS] [--mingw-cxxflags=FLAGS]" 47 | echo "" 48 | echo " prebuilt options: [--git-commit=TAG/SHA1] [--downloader=CMDLINE]" 49 | echo "" 50 | echo " win32 options: [--win32-prebuilt] [--win32-cxx=COMPILER]" 51 | echo " [--win32-flags=FLAGS] [--win32-static]" 52 | echo " [--wine-path=PATH]" 53 | echo "" 54 | echo " win64 options: [--with-win64]" 55 | echo " [--win64-prebuilt] [--win64-cxx=COMPILER]" 56 | echo " [--win64-flags=FLAGS] [--win64-static]" 57 | echo " [--wine64-path=PATH]" 58 | echo "" 59 | } 60 | 61 | # Default configuration 62 | version="unknown" 63 | prefix="/usr/local" 64 | bindir="" 65 | datadir="" 66 | libdir="" 67 | mandir="" 68 | bash_interp="$(which bash)" 69 | if which gpg &> /dev/null; then 70 | gpg_exec="$(which gpg)" 71 | else 72 | gpg_exec="/usr/bin/gpg" 73 | fi 74 | moz_plugin_path="" 75 | so_mode="0644" 76 | debug="false" 77 | 78 | cxx="" 79 | cxxflags="$CXXFLAGS" 80 | mingw_cxxflags="$(echo "$CXXFLAGS" | \ 81 | sed -e 's!-fstack-protector\(.[a-zA-Z0-9]*\)! !g' \ 82 | -e 's!-m\([0-9]\|arch\|float-abi\|fpu\|tune\)[=]*\([a-zA-Z0-9-]*\)! !g' \ 83 | -e 's![ \t]\+! !g' -e 's!\(^[ \t]*\|[ \t]*$\)!!g')" 84 | 85 | git_commit="" 86 | downloader="" 87 | 88 | win32_cxx="" 89 | win32_flags="-m32" 90 | win32_static=0 91 | wine_path="/opt/wine-compholio/bin/wine" 92 | 93 | with_win64="false" 94 | win64_cxx="" 95 | win64_flags="-m64" 96 | win64_static=0 97 | wine64_path="" 98 | 99 | while [[ $# > 0 ]] ; do 100 | CMD="$1"; shift 101 | case "$CMD" in 102 | --prefix=*) 103 | prefix="${CMD#*=}" 104 | ;; 105 | --prefix) 106 | prefix="$1"; shift 107 | ;; 108 | 109 | --bindir=*) 110 | bindir="${CMD#*=}" 111 | ;; 112 | --bindir) 113 | bindir="$1"; shift 114 | ;; 115 | 116 | --datadir=*) 117 | datadir="${CMD#*=}" 118 | ;; 119 | --datadir) 120 | datadir="$1"; shift 121 | ;; 122 | 123 | --libdir=*) 124 | libdir="${CMD#*=}" 125 | ;; 126 | --libdir) 127 | libdir="$1"; shift 128 | ;; 129 | 130 | --mandir=*) 131 | mandir="${CMD#*=}" 132 | ;; 133 | --mandir) 134 | mandir="$1"; shift 135 | ;; 136 | 137 | --bash-interp=*) 138 | bash_interp="${CMD#*=}" 139 | ;; 140 | --bash-interp) 141 | bash_interp="$1"; shift 142 | ;; 143 | 144 | --gpg-exec=*) 145 | gpg_exec="${CMD#*=}" 146 | ;; 147 | --gpg-exec) 148 | gpg_exec="$1"; shift 149 | ;; 150 | 151 | --moz-plugin-path=*) 152 | moz_plugin_path="${CMD#*=}" 153 | ;; 154 | --moz-plugin-path) 155 | moz_plugin_path="$1"; shift 156 | ;; 157 | 158 | --so-mode=*) 159 | so_mode="${CMD#*=}" 160 | ;; 161 | --so-mode) 162 | so_mode="$1"; shift 163 | ;; 164 | 165 | --debug) 166 | debug="true" 167 | ;; 168 | 169 | --cxx=*) 170 | cxx="${CMD#*=}" 171 | ;; 172 | --cxx) 173 | cxx="$1"; shift 174 | ;; 175 | 176 | --cxxflags=*) 177 | cxxflags="${CMD#*=}" 178 | ;; 179 | --cxxflags) 180 | cxxflags="$1"; shift 181 | ;; 182 | 183 | --mingw-cxxflags=*) 184 | mingw_cxxflags="${CMD#*=}" 185 | ;; 186 | --mingw-cxxflags) 187 | mingw_cxxflags="$1"; shift 188 | ;; 189 | 190 | --git-commit=*) 191 | git_commit="${CMD#*=}" 192 | ;; 193 | --git-commit) 194 | git_commit="$1"; shift 195 | ;; 196 | 197 | --downloader=*) 198 | downloader="${CMD#*=}" 199 | ;; 200 | --downloader) 201 | downloader="$1"; shift 202 | ;; 203 | 204 | --win32-prebuilt) 205 | win32_cxx="prebuilt" 206 | ;; 207 | --win32-cxx=*) 208 | win32_cxx="${CMD#*=}" 209 | ;; 210 | --win32-cxx) 211 | win32_cxx="$1"; shift 212 | ;; 213 | 214 | --win32-flags=*) 215 | win32_flags="$win32_flags ${CMD#*=}" 216 | ;; 217 | --win32-flags) 218 | win32_flags="$win32_flags $1"; shift 219 | ;; 220 | --win32-static) 221 | win32_static=1 222 | ;; 223 | 224 | --wine-path=*) 225 | wine_path="${CMD#*=}" 226 | ;; 227 | --wine-path) 228 | wine_path="$1"; shift 229 | ;; 230 | 231 | --with-win64) 232 | with_win64="true" 233 | ;; 234 | 235 | --win64-prebuilt) 236 | win64_cxx="prebuilt" 237 | ;; 238 | --win64-cxx=*) 239 | win64_cxx="${CMD#*=}" 240 | ;; 241 | --win64-cxx) 242 | win64_cxx="$1"; shift 243 | ;; 244 | 245 | --win64-flags=*) 246 | win64_flags="$win64_flags ${CMD#*=}" 247 | ;; 248 | --win64-flags) 249 | win64_flags="$win64_flags $1"; shift 250 | ;; 251 | --win64-static) 252 | win64_static=1 253 | ;; 254 | 255 | --wine64-path=*) 256 | wine64_path="${CMD#*=}" 257 | ;; 258 | --wine64-path) 259 | wine64_path="$1"; shift 260 | ;; 261 | 262 | --help) 263 | usage 264 | exit 265 | ;; 266 | *) 267 | echo "WARNING: Unknown argument $CMD." >&2 268 | ;; 269 | esac 270 | done 271 | 272 | # Determine current git commit 273 | if [ -z "$git_commit" ] && [ -d "./.git" ] && command -v git >/dev/null 2>&1; then 274 | git_commit="$(git log --pretty=format:'%H' -n 1)" 275 | fi 276 | 277 | # Get the version number 278 | changelog="$(head -n1 ./debian/changelog)" 279 | if [[ "$changelog" =~ \((.*)\)\ (UNRELEASED)? ]]; then 280 | version="${BASH_REMATCH[1]}" 281 | if [ "${BASH_REMATCH[2]}" == "UNRELEASED" ]; then 282 | version="$version-daily" 283 | elif [ -z "$git_commit" ]; then 284 | git_commit="v$version" 285 | fi 286 | fi 287 | 288 | # Intialize other dirs, if not already set by switches 289 | init_dirs "$prefix" 290 | 291 | # Try to autodetect linux compiler 292 | if [ -z "$cxx" ]; then 293 | if command -v g++ >/dev/null 2>&1; then 294 | cxx="g++" 295 | elif command -v clang++ > /dev/null 2>&1; then 296 | cxx="clang++" 297 | else 298 | echo "ERROR: No cxx compiler found. Please use --cxx to specify one." 299 | exit 1 300 | fi 301 | fi 302 | 303 | # In case of using prebuilt windows binaries we need the git_commit variable, and a downloader if the files don't exist yet 304 | if [ "$win32_cxx" == "prebuilt" ] || [ "$win64_cxx" == "prebuilt" ]; then 305 | if [ -z "$git_commit" ]; then 306 | echo "ERROR: Unable to determine git commit! Please use --git-commit to specify the tag/sha1 of this version." 307 | exit 1 308 | fi 309 | 310 | if [ ! -f "./pluginloader-$git_commit.tar.gz" ] || [ ! -f "./pluginloader-$git_commit.tar.gz.sig" ]; then 311 | if [ -z "$downloader" ]; then 312 | if command -v wget >/dev/null 2>&1; then 313 | downloader="wget -O" 314 | elif command -v fetch >/dev/null 2>&1; then 315 | downloader="fetch -o" 316 | else 317 | echo "ERROR: Could neither find wget nor fetch! Please use --downloader to specify a program." 318 | exit 1 319 | fi 320 | fi 321 | fi 322 | fi 323 | 324 | # Try to autodetect windows 32-bit compiler 325 | if [ -z "$win32_cxx" ]; then 326 | if command -v i686-w64-mingw32-g++ >/dev/null 2>&1; then 327 | win32_cxx="i686-w64-mingw32-g++" 328 | win32_static=1 329 | 330 | elif command -v mingw32-g++ > /dev/null 2>&1; then 331 | win32_cxx="mingw32-g++" 332 | win32_flags="$win32_flags -DMINGW32_FALLBACK" 333 | win32_static=1 334 | 335 | elif command -v i686-pc-mingw32-g++ > /dev/null 2>&1; then 336 | win32_cxx="i686-pc-mingw32-g++" 337 | win32_flags="$win32_flags -DMINGW32_FALLBACK" 338 | win32_static=1 339 | 340 | elif command -v i586-mingw32msvc-c++ > /dev/null 2>&1; then 341 | win32_cxx="i586-mingw32msvc-c++" 342 | win32_flags="$win32_flags -DMINGW32_FALLBACK" 343 | win32_static=1 344 | 345 | elif command -v wineg++ > /dev/null 2>&1; then 346 | win32_cxx="wineg++" 347 | win32_static=0 348 | 349 | else 350 | echo "ERROR: No mingw32-g++ compiler found. Please use --win32-cxx to specify one." 351 | exit 1 352 | fi 353 | fi 354 | 355 | # # Try to autodetect windows 64-bit compiler (if required) 356 | if [ "$with_win64" == "true" ] && [ -z "$win64_cxx" ]; then 357 | if command -v x86_64-w64-mingw32-g++ >/dev/null 2>&1; then 358 | win64_cxx="x86_64-w64-mingw32-g++" 359 | win64_static=1 360 | 361 | else 362 | echo "ERROR: No mingw64-g++ compiler found. Please use --win64-cxx to specify one." 363 | exit 1 364 | fi 365 | fi 366 | 367 | if [ "$win32_static" -ne 0 ]; then 368 | win32_flags="$win32_flags -static-libgcc -static-libstdc++ -static" 369 | fi 370 | 371 | if [ "$win64_static" -ne 0 ]; then 372 | win64_flags="$win64_flags -static-libgcc -static-libstdc++ -static" 373 | fi 374 | 375 | if [ ! -z "$mingw_cxxflags" ]; then 376 | win32_flags="$mingw_cxxflags $win32_flags" 377 | win64_flags="$mingw_cxxflags $win64_flags" 378 | fi 379 | 380 | if [ "$with_win64" == "true" ] && [ -z "$wine64_path" ]; then 381 | wine64_path="$wine_path/../wine64" 382 | fi 383 | 384 | # Normalize the paths 385 | prefix=$(resolvepath "$prefix") 386 | bindir=$(resolvepath "$bindir") 387 | datadir=$(resolvepath "$datadir") 388 | libdir=$(resolvepath "$libdir") 389 | mandir=$(resolvepath "$mandir") 390 | bash_interp=$(resolvepath "$bash_interp") 391 | gpg_exec=$(resolvepath "$gpg_exec") 392 | moz_plugin_path=$(resolvepath "$moz_plugin_path") 393 | wine_path=$(resolvepath "$wine_path") 394 | wine64_path=$(resolvepath "$wine64_path") 395 | 396 | ( 397 | echo "#" 398 | echo "# This file is automatically created by ./configure, DO NOT EDIT!" 399 | echo "#" 400 | echo "" 401 | echo "# General" 402 | echo "version=$version" 403 | echo "prefix=$prefix" 404 | echo "bindir=$bindir" 405 | echo "datadir=$datadir" 406 | echo "libdir=$libdir" 407 | echo "mandir=$mandir" 408 | echo "bash_interp=$bash_interp" 409 | echo "gpg_exec=$gpg_exec" 410 | echo "moz_plugin_path=$moz_plugin_path" 411 | echo "so_mode=$so_mode" 412 | echo "debug=$debug" 413 | echo "cxx=$cxx" 414 | echo "cxxflags=$cxxflags" 415 | echo "" 416 | echo "# Prebuilt" 417 | echo "git_commit=$git_commit" 418 | echo "downloader=$downloader" 419 | echo "" 420 | echo "# Win32" 421 | echo "win32_cxx=$win32_cxx" 422 | echo "win32_flags=$win32_flags" 423 | echo "wine_path=$wine_path" 424 | echo "" 425 | echo "# Win64" 426 | echo "with_win64=$with_win64" 427 | echo "win64_cxx=$win64_cxx" 428 | echo "win64_flags=$win64_flags" 429 | echo "wine64_path=$wine64_path" 430 | ) > config.make 431 | 432 | echo "Configuration Summary" 433 | echo "---------------------" 434 | echo "" 435 | echo "Pipelight has been configured with:" 436 | while IFS="=" read key val; do 437 | if [ -z "$key" ]; then 438 | echo "" 439 | elif [ "${key:0:1}" != "#" ]; then 440 | printf "%20s = %s\n" "$(echo "$key" | sed -e 's|_|-|g')" "$val" 441 | fi 442 | done < config.make 443 | echo "" 444 | echo "IMPORTANT: Please ensure you have XATTR support enabled for both wine and" 445 | echo " your file system (required to watch DRM protected content)!" 446 | echo "" 447 | 448 | exit 0 449 | -------------------------------------------------------------------------------- /debian/README-pipelight: -------------------------------------------------------------------------------- 1 | The pipelight package is only a meta package to install pipelight-multi 2 | and configure Silverlight for system-wide installation and is only used 3 | to stay compatible with old installations. It should no longer be used 4 | for new installations, install pipelight-multi instead. -------------------------------------------------------------------------------- /debian/changelog: -------------------------------------------------------------------------------- 1 | pipelight-multi (0.2.9) UNRELEASED; urgency=low 2 | 3 | * Update Flash to 19.0.0.226 4 | 5 | -- Michael Mueller Fri, 16 Oct 2015 18:00:47 +0200 6 | 7 | pipelight-multi (0.2.8.2) RELEASED; urgency=low 8 | 9 | * Update Flash to 19.0.0.185 10 | * Update Shockwave to 12.2.0.162 11 | * Update Silverlight 5 to 5.1.40416.0 12 | * Update Unity3D checksum 13 | * Fix compatibility with gpg2 14 | 15 | -- Michael Mueller Sun, 04 Oct 2015 14:32:48 +0200 16 | 17 | 18 | pipelight-multi (0.2.8.1) RELEASED; urgency=low 19 | 20 | * Change dependency from wine-compholio to wine-staging for Debian/Ubuntu 21 | * Update checksum for Shockwave 22 | 23 | -- Michael Mueller Sun, 11 Jan 2015 05:09:54 +0100 24 | 25 | 26 | pipelight-multi (0.2.8) RELEASED; urgency=low 27 | 28 | * Use signature for install-dependency.sig in clearsign format 29 | * Use new key for signing install-dependency.sig (used for --update) 30 | * Use cached plugin information when plugin initialization fails 31 | * 'pipelight-plugin --update' now automatically updates file timestamps 32 | * Update Flash to 16.0.0.235 33 | * Update Silverlight to 5.1.30514.0 34 | * Update AdobeReader to 11.0.08 35 | * Update Shockwave to 12.1.5.155 36 | * Update Unity3D checksum 37 | * Update Foxit Reader to 7.0.6.1126 (broken in Wine 1.7.32) 38 | * Update Roblox checksum (broken in Wine 1.7.32) 39 | * Remove TrianglePlayer plugin (doesn't exist anymore?) 40 | * Avoid exporting unnecessary symbols in libpipelight.so 41 | * Rewrite Makefile system to automatically detect dependencies 42 | * Code cleanup 43 | 44 | -- Sebastian Lackner Wed, 10 Dec 2014 05:55:56 +0100 45 | 46 | 47 | pipelight-multi (0.2.7.3) RELEASED; urgency=high 48 | 49 | * Fix 'pipelight-plugin --update' command 50 | 51 | -- Sebastian Lackner Sun, 20 Jul 2014 05:24:43 +0200 52 | 53 | 54 | pipelight-multi (0.2.7.2) RELEASED; urgency=low 55 | 56 | * Update Flash to 14.0.0.145 57 | * Update Shockwave to 12.1.3.153 58 | * Update FoxitPDF to 6.2.1.0618 59 | * Update Unity3D to 4.5.2f1 60 | * Effectively drop group-privileges by calling initgroups() 61 | prior to setuid() and/or setgid() 62 | * Prefer `cp -af` over `install -m 0644`, but change timestamp 63 | * Add configure-switches: bash-interp, bindir, datadir, gpg-exec, 64 | libdir, mandir, mingw-cxxflags, so-modeq, git-commit 65 | * Preserve timestamps on 'make install' 66 | * Additional improvements to the build system 67 | * Fix --no-gpu-accel configure switch 68 | 69 | -- Michael Mueller Sat, 19 Jul 2014 22:51:15 +0200 70 | 71 | 72 | pipelight-multi (0.2.7.1) RELEASED; urgency=low 73 | 74 | * Update Shockwave to 12.1.2.152 75 | * Fix AMD detection for open source drivers 76 | * Make Pipelight FreeBSD compatible 77 | 78 | -- Michael Mueller Mon, 09 Jun 2014 22:57:23 +0200 79 | 80 | 81 | pipelight-multi (0.2.7) RELEASED; urgency=low 82 | 83 | * Update Flash to 13.0.0.214 84 | * Update Shockwave to 12.1.1.151 85 | * Update for Unity3D plugin 86 | * Update for Adobereader, FoxitReader and Roblox plugin 87 | * Added experimental TrianglePlayer plugin 88 | * Fixed pluginloader.exe crash when closing browser window and using 89 | multiple instances of the same plugin 90 | * Fix issue that Firefox detected wrong plugin version in some cases 91 | * Fix structure for x11drv_escape_set_drawable (linux windowless mode) 92 | * Integrate graphic driver check directly into pluginloader.exe 93 | * Allow changing strict draw ordering at runtime via context menu 94 | * Add system-check utility to verify that installation is correct 95 | * Remove full paths from plugin config files 96 | * Make scripts more compatible with BSD systems 97 | * Add --debug configure option 98 | * Code cleanup 99 | 100 | -- Michael Mueller Tue, 03 Jun 2014 03:09:13 +0200 101 | 102 | 103 | pipelight-multi (0.2.6) RELEASED; urgency=low 104 | 105 | * Update Silverlight to 5.1.30214.0 106 | * Add ViewRight for Caiway plugin 107 | * Update Flash to 12.0.0.77 108 | * Update Shockwave Player to 12.1.0.150 109 | * Update Roblox plugin 110 | * Added Vizzed RGR plugin 111 | * Add pipelight-plugin commandline switch --list-enabled-all 112 | * Silverlight now works even with less strict user agent settings 113 | * Made pluginloader 64-bit compatible and added experimental 64-bit 114 | version of Flash 115 | * Add implementation for NPN_PluginThreadAsyncCall 116 | * Some first steps to make Pipelight MacOS compatible 117 | * --win{32/64}-prebuilt now automatically downloads the prebuilt binary 118 | if it doesn't exist yet in the 'make' step 119 | * Fixed compilation of 32bit pluginloader with wineg++ 120 | * More code cleanup 121 | 122 | -- Michael Mueller Sun, 06 Apr 2014 04:42:15 +0200 123 | 124 | 125 | pipelight-multi (0.2.5) RELEASED; urgency=low 126 | 127 | * Update Flash to 12.0.0.70 128 | * Update version of Unity3D, Shockwave and FoxitPDF 129 | * Add np-ActiveX plugin 130 | * Add Roblox plugin 131 | * Add Hikvision Webcontrol plugin as experimental plugin 132 | * install-dependency: Fix compatibility with old versions of mktemp 133 | * Add compile flag -DMINGW32_FALLBACK for old versions of Mingw 134 | * Increase startup timeout for Wine from 20sec to 1min (for slow PCs) 135 | * Add man page for pipelight-plugin commandline utility 136 | * Moved configure-* scripts to /usr/share/pipelight/scripts/* 137 | 138 | -- Michael Mueller Sat, 22 Feb 2014 02:46:41 +0100 139 | 140 | 141 | pipelight-multi (0.2.4.2) RELEASED; urgency=high 142 | 143 | * Improved identifier caching system to ensure that the linux side never 144 | uses invalid values 145 | * Don't require ScheduleTimer and UnscheduleTimer function calls 146 | * Revert PIPELIGHT_SYNC in some specific cases, where some browsers seem 147 | to behave differently - will be readded later after some more testing 148 | 149 | -- Michael Mueller Mon, 20 Jan 2014 01:11:27 +0100 150 | 151 | 152 | pipelight-multi (0.2.4.1) RELEASED; urgency=high 153 | 154 | * Fix a regression with Firefox/Opera browsers, which pass a malformed 155 | value in the plugin initialization array 156 | 157 | -- Michael Mueller Sun, 19 Jan 2014 18:13:43 +0100 158 | 159 | 160 | pipelight-multi (0.2.4) RELEASED; urgency=low 161 | 162 | * Add Widevine plugin (version 6.0.0.12442) 163 | * Add experimental Adobe Reader plugin (version 11.0.06) 164 | * Updated Flash plugin to version 12.0.0.43 165 | * Updated version of Unity3D and FoxitPDF 166 | * Added additional wine patches to improve performance 167 | * Several speed improvements like: Give control back to plugin/browser before 168 | cleaning up stuff, use async calls when possible, improved refcounting 169 | system, use cache for NPIdentifiers 170 | * Show corresponding plugin and library licenses when activating a module 171 | * Add experimental strictDrawOrdering support (can help in case of drawing 172 | bugs with AMD graphic cards) 173 | * Added experimental linuxWindowlessMode (required by browsers without 174 | XEMBED support, like for example QT5 browsers) 175 | * Change behaviour of install-dependency to stop on the first failure 176 | * Several smaller bugs fixed and other code improvements 177 | 178 | -- Michael Mueller Sun, 19 Jan 2014 01:35:20 +0100 179 | 180 | 181 | pipelight-multi (0.2.3) RELEASED; urgency=low 182 | 183 | * Updated Silverlight to version 5.1.20913.0 184 | * Updated Flash plugin to version 11.9.900.170 185 | * Updated version of Unity3D and Shockwave 186 | * Added pulseaudio patches to wine-compholio 187 | * Added install-dependency supports for the debug version of the flash 188 | plugin (wine-flash-debug-installer) 189 | * Fixed a bug that the plugin resolution is not set correct in 190 | non-embedded mode 191 | * Added additional checks to ensure that the windows and linux part of 192 | pipelight are compatible 193 | * Improved sandboxing support to allow sandboxing even on the first startup 194 | * Show sandbox status and wine version in popup menu 195 | * Several code optimizations and improvements 196 | * Added experimental plugins: foxitpdf, grandstream (not created by default, 197 | but can be unlocked with: sudo pipelight-plugin --unlock-plugin PLUGIN) 198 | 199 | -- Michael Mueller Sat, 14 Dec 2013 16:54:15 +0100 200 | 201 | 202 | pipelight-multi (0.2.2) RELEASED; urgency=high 203 | 204 | * Updated flash to version 11.9.900.152 (security update!) and unity 3D 205 | installer checksum 206 | * Fixed an error when the gpu acceleration check is set to /bin/false 207 | * Added an additional wine patch to fix loading problems with TestOut 208 | * Added additional checks to ensure that the wine prefix is owned by 209 | the correct user 210 | * Fixed kdialog/qdbus error in install-dependency script 211 | 212 | -- Michael Mueller Thu, 14 Nov 2013 22:57:34 +0100 213 | 214 | 215 | pipelight-multi (0.2.1) RELEASED; urgency=medium 216 | 217 | * Added shockwave and unity3d plugin (including installer) 218 | * Added wine-wininet-installer to work around some bugs in the wine 219 | implementation (eg. authentication dialogs not working) 220 | * Fixed a bug in install-dep that the downloads were not cached anymore 221 | * Added --destdir to install-dep script (required for distributions without 222 | postinstallation step) 223 | * Added workaround for archlinux, which seems to set always the 224 | environment variable MOZ_PLUGIN_PATH 225 | * The win32 part is now statically linked against the mingw32 runtime 226 | and we therefore dropped the dependency on mingw for end users 227 | which should save a lot of space 228 | * Enable GPU acceleration for flash 229 | * For Silverlight and flash: Show popup menu entries when right-clicking on 230 | the plugin (more options will be added later) 231 | * Added additional workaround for a Chrome bug 232 | * Updated the wine-compholio patches to work around problems with multiple 233 | browser tabs and the flash plugin, moreover to fix a bug related to the 234 | QT XEmbed libraries 235 | * Added experimental "Stay in fullscreen" context menu for Silverlight and 236 | Flash 237 | * Fixed a bug where in windowlessmode the focus is not always set correctly 238 | 239 | -- Michael Mueller Wed, 30 Oct 2013 18:47:18 +0100 240 | 241 | 242 | pipelight-multi (0.2.0) RELEASED; urgency=low 243 | 244 | * Implemented possibility to use multiple windows plugins 245 | * Renamed package to pipelight-multi, converted pipelight into a meta package 246 | (contains only a readme file and enables Silverlight to be backwards 247 | compatible) 248 | * Dropped dependencies on other packages than wine-compholio and moved all 249 | required scripts into pipelight-multi 250 | * Added config and downloader for Flash 251 | * Added several wine patches to fix deadlocks and race conditions when using 252 | hardware acceleration with Silverlight 253 | * Removed all Silverlight specific config options (except graphicDriverCheck) 254 | * Added possibility to read plugin path from the registry, so that it is not 255 | necessary to update the configuration on a plugin update 256 | * Added pipelight-plugin script which allows the user to enable or disable 257 | specific plugins for either his account or system-wide 258 | * Code refactoring (renamed files, moved shared code into common.h, use of 259 | inline functions when appropriate, ...) 260 | * Added PIPELIGHT_X11WINDOW environment variable (can be used for XBMC-like 261 | plugins based on pipelight) 262 | * Fixed several smaller bugs 263 | 264 | -- Michael Mueller Mon, 14 Oct 2013 23:35:37 +0200 265 | 266 | 267 | pipelight (0.1-4) RELEASED; urgency=low 268 | 269 | * Add unofficial flash support by fixing some bugs and implementing 270 | additional functions 271 | * Added HIGHLY experimental sandbox support 272 | * Imported new translations (nl, en_GB) 273 | * Improved and cleaned up debugging code for developers 274 | 275 | -- Michael Mueller Mon, 16 Sep 2013 03:43:00 +0200 276 | 277 | 278 | pipelight (0.1-3) RELEASED; urgency=low 279 | 280 | * Added additional wine patches, which allows one to use additional streaming 281 | pages like for example LOVEFiLM 282 | * Added configuration option that allows to install additional dependencies 283 | * Initialize FPU registers on startup (fixes error popup messages) 284 | * Code cleanup and some bug fixes 285 | 286 | -- Michael Mueller Sun, 08 Sep 2013 01:00:00 +0200 287 | 288 | 289 | pipelight (0.1-2-1) RELEASED; urgency=low 290 | 291 | * Fixed bug that a symlink can not be created if the /usr/lib/mozilla/plugins 292 | directory does not exist 293 | 294 | -- Michael Mueller Mon, 28 Aug 2013 22:28:00 +0200 295 | 296 | 297 | pipelight (0.1-2) RELEASED; urgency=low 298 | 299 | * Fixed build flags for wingw32. (fixes lp issue 1213725) 300 | * Added documentation for option gccRuntimeDlls to the config file 301 | * Added experimental usermode timer support (experimental-userModeTimer) 302 | * Added an alternative event handling method using async calls 303 | to make it work with browsers like Midori which don't support timers. 304 | * Fixed the wine xembed patch such that it also should work on KDE 305 | and others (fixes lp issue 1213784) 306 | * Added PIPELIGHT_CONFIG env. variable to overwrite the config search path. 307 | * Merged with changes by Joseph Yasi (merge 180968) 308 | Allows to define WINEARCH via the config variable wineArch. 309 | * Added fix to make Pipelight working with Opera (fixes lp issue 1214447) 310 | * Added the possibility to enable/disable pipelight system-wide 311 | * Changed meaning of winePath variable in config file - its now the path to 312 | the wine directory, not the wine executable (see default config) 313 | * Prevent Wine from asking for Gecko or Mono 314 | * Automatically enable/disable windowlessMode when required 315 | * Detect Opera browser automatically to set eventAsyncCall to true 316 | * Added a config option to execute Javascript on instance creation, 317 | this allows faking the user agent in some cases without external plugin 318 | * Added diagnostic debug output via JavaScript in case of an error 319 | * Changed the meaning of overwriteArg, which is now also able to add 320 | arguments if they were not defined by the website 321 | * Provide Wine patch which implements a part of the 322 | IDirect3DSwapChain9Ex interface which is required to get hardware 323 | acceleration with Silverlight 324 | * Added GPU driver check script, which will check if the driver is known 325 | to work with hardware acceleration and Silverlight 326 | 327 | -- Michael Mueller Mon, 28 Aug 2013 03:40:00 +0200 328 | 329 | 330 | pipelight (0.1-1) RELEASED; urgency=low 331 | 332 | * Initial release. 333 | 334 | -- Michael Mueller Mon, 16 Aug 2013 20:26:54 +0200 335 | -------------------------------------------------------------------------------- /debian/compat: -------------------------------------------------------------------------------- 1 | 8 2 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: pipelight-multi 2 | Maintainer: Michael Mueller 3 | Section: misc 4 | Priority: optional 5 | Standards-Version: 3.9.3 6 | Build-Depends: debhelper (>= 8), libc6-dev(>= 2.11.1), libx11-dev (>= 2:1.3), 7 | mingw-w64, g++-mingw-w64, make (>= 3.81), g++ (>= 4:4.4), sed (>= 4.2.1), po-debconf 8 | 9 | Package: pipelight-multi 10 | Architecture: amd64 i386 11 | Depends: ${shlibs:Depends}, ${misc:Depends}, libx11-6, mesa-utils, 12 | ttf-mscorefonts-installer, wget, zenity | kde-baseapps-bin, zenity | qdbus, 13 | wine-staging, bash (>= 4.0), unzip, cabextract, gnupg 14 | Conflicts: pipelight (<< 0.2.0~) 15 | Replaces: pipelight (<< 0.2.0~) 16 | Description: allows usage of Windows NPAPI plugins through Wine 17 | Pipelight allows one to use NPAPI plugins inside a Linux browser 18 | with the help of Wine. 19 | -------------------------------------------------------------------------------- /debian/copyright: -------------------------------------------------------------------------------- 1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: Pipelight 3 | Upstream-Contact: Michael Mueller 4 | Source: http://fds-team.de/cms/projects.html 5 | 6 | Files: * 7 | Copyright: 2013, Michael Mueller 8 | 2013, Sebastian Lackner 9 | License: MPL-1.1 or GPL-2 or LGPL-2.1 10 | 11 | Files: src/* 12 | Copyright: 1998, Netscape Communications Corporation 13 | 1998, Josh Aas 14 | 2013, Michael Mueller 15 | 2013, Sebastian Lackner 16 | License: MPL-1.1 or GPL-2 or LGPL-2.1 17 | 18 | Files: src/npapi-headers/* 19 | Copyright: 1998, Netscape Communications Corporation 20 | 1998, Josh Aas 21 | License: MPL-1.1 or GPL-2 or LGPL-2.1 22 | 23 | Files: src/npapi-headers/npruntime.h 24 | Copyright: 2014, Michael Müller 25 | License: MPL-1.1 or GPL-2 or LGPL-2.1 26 | 27 | Files: debian/po/* 28 | Copyright: see individual files for the creator of the translation 29 | License: BSD-3-clause 30 | 31 | License: MPL-1.1 32 | The contents of this file are subject to the Mozilla Public License Version 33 | 1.1 (the "License"); you may not use this file except in compliance with 34 | the License. You may obtain a copy of the License at 35 | http://www.mozilla.org/MPL/ 36 | . 37 | Software distributed under the License is distributed on an "AS IS" basis, 38 | WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 39 | for the specific language governing rights and limitations under the 40 | License. 41 | . 42 | The Original Code is mozilla.org code. 43 | . 44 | The Initial Developer of the Original Code is 45 | Netscape Communications Corporation. 46 | Portions created by the Initial Developer are Copyright (C) 1998 47 | the Initial Developer. All Rights Reserved. 48 | . 49 | Contributor(s): 50 | Josh Aas 51 | Michael Müller 52 | Sebastian Lackner 53 | . 54 | Alternatively, the contents of this file may be used under the terms of 55 | either the GNU General Public License Version 2 or later (the "GPL"), or 56 | the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 57 | in which case the provisions of the GPL or the LGPL are applicable instead 58 | of those above. If you wish to allow use of your version of this file only 59 | under the terms of either the GPL or the LGPL, and not to allow others to 60 | use your version of this file under the terms of the MPL, indicate your 61 | decision by deleting the provisions above and replace them with the notice 62 | and other provisions required by the GPL or the LGPL. If you do not delete 63 | the provisions above, a recipient may use your version of this file under 64 | the terms of any one of the MPL, the GPL or the LGPL. 65 | 66 | License: GPL-2 67 | This program is free software; you can redistribute it 68 | and/or modify it under the terms of the GNU General Public 69 | License as published by the Free Software Foundation; either 70 | version 2 of the License, or (at your option) any later 71 | version. 72 | . 73 | This program is distributed in the hope that it will be 74 | useful, but WITHOUT ANY WARRANTY; without even the implied 75 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 76 | PURPOSE. See the GNU General Public License for more 77 | details. 78 | . 79 | You should have received a copy of the GNU General Public 80 | License along with this package; if not, write to the Free 81 | Software Foundation, Inc., 51 Franklin St, Fifth Floor, 82 | Boston, MA 02110-1301 USA 83 | . 84 | On Debian systems, the full text of the GNU General Public 85 | License version 2 can be found in the file 86 | `/usr/share/common-licenses/GPL-2'. 87 | 88 | License: LGPL-2.1 89 | This library is free software; you can redistribute it and/or 90 | modify it under the terms of the GNU Lesser General Public 91 | License as published by the Free Software Foundation; either 92 | version 2.1 of the License, or (at your option) any later version. 93 | . 94 | This library is distributed in the hope that it will be useful, 95 | but WITHOUT ANY WARRANTY; without even the implied warranty of 96 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 97 | Lesser General Public License for more details. 98 | . 99 | You should have received a copy of the GNU Lesser General Public 100 | License along with this library; if not, write to the Free Software 101 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. 102 | . 103 | On Debian systems, the full text of the GNU Lesser General Public 104 | License version 2.1 can be found in the file 105 | `/usr/share/common-licenses/LGPL-2.1'. 106 | 107 | License: BSD-3-clause 108 | Redistribution and use in source and binary forms, with or without 109 | modification, are permitted provided that the following conditions are 110 | met: 111 | . 112 | * Redistributions of source code must retain the above copyright 113 | notice, this list of conditions and the following disclaimer. 114 | . 115 | * Redistributions in binary form must reproduce the above 116 | copyright notice, this list of conditions and the following 117 | disclaimer in the documentation and/or other materials provided 118 | with the distribution. 119 | . 120 | * Neither the name of the Pipelight project nor the names of its 121 | contributors may be used to endorse or promote products derived 122 | from this software without specific prior written permission. 123 | . 124 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 125 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 126 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 127 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 128 | HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 129 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 130 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 131 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 132 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 133 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 134 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /debian/pipelight-multi.postinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | #DEBHELPER# 3 | 4 | pipelight-plugin --create-mozilla-plugins 5 | -------------------------------------------------------------------------------- /debian/pipelight-multi.prerm: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | #DEBHELPER# 3 | 4 | pipelight-plugin --remove-mozilla-plugins 5 | 6 | # Keep the previous configuration on an update 7 | if [ "$1" != "upgrade" ]; then 8 | pipelight-plugin --disable-all 9 | fi 10 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | %: 3 | dh $@ 4 | 5 | override_dh_auto_configure: 6 | ifeq ($(DEB_BUILD_ARCH), amd64) 7 | dh_auto_configure -- --win32-static --gcc-runtime-dlls="" --with-win64 --wine-path="/opt/wine-staging/bin/wine" 8 | else 9 | dh_auto_configure -- --win32-static --gcc-runtime-dlls="" --wine-path="/opt/wine-staging/bin/wine" 10 | endif 11 | 12 | override_dh_auto_install: 13 | $(MAKE) DESTDIR=$$(pwd)/debian/pipelight-multi install 14 | mkdir -p $$(pwd)/debian/pipelight/usr/share/pipelight 15 | install -m 0644 "$$(pwd)/debian/README-pipelight" "$$(pwd)/debian/pipelight/usr/share/pipelight" 16 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (quilt) 2 | -------------------------------------------------------------------------------- /debian/source/options: -------------------------------------------------------------------------------- 1 | compression = xz 2 | -------------------------------------------------------------------------------- /include/npapi-headers/npfunctions.h: -------------------------------------------------------------------------------- 1 | /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 | /* ***** BEGIN LICENSE BLOCK ***** 3 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 4 | * 5 | * The contents of this file are subject to the Mozilla Public License Version 6 | * 1.1 (the "License"); you may not use this file except in compliance with 7 | * the License. You may obtain a copy of the License at 8 | * http://www.mozilla.org/MPL/ 9 | * 10 | * Software distributed under the License is distributed on an "AS IS" basis, 11 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 12 | * for the specific language governing rights and limitations under the 13 | * License. 14 | * 15 | * The Original Code is mozilla.org code. 16 | * 17 | * The Initial Developer of the Original Code is 18 | * Netscape Communications Corporation. 19 | * Portions created by the Initial Developer are Copyright (C) 1998 20 | * the Initial Developer. All Rights Reserved. 21 | * 22 | * Contributor(s): 23 | * 24 | * Alternatively, the contents of this file may be used under the terms of 25 | * either the GNU General Public License Version 2 or later (the "GPL"), or 26 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 27 | * in which case the provisions of the GPL or the LGPL are applicable instead 28 | * of those above. If you wish to allow use of your version of this file only 29 | * under the terms of either the GPL or the LGPL, and not to allow others to 30 | * use your version of this file under the terms of the MPL, indicate your 31 | * decision by deleting the provisions above and replace them with the notice 32 | * and other provisions required by the GPL or the LGPL. If you do not delete 33 | * the provisions above, a recipient may use your version of this file under 34 | * the terms of any one of the MPL, the GPL or the LGPL. 35 | * 36 | * ***** END LICENSE BLOCK ***** */ 37 | 38 | #ifndef npfunctions_h_ 39 | #define npfunctions_h_ 40 | 41 | #ifdef __OS2__ 42 | #pragma pack(1) 43 | #define NP_LOADDS _System 44 | #else 45 | #define NP_LOADDS 46 | #endif 47 | 48 | #include "npapi.h" 49 | #include "npruntime.h" 50 | 51 | typedef NPError (* NP_LOADDS NPP_NewProcPtr)(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved); 52 | typedef NPError (* NP_LOADDS NPP_DestroyProcPtr)(NPP instance, NPSavedData** save); 53 | typedef NPError (* NP_LOADDS NPP_SetWindowProcPtr)(NPP instance, NPWindow* window); 54 | typedef NPError (* NP_LOADDS NPP_NewStreamProcPtr)(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype); 55 | typedef NPError (* NP_LOADDS NPP_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason); 56 | typedef int32_t (* NP_LOADDS NPP_WriteReadyProcPtr)(NPP instance, NPStream* stream); 57 | typedef int32_t (* NP_LOADDS NPP_WriteProcPtr)(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer); 58 | typedef void (* NP_LOADDS NPP_StreamAsFileProcPtr)(NPP instance, NPStream* stream, const char* fname); 59 | typedef void (* NP_LOADDS NPP_PrintProcPtr)(NPP instance, NPPrint* platformPrint); 60 | typedef int16_t (* NP_LOADDS NPP_HandleEventProcPtr)(NPP instance, void* event); 61 | typedef void (* NP_LOADDS NPP_URLNotifyProcPtr)(NPP instance, const char* url, NPReason reason, void* notifyData); 62 | /* Any NPObjects returned to the browser via NPP_GetValue should be retained 63 | by the plugin on the way out. The browser is responsible for releasing. */ 64 | typedef NPError (* NP_LOADDS NPP_GetValueProcPtr)(NPP instance, NPPVariable variable, void *ret_value); 65 | typedef NPError (* NP_LOADDS NPP_SetValueProcPtr)(NPP instance, NPNVariable variable, void *value); 66 | typedef NPBool (* NP_LOADDS NPP_GotFocusPtr)(NPP instance, NPFocusDirection direction); 67 | typedef void (* NP_LOADDS NPP_LostFocusPtr)(NPP instance); 68 | typedef void (* NP_LOADDS NPP_URLRedirectNotifyPtr)(NPP instance, const char* url, int32_t status, void* notifyData); 69 | typedef NPError (* NP_LOADDS NPP_ClearSiteDataPtr)(const char* site, uint64_t flags, uint64_t maxAge); 70 | typedef char** (* NP_LOADDS NPP_GetSitesWithDataPtr)(void); 71 | typedef void (* NP_LOADDS NPP_DidCompositePtr)(NPP instance); 72 | 73 | typedef NPError (* NP_LOADDS NPN_GetValueProcPtr)(NPP instance, NPNVariable variable, void *ret_value); 74 | typedef NPError (* NP_LOADDS NPN_SetValueProcPtr)(NPP instance, NPPVariable variable, void *value); 75 | typedef NPError (* NP_LOADDS NPN_GetURLNotifyProcPtr)(NPP instance, const char* url, const char* window, void* notifyData); 76 | typedef NPError (* NP_LOADDS NPN_PostURLNotifyProcPtr)(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file, void* notifyData); 77 | typedef NPError (* NP_LOADDS NPN_GetURLProcPtr)(NPP instance, const char* url, const char* window); 78 | typedef NPError (* NP_LOADDS NPN_PostURLProcPtr)(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file); 79 | typedef NPError (* NP_LOADDS NPN_RequestReadProcPtr)(NPStream* stream, NPByteRange* rangeList); 80 | typedef NPError (* NP_LOADDS NPN_NewStreamProcPtr)(NPP instance, NPMIMEType type, const char* window, NPStream** stream); 81 | typedef int32_t (* NP_LOADDS NPN_WriteProcPtr)(NPP instance, NPStream* stream, int32_t len, void* buffer); 82 | typedef NPError (* NP_LOADDS NPN_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason); 83 | typedef void (* NP_LOADDS NPN_StatusProcPtr)(NPP instance, const char* message); 84 | /* Browser manages the lifetime of the buffer returned by NPN_UserAgent, don't 85 | depend on it sticking around and don't free it. */ 86 | typedef const char* (* NP_LOADDS NPN_UserAgentProcPtr)(NPP instance); 87 | typedef void* (* NP_LOADDS NPN_MemAllocProcPtr)(uint32_t size); 88 | typedef void (* NP_LOADDS NPN_MemFreeProcPtr)(void* ptr); 89 | typedef uint32_t (* NP_LOADDS NPN_MemFlushProcPtr)(uint32_t size); 90 | typedef void (* NP_LOADDS NPN_ReloadPluginsProcPtr)(NPBool reloadPages); 91 | typedef void* (* NP_LOADDS NPN_GetJavaEnvProcPtr)(void); 92 | typedef void* (* NP_LOADDS NPN_GetJavaPeerProcPtr)(NPP instance); 93 | typedef void (* NP_LOADDS NPN_InvalidateRectProcPtr)(NPP instance, NPRect *rect); 94 | typedef void (* NP_LOADDS NPN_InvalidateRegionProcPtr)(NPP instance, NPRegion region); 95 | typedef void (* NP_LOADDS NPN_ForceRedrawProcPtr)(NPP instance); 96 | typedef NPIdentifier (* NP_LOADDS NPN_GetStringIdentifierProcPtr)(const NPUTF8* name); 97 | typedef void (* NP_LOADDS NPN_GetStringIdentifiersProcPtr)(const NPUTF8** names, int32_t nameCount, NPIdentifier* identifiers); 98 | typedef NPIdentifier (* NP_LOADDS NPN_GetIntIdentifierProcPtr)(int32_t intid); 99 | typedef bool (* NP_LOADDS NPN_IdentifierIsStringProcPtr)(NPIdentifier identifier); 100 | typedef NPUTF8* (* NP_LOADDS NPN_UTF8FromIdentifierProcPtr)(NPIdentifier identifier); 101 | typedef int32_t (* NP_LOADDS NPN_IntFromIdentifierProcPtr)(NPIdentifier identifier); 102 | typedef NPObject* (* NP_LOADDS NPN_CreateObjectProcPtr)(NPP npp, NPClass *aClass); 103 | typedef NPObject* (* NP_LOADDS NPN_RetainObjectProcPtr)(NPObject *obj); 104 | typedef void (* NP_LOADDS NPN_ReleaseObjectProcPtr)(NPObject *obj); 105 | typedef bool (* NP_LOADDS NPN_InvokeProcPtr)(NPP npp, NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result); 106 | typedef bool (* NP_LOADDS NPN_InvokeDefaultProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result); 107 | typedef bool (* NP_LOADDS NPN_EvaluateProcPtr)(NPP npp, NPObject *obj, NPString *script, NPVariant *result); 108 | typedef bool (* NP_LOADDS NPN_GetPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName, NPVariant *result); 109 | typedef bool (* NP_LOADDS NPN_SetPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName, const NPVariant *value); 110 | typedef bool (* NP_LOADDS NPN_RemovePropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName); 111 | typedef bool (* NP_LOADDS NPN_HasPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName); 112 | typedef bool (* NP_LOADDS NPN_HasMethodProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName); 113 | typedef void (* NP_LOADDS NPN_ReleaseVariantValueProcPtr)(NPVariant *variant); 114 | typedef void (* NP_LOADDS NPN_SetExceptionProcPtr)(NPObject *obj, const NPUTF8 *message); 115 | typedef void (* NP_LOADDS NPN_PushPopupsEnabledStateProcPtr)(NPP npp, NPBool enabled); 116 | typedef void (* NP_LOADDS NPN_PopPopupsEnabledStateProcPtr)(NPP npp); 117 | typedef bool (* NP_LOADDS NPN_EnumerateProcPtr)(NPP npp, NPObject *obj, NPIdentifier **identifier, uint32_t *count); 118 | typedef void (* NP_LOADDS NPN_PluginThreadAsyncCallProcPtr)(NPP instance, void (*func)(void *), void *userData); 119 | typedef bool (* NP_LOADDS NPN_ConstructProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result); 120 | typedef NPError (* NP_LOADDS NPN_GetValueForURLPtr)(NPP npp, NPNURLVariable variable, const char *url, char **value, uint32_t *len); 121 | typedef NPError (* NP_LOADDS NPN_SetValueForURLPtr)(NPP npp, NPNURLVariable variable, const char *url, const char *value, uint32_t len); 122 | typedef NPError (* NP_LOADDS NPN_GetAuthenticationInfoPtr)(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); 123 | typedef uint32_t (* NP_LOADDS NPN_ScheduleTimerPtr)(NPP instance, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID)); 124 | typedef void (* NP_LOADDS NPN_UnscheduleTimerPtr)(NPP instance, uint32_t timerID); 125 | typedef NPError (* NP_LOADDS NPN_PopUpContextMenuPtr)(NPP instance, NPMenu* menu); 126 | typedef NPBool (* NP_LOADDS NPN_ConvertPointPtr)(NPP instance, DOUBLE sourceX, DOUBLE sourceY, NPCoordinateSpace sourceSpace, DOUBLE *destX, DOUBLE *destY, NPCoordinateSpace destSpace); 127 | typedef NPBool (* NP_LOADDS NPN_HandleEventPtr)(NPP instance, void *event, NPBool handled); 128 | typedef NPBool (* NP_LOADDS NPN_UnfocusInstancePtr)(NPP instance, NPFocusDirection direction); 129 | typedef void (* NP_LOADDS NPN_URLRedirectResponsePtr)(NPP instance, void* notifyData, NPBool allow); 130 | typedef NPError (* NP_LOADDS NPN_InitAsyncSurfacePtr)(NPP instance, NPSize *size, NPImageFormat format, void *initData, NPAsyncSurface *surface); 131 | typedef NPError (* NP_LOADDS NPN_FinalizeAsyncSurfacePtr)(NPP instance, NPAsyncSurface *surface); 132 | typedef void (* NP_LOADDS NPN_SetCurrentAsyncSurfacePtr)(NPP instance, NPAsyncSurface *surface, NPRect *changed); 133 | 134 | typedef struct _NPPluginFuncs { 135 | uint16_t size; 136 | uint16_t version; 137 | NPP_NewProcPtr newp; 138 | NPP_DestroyProcPtr destroy; 139 | NPP_SetWindowProcPtr setwindow; 140 | NPP_NewStreamProcPtr newstream; 141 | NPP_DestroyStreamProcPtr destroystream; 142 | NPP_StreamAsFileProcPtr asfile; 143 | NPP_WriteReadyProcPtr writeready; 144 | NPP_WriteProcPtr write; 145 | NPP_PrintProcPtr print; 146 | NPP_HandleEventProcPtr event; 147 | NPP_URLNotifyProcPtr urlnotify; 148 | void* javaClass; 149 | NPP_GetValueProcPtr getvalue; 150 | NPP_SetValueProcPtr setvalue; 151 | NPP_GotFocusPtr gotfocus; 152 | NPP_LostFocusPtr lostfocus; 153 | NPP_URLRedirectNotifyPtr urlredirectnotify; 154 | NPP_ClearSiteDataPtr clearsitedata; 155 | NPP_GetSitesWithDataPtr getsiteswithdata; 156 | NPP_DidCompositePtr didComposite; 157 | } NPPluginFuncs; 158 | 159 | typedef struct _NPNetscapeFuncs { 160 | uint16_t size; 161 | uint16_t version; 162 | NPN_GetURLProcPtr geturl; 163 | NPN_PostURLProcPtr posturl; 164 | NPN_RequestReadProcPtr requestread; 165 | NPN_NewStreamProcPtr newstream; 166 | NPN_WriteProcPtr write; 167 | NPN_DestroyStreamProcPtr destroystream; 168 | NPN_StatusProcPtr status; 169 | NPN_UserAgentProcPtr uagent; 170 | NPN_MemAllocProcPtr memalloc; 171 | NPN_MemFreeProcPtr memfree; 172 | NPN_MemFlushProcPtr memflush; 173 | NPN_ReloadPluginsProcPtr reloadplugins; 174 | NPN_GetJavaEnvProcPtr getJavaEnv; 175 | NPN_GetJavaPeerProcPtr getJavaPeer; 176 | NPN_GetURLNotifyProcPtr geturlnotify; 177 | NPN_PostURLNotifyProcPtr posturlnotify; 178 | NPN_GetValueProcPtr getvalue; 179 | NPN_SetValueProcPtr setvalue; 180 | NPN_InvalidateRectProcPtr invalidaterect; 181 | NPN_InvalidateRegionProcPtr invalidateregion; 182 | NPN_ForceRedrawProcPtr forceredraw; 183 | NPN_GetStringIdentifierProcPtr getstringidentifier; 184 | NPN_GetStringIdentifiersProcPtr getstringidentifiers; 185 | NPN_GetIntIdentifierProcPtr getintidentifier; 186 | NPN_IdentifierIsStringProcPtr identifierisstring; 187 | NPN_UTF8FromIdentifierProcPtr utf8fromidentifier; 188 | NPN_IntFromIdentifierProcPtr intfromidentifier; 189 | NPN_CreateObjectProcPtr createobject; 190 | NPN_RetainObjectProcPtr retainobject; 191 | NPN_ReleaseObjectProcPtr releaseobject; 192 | NPN_InvokeProcPtr invoke; 193 | NPN_InvokeDefaultProcPtr invokeDefault; 194 | NPN_EvaluateProcPtr evaluate; 195 | NPN_GetPropertyProcPtr getproperty; 196 | NPN_SetPropertyProcPtr setproperty; 197 | NPN_RemovePropertyProcPtr removeproperty; 198 | NPN_HasPropertyProcPtr hasproperty; 199 | NPN_HasMethodProcPtr hasmethod; 200 | NPN_ReleaseVariantValueProcPtr releasevariantvalue; 201 | NPN_SetExceptionProcPtr setexception; 202 | NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate; 203 | NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate; 204 | NPN_EnumerateProcPtr enumerate; 205 | NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall; 206 | NPN_ConstructProcPtr construct; 207 | NPN_GetValueForURLPtr getvalueforurl; 208 | NPN_SetValueForURLPtr setvalueforurl; 209 | NPN_GetAuthenticationInfoPtr getauthenticationinfo; 210 | NPN_ScheduleTimerPtr scheduletimer; 211 | NPN_UnscheduleTimerPtr unscheduletimer; 212 | NPN_PopUpContextMenuPtr popupcontextmenu; 213 | NPN_ConvertPointPtr convertpoint; 214 | NPN_HandleEventPtr handleevent; 215 | NPN_UnfocusInstancePtr unfocusinstance; 216 | NPN_URLRedirectResponsePtr urlredirectresponse; 217 | NPN_InitAsyncSurfacePtr initasyncsurface; 218 | NPN_FinalizeAsyncSurfacePtr finalizeasyncsurface; 219 | NPN_SetCurrentAsyncSurfacePtr setcurrentasyncsurface; 220 | } NPNetscapeFuncs; 221 | 222 | #ifdef XP_MACOSX 223 | /* 224 | * Mac OS X version(s) of NP_GetMIMEDescription(const char *) 225 | * These can be called to retreive MIME information from the plugin dynamically 226 | * 227 | * Note: For compatibility with Quicktime, BPSupportedMIMEtypes is another way 228 | * to get mime info from the plugin only on OSX and may not be supported 229 | * in furture version -- use NP_GetMIMEDescription instead 230 | */ 231 | enum 232 | { 233 | kBPSupportedMIMETypesStructVers_1 = 1 234 | }; 235 | typedef struct _BPSupportedMIMETypes 236 | { 237 | SInt32 structVersion; /* struct version */ 238 | Handle typeStrings; /* STR# formated handle, allocated by plug-in */ 239 | Handle infoStrings; /* STR# formated handle, allocated by plug-in */ 240 | } BPSupportedMIMETypes; 241 | OSErr BP_GetSupportedMIMETypes(BPSupportedMIMETypes *mimeInfo, UInt32 flags); 242 | #define NP_GETMIMEDESCRIPTION_NAME "NP_GetMIMEDescription" 243 | typedef const char* (*NP_GetMIMEDescriptionProcPtr)(void); 244 | typedef OSErr (*BP_GetSupportedMIMETypesProcPtr)(BPSupportedMIMETypes*, UInt32); 245 | #endif 246 | 247 | #if defined(_WIN32) 248 | #define OSCALL WINAPI 249 | #else 250 | #if defined(__OS2__) 251 | #define OSCALL _System 252 | #else 253 | #define OSCALL 254 | #endif 255 | #endif 256 | 257 | #if defined(XP_UNIX) 258 | /* GCC 3.3 and later support the visibility attribute. */ 259 | #if defined(__GNUC__) && ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) 260 | #define NP_VISIBILITY_DEFAULT __attribute__((visibility("default"))) 261 | #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) 262 | #define NP_VISIBILITY_DEFAULT __global 263 | #else 264 | #define NP_VISIBILITY_DEFAULT 265 | #endif 266 | #define NP_EXPORT(__type) NP_VISIBILITY_DEFAULT __type 267 | #endif 268 | 269 | #if defined(_WIN32) || defined (__OS2__) 270 | #ifdef __cplusplus 271 | extern "C" { 272 | #endif 273 | /* plugin meta member functions */ 274 | #if defined(__OS2__) 275 | typedef struct _NPPluginData { /* Alternate OS2 Plugin interface */ 276 | char *pMimeTypes; 277 | char *pFileExtents; 278 | char *pFileOpenTemplate; 279 | char *pProductName; 280 | char *pProductDescription; 281 | unsigned long dwProductVersionMS; 282 | unsigned long dwProductVersionLS; 283 | } NPPluginData; 284 | typedef NPError (OSCALL *NP_GetPluginDataFunc)(NPPluginData*); 285 | NPError OSCALL NP_GetPluginData(NPPluginData * pPluginData); 286 | #endif 287 | typedef NPError (OSCALL *NP_GetEntryPointsFunc)(NPPluginFuncs*); 288 | NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* pFuncs); 289 | typedef NPError (OSCALL *NP_InitializeFunc)(NPNetscapeFuncs*); 290 | NPError OSCALL NP_Initialize(NPNetscapeFuncs* bFuncs); 291 | typedef NPError (OSCALL *NP_ShutdownFunc)(void); 292 | NPError OSCALL NP_Shutdown(void); 293 | typedef const char* (*NP_GetMIMEDescriptionFunc)(void); 294 | const char* NP_GetMIMEDescription(void); 295 | #ifdef __cplusplus 296 | } 297 | #endif 298 | #endif 299 | 300 | #if defined(__OS2__) 301 | #pragma pack() 302 | #endif 303 | 304 | #ifdef XP_UNIX 305 | #ifdef __cplusplus 306 | extern "C" { 307 | #endif 308 | typedef char* (*NP_GetPluginVersionFunc)(void); 309 | NP_EXPORT(char*) NP_GetPluginVersion(void); 310 | typedef const char* (*NP_GetMIMEDescriptionFunc)(void); 311 | NP_EXPORT(const char*) NP_GetMIMEDescription(void); 312 | #ifdef XP_MACOSX 313 | typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*); 314 | NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs); 315 | typedef NPError (*NP_GetEntryPointsFunc)(NPPluginFuncs*); 316 | NP_EXPORT(NPError) NP_GetEntryPoints(NPPluginFuncs* pFuncs); 317 | #else 318 | typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*, NPPluginFuncs*); 319 | NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs); 320 | #endif 321 | typedef NPError (*NP_ShutdownFunc)(void); 322 | NP_EXPORT(NPError) NP_Shutdown(void); 323 | typedef NPError (*NP_GetValueFunc)(void *, NPPVariable, void *); 324 | NP_EXPORT(NPError) NP_GetValue(void *future, NPPVariable aVariable, void *aValue); 325 | #ifdef __cplusplus 326 | } 327 | #endif 328 | #endif 329 | 330 | #endif /* npfunctions_h_ */ 331 | -------------------------------------------------------------------------------- /include/npapi-headers/npruntime.h: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2014 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * 24 | * Alternatively, the contents of this file may be used under the terms of 25 | * either the GNU General Public License Version 2 or later (the "GPL"), or 26 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 27 | * in which case the provisions of the GPL or the LGPL are applicable instead 28 | * of those above. If you wish to allow use of your version of this file only 29 | * under the terms of either the GPL or the LGPL, and not to allow others to 30 | * use your version of this file under the terms of the MPL, indicate your 31 | * decision by deleting the provisions above and replace them with the notice 32 | * and other provisions required by the GPL or the LGPL. If you do not delete 33 | * the provisions above, a recipient may use your version of this file under 34 | * the terms of any one of the MPL, the GPL or the LGPL. 35 | * 36 | * ***** END LICENSE BLOCK ***** */ 37 | 38 | #ifndef _NP_RUNTIME_H_ 39 | #define _NP_RUNTIME_H_ 40 | 41 | #ifdef __cplusplus 42 | extern "C" { 43 | #endif 44 | 45 | #include "nptypes.h" 46 | 47 | typedef void *NPIdentifier; 48 | typedef char NPUTF8; 49 | typedef struct _NPClass NPClass; 50 | 51 | typedef struct _NPString 52 | { 53 | const NPUTF8 *UTF8Characters; 54 | uint32_t UTF8Length; 55 | } NPString; 56 | 57 | typedef struct _NPObject 58 | { 59 | NPClass *_class; 60 | uint32_t referenceCount; 61 | } NPObject; 62 | 63 | typedef enum 64 | { 65 | NPVariantType_Void, 66 | NPVariantType_Null, 67 | NPVariantType_Bool, 68 | NPVariantType_Int32, 69 | NPVariantType_Double, 70 | NPVariantType_String, 71 | NPVariantType_Object 72 | } NPVariantType; 73 | 74 | typedef struct _NPVariant 75 | { 76 | NPVariantType type; 77 | union 78 | { 79 | bool boolValue; 80 | int32_t intValue; 81 | DOUBLE doubleValue; 82 | NPString stringValue; 83 | NPObject *objectValue; 84 | } value; 85 | } NPVariant; 86 | 87 | #define NP_CLASS_STRUCT_VERSION 3 88 | #define NP_CLASS_STRUCT_VERSION_ENUM 2 89 | #define NP_CLASS_STRUCT_VERSION_CTOR 3 90 | 91 | struct _NPClass 92 | { 93 | uint32_t structVersion; 94 | NPObject *(*allocate)(NPP instance, NPClass *aClass); 95 | void (*deallocate)(NPObject *obj); 96 | void (*invalidate)(NPObject *obj); 97 | bool (*hasMethod)(NPObject *obj, NPIdentifier ident); 98 | bool (*invoke)(NPObject *obj, NPIdentifier ident, const NPVariant *args, uint32_t count, NPVariant *ret); 99 | bool (*invokeDefault)(NPObject *obj, const NPVariant *args, uint32_t count, NPVariant *ret); 100 | bool (*hasProperty)(NPObject *obj, NPIdentifier ident); 101 | bool (*getProperty)(NPObject *obj, NPIdentifier ident, NPVariant *ret); 102 | bool (*setProperty)(NPObject *obj, NPIdentifier ident, const NPVariant *val); 103 | bool (*removeProperty)(NPObject *obj, NPIdentifier ident); 104 | bool (*enumerate)(NPObject *obj, NPIdentifier **val, uint32_t *count); 105 | bool (*construct)(NPObject *obj, const NPVariant *args, uint32_t count, NPVariant *ret); 106 | }; 107 | 108 | #ifdef __cplusplus 109 | } 110 | #endif 111 | 112 | #endif 113 | -------------------------------------------------------------------------------- /include/npapi-headers/nptypes.h: -------------------------------------------------------------------------------- 1 | /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 | /* ***** BEGIN LICENSE BLOCK ***** 3 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 4 | * 5 | * The contents of this file are subject to the Mozilla Public License Version 6 | * 1.1 (the "License"); you may not use this file except in compliance with 7 | * the License. You may obtain a copy of the License at 8 | * http://www.mozilla.org/MPL/ 9 | * 10 | * Software distributed under the License is distributed on an "AS IS" basis, 11 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 12 | * for the specific language governing rights and limitations under the 13 | * License. 14 | * 15 | * The Original Code is mozilla.org code. 16 | * 17 | * The Initial Developer of the Original Code is 18 | * mozilla.org. 19 | * Portions created by the Initial Developer are Copyright (C) 2004 20 | * the Initial Developer. All Rights Reserved. 21 | * 22 | * Contributor(s): 23 | * Johnny Stenback (Original author) 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #ifndef nptypes_h_ 40 | #define nptypes_h_ 41 | 42 | /* 43 | * Use DOUBLE instead of double to work around different align of doubles. 44 | * On Windows doubles are always 64-bit aligned, on Linux they are only 32-bit 45 | * aligned. Wineg++ doesn't handle the alignment correctly when using 'double'. 46 | */ 47 | #if defined(__WINE__) 48 | typedef double __attribute__((aligned(8))) DOUBLE; 49 | #else 50 | typedef double DOUBLE; 51 | #endif 52 | 53 | /* 54 | * Header file for ensuring that C99 types ([u]int32_t, [u]int64_t and bool) and 55 | * true/false macros are available. 56 | */ 57 | 58 | #if (defined(WIN32) && !defined(__GNUC__)) || defined(OS2) 59 | /* 60 | * Win32 and OS/2 don't know C99, so define [u]int_16/32/64 here. The bool 61 | * is predefined tho, both in C and C++. 62 | */ 63 | typedef short int16_t; 64 | typedef unsigned short uint16_t; 65 | typedef int int32_t; 66 | typedef unsigned int uint32_t; 67 | typedef long long int64_t; 68 | typedef unsigned long long uint64_t; 69 | #elif defined(_AIX) || defined(__sun) || defined(__osf__) || defined(IRIX) || defined(HPUX) 70 | /* 71 | * AIX and SunOS ship a inttypes.h header that defines [u]int32_t, 72 | * but not bool for C. 73 | */ 74 | #include 75 | 76 | #ifndef __cplusplus 77 | typedef int bool; 78 | #define true 1 79 | #define false 0 80 | #endif 81 | #elif defined(bsdi) || defined(FREEBSD) || defined(OPENBSD) 82 | /* 83 | * BSD/OS, FreeBSD, and OpenBSD ship sys/types.h that define int32_t and 84 | * u_int32_t. 85 | */ 86 | #include 87 | 88 | /* 89 | * BSD/OS ships no header that defines uint32_t, nor bool (for C) 90 | */ 91 | #if defined(bsdi) 92 | typedef u_int32_t uint32_t; 93 | typedef u_int64_t uint64_t; 94 | 95 | #if !defined(__cplusplus) 96 | typedef int bool; 97 | #define true 1 98 | #define false 0 99 | #endif 100 | #else 101 | /* 102 | * FreeBSD and OpenBSD define uint32_t and bool. 103 | */ 104 | #include 105 | #include 106 | #endif 107 | #elif defined(BEOS) 108 | #include 109 | #else 110 | /* 111 | * For those that ship a standard C99 stdint.h header file, include 112 | * it. Can't do the same for stdbool.h tho, since some systems ship 113 | * with a stdbool.h file that doesn't compile! 114 | */ 115 | #include 116 | 117 | #ifndef __cplusplus 118 | #if !defined(__GNUC__) || (__GNUC__ > 2 || __GNUC_MINOR__ > 95) 119 | #include 120 | #else 121 | /* 122 | * GCC 2.91 can't deal with a typedef for bool, but a #define 123 | * works. 124 | */ 125 | #define bool int 126 | #define true 1 127 | #define false 0 128 | #endif 129 | #endif 130 | #endif 131 | 132 | #endif /* nptypes_h_ */ 133 | -------------------------------------------------------------------------------- /patches/0001-Workaround-for-Qt5.2-Invalidate-always-whole-drawing-a.patch: -------------------------------------------------------------------------------- 1 | From 9235a12bd03e0b03b93fff29ee77580d2b6cfb29 Mon Sep 17 00:00:00 2001 2 | From: Sebastian Lackner 3 | Date: Sun, 12 Jan 2014 19:24:59 +0100 4 | Subject: Workaround for Qt5.2: Invalidate always whole drawing area for 5 | repaint events 6 | 7 | --- 8 | src/windows/npnfunctions.c | 23 +---------------------- 9 | 1 file changed, 1 insertion(+), 22 deletions(-) 10 | 11 | diff --git a/src/windows/npnfunctions.c b/src/windows/npnfunctions.c 12 | index e92c095..b2c26a2 100644 13 | --- a/src/windows/npnfunctions.c 14 | +++ b/src/windows/npnfunctions.c 15 | @@ -469,28 +469,7 @@ void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *rect){ 16 | InvalidateRect(ndata->hWnd, NULL, false); 17 | 18 | }else if (ndata->hDC){ 19 | - 20 | - if (!rect) 21 | - ndata->invalidate = INVALIDATE_EVERYTHING; 22 | - 23 | - else if (!ndata->invalidate){ 24 | - memcpy(&ndata->invalidateRect, rect, sizeof(*rect)); 25 | - ndata->invalidate = INVALIDATE_RECT; 26 | - 27 | - }else if (ndata->invalidate == INVALIDATE_RECT){ 28 | - 29 | - /* Merge the NPRects */ 30 | - if (rect->top < ndata->invalidateRect.top) 31 | - ndata->invalidateRect.top = rect->top; 32 | - if (rect->left < ndata->invalidateRect.left) 33 | - ndata->invalidateRect.left = rect->left; 34 | - if (rect->bottom > ndata->invalidateRect.bottom) 35 | - ndata->invalidateRect.bottom = rect->bottom; 36 | - if (rect->right > ndata->invalidateRect.right) 37 | - ndata->invalidateRect.right = rect->right; 38 | - 39 | - } 40 | - 41 | + ndata->invalidate = INVALIDATE_EVERYTHING; 42 | invalidateLinuxWindowless = true; 43 | } 44 | } 45 | -- 46 | 1.7.9.5 47 | 48 | -------------------------------------------------------------------------------- /pipelight-plugin.1.in: -------------------------------------------------------------------------------- 1 | .TH PIPELIGHT "1" "February 2014" "@@VERSION@@" "Pipelight" 2 | .SH NAME 3 | Pipelight \- use Windows plugins in Linux browsers (based on Wine) 4 | .SH SYNOPSIS 5 | .B pipelight-plugin 6 | [\fIOPTIONS \fR...] \fICOMMAND\fR 7 | .PP 8 | For a list of possible options and commands please take a look at the 9 | \fBOPTIONS/COMMANDS\fR section on the man page. 10 | .SH DESCRIPTION 11 | Pipelight is a special browser plugin which allows one to use Windows only 12 | plugins inside Linux browsers. Currently supported plugins are Silverlight, 13 | Flash, Shockwave, the Unity3D Webplayer, and some more (see the \fBPLUGINS\fR 14 | section). 15 | .PP 16 | The commandline utility \fBpipelight-plugin\fR allows you to enable/disable 17 | plugins and to update the plugin database. 18 | .SH OPTIONS/COMMANDS 19 | .SS "Options:" 20 | .TP 21 | \fB\-y, \-\-accept\fR 22 | Don't ask the user for license confirmation, instead enable plugins directly. 23 | Can be used to automate the process of accepting the license agreement. 24 | .SS "User commands:" 25 | .TP 26 | \fB\-\-enable\fR \fIPLUGIN\fR 27 | Enables the specified plugin for the current user (by creating a symlink in 28 | \fI$HOME/.mozilla/plugins\fR). When you run this command as root the plugin is 29 | enabled system-wide by creating a symlink in the mozilla plugins directory 30 | instead (often located at \fI@@MOZ_PLUGIN_PATH@@\fR). For a list of 31 | plugins see the \fBPLUGINS\fR section in this man page. 32 | .TP 33 | \fB\-\-disable\fR \fIPLUGIN\fR 34 | Disables the specified plugin for the current user, or disables the system-wide 35 | symlink when executed as root. Please note that a plugin may still stay 36 | active if it was enabled both system-wide and for the current user before. 37 | .TP 38 | \fB\-\-disable\-all\fR 39 | Disables all enabled plugins. For more details see \fB--disable\fR. 40 | .TP 41 | \fB\-\-list\-enabled\fR 42 | Returns a list of all plugins which are enabled for the current user. The 43 | result contains one plugin per line in order to simplify parsing by external 44 | scripts. 45 | .TP 46 | \fB\-\-list\-enabled\-all\fR 47 | Returns a list which contains both the plugins enabled for the current user and 48 | additionally the system-wide enabled plugins. If a plugin is enabled multiple 49 | times it also appears multiple times in the list. 50 | .TP 51 | \fB\-\-system\-check\fR 52 | Will perform some system checks to ensure that wine and all required components 53 | are installed correctly. A warning doesn't necessarily mean that something is 54 | wrong, but if you encounter a problem it is useful to attach this to your bug 55 | report. 56 | .TP 57 | \fB\-\-help\fR 58 | Shows a short version of this help. 59 | .TP 60 | \fB\-\-version\fR 61 | Shows the current version of Pipelight. 62 | .SS "Global commands (require root rights):" 63 | .TP 64 | \fB\-\-create\-mozilla\-plugins\fR 65 | In order to make it possible to use multiple Windows plugins with Pipelight at 66 | the same time, it is necessary to have multiple copies of \fIlibpipelight.so\fR 67 | installed. This command is typically used in the installation process of Pipelight 68 | itself to create all the necessary copies. On a first execution it will only create 69 | the libraries for the standard plugins, on all future executions it will 70 | additionally update all unlocked additional plugins. 71 | .TP 72 | \fB\-\-remove\-mozilla\-plugins\fR 73 | Removes all the copies of \fIlibpipelight.so\fR. This command is typically 74 | used during the uninstallation (but not for updating!). All unlocked plugins 75 | are locked again afterwards. 76 | .TP 77 | \fB\-\-unlock\fR PLUGIN 78 | To save some disk space the default installation of Pipelight only creates 79 | copies of \fIlibpipelight.so\fR for the most commonly used plugins. This 80 | command can be used to unlock an additional plugin by creating another copy of 81 | \fIlibpipelight.so\fR. Afterwards you can \fB--enable\fR it like any other 82 | standard plugin. 83 | .TP 84 | \fB\-\-lock\fR PLUGIN 85 | Removes the copy of \fIlibpipelight.so\fR for a specific plugin. This command 86 | can only be used for additional plugins, not for the standard plugins. 87 | .TP 88 | \fB\-\-update\fR 89 | Establishes a connection to the Pipelight upstream repository and downloads 90 | the latest version of the plugin database (called \fIdependency-installer\fR) 91 | containing the plugin URLs and checksums. The main purpose of this command is 92 | to update the plugins between the official Pipelight releases. The signature 93 | of the downloaded file is checked to prevent corruption or modification. 94 | .SH "ENVIRONMENT VARIABLES" 95 | You can export the following environment variables to modify the behaviour of 96 | \fBpipelight-plugin\fR. 97 | .TP 98 | \fBMOZ_PLUGIN_PATH\fR 99 | Create the plugin symlinks in the provided path instead of 100 | \fI$HOME/.mozilla/plugins\fR. You can use this environment variable to keep 101 | your Pipelight plugins separate from your other browser plugins. 102 | .SH PLUGINS 103 | Pipelight currently supports the following browser plugins: 104 | .TP 105 | \fBStandard plugins\fR 106 | silverlight5.1, 107 | silverlight5.0, 108 | flash, 109 | unity3d, 110 | widevine 111 | .TP 112 | \fBAdditional plugins (experimental or not often used):\fR 113 | shockwave 114 | .SH EXAMPLES 115 | .PP 116 | Here are some typical examples how to use \fBpipelight-plugin\fR. 117 | .PP 118 | $ sudo pipelight-plugin --update 119 | .PP 120 | Downloads the latest version of the plugin database. If there was a new 121 | update, it will be installed on the next browser restart or when the plugin is 122 | reloaded the next time. 123 | .PP 124 | $ sudo pipelight-plugin --enable silverlight --enable unity3d 125 | .PP 126 | Enable multiple plugins (in this example Silverlight and the Unity3D Webplayer) 127 | system-wide. 128 | .PP 129 | $ MOZ_PLUGIN_PATH=$HOME/myplugins pipelight-plugin --enable silverlight 130 | .br 131 | $ MOZ_PLUGIN_PATH=$HOME/myplugins/ google-chrome --user-data-dir=$HOME/.config/chrome-pipelight 132 | .PP 133 | The first line enables Silverlight in the (self-defined) plugin directory 134 | \fI$HOME/myplugins\fR, afterwards Google-Chrome is started with the same 135 | environment variable, such that it can detect the Silverlight plugin. All other 136 | browsers will not have Silverlight enabled, because they don't search for 137 | plugins in the custom plugin directory. 138 | .SH FILES 139 | .TP 140 | \fI@@BINDIR@@/pipelight-plugin\fR 141 | Commandline utility to enable/disable plugins and to update the plugin database. 142 | .TP 143 | \fI@@LIBDIR@@/pipelight/libpipelight*.so\fR 144 | The shared library \fIlibpipelight.so\fR and additional copies for all 145 | unlocked and standard plugins. 146 | .TP 147 | \fI@@DATADIR@@/pipelight/licenses/*\fR 148 | License information for supported plugins. 149 | .TP 150 | \fI@@DATADIR@@/pipelight/configs/*\fR 151 | Configuration files containing for example which dependencies are required for 152 | a specific plugin, and where Pipelight can find the plugin DLLs. Normally 153 | there should be \fBno\fR need to edit them manually! 154 | .TP 155 | \fI@@DATADIR@@/pipelight/scripts/*\fR 156 | Helper scripts for specific plugins, for example to enable/disable GPU acceleration. 157 | .TP 158 | \fI@@DATADIR@@/pipelight/*\fR 159 | Directory containing other files used internally by Pipelight. 160 | .TP 161 | \fI@@MOZ_PLUGIN_PATH@@/libpipelight-*.so\fR 162 | Symlinks to all enabled system-wide plugins. 163 | .TP 164 | \fI$HOME/.mozilla/plugins/libpipelight-*.so\fR 165 | Symlinks to all enabled user-specific plugins. 166 | .SH COPYRIGHT 167 | Pipelight can be distributed under the terms of the 168 | \fIMPL-1.1\fR 169 | or 170 | \fIGPL-2.0\fR 171 | or 172 | \fILGPL-2.1\fR 173 | license. 174 | .br 175 | Please note that most of the plugins also have their own end-user license 176 | agreement. Take a look there or ask the developers if you want to redistribute 177 | Pipelight with third-party plugins included. 178 | .SH BUGS 179 | Bugs can be reported on the 180 | .UR @@REPO@@ 181 | .B Pipelight project page 182 | .UE . 183 | Please note that Pipelight uses a patched wine version, so don't report Wine 184 | related bugs at the official Wine bug tracker. Instead report them also at the 185 | Pipelight project page (unless you can reproduce them with an unpatched 186 | version of Wine). 187 | .SH "SEE ALSO" 188 | .UR @@REPO@@ 189 | .B Pipelight project page 190 | .UE , 191 | .br 192 | .UR http://web.archive.org/web/20160815170857/http://pipelight.net:80/cms/installation.html 193 | .B Installation instructions 194 | .UE , 195 | .br 196 | .B #pipelight 197 | on IRC freenode 198 | -------------------------------------------------------------------------------- /share/configs/pipelight-flash: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine 3 | # winePrefix = $HOME/.wine-pipelight 4 | # wineArch = win32 5 | # pluginLoaderPath = $share/pluginloader.exe 6 | # # dllPath = C:\windows\system32\Macromed\Flash\ 7 | # # dllName = NPSWF32_11_8_800_168.dll 8 | # regKey = @adobe.com/FlashPlayer 9 | # windowlessMode = false 10 | # windowlessOverwriteArg = wmode=opaque 11 | # experimental-windowClassHook = true 12 | # ---END CONFIG--- 13 | 14 | install_flash() 15 | { 16 | # http://www.adobe.com/de/software/flash/about/ 17 | local URL="http://fpdownload.macromedia.com/get/flashplayer/pdc/23.0.0.205/install_flash_player.exe" 18 | local SHA="c4d38ca72b0e818d3418c020753132a3c95fccab4dd361b5486a151608689f5c" 19 | local VER="23_0_0_205" 20 | 21 | if ! download "$URL" "$SHA" "flash" ""; then 22 | echo "[flash] ERROR: Download failed." >&2 23 | return 1 24 | fi 25 | 26 | # Launch the installer 27 | if [ "$QUIETINSTALLATION" -eq 0 ]; then 28 | "$WINE" "$DOWNLOADFILE" 2>&1 29 | else 30 | "$WINE" "$DOWNLOADFILE" -install 2>&1 | progressbar "Please wait, installing ..." "Running Flash installer" 31 | fi 32 | 33 | local installdir="$WINEPREFIX/drive_c/windows/system32/Macromed/Flash" 34 | if [ ! -f "$installdir/NPSWF32_$VER.dll" ]; then 35 | echo "[flash] ERROR: Installer did not run correctly or was aborted." >&2 36 | return 1 37 | fi 38 | 39 | local flashconfig="$installdir/mms.cfg" 40 | if ! grep -q "^OverrideGPUValidation=" "$flashconfig" 2>/dev/null; then 41 | ( 42 | grep -v "^OverrideGPUValidation=" "$flashconfig" 2>/dev/null 43 | echo "OverrideGPUValidation=true" 44 | ) > "$flashconfig.bak" 45 | 46 | if ! mv "$flashconfig.bak" "$flashconfig"; then 47 | echo "[flash] ERROR: Unable to change plugin settings." >&2 48 | fi 49 | fi 50 | 51 | return 0 52 | } 53 | 54 | install_plugin() 55 | { 56 | install_flash 57 | return $? 58 | } 59 | -------------------------------------------------------------------------------- /share/configs/pipelight-shockwave: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine 3 | # winePrefix = $HOME/.wine-pipelight 4 | # wineArch = win32 5 | # pluginLoaderPath = $share/pluginloader.exe 6 | # # dllPath = C:\windows\system32\Adobe\Director\ 7 | # # dllName = np32dsw_1204144.dll 8 | # regKey = @adobe.com/ShockwavePlayer 9 | # ---END CONFIG--- 10 | 11 | install_shockwave() 12 | { 13 | # http://get.adobe.com/de/shockwave/otherversions/ 14 | local URL="http://fpdownload.macromedia.com/get/shockwave/default/english/win95nt/latest/sw_lic_full_installer.exe" 15 | local SHA="4c50d3f64372a9e242f13d8a12d3f5ef091b4a59ade48f8d878557d62ec74c3f" 16 | local VER="1225195" 17 | 18 | if ! download "$URL" "$SHA" "shockwave" ""; then 19 | echo "[shockwave] ERROR: Download failed." >&2 20 | return 1 21 | fi 22 | 23 | # Launch the installer 24 | if [ "$QUIETINSTALLATION" -eq 0 ]; then 25 | "$WINE" "$DOWNLOADFILE" 2>&1 26 | else 27 | "$WINE" "$DOWNLOADFILE" /S 2>&1 | progressbar "Please wait, installing ..." "Running Shockwave installer" 28 | fi 29 | 30 | local installdir1="$WINEPREFIX/drive_c/windows/system32/Adobe/Director" 31 | local installdir2="$WINEPREFIX/drive_c/windows/syswow64/Adobe/Director" 32 | if [ ! -f "$installdir1/np32dsw_$VER.dll" ] && [ ! -f "$installdir2/np32dsw_$VER.dll" ]; then 33 | echo "[shockwave] ERROR: Installer did not run correctly or was aborted." >&2 34 | return 1 35 | fi 36 | 37 | # Switch to OpenGL mode and disable fallback mode 38 | local tmpfile=$(mktemp) 39 | [ -f "$tmpfile" ] || return 1 40 | 41 | ( 42 | echo "REGEDIT4" 43 | echo "" 44 | echo "[HKEY_CURRENT_USER\\Software\\Adobe\\Shockwave 12\\allowfallback]" 45 | echo "@=\"n\"" 46 | echo "" 47 | echo "[HKEY_CURRENT_USER\\Software\\Adobe\\Shockwave 12\\renderer3dsetting]" 48 | echo "@=\"2\"" 49 | echo "" 50 | echo "[HKEY_CURRENT_USER\\Software\\Adobe\\Shockwave 12\\renderer3dsettingPerm]" 51 | echo "@=\"2\"" 52 | ) > "$tmpfile" 53 | 54 | "$WINE" regedit "$tmpfile" 55 | local res=$? 56 | 57 | # Cleanup 58 | rm "$tmpfile" 59 | 60 | return "$res" 61 | } 62 | 63 | install_plugin() 64 | { 65 | install_shockwave 66 | return $? 67 | } 68 | -------------------------------------------------------------------------------- /share/configs/pipelight-silverlight5.0: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine 3 | # winePrefix = $HOME/.wine-pipelight 4 | # wineArch = win32 5 | # pluginLoaderPath = $share/pluginloader.exe 6 | # dllPath = c:\Program Files\Silverlight\5.0.61118.0\ 7 | # dllName = npctrl.dll 8 | # # regKey = @Microsoft.com/NpCtrl,version=1.0 9 | # fakeVersion = 5.1.30214.0 10 | # overwriteArg = minRuntimeVersion=5.0.61118.0 11 | # # overwriteArg = enableGPUAcceleration=true 12 | # silverlightGraphicDriverCheck = true 13 | # experimental-windowClassHook = true 14 | # ---END CONFIG--- 15 | 16 | install_silverlight50() 17 | { 18 | local URL="http://silverlight.dlservice.microsoft.com/download/5/5/7/55748E53-D673-4225-8072-4C7A377BB513/runtime/Silverlight.exe" 19 | local SHA="dd45a55419026c592f8b6fc848dceface7e1ce98720bf13848a2e8ae366b29e8" 20 | local VER="5.0.61118.0" 21 | 22 | if ! download "$URL" "$SHA" "silverlight50" ""; then 23 | echo "[silverlight5.0] ERROR: Download failed." >&2 24 | return 1 25 | fi 26 | 27 | # Remove the registry keys for Silverlight since other versions can prevent this one from installing 28 | "$WINE" msiexec /uninstall {89F4137D-6C26-4A84-BDB8-2E5A4BB71E00}; 29 | 30 | # Launch the installer 31 | if [ "$QUIETINSTALLATION" -eq 0 ]; then 32 | "$WINE" "$DOWNLOADFILE" /noupdate 2>&1 33 | else 34 | "$WINE" "$DOWNLOADFILE" /q /doNotRequireDRMPrompt /noupdate 2>&1 | progressbar "Please wait, installing ..." "Running Silverlight 5.0 installer" 35 | fi 36 | 37 | local programfiles="$WINEPREFIX/drive_c/Program Files" 38 | if [ ! -d "$programfiles/Microsoft Silverlight/$VER" ]; then 39 | echo "[silverligh5.0] ERROR: Installer did not run correctly or was aborted." >&2 40 | return 1 41 | fi 42 | 43 | # Move the installation to a version-specific folder that nothing will touch 44 | mkdir -p "$programfiles/Silverlight" 45 | rm -rf "$programfiles/Silverlight/$VER" 46 | mv "$programfiles/Microsoft Silverlight/$VER" "$programfiles/Silverlight/$VER" 47 | 48 | # Remove the Silverlight menu shortcut 49 | rm -f "$WINEPREFIX/drive_c/users/$USER/Start Menu/Programs/Microsoft Silverlight/Microsoft Silverlight.lnk" 50 | 51 | # Successful 52 | return 0 53 | } 54 | 55 | install_mpg2splt() 56 | { 57 | local URL="http://download.microsoft.com/download/8/0/D/80D7E79D-C0E4-415A-BCCA-E229EAFE2679/dshow_nt.cab" 58 | local SHA="984ed15e23a00a33113f0012277e1e680c95782ce2c44f414e7af14e28e3f1a2" 59 | 60 | if ! download "$URL" "$SHA" "mpg2splt" ""; then 61 | echo "[mpg2splt] ERROR: Download failed." >&2 62 | return 1 63 | fi 64 | 65 | install_cabextract "$DOWNLOADFILE" mpg2splt.ax --reg 66 | return $? 67 | } 68 | 69 | install_plugin() 70 | { 71 | install_mpg2splt && install_silverlight50 72 | return $? 73 | } 74 | -------------------------------------------------------------------------------- /share/configs/pipelight-silverlight5.1: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine 3 | # winePrefix = $HOME/.wine-pipelight 4 | # wineArch = win32 5 | # pluginLoaderPath = $share/pluginloader.exe 6 | # dllPath = c:\Program Files\Silverlight\latest\ 7 | # dllName = npctrl.dll 8 | # # regKey = @Microsoft.com/NpCtrl,version=1.0 9 | # # fakeVersion = 5.1.30214.0 10 | # # overwriteArg = minRuntimeVersion=5.0.61118.0 11 | # # overwriteArg = enableGPUAcceleration=true 12 | # 13 | # executeJavascript = var __pipelight_navigator = new Object(); 14 | # executeJavascript = for (var __i in window.navigator) { __pipelight_navigator[__i] = window.navigator[__i]; } 15 | # executeJavascript = __pipelight_navigator.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1'; 16 | # replaceJavascript = window.navigator = __pipelight_navigator 17 | # 18 | # silverlightGraphicDriverCheck = true 19 | # experimental-windowClassHook = true 20 | # ---END CONFIG--- 21 | 22 | install_silverlight51() 23 | { 24 | # http://www.microsoft.com/getsilverlight/locale/en-us/html/Microsoft%20Silverlight%20Release%20History.htm 25 | local URL="http://download.microsoft.com/download/5/3/D/53D3880B-25F8-4714-A4AC-E463A492F96E/41212.00/Silverlight.exe" 26 | local SHA="af2d435a034e03c2940a648291013ebd9de20d855447dbdb93416e7e03c3e91b" 27 | local VER="5.1.41212.0" 28 | local SHORTVER="latest" 29 | 30 | if ! download "$URL" "$SHA" "silverlight51" ""; then 31 | echo "[silverlight5.1] ERROR: Download failed." >&2 32 | return 1 33 | fi 34 | 35 | # Remove the registry keys for Silverlight since other versions can prevent this one from installing 36 | "$WINE" msiexec /uninstall {89F4137D-6C26-4A84-BDB8-2E5A4BB71E00}; 37 | 38 | # Launch the installer 39 | if [ "$QUIETINSTALLATION" -eq 0 ]; then 40 | "$WINE" "$DOWNLOADFILE" /noupdate 2>&1 41 | else 42 | "$WINE" "$DOWNLOADFILE" /q /doNotRequireDRMPrompt /noupdate 2>&1 | progressbar "Please wait, installing ..." "Running Silverlight 5.1 installer" 43 | fi 44 | 45 | local programfiles="$WINEPREFIX/drive_c/Program Files" 46 | if [ ! -d "$programfiles/Microsoft Silverlight/$VER" ]; then 47 | echo "[silverligh5.1] ERROR: Installer did not run correctly or was aborted." >&2 48 | return 1 49 | fi 50 | 51 | # Move the installation to a version-specific folder that nothing will touch 52 | mkdir -p "$programfiles/Silverlight" 53 | rm -rf "$programfiles/Silverlight/$VER" 54 | mv "$programfiles/Microsoft Silverlight/$VER" "$programfiles/Silverlight/$VER" 55 | 56 | # Create a short symlink if SHORTVER is provided. 57 | if [ ! -z "$SHORTVER" ]; then 58 | local shortsymlink="$programfiles/Silverlight/$SHORTVER" 59 | if [ -L "$shortsymlink" ]; then 60 | rm "$shortsymlink" 61 | elif [ -e "$shortsymlink" ]; then 62 | echo "[silverlight5.1] ERROR: Unable to overwrite $shortsymlink, please delete this file manually." >&2 63 | return 1 64 | fi 65 | ln -s "$VER" "$shortsymlink" 66 | fi 67 | 68 | # Remove the Silverlight menu shortcut 69 | rm -f "$WINEPREFIX/drive_c/users/$USER/Start Menu/Programs/Microsoft Silverlight/Microsoft Silverlight.lnk" 70 | 71 | # Successful 72 | return 0 73 | } 74 | 75 | install_mpg2splt() 76 | { 77 | local URL="http://download.microsoft.com/download/8/0/D/80D7E79D-C0E4-415A-BCCA-E229EAFE2679/dshow_nt.cab" 78 | local SHA="984ed15e23a00a33113f0012277e1e680c95782ce2c44f414e7af14e28e3f1a2" 79 | 80 | if ! download "$URL" "$SHA" "mpg2splt" ""; then 81 | echo "[mpg2splt] ERROR: Download failed." >&2 82 | return 1 83 | fi 84 | 85 | install_cabextract "$DOWNLOADFILE" mpg2splt.ax --reg 86 | return $? 87 | } 88 | 89 | install_plugin() 90 | { 91 | install_mpg2splt && install_silverlight51 92 | return $? 93 | } 94 | -------------------------------------------------------------------------------- /share/configs/pipelight-unity3d: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine 3 | # winePrefix = $HOME/.wine-pipelight 4 | # wineArch = win32 5 | # wineDLLOverrides = mscoree,mshtml,winegstreamer,d3d11,winemenubuilder.exe= 6 | # pluginLoaderPath = $share/pluginloader.exe 7 | # # dllPath = C:\Program Files\Unity\WebPlayer\loader 8 | # # dllName = npUnity3D32.dll 9 | # regKey = @unity3d.com/UnityPlayer,version=1.0 10 | # # fakeVersion = Unity Player 4.2.2f1 11 | # ---END CONFIG--- 12 | 13 | install_unity3d() 14 | { 15 | # http://get.adobe.com/de/shockwave/otherversions/ 16 | local URL="http://webplayer.unity3d.com/download_webplayer-3.x/UnityWebPlayer.exe" 17 | local SHA="9a5bcbe13bb74590e97ea4ee4fe76c24a5ac0b9cc99948e1be33ed3394d8c245" 18 | 19 | if ! download "$URL" "$SHA" "unity3d" ""; then 20 | echo "[unity3d] ERROR: Download failed." >&2 21 | return 1 22 | fi 23 | 24 | if [ "$QUIETINSTALLATION" -eq 0 ]; then 25 | "$WINE" "$DOWNLOADFILE" /AllUsers 2>&1 26 | else 27 | "$WINE" "$DOWNLOADFILE" /S /AllUsers 2>&1 | progressbar "Please wait, installing ..." "Running Unity3D plugin installer" 28 | fi 29 | 30 | local installdir="$WINEPREFIX/drive_c/Program Files/Unity/WebPlayer/loader" 31 | if [ ! -f "$installdir/npUnity3D32.dll" ]; then 32 | echo "[unity3d] ERROR: Installer did not run correctly or was aborted." >&2 33 | return 1 34 | fi 35 | 36 | return 0 37 | } 38 | 39 | install_plugin() 40 | { 41 | install_unity3d 42 | return $? 43 | } 44 | -------------------------------------------------------------------------------- /share/configs/pipelight-widevine: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine 3 | # winePrefix = $HOME/.wine-pipelight 4 | # wineArch = win32 5 | # pluginLoaderPath = $share/pluginloader.exe 6 | # dllPath = C:\windows\system32 7 | # dllName = npwidevinemediaoptimizer.dll 8 | # experimental-forceSetWindow = true 9 | # ---END CONFIG--- 10 | 11 | install_widevine() 12 | { 13 | # http://www.widevine.com/download/videooptimizer/index.html 14 | local URL="https://dl.google.com/widevine/6.0.0.12442/WidevineMediaOptimizer_Win.xpi" 15 | local SHA="84cde1b83d8f5e4b287303a25e61227ce9a253268af6bd88b9a2f98c85129bc8" 16 | local EXT="zip" 17 | 18 | if ! download "$URL" "$SHA" "widevine" "$EXT"; then 19 | echo "[widevine] ERROR: Download failed." >&2 20 | return 1 21 | fi 22 | 23 | local system32="$WINEPREFIX/drive_c/windows/system32" 24 | if ! unzip -p "$DOWNLOADFILE" "plugins/npwidevinemediaoptimizer.dll" > "$system32/npwidevinemediaoptimizer.dll"; then 25 | echo "[widevine] ERROR: Unable to extract plugin from xip file." >&2 26 | return 1 27 | fi 28 | 29 | return 0 30 | } 31 | 32 | install_plugin() 33 | { 34 | install_widevine 35 | return $? 36 | } 37 | -------------------------------------------------------------------------------- /share/configs/pipelight-x64-flash: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine64 3 | # winePrefix = $HOME/.wine-pipelight64 4 | # wineArch = win64 5 | # pluginLoaderPath = $share/pluginloader64.exe 6 | # # dllPath = C:\windows\system32\Macromed\Flash\ 7 | # # dllName = NPSWF64_11_8_800_168.dll 8 | # regKey = @adobe.com/FlashPlayer 9 | # windowlessMode = false 10 | # windowlessOverwriteArg = wmode=opaque 11 | # experimental-windowClassHook = true 12 | # ---END CONFIG--- 13 | 14 | install_flash() 15 | { 16 | # http://www.adobe.com/de/software/flash/about/ 17 | local URL="http://fpdownload.macromedia.com/get/flashplayer/pdc/23.0.0.205/install_flash_player.exe" 18 | local SHA="c4d38ca72b0e818d3418c020753132a3c95fccab4dd361b5486a151608689f5c" 19 | local VER="23_0_0_205" 20 | 21 | if ! download "$URL" "$SHA" "flash-x64" ""; then 22 | echo "[flash-x64] ERROR: Download failed." >&2 23 | return 1 24 | fi 25 | 26 | # Launch the installer 27 | if [ "$QUIETINSTALLATION" -eq 0 ]; then 28 | "$WINE" "$DOWNLOADFILE" 2>&1 29 | else 30 | "$WINE" "$DOWNLOADFILE" -install 2>&1 | progressbar "Please wait, installing ..." "Running Flash installer" 31 | fi 32 | 33 | local installdir="$WINEPREFIX/drive_c/windows/system32/Macromed/Flash" 34 | if [ ! -f "$installdir/NPSWF64_$VER.dll" ]; then 35 | echo "[flash-x64] ERROR: Installer did not run correctly or was aborted." >&2 36 | return 1 37 | fi 38 | 39 | local flashconfig="$installdir/mms.cfg" 40 | if ! grep -q "^OverrideGPUValidation=" "$flashconfig" 2>/dev/null; then 41 | ( 42 | grep -v "^OverrideGPUValidation=" "$flashconfig" 2>/dev/null 43 | echo "OverrideGPUValidation=true" 44 | ) > "$flashconfig.bak" 45 | 46 | if ! mv "$flashconfig.bak" "$flashconfig"; then 47 | echo "[flash-x64] ERROR: Unable to change plugin settings." >&2 48 | fi 49 | fi 50 | 51 | return 0 52 | } 53 | 54 | install_plugin() 55 | { 56 | install_flash 57 | return $? 58 | } 59 | -------------------------------------------------------------------------------- /share/configs/pipelight-x64-unity3d: -------------------------------------------------------------------------------- 1 | # ---BEGIN CONFIG--- 2 | # winePath = $share/wine64 3 | # winePrefix = $HOME/.wine-pipelight64 4 | # wineArch = win64 5 | # pluginLoaderPath = $share/pluginloader64.exe 6 | # dllPath = C:\Program Files\Unity\WebPlayer64\loader-x64 7 | # dllName = npUnity3D64.dll 8 | # # regKey = @unity3d.com/UnityPlayer,version=1.0 9 | # ---END CONFIG--- 10 | 11 | install_unity3d_x64() 12 | { 13 | local URL="http://webplayer.unity3d.com/download_webplayer-3.x/UnityWebPlayerFull64.exe" 14 | local SHA="38bb0ddb2e833786c5563af72624316759e2f6cfb5a0249c7f76357859d2262c" 15 | 16 | if ! download "$URL" "$SHA" "unity3d-x64" ""; then 17 | echo "[unity3d-x64] ERROR: Download failed." >&2 18 | return 1 19 | fi 20 | 21 | # Launch the installer 22 | if [ "$QUIETINSTALLATION" -eq 0 ]; then 23 | "$WINE" "$DOWNLOADFILE" /AllUsers 2>&1 24 | else 25 | "$WINE" "$DOWNLOADFILE" /S /AllUsers 2>&1 | progressbar "Please wait, installing ..." "Running Unity3D x64 installer" 26 | fi 27 | 28 | local installdir="$WINEPREFIX/drive_c/Program Files/Unity/WebPlayer64/loader-x64" 29 | if [ ! -f "$installdir/npUnity3D64.dll" ]; then 30 | echo "[unity3d-x64] ERROR: Installer did not run correctly or was aborted." >&2 31 | return 1 32 | fi 33 | 34 | return 0 35 | } 36 | 37 | install_plugin() 38 | { 39 | install_unity3d_x64 40 | return $? 41 | } 42 | -------------------------------------------------------------------------------- /share/install-plugin: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PRG=$(basename "$0") 4 | 5 | # > Marks a file in order to delete it at program termination 6 | # arguments: 7 | # $1 - File to delete 8 | ATEXIT_RM_LIST=() 9 | atexit_add_rm() 10 | { 11 | ATEXIT_RM_LIST+=("$1") 12 | } 13 | 14 | atexit() 15 | { 16 | local file 17 | for file in "${ATEXIT_RM_LIST[@]}"; do 18 | echo "Deleting temporary '$file'." 19 | rm "$file" 20 | done 21 | } 22 | 23 | mktemp_with_ext() 24 | { 25 | file=$(mktemp --suffix=".$1" 2>/dev/null) 26 | if [ "$?" -eq 0 ]; then echo "$file"; return 0; fi 27 | file=$(mktemp 2>/dev/null) # old version of mktemp 28 | if [ "$?" -eq 0 ]; then echo "$file"; return 0; fi 29 | file=$(mktemp -t pipelight 2>/dev/null) # MacOS version of mktemp 30 | if [ "$?" -eq 0 ]; then echo "$file"; return 0; fi 31 | return 1 32 | } 33 | 34 | # > Checks if a dependency is already installed 35 | # arguments: 36 | # $1 - Date of last change 37 | is_installed() 38 | { 39 | local LASTCHANGE="$1" 40 | local ckfile="$WINEPREFIX/$PLUGIN.installed" 41 | [ -f "$ckfile" ] && [ "$LASTCHANGE" == "$(cat "$ckfile")" ] 42 | return $? 43 | } 44 | 45 | # > Marks a dependency as already installed 46 | # arguments: same as is_installed 47 | mark_installed() 48 | { 49 | local LASTCHANGE="$1" 50 | local ckfile="$WINEPREFIX/$PLUGIN.installed" 51 | echo "$LASTCHANGE" > "$ckfile" 52 | } 53 | 54 | # > Download a given dependency file 55 | # arguments: 56 | # $1 - URL 57 | # $2 - SHA256 58 | # $3 - Name 59 | # $4 - Overwrite file extension 60 | # returns: 61 | # $DOWNLOADFILE 62 | DOWNLOADFILE="" 63 | download() 64 | { 65 | local URL="$1"; local SHA="$2"; local NAME="$3"; local EXT="$4" 66 | 67 | if [ -z "$EXT" ]; then 68 | EXT=$(echo "$URL" | sed 's/.*\.//') 69 | fi 70 | 71 | # Reuse existing download 72 | local dlfile="/tmp/pipelight-$NAME.$EXT" 73 | if [ -f "$dlfile" ] && [ "$SHA" == "$(sha256sum "$dlfile" | cut -d' ' -f1)" ]; then 74 | DOWNLOADFILE="$dlfile" 75 | return 0 76 | fi 77 | 78 | local trycount=3 79 | local tmpfile=$(mktemp_with_ext "$EXT") 80 | [ -f "$tmpfile" ] || return 1 81 | local filesize=$(get_download_size "$URL") 82 | 83 | # Download to tmpfile 84 | while true; do 85 | if [ "$trycount" -le 0 ]; then 86 | rm "$tmpfile" 87 | echo "[$PRG] ERROR: Downloading of $NAME failed multiple times. Please check:" >&2 88 | echo "[$PRG]" >&2 89 | echo "[$PRG] * that your internet connection is working properly" >&2 90 | echo "[$PRG]" >&2 91 | echo "[$PRG] * and that the plugin database is up-to-date. To update it just run:" >&2 92 | echo "[$PRG] sudo pipelight-plugin --update" >&2 93 | echo "[$PRG]" >&2 94 | echo "[$PRG] If this doesn't help then most-likely the download URLs or checksums" >&2 95 | echo "[$PRG] have changed. We recommend to open a bug-report in this case." >&2 96 | return 1 97 | fi 98 | 99 | download_file "$tmpfile" "$URL" 2>&1 | progressbar "Please wait, downloading ..." "Downloading $NAME ($filesize MiB)" 100 | if [ -f "$tmpfile" ] && [ "$SHA" == "$(sha256sum "$tmpfile" | cut -d' ' -f1)" ]; then 101 | break 102 | fi 103 | 104 | (( trycount-- )) 105 | sleep 2 106 | done 107 | 108 | # Move the downloaded file to the right path 109 | if mv "$tmpfile" "$dlfile"; then 110 | chmod 0644 "$dlfile" 111 | DOWNLOADFILE="$dlfile" 112 | return 0 113 | fi 114 | 115 | # Continue using the temp path 116 | atexit_add_rm "$tmpfile" 117 | DOWNLOADFILE="$tmpfile" 118 | return 0 119 | } 120 | 121 | 122 | # > Extract cab library 123 | # arguments: 124 | # $1 - cab file 125 | # $2 - file to extract 126 | # 127 | # optional arguments: 128 | # --reg - run regsvr32.dll to register the dll 129 | install_cabextract() 130 | { 131 | local CABFILE="$1"; shift 132 | local FILE="$1"; shift 133 | 134 | local system32="$WINEPREFIX/drive_c/windows/system32" 135 | cabextract -d "$system32" "$CABFILE" -F "$FILE" 136 | if [ ! -f "$system32/$FILE" ]; then 137 | echo "[$PRG] ERROR: Failed to extract $FILE from cab file." >&2 138 | return 1 139 | fi 140 | 141 | # Process additional args 142 | while [ $# -gt 0 ] ; do 143 | local cmd=$1; shift 144 | case "$cmd" in 145 | --rename) 146 | if ! mv "$system32/$FILE" "$system32/$1"; then 147 | echo "[$PRG] ERROR: Unable to rename extracted file." >&2 148 | return 1 149 | fi 150 | FILE="$1"; shift 151 | ;; 152 | --reg) 153 | "$WINE" regsvr32.exe "$FILE" 154 | ;; 155 | *) 156 | echo "[$PRG] ERROR: Internal error, install_cabextract called with argument: $cmd" >&2 157 | return 1 158 | ;; 159 | esac 160 | done 161 | 162 | # Successful 163 | return 0 164 | } 165 | 166 | # Use fetch on FreeBSD if wget is not available 167 | if command -v wget >/dev/null 2>&1; then 168 | download_file() 169 | { 170 | wget -O "$1" "$2" 171 | } 172 | get_download_size() 173 | { 174 | local filesize="$(wget -O- "$1" --spider --server-response 2>&1 | sed -ne '/Content-Length/{s/.*: //;p}')" 175 | local re='^[0-9]+$' 176 | if [[ "$filesize" -ne "0" ]] && [[ "$filesize" =~ $re ]]; then 177 | echo "$(($filesize/(1024*1024)))" 178 | else 179 | echo "N/A" 180 | fi 181 | } 182 | elif command -v fetch >/dev/null 2>&1; then 183 | download_file() 184 | { 185 | fetch -o "$1" "$2" 186 | } 187 | get_download_size() 188 | { 189 | echo "N/A" 190 | } 191 | else 192 | download_file() 193 | { 194 | echo "ERROR: Could neither find wget nor fetch. Unable to download file!" >&2 195 | return 1 196 | } 197 | get_download_size() 198 | { 199 | echo "N/A" 200 | } 201 | fi 202 | 203 | # Use shasum instead of sha256sum on MacOS / *BSD 204 | if ! command -v sha256sum >/dev/null 2>&1 && command -v shasum >/dev/null 2>&1; then 205 | sha256sum() 206 | { 207 | shasum -a 256 "$1" 208 | } 209 | fi 210 | 211 | # Use md5 instead of md5sum on MacOS / *BSD 212 | if ! command -v md5sum >/dev/null 2>&1 && command -v md5 >/dev/null 2>&1; then 213 | md5sum() 214 | { 215 | md5 216 | } 217 | fi 218 | 219 | # Check if some visual feedback is possible 220 | if command -v zenity >/dev/null 2>&1; then 221 | progressbar() 222 | { 223 | WINDOWID="" zenity --progress --title="$1" --text="$2" --pulsate --width=400 --auto-close --no-cancel || 224 | WINDOWID="" zenity --progress --title="$1" --text="$2" --pulsate --width=400 --auto-close 225 | } 226 | 227 | elif command -v kdialog >/dev/null 2>&1 && command -v qdbus >/dev/null 2>&1; then 228 | #Check if qdbus is symlinked to qtchooser (for Arch Linux) 229 | QDBUSPATH=$(which qdbus) 230 | QDBUSPATH=$(readlink "$QDBUSPATH") 231 | if [ "$QDBUSPATH" == "qtchooser" ]; then 232 | QDBUSPATH="qtchooser -run-tool=qdbus -qt=4" 233 | else 234 | QDBUSPATH="qdbus" 235 | fi 236 | 237 | progressbar() 238 | { 239 | local dcopref=$(kdialog --title "$1" --progressbar "$2" 10) 240 | 241 | # Update the progress bar (not really the progress, but the user knows that something is going on) 242 | ( 243 | local progress=1 244 | while true; do 245 | local err=$($QDBUSPATH $dcopref org.freedesktop.DBus.Properties.Set org.kde.kdialog.ProgressDialog value "$progress" 2>&1) 246 | if [ ! -z "$err" ]; then break; fi 247 | 248 | sleep 1 249 | 250 | (( progress++ )) 251 | if [ "$progress" -gt 10 ]; then progress=0; fi 252 | done 253 | ) 0 /dev/null 260 | } 261 | 262 | else 263 | progressbar() 264 | { 265 | cat - 266 | } 267 | fi 268 | 269 | # Abort if no arguments were given 270 | if [ $# -ne 2 ]; then 271 | echo "[$PRG] ERROR: Please provide a path to a plugin config and a plugin name." >&2 272 | exit 1 273 | fi 274 | 275 | # Check for environment variables 276 | if [ -z "$WINE" ] || [ -z "$WINEPREFIX" ]; then 277 | echo "[$PRG] ERROR: Missing necessary environment variables WINE and WINEPREFIX." >&2 278 | exit 1 279 | fi 280 | 281 | if [ ! -w "$WINEPREFIX" ]; then 282 | WINEPREFIX_PARENT="$(dirname "$WINEPREFIX")" 283 | if [ ! -w "$WINEPREFIX_PARENT" ] || [ ! -O "$WINEPREFIX_PARENT" ]; then 284 | echo "[$PRG] ERROR: You're running this script as a wrong user - WINEPREFIX or parent directory not owned by you." >&2 285 | exit 1 286 | fi 287 | fi 288 | 289 | PLUGIN_SCRIPT="$1" 290 | PLUGIN="$2" 291 | 292 | if [ ! -f "$PLUGIN_SCRIPT" ]; then 293 | echo "[$PRG] ERROR: Plugin script $PLUGIN_SCRIPT does not exist" >&2 294 | exit 1 295 | fi 296 | 297 | # Silent installation 298 | if [ -z "$QUIETINSTALLATION" ]; then 299 | QUIETINSTALLATION=0 300 | fi 301 | 302 | # Generate a lock file based on the wine prefix 303 | LOCKFILE=$(echo "$WINEPREFIX" | md5sum | cut -d' ' -f1) 304 | LOCKFILE="/tmp/wine-$LOCKFILE.tmp" 305 | 306 | LOCKFD=9; eval "exec $LOCKFD> \"\$LOCKFILE\"" 307 | if ! flock -x -w 360 "$LOCKFD"; then 308 | echo "[$PRG] ERROR: Failed to obtain an installation lock in 6 minutes." >&2 309 | exit 1 310 | fi 311 | 312 | # Close file descriptor (ensure that the lock is released when the installation is ready) 313 | trap "EXITSTATUS=\$?; flock -u \"$LOCKFD\"; atexit; exit \"\$EXITSTATUS\"" 0 314 | 315 | # Initialize wine if not done yet 316 | if [ ! -f "$WINEPREFIX/system.reg" ]; then 317 | 318 | # Directory exists, but without system.reg - wine will assume wrong platform, so create dummy system.reg 319 | if [ -d "$WINEPREFIX" ] && [ ! -f "$WINEPREFIX/system.reg" ]; then 320 | if [ "$WINEARCH" == "win32" ] || [ "$WINEARCH" == "win64" ]; then 321 | echo -en "WINE REGISTRY Version 2\n\n#arch=$WINEARCH\n" > "$WINEPREFIX/system.reg" 322 | echo "[$PRG] Forced creation of a $WINEARCH wine prefix." 323 | fi 324 | fi 325 | 326 | DISPLAY="" "$WINE" wineboot.exe 2>&1 | progressbar "Please wait..." "Creating wine prefix" 327 | fi 328 | 329 | file_date=$(date -u -Ins -r "$PLUGIN_SCRIPT") 330 | 331 | # Is already installed? 332 | if is_installed "$file_date"; then 333 | echo "[$PRG] $PLUGIN is already installed in '$WINEPREFIX'." 334 | exit 0 335 | fi 336 | 337 | echo "[$PRG] Running $PLUGIN installation script." 338 | 339 | source "$PLUGIN_SCRIPT" 340 | if ! install_plugin; then 341 | echo "[$PRG] ERROR: Installation script for $PLUGIN failed." >&2 342 | exit 1 343 | fi 344 | 345 | # Mark the package as installed 346 | mark_installed "$file_date" 347 | 348 | exit 0 349 | -------------------------------------------------------------------------------- /share/licenses/license-adobereader.txt.in: -------------------------------------------------------------------------------- 1 | [*] Adobe Reader 2 | By continuing the installation you agree that you've read and accepted the 3 | ADOBE Personal Computer Software License Agreement: 4 | http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/legal/licenses-terms/pdf/Reader_11.0.pdf 5 | 6 | To find out more click here: 7 | http://get.adobe.com/reader 8 | -------------------------------------------------------------------------------- /share/licenses/license-flash.txt.in: -------------------------------------------------------------------------------- 1 | [*] Adobe Flash Player 2 | By continuing the installation you agree that you've read and accepted the 3 | ADOBE Personal Computer Software License Agreement: 4 | http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/legal/licenses-terms/pdf/Flash%20Player_11.0.pdf 5 | 6 | To find out more click here: 7 | http://get.adobe.com/flashplayer 8 | -------------------------------------------------------------------------------- /share/licenses/license-foxitpdf.txt.in: -------------------------------------------------------------------------------- 1 | [*] Foxit PDF Reader 2 | By continuing the installation you agree that you've read and accepted the 3 | FOXIT CORPORATION LICENSE AGREEMENT FOR DESKTOP SOFTWARE APPLICATIONS: 4 | http://www.foxitsoftware.com/Secure_PDF_Reader/eula.php 5 | 6 | To find out more click here: 7 | http://www.foxitsoftware.com/Secure_PDF_Reader/ 8 | -------------------------------------------------------------------------------- /share/licenses/license-grandstream.txt.in: -------------------------------------------------------------------------------- 1 | [*] Grandstream WebControl Plugin 2 | To find out more about this plugin click here: 3 | http://www.grandstream.com/support/tools 4 | -------------------------------------------------------------------------------- /share/licenses/license-hikvision.txt.in: -------------------------------------------------------------------------------- 1 | [*] Hikvision WebControl Plugin 2 | To find out more about this plugin click here: 3 | http://www.hikvision.com/en/ 4 | -------------------------------------------------------------------------------- /share/licenses/license-mpg2splt.txt.in: -------------------------------------------------------------------------------- 1 | [*] mpg2splt.ax 2 | This library is part of the Microsoft DirectX End-User Runtime. 3 | By continuing the installation you agree that you've read and accepted the 4 | Microsoft Software License Terms. 5 | You can find them in @@PIPELIGHT_SHARE_PATH@@/licenses/license-mpg2splt.txt 6 | 7 | To find out more click here: 8 | http://www.microsoft.com/en-us/download/details.aspx?id=35 9 | --- 10 | 11 | MICROSOFT SOFTWARE LICENSE TERMS 12 | MICROSOFT DIRECTX END USER RUNTIME 13 | These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft 14 | * updates, 15 | * supplements, 16 | * Internet-based services, and 17 | * support services 18 | for this software, unless other terms accompany those items. If so, those terms apply. 19 | BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. 20 | If you comply with these license terms, you have the rights below. 21 | 1. INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software on your devices. 22 | 2. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not 23 | * work around any technical limitations in the software; 24 | * reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; 25 | * make more copies of the software than specified in this agreement or allowed by applicable law, despite this limitation; 26 | * publish the software for others to copy; 27 | * rent, lease or lend the software; 28 | * transfer the software or this agreement to any third party; or 29 | * use the software for commercial software hosting services. 30 | 3. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the software. 31 | 4. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. 32 | 5. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see www.microsoft.com/exporting. 33 | 6. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. 34 | 7. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. 35 | 8. APPLICABLE LAW. 36 | a. United States. If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort. 37 | b. Outside the United States. If you acquired the software in any other country, the laws of that country apply. 38 | 9. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. 39 | 10. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 40 | 11. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. 41 | This limitation applies to 42 | * anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and 43 | * claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. 44 | It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. 45 | -------------------------------------------------------------------------------- /share/licenses/license-mspatcha.txt.in: -------------------------------------------------------------------------------- 1 | [*] mspatcha.dll 2 | This library is part of the Windows Installer 2.0 Redistributable Windows 3 | 2000 and Windows NT 4.0. By continuing the installation you agree that 4 | you've read and accepted the End-User License Agreement for Microsoft 5 | Software: 6 | http://download.microsoft.com/download/WindowsInstaller/Install/2.0/NT45/EN-US/License.txt 7 | 8 | To find out more click here: 9 | http://www.microsoft.com/en-us/download/details.aspx?id=11176 10 | -------------------------------------------------------------------------------- /share/licenses/license-roblox.txt.in: -------------------------------------------------------------------------------- 1 | [*] ROBLOX Software 2 | By continuing the installation you agree that you've read and accepted the 3 | ROBLOX Software License Agreement: http://www.roblox.com/Info/EULA.htm 4 | 5 | To find out more click here: 6 | http://www.roblox.com 7 | -------------------------------------------------------------------------------- /share/licenses/license-shockwave.txt.in: -------------------------------------------------------------------------------- 1 | [*] Adobe Shockwave Player 2 | By continuing the installation you agree that you've read and accepted the 3 | ADOBE SOFTWARE LICENSE AGREEMENT: 4 | http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/legal/licenses-terms/pdf/Shockwave%2011.0.pdf 5 | 6 | To find out more click here: 7 | http://get.adobe.com/shockwave 8 | -------------------------------------------------------------------------------- /share/licenses/license-silverlight4.txt.in: -------------------------------------------------------------------------------- 1 | [*] Microsoft Silverlight 4 2 | By continuing the installation you agree that you've read and accepted the 3 | MICROSOFT SOFTWARE LICENSE TERMS: 4 | http://go2.microsoft.com/fwlink/?LinkID=183382 5 | 6 | Microsoft Silverlight Privacy Statement: 7 | http://go2.microsoft.com/fwlink/?LinkID=200620 8 | 9 | To find out more click here: 10 | http://www.microsoft.com/silverlight/ 11 | -------------------------------------------------------------------------------- /share/licenses/license-silverlight5.0.txt.in: -------------------------------------------------------------------------------- 1 | [*] Microsoft Silverlight 5.0 2 | By continuing the installation you agree that you've read and accepted the 3 | MICROSOFT SOFTWARE LICENSE TERMS: 4 | http://go.microsoft.com/fwlink/?LinkId=229303 5 | 6 | Microsoft Silverlight Privacy Statement: 7 | http://go.microsoft.com/fwlink/?LinkId=229306 8 | 9 | To find out more click here: 10 | http://www.microsoft.com/silverlight/ 11 | -------------------------------------------------------------------------------- /share/licenses/license-silverlight5.1.txt.in: -------------------------------------------------------------------------------- 1 | [*] Microsoft Silverlight 5.1 2 | By continuing the installation you agree that you've read and accepted the 3 | MICROSOFT SOFTWARE LICENSE TERMS: 4 | http://go.microsoft.com/fwlink/?LinkId=229303 5 | 6 | Microsoft Silverlight Privacy Statement: 7 | http://go.microsoft.com/fwlink/?LinkId=229306 8 | 9 | To find out more click here: 10 | http://www.microsoft.com/silverlight/ 11 | -------------------------------------------------------------------------------- /share/licenses/license-unity3d.txt.in: -------------------------------------------------------------------------------- 1 | [*] Unity Web Player 2 | By continuing the installation you agree that you've read and accepted the 3 | Web Player License Agreement: 4 | http://unity3d.com/company/legal/webplayer-eula 5 | 6 | To find out more click here: 7 | http://unity3d.com/unity 8 | -------------------------------------------------------------------------------- /share/licenses/license-viewright-caiway.txt.in: -------------------------------------------------------------------------------- 1 | [*] ViewRight Caiway 2 | By continuing the installation you agree that you've read and accepted the 3 | END USER LICENSE AGREEMENT. 4 | You can find it in @@PIPELIGHT_SHARE_PATH@@/licenses/license-viewright-caiway.txt 5 | 6 | To find out more click here: 7 | https://www.caiway.nl/site/nl/applicatie/multiscreentvplugins 8 | --- 9 | 10 | ViewRight™ Web 11 | 12 | “CLICK TO ACCEPT” END USER LICENSE AGREEMENT 13 | 14 | PLEASE READ THIS END USER LICENSE AGREEMENT (“EULA”) CAREFULLY. BY USING THIS SOFTWARE YOU OR YOUR COMPANY (“LICENSEE”) ACCEPT ALL OF THE TERMS AND CONDITIONS OF THIS EULA. IF YOU ACQUIRE THIS PRODUCT FOR YOUR COMPANY’S USE, YOU REPRESENT THAT YOU ARE AN AUTHORIZED REPRESENTATIVE WHO HAS THE AUTHORITY TO LEGALLY BIND YOUR COMPANY TO THE TERMS OF THIS EULA. IF YOU/LICENSEE DO NOT AGREE TO THE TERMS OF THIS EULA, YOU/LICENSEE ARE NOT AUTHORIZED TO USE THIS SOFTWARE. 15 | 16 | 1.0 Ownership. Verimatrix, Inc. (“Verimatrix”) and its licensors own the Software and all intellectual property rights therein. The structure, organization and code of the Software are valuable trade secrets and are confidential information. The Software is protected by law including, without limitation, the copyright laws of the United States and by international treaties. This EULA does not grant to Licensee any intellectual property rights in the Software and all rights are expressly reserved by Verimatrix. 17 | 18 | 2.0 Software License. Subject to the terms of this EULA, Verimatrix grants to Licensee a non-exclusive license to use the Software internally for the purposes described in the Software Documentation. Use of some third party materials may be subject to other terms and conditions typically found in a separate license agreement or “Read Me” file located near such materials. Licensee is permitted to make a single copy of the Software strictly for backup/archival purposes only. Licensee may not alter or modify the Software. 19 | 20 | 3.0 Restrictions on Use. Licensee may not and shall not permit a third party to: 21 | (i) Create derivative works based on the Software; 22 | (ii) Sell, assign, license, disclose or otherwise transfer or make available the Software in whole or in part to any third party; 23 | (iii) Alter, translate, decompile or attempt to reverse engineer the Software; 24 | (iv) Use the Software to provide services to third parties or to provide any type of service bureau or application service provider service; or 25 | (v) Remove or alter any proprietary notices or marks on the Software. 26 | 27 | 4.0 Updates. If Licensee is receiving an update or an upgrade to or a new version of the Software (“Update”), License must possess a valid license to use the previous version in order to use the Update. All Updates are provided to Licensee on a license exchange basis. Licensee agrees that by using an Update, Licensee voluntarily terminates Licensee’s right to use any previous version of the Software. Licensee may continue to use previous versions of the Software but Licensee acknowledges and agrees that any obligation that Verimatrix has to support previous versions of the Software may end upon availability of the Update. 28 | 29 | 5.0 NO WARRANTY. THE SOFTWARE IS OFFERED ON AN “AS-IS” BASIS. NO WARRANTY EITHER EXPRESS OR IMPLIED IS GIVEN. VERIMATRIX AND ITS LICENSORS DISCLAIM ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. VERIMATRIX SPECIFICALLY DISCLAIMS ANY AND ALL LIABILITY HOWSOEVER ARISING WHICH RESULTS FROM THE USE OF MPEG EMBEDDED SOFTWARE AND SPECIFIC TECHNIQUES EMPLOYED BY SOFTWARE TO PREVENT ALTERATION, REVERSE ENGINEERING AND DECOMPILATION, IF ANY. 30 | 31 | 6.0 Indemnification. By having read this EULA and using the Software, Licensee agrees to indemnify and hold harmless Verimatrix, its officers, employees, agents, subsidiaries, affiliates and partners from any direct, indirect, incidental, special, consequential or exemplary damages arising out of, relating to, or resulting from Licensee’s use of the Software or any other matter relating to the Software. 32 | 33 | 7.0 Limitation of Liability. Licensee expressly UNDERSTANDS AND AGREES THAT VERIMATRIX SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER INTANGIBLE LOSSES EVEN IF VERIMATRIX HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE EXLCUSION OR THE LIMITATION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES. aCCORDINGLY, SOME OF THE ABOVE LIMITATIONS MAY NOT APPLY TO LICENSEE. IN NO EVENT SHALL VERIMATRIX’S TOTAL CUMULATIVE DAMAGES ARISING UNDER THE TERMS OF THIS eula EXCEED THE FEES PAID BY LICENSEE TO VERIMATRIX FOR THE SOFTWARE. 34 | 35 | 8.0 General Provisions. The terms of this EULA shall be governed by and construed in accordance with the laws of the State of California without regard to its conflict of law principles. The EULA contains the entire agreement between the parties with respect to its subject matter and supersedes any prior agreements between the parties. If any provision of this EULA is held to be invalid or unenforceable by a court of law, such provision shall be changed and interpreted so as to best accomplish the objectives of the original version to the fullest extent allowed by law and the remaining provisions shall remain in full force and effect. The parties acknowledge that licensing of the Software is subject to the export control laws of the United States including, the U.S. Bureau of Export Administration regulations, as amended, and the parties agree to obey all such laws. Licensee may not assign this EULA and any purported assignment of this EULA by Licensee shall be null and void. Verimatrix and the Verimatrix logo are and shall remain the trademarks of Verimatrix. 36 | 37 | 9.0 USE OF THIS PRODUCT IN ANY MANNER THAT COMPLIES WITH THE MPEG-2 STANDARD IS EXPRESSLY PROHIBITED WITHOUT A LICENSE UNDER APPLICABLE PATENTS IN THE MPEG-2 PATENT PORTFOLIO, WHICH LICENSE IS AVAILABLE FROM MPEG LA, LLC, 250 STEELE STREET, SUITE 300, DENVER, COLORADO 80206. 38 | 39 | 10.0 THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL AND NON-COMMERCIAL USE OF A CONSUMER TO (I) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD ("AVC VIDEO") AND/OR (II) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, LLC. SEE HTTP://WWW.MPEGLA.COM. 40 | -------------------------------------------------------------------------------- /share/licenses/license-widevine.txt.in: -------------------------------------------------------------------------------- 1 | [*] Widevine Media Optimizer 2 | To find out more about this plugin click here: 3 | https://tools.google.com/dlpage/widevine 4 | -------------------------------------------------------------------------------- /share/licenses/license-wininet.txt.in: -------------------------------------------------------------------------------- 1 | [*] wininet.dll 2 | This wininet.dll library is a debug version provided for the Microsoft 3 | Internet Explorer. By continuing the installation you agree that you've 4 | read and accepted the license terms. 5 | You can find them in @@PIPELIGHT_SHARE_PATH@@/licenses/license-wininet.txt 6 | 7 | To find out more click here: 8 | http://www.microsoft.com/en-us/download/details.aspx?id=11434 9 | --- 10 | 11 | PLEASE NOTE: Microsoft Corporation (or based 12 | on where you live, one of its affiliates) 13 | licenses this supplement to you. The 14 | supplement is identified for use with one or 15 | more Microsoft operating system products (the 16 | 'software'). You may use a copy of this 17 | supplement with each validly licensed copy of 18 | the software. You may not use it if you do 19 | not have a license for the software. The 20 | license terms for the software apply to your 21 | use of this supplement. To read the license 22 | terms, go to www.microsoft.com/useterms 23 | . 24 | Microsoft provides support services for the 25 | supplement as described at www.support. 26 | microsoft.com/common/international.aspx 27 | . 29 | 30 | EULAID:HFX_RM.1_GDR_NRL_EN 31 | -------------------------------------------------------------------------------- /share/scripts/configure-flash.in: -------------------------------------------------------------------------------- 1 | #!@@BASH@@ 2 | PIPELIGHT_SHARE_PATH="@@PIPELIGHT_SHARE_PATH@@" 3 | 4 | # Don't run this as root 5 | if [ $(/usr/bin/id -u) -eq 0 ]; then 6 | echo "ERROR: You should not run this as root!" >&2 7 | exit 1 8 | fi 9 | 10 | # Check for environment variables 11 | if [ -z "$WINE" ]; then 12 | export WINE="$PIPELIGHT_SHARE_PATH/wine" 13 | fi 14 | if [ -z "$WINEPREFIX" ]; then 15 | export WINEPREFIX="$HOME/.wine-pipelight" 16 | fi 17 | if [ -z "$WINEARCH" ]; then 18 | export WINEARCH="win32" 19 | fi 20 | if [ -z "$WINEDLLOVERRIDES" ]; then 21 | export WINEDLLOVERRIDES="mscoree,mshtml,winegstreamer,winemenubuilder.exe=" 22 | fi 23 | 24 | if [ ! -x "$WINE" ]; then 25 | echo "ERROR: wine executable not found!" >&2 26 | exit 1 27 | fi 28 | 29 | system32="$WINEPREFIX/drive_c/windows/system32" 30 | flashconfig="$system32/Macromed/Flash/mms.cfg" 31 | 32 | while true; do 33 | hwaccel="disabled" 34 | if grep -q "OverrideGPUValidation=true" "$flashconfig" 2>/dev/null; then 35 | hwaccel="enabled" 36 | fi 37 | 38 | echo "" 39 | echo "Flash hardware acceleration is currently $hwaccel in the config file." 40 | 41 | read -p "[enable/disable/abort]? " hwaccel_new 42 | if [ -z "$hwaccel_new" ] || [ "$hwaccel_new" == "abort" ]; then break; fi 43 | 44 | ( 45 | grep -v "^OverrideGPUValidation=" "$flashconfig" 2>/dev/null 46 | if [ "$hwaccel_new" == "disable" ]; then 47 | echo "OverrideGPUValidation=false" 48 | else 49 | echo "OverrideGPUValidation=true" 50 | fi 51 | ) > "$flashconfig.new" 52 | 53 | if ! mv "$flashconfig.new" "$flashconfig"; then 54 | echo "ERROR: Unable to change Flash plugin settings." >&2 55 | fi 56 | done 57 | 58 | -------------------------------------------------------------------------------- /share/scripts/configure-silverlight.in: -------------------------------------------------------------------------------- 1 | #!@@BASH@@ 2 | PIPELIGHT_SHARE_PATH="@@PIPELIGHT_SHARE_PATH@@" 3 | 4 | # Don't run this as root 5 | if [ $(/usr/bin/id -u) -eq 0 ]; then 6 | echo "ERROR: You should not run this as root!" >&2 7 | exit 1 8 | fi 9 | 10 | # Check for environment variables 11 | if [ -z "$WINE" ]; then 12 | export WINE="$PIPELIGHT_SHARE_PATH/wine" 13 | fi 14 | if [ -z "$WINEPREFIX" ]; then 15 | export WINEPREFIX="$HOME/.wine-pipelight" 16 | fi 17 | if [ -z "$WINEARCH" ]; then 18 | export WINEARCH="win32" 19 | fi 20 | if [ -z "$WINEDLLOVERRIDES" ]; then 21 | export WINEDLLOVERRIDES="mscoree,mshtml,winegstreamer,winemenubuilder.exe=" 22 | fi 23 | 24 | if [ ! -x "$WINE" ]; then 25 | echo "ERROR: wine executable not found!" >&2 26 | exit 1 27 | fi 28 | 29 | tmpfile=$(mktemp) 30 | [ -f "$tmpfile" ] || exit 1 31 | 32 | while true; do 33 | hwaccel="enabled" 34 | "$WINE" regedit /E "$tmpfile" "HKEY_CURRENT_USER\\Software\\Microsoft\\Silverlight" 35 | if [ $? -eq 0 ]; then 36 | if grep -q "\"DisableGPUAcceleration\"=dword:00000001" "$tmpfile"; then 37 | hwaccel="disabled" 38 | elif grep -q "\"ForceGPUAcceleration\"=dword:00000001" "$tmpfile"; then 39 | hwaccel="forced" 40 | fi 41 | fi 42 | 43 | echo "" 44 | echo "Silverlight hardware acceleration is currently $hwaccel in the registry." 45 | if [ "$hwaccel" == "enabled" ]; then 46 | echo "Please note that it will not be used unless your graphic card is whitelisted." 47 | fi 48 | 49 | read -p "[enable/disable/force/abort]? " hwaccel_new 50 | if [ -z "$hwaccel_new" ] || [ "$hwaccel_new" == "abort" ]; then break; fi 51 | 52 | ( 53 | echo "REGEDIT4" 54 | echo "" 55 | echo "[HKEY_CURRENT_USER\\Software\\Microsoft\\Silverlight]" 56 | [ "$hwaccel_new" != "disable" ] 57 | echo "\"DisableGPUAcceleration\"=dword:0000000$?" 58 | [ "$hwaccel_new" != "force" ] 59 | echo "\"ForceGPUAcceleration\"=dword:0000000$?" 60 | ) > "$tmpfile" 61 | 62 | "$WINE" regedit "$tmpfile" 63 | if [ $? -ne 0 ]; then 64 | echo "ERROR: Unable to change Silverlight plugin settings." >&2 65 | fi 66 | done 67 | 68 | # Cleanup 69 | rm "$tmpfile" 70 | 71 | exit 0 -------------------------------------------------------------------------------- /share/sig-install-dependency.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keithbowes/pipelight/40dbef17afd4d559f7e923e4970c2468fd30c83b/share/sig-install-dependency.gpg -------------------------------------------------------------------------------- /share/sig-pluginloader.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keithbowes/pipelight/40dbef17afd4d559f7e923e4970c2468fd30c83b/share/sig-pluginloader.gpg -------------------------------------------------------------------------------- /src/common/Makefile: -------------------------------------------------------------------------------- 1 | CXXFLAGS := -I../../include $(CXXFLAGS) 2 | export 3 | 4 | SOURCE = $(wildcard *.c) 5 | OBJECTS = $(SOURCE:.c=_$(common_suffix).o) 6 | 7 | .PHONY: all 8 | all: $(OBJECTS) 9 | 10 | %_$(common_suffix).o: %.c 11 | $(CXX) $(CXXFLAGS) -MMD -MP -o $@ -c $< 12 | 13 | -include $(SOURCE:.c=.d) 14 | 15 | .PHONY: clean 16 | clean: 17 | rm -f *.o *.d 18 | -------------------------------------------------------------------------------- /src/linux/Makefile: -------------------------------------------------------------------------------- 1 | CXXFLAGS := -I../../../include -Wall -std=gnu++0x -fPIC $(CXXFLAGS) 2 | export 3 | 4 | SUBDIRS = $(dir $(wildcard */Makefile)) 5 | 6 | .PHONY: all 7 | all: $(SUBDIRS) 8 | 9 | .PHONY: $(SUBDIRS) 10 | $(SUBDIRS): 11 | $(MAKE) -C $@ 12 | 13 | .PHONY: clean 14 | clean: 15 | for dir in $(SUBDIRS); do \ 16 | $(MAKE) -C $$dir $@; \ 17 | done -------------------------------------------------------------------------------- /src/linux/libpipelight/Makefile: -------------------------------------------------------------------------------- 1 | CXXFLAGS := -fvisibility=hidden -DPIPELIGHT_SHARE_PATH='"$(datadir)/pipelight"' $(CXXFLAGS) 2 | LDFLAGS := -lpthread -Wl,--unresolved-symbols=report-all $(LDFLAGS) 3 | UNAME_S := $(shell uname -s) 4 | ifeq ($(UNAME_S), FreeBSD) 5 | CXXFLAGS := -I/usr/local/include $(CXXFLAGS) 6 | LDFLAGS := -L/usr/local/lib $(LDFLAGS) 7 | else 8 | LDFLAGS := -ldl $(LDFLAGS) 9 | endif 10 | ifneq ($(UNAME_S),Darwin) 11 | LDFLAGS := -lX11 $(LDFLAGS) 12 | endif 13 | common_suffix := lin 14 | export 15 | 16 | SOURCE = $(wildcard *.c) 17 | OBJECTS = $(SOURCE:.c=.o) ../../common/common_lin.o 18 | SUBDIRS := ../../common/ 19 | 20 | .PHONY: all 21 | all: libpipelight.so 22 | 23 | libpipelight.so: $(OBJECTS) 24 | $(CXX) -shared $(CXXFLAGS) $(OBJECTS) $(LDFLAGS) -o libpipelight.so 25 | 26 | %.o: %.c 27 | $(CXX) $(CXXFLAGS) -MMD -MP -o $@ -c $< 28 | 29 | ../../common/common_lin.o: dummy 30 | $(MAKE) -C ../../common/ 31 | 32 | -include $(SOURCE:.c=.d) 33 | 34 | .PHONY: clean dummy 35 | clean: 36 | rm -f *.so *.o *.d 37 | for dir in $(SUBDIRS); do \ 38 | $(MAKE) -C $$dir $@; \ 39 | done -------------------------------------------------------------------------------- /src/linux/libpipelight/basicplugin.h: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is mozilla.org code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Netscape Communications Corporation. 18 | * Portions created by the Initial Developer are Copyright (C) 1998 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Josh Aas 23 | * Michael Müller 24 | * Sebastian Lackner 25 | * 26 | * Alternatively, the contents of this file may be used under the terms of 27 | * either the GNU General Public License Version 2 or later (the "GPL"), or 28 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 29 | * in which case the provisions of the GPL or the LGPL are applicable instead 30 | * of those above. If you wish to allow use of your version of this file only 31 | * under the terms of either the GPL or the LGPL, and not to allow others to 32 | * use your version of this file under the terms of the MPL, indicate your 33 | * decision by deleting the provisions above and replace them with the notice 34 | * and other provisions required by the GPL or the LGPL. If you do not delete 35 | * the provisions above, a recipient may use your version of this file under 36 | * the terms of any one of the MPL, the GPL or the LGPL. 37 | * 38 | * ***** END LICENSE BLOCK ***** */ 39 | 40 | #ifndef BasicPlugin_h_ 41 | #define BasicPlugin_h_ 42 | 43 | #include 44 | 45 | #include "common/common.h" 46 | #include "configloader.h" 47 | 48 | extern PluginConfig config; 49 | 50 | /* 51 | Plugin Interface for the Browser 52 | */ 53 | 54 | NPError NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs); 55 | NPError NP_Shutdown(); 56 | 57 | NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved); 58 | NPError NPP_Destroy(NPP instance, NPSavedData** save); 59 | NPError NPP_SetWindow(NPP instance, NPWindow* window); 60 | NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype); 61 | NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason); 62 | int32_t NPP_WriteReady(NPP instance, NPStream* stream); 63 | int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer); 64 | void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname); 65 | void NPP_Print(NPP instance, NPPrint* platformPrint); 66 | int16_t NPP_HandleEvent(NPP instance, void* event); 67 | void NPP_URLNotify(NPP instance, const char* URL, NPReason reason, void* notifyData); 68 | NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value); 69 | NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value); 70 | 71 | /* XEMBED messages */ 72 | #define XEMBED_EMBEDDED_NOTIFY 0 73 | #define XEMBED_WINDOW_ACTIVATE 1 74 | #define XEMBED_WINDOW_DEACTIVATE 2 75 | #define XEMBED_REQUEST_FOCUS 3 76 | #define XEMBED_FOCUS_IN 4 77 | #define XEMBED_FOCUS_OUT 5 78 | #define XEMBED_FOCUS_NEXT 6 79 | #define XEMBED_FOCUS_PREV 7 80 | /* 8-9 were used for XEMBED_GRAB_KEY/XEMBED_UNGRAB_KEY */ 81 | #define XEMBED_MODALITY_ON 10 82 | #define XEMBED_MODALITY_OFF 11 83 | #define XEMBED_REGISTER_ACCELERATOR 12 84 | #define XEMBED_UNREGISTER_ACCELERATOR 13 85 | #define XEMBED_ACTIVATE_ACCELERATOR 14 86 | 87 | /* Details for XEMBED_FOCUS_IN: */ 88 | #define XEMBED_FOCUS_CURRENT 0 89 | #define XEMBED_FOCUS_FIRST 1 90 | #define XEMBED_FOCUS_LAST 2 91 | 92 | #define XEMBED_MAPPED (1 << 0) 93 | 94 | /* public */ 95 | struct PluginData 96 | { 97 | Context *ctx; 98 | bool pipelightError; 99 | int containerType; 100 | void* container; 101 | #ifndef __APPLE__ 102 | Window plugin; 103 | #endif 104 | }; 105 | 106 | #endif // BasicPlugin_h_ 107 | -------------------------------------------------------------------------------- /src/linux/libpipelight/configloader.h: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2013 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * Sebastian Lackner 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #ifndef ConfigLoader_h_ 40 | #define ConfigLoader_h_ 41 | 42 | #include // for strcasecmp 43 | #include // for std::string 44 | #include // for std::vector 45 | #include // for std::map 46 | 47 | #ifndef __APPLE__ 48 | #include // for Window 49 | #endif 50 | 51 | struct stringInsensitiveCompare { 52 | bool operator() (const std::string& a, const std::string& b) const{ 53 | return strcasecmp(a.c_str(), b.c_str()) < 0; 54 | } 55 | }; 56 | 57 | struct MimeInfo{ 58 | std::string mimeType; 59 | std::string extension; 60 | std::string description; 61 | std::string originalMime; 62 | }; 63 | 64 | struct PluginConfig{ 65 | std::string configPath; 66 | std::string pluginName; 67 | 68 | std::string winePath; 69 | std::string wineArch; 70 | std::string winePrefix; 71 | std::string wineDLLOverrides; 72 | 73 | std::string dllPath; 74 | std::string dllName; 75 | std::string regKey; 76 | std::string pluginLoaderPath; 77 | std::string gccRuntimeDLLs; 78 | 79 | bool embed; 80 | bool windowlessMode; 81 | bool linuxWindowlessMode; 82 | 83 | std::string fakeVersion; 84 | std::vector fakeMIMEtypes; 85 | std::map overwriteArgs; 86 | std::map windowlessOverwriteArgs; 87 | 88 | bool eventAsyncCall; 89 | bool operaDetection; 90 | std::string executeJavascript; 91 | std::map replaceJavascript; 92 | 93 | bool silverlightGraphicDriverCheck; 94 | 95 | #ifndef __APPLE__ 96 | Window x11WindowID; 97 | #endif 98 | 99 | bool experimental_forceSetWindow; 100 | bool experimental_windowClassHook; 101 | bool experimental_strictDrawOrdering; 102 | }; 103 | 104 | extern bool loadConfig(PluginConfig &config); 105 | 106 | #endif // ConfigLoader_h_ 107 | -------------------------------------------------------------------------------- /src/linux/libpipelight/npclass.c: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2013 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * Sebastian Lackner 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #include // for memcpy 40 | 41 | #include "common/common.h" 42 | 43 | struct ProxyObject 44 | { 45 | NPObject obj; 46 | Context *ctx; 47 | }; 48 | 49 | static void NPInvalidateFunction(NPObject *npobj) 50 | { 51 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 52 | Context *ctx = proxy->ctx; 53 | 54 | DBG_TRACE("( npobj=%p )", npobj); 55 | 56 | ctx->writeHandleObj(npobj); 57 | ctx->callFunction(FUNCTION_NP_INVALIDATE); 58 | ctx->readResultVoid(); 59 | 60 | DBG_TRACE(" -> void"); 61 | } 62 | 63 | static bool NPHasMethodFunction(NPObject *npobj, NPIdentifier name) 64 | { 65 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 66 | Context *ctx = proxy->ctx; 67 | 68 | DBG_TRACE("( npobj=%p, name=%p )", npobj, name); 69 | 70 | ctx->writeHandleIdentifier(name); 71 | ctx->writeHandleObj(npobj); 72 | ctx->callFunction(FUNCTION_NP_HAS_METHOD); 73 | 74 | bool resultBool = (bool)ctx->readResultInt32(); 75 | DBG_TRACE(" -> result=%d", resultBool); 76 | return resultBool; 77 | } 78 | 79 | static bool NPInvokeFunction(NPObject *npobj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) 80 | { 81 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 82 | Context *ctx = proxy->ctx; 83 | Stack stack; 84 | 85 | DBG_TRACE("( npobj=%p, name=%p, args[]=%p, argCount=%d, result=%p )", npobj, name, args, argCount, result); 86 | 87 | /* warning: parameter order swapped! */ 88 | ctx->writeVariantArrayConst(args, argCount); 89 | ctx->writeInt32(argCount); 90 | ctx->writeHandleIdentifier(name); 91 | ctx->writeHandleObj(npobj); 92 | ctx->callFunction(FUNCTION_NP_INVOKE); 93 | ctx->readCommands(stack); 94 | 95 | bool resultBool = (bool)readInt32(stack); 96 | 97 | if (resultBool) 98 | readVariant(stack, *result); /* refcount already incremented by invoke() */ 99 | else 100 | { 101 | result->type = NPVariantType_Void; 102 | result->value.objectValue = NULL; 103 | } 104 | 105 | DBG_TRACE(" -> ( result=%d, ... )", resultBool); 106 | return resultBool; 107 | } 108 | 109 | static bool NPInvokeDefaultFunction(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) 110 | { 111 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 112 | Context *ctx = proxy->ctx; 113 | Stack stack; 114 | 115 | DBG_TRACE("( npobj=%p, args=%p, argCount=%d, result=%p )", npobj, args, argCount, result); 116 | 117 | ctx->writeVariantArrayConst(args, argCount); 118 | ctx->writeInt32(argCount); 119 | ctx->writeHandleObj(npobj); 120 | ctx->callFunction(FUNCTION_NP_INVOKE_DEFAULT); 121 | ctx->readCommands(stack); 122 | 123 | bool resultBool = (bool)readInt32(stack); 124 | 125 | if (resultBool) 126 | readVariant(stack, *result); /* refcount already incremented by invoke() */ 127 | else 128 | { 129 | result->type = NPVariantType_Void; 130 | result->value.objectValue = NULL; 131 | } 132 | 133 | DBG_TRACE(" -> ( result=%d, ... )", resultBool); 134 | return resultBool; 135 | } 136 | 137 | static bool NPHasPropertyFunction(NPObject *npobj, NPIdentifier name) 138 | { 139 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 140 | Context *ctx = proxy->ctx; 141 | 142 | DBG_TRACE("( npobj=%p, name=%p )", npobj, name); 143 | 144 | ctx->writeHandleIdentifier(name); 145 | ctx->writeHandleObj(npobj); 146 | ctx->callFunction(FUNCTION_NP_HAS_PROPERTY); 147 | 148 | bool resultBool = (bool)ctx->readResultInt32(); 149 | DBG_TRACE(" -> result=%d", resultBool); 150 | return resultBool; 151 | } 152 | 153 | static bool NPGetPropertyFunction(NPObject *npobj, NPIdentifier name, NPVariant *result) 154 | { 155 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 156 | Context *ctx = proxy->ctx; 157 | Stack stack; 158 | 159 | DBG_TRACE("( npobj=%p, name=%p, result=%p )", npobj, name, result); 160 | 161 | ctx->writeHandleIdentifier(name); 162 | ctx->writeHandleObj(npobj); 163 | ctx->callFunction(FUNCTION_NP_GET_PROPERTY); 164 | ctx->readCommands(stack); 165 | 166 | bool resultBool = readInt32(stack); /* refcount already incremented by getProperty() */ 167 | 168 | if (resultBool) 169 | readVariant(stack, *result); 170 | else 171 | { 172 | result->type = NPVariantType_Void; 173 | result->value.objectValue = NULL; 174 | } 175 | 176 | DBG_TRACE(" -> ( result=%d, ... )", resultBool); 177 | return resultBool; 178 | } 179 | 180 | static bool NPSetPropertyFunction(NPObject *npobj, NPIdentifier name, const NPVariant *value) 181 | { 182 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 183 | Context *ctx = proxy->ctx; 184 | 185 | DBG_TRACE("( npobj=%p, name=%p, value=%p )", npobj, name, value); 186 | 187 | ctx->writeVariantConst(*value); 188 | ctx->writeHandleIdentifier(name); 189 | ctx->writeHandleObj(npobj); 190 | ctx->callFunction(FUNCTION_NP_SET_PROPERTY); 191 | 192 | bool resultBool = (bool)ctx->readResultInt32(); 193 | DBG_TRACE(" -> result=%d", resultBool); 194 | return resultBool; 195 | } 196 | 197 | static bool NPRemovePropertyFunction(NPObject *npobj, NPIdentifier name) 198 | { 199 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 200 | Context *ctx = proxy->ctx; 201 | 202 | DBG_TRACE("( npobj=%p, name=%p )", npobj, name); 203 | 204 | ctx->writeHandleIdentifier(name); 205 | ctx->writeHandleObj(npobj); 206 | ctx->callFunction(FUNCTION_NP_REMOVE_PROPERTY); 207 | 208 | bool resultBool = (bool)ctx->readResultInt32(); 209 | DBG_TRACE(" -> result=%d", resultBool); 210 | return resultBool; 211 | } 212 | 213 | static bool NPEnumerationFunction(NPObject *npobj, NPIdentifier **value, uint32_t *count) 214 | { 215 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 216 | Context *ctx = proxy->ctx; 217 | Stack stack; 218 | 219 | DBG_TRACE("( npobj=%p, value=%p, count=%p )", npobj, value, count); 220 | 221 | ctx->writeHandleObj(npobj); 222 | ctx->callFunction(FUNCTION_NP_ENUMERATE); 223 | ctx->readCommands(stack); 224 | 225 | bool result = (bool)readInt32(stack); 226 | if (result){ 227 | 228 | uint32_t identifierCount = readInt32(stack); 229 | if (identifierCount == 0){ 230 | *value = NULL; 231 | *count = 0; 232 | 233 | }else{ 234 | std::vector identifiers = readIdentifierArray(stack, identifierCount); 235 | NPIdentifier* identifierTable = (NPIdentifier*)sBrowserFuncs->memalloc(identifierCount * sizeof(NPIdentifier)); 236 | 237 | if (identifierTable){ 238 | memcpy(identifierTable, identifiers.data(), sizeof(NPIdentifier) * identifierCount); 239 | 240 | *value = identifierTable; 241 | *count = identifierCount; 242 | 243 | }else{ 244 | result = false; 245 | 246 | } 247 | } 248 | } 249 | 250 | DBG_TRACE(" -> ( result=%d, ... )", result); 251 | return result; 252 | } 253 | 254 | static bool NPConstructFunction(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) 255 | { 256 | DBG_TRACE("( npobj=%p, args=%p, argCount=%d, result=%p )", npobj, args, argCount, result); 257 | NOTIMPLEMENTED(); 258 | DBG_TRACE(" -> result=0"); 259 | return false; 260 | } 261 | 262 | static NPObject *NPAllocateFunction(NPP instance, NPClass *aClass) 263 | { 264 | struct ProxyObject *proxy; 265 | 266 | DBG_TRACE("( instance=%p, aClass=%p )", instance, aClass); 267 | 268 | proxy = (ProxyObject *)malloc(sizeof(struct ProxyObject)); 269 | if (proxy) 270 | { 271 | proxy->obj._class = aClass; 272 | proxy->obj.referenceCount = 1; 273 | proxy->ctx = ctx; /* FIXME: Obtain from instance->pdata */ 274 | } 275 | 276 | DBG_TRACE(" -> npobj=%p", &proxy->obj); 277 | return &proxy->obj; 278 | } 279 | 280 | static void NPDeallocateFunction(NPObject *npobj) 281 | { 282 | struct ProxyObject *proxy = (struct ProxyObject *)npobj; 283 | Context *ctx = proxy->ctx; 284 | 285 | DBG_TRACE("( npobj=%p )", npobj); 286 | 287 | if (handleManager_existsByPtr(HMGR_TYPE_NPObject, npobj)) 288 | { 289 | DBG_TRACE("seems to be a user created handle, calling WIN_HANDLE_MANAGER_FREE_OBJECT( obj=%p ).", npobj); 290 | 291 | /* kill the object on the other side */ 292 | ctx->writeHandleObj(npobj); 293 | ctx->callFunction(WIN_HANDLE_MANAGER_FREE_OBJECT); 294 | ctx->readResultVoid(); 295 | 296 | /* remove it in the handle manager */ 297 | handleManager_removeByPtr(HMGR_TYPE_NPObject, npobj); 298 | } 299 | 300 | /* remove the object locally */ 301 | free(proxy); 302 | DBG_TRACE(" -> void"); 303 | } 304 | 305 | NPClass proxy_class = { 306 | NP_CLASS_STRUCT_VERSION, 307 | NPAllocateFunction, 308 | NPDeallocateFunction, 309 | NPInvalidateFunction, 310 | NPHasMethodFunction, 311 | NPInvokeFunction, 312 | NPInvokeDefaultFunction, 313 | NPHasPropertyFunction, 314 | NPGetPropertyFunction, 315 | NPSetPropertyFunction, 316 | NPRemovePropertyFunction, 317 | NPEnumerationFunction, 318 | NPConstructFunction 319 | }; 320 | -------------------------------------------------------------------------------- /src/windows/Makefile: -------------------------------------------------------------------------------- 1 | CXXFLAGS := -I../../../include -Wall -I$(dir $(wine_path))../include/wine/windows -std=gnu++0x -D_WIN32_WINNT=0x0502 $(CXXFLAGS) 2 | export 3 | 4 | SUBDIRS = $(dir $(wildcard */Makefile)) 5 | 6 | .PHONY: all 7 | all: $(SUBDIRS) 8 | 9 | .PHONY: $(SUBDIRS) 10 | $(SUBDIRS): 11 | $(MAKE) -C $@ 12 | 13 | .PHONY: clean 14 | clean: 15 | for dir in $(SUBDIRS); do \ 16 | $(MAKE) -C $$dir $@; \ 17 | done 18 | -------------------------------------------------------------------------------- /src/windows/pluginloader/Makefile: -------------------------------------------------------------------------------- 1 | include ../../../config.make 2 | winelibdir = $(dir $(wine_path))../lib 3 | CXXFLAGS := -DPLUGINLOADER -DPIPELIGHT_VERSION='"$(version)"' $(CXXFLAGS) 4 | LDFLAGS := -lversion -lgdi32 -lole32 -lopengl32 -L$(winelibdir) -L$(winelibdir)/wine 5 | common_suffix := win$(suffix) 6 | export 7 | 8 | SUBDIRS := ../../common/ 9 | SOURCE = $(wildcard *.c) 10 | OBJECTS = $(SOURCE:.c=$(suffix).o) ../../common/common_win$(suffix).o 11 | 12 | .PHONY: all 13 | all: pluginloader$(suffix).exe 14 | 15 | pluginloader$(suffix).exe: apihook.h $(OBJECTS) 16 | rm -f "pluginloader$(suffix).exe.so" 17 | $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(OBJECTS) $(LDFLAGS) -o pluginloader$(suffix).exe 18 | 19 | if [ -f "pluginloader$(suffix).exe.so" ]; then \ 20 | rm -f "pluginloader$(suffix).exe"; \ 21 | mv "pluginloader$(suffix).exe.so" "pluginloader$(suffix).exe"; \ 22 | fi 23 | 24 | apihook.h: apihook.h.in 25 | sed $(SED_OPTS) $< > $@ 26 | 27 | %$(suffix).o: %.c 28 | $(CXX) $(CXXFLAGS) -MMD -MP -o $@ -c $< 29 | 30 | ../../common/common_win$(suffix).o: dummy 31 | $(MAKE) -C ../../common/ 32 | 33 | -include $(SOURCE:.c=.d) 34 | 35 | .PHONY: clean dummy 36 | clean: 37 | rm -f apihook.h *.exe *.exe.so *.o *.d 38 | for dir in $(SUBDIRS); do \ 39 | $(MAKE) -C $$dir $@; \ 40 | done 41 | -------------------------------------------------------------------------------- /src/windows/pluginloader/apihook.c: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2013 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * Sebastian Lackner 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #define __WINESRC__ 40 | 41 | #include // for std::vector 42 | #include "common/common.h" 43 | #include "apihook.h" 44 | #include "pluginloader.h" 45 | 46 | #include // for PVOID and other types 47 | #include // for memset 48 | 49 | void* patchDLLExport(PVOID ModuleBase, const char* functionName, void* newFunctionPtr){ 50 | /* 51 | Based on the following source code: 52 | http://alter.org.ua/docs/nt_kernel/procaddr/#RtlImageDirectoryEntryToData 53 | */ 54 | 55 | /* This method does no longer work on 64 bit */ 56 | #if !defined(_WIN64) && !defined(_AMD64) 57 | PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER) ModuleBase; 58 | PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)((char *)ModuleBase + dos->e_lfanew); 59 | 60 | PIMAGE_DATA_DIRECTORY expdir = (PIMAGE_DATA_DIRECTORY)(nt->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT); 61 | ULONG addr = expdir->VirtualAddress; 62 | PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((char *)ModuleBase + addr); 63 | 64 | PULONG functions = (PULONG)((char *)ModuleBase + exports->AddressOfFunctions); 65 | PSHORT ordinals = (PSHORT)((char *)ModuleBase + exports->AddressOfNameOrdinals); 66 | PULONG names = (PULONG)((char *)ModuleBase + exports->AddressOfNames); 67 | ULONG max_name = exports->NumberOfNames; 68 | ULONG max_func = exports->NumberOfFunctions; 69 | 70 | ULONG i; 71 | DWORD oldProtect; 72 | 73 | for (i = 0; i < max_name; i++) 74 | { 75 | ULONG ord = ordinals[i]; 76 | if (ord >= max_func) 77 | break; 78 | 79 | if (strcmp( (PCHAR) ModuleBase + names[i], functionName ) == 0){ 80 | if (!VirtualProtect(&functions[ord], sizeof(ULONG), PAGE_EXECUTE_READWRITE, &oldProtect)) 81 | return NULL; 82 | 83 | DBG_INFO("replaced API function %s.", functionName); 84 | 85 | void *oldFunctionPtr = (PVOID)((char *)ModuleBase + functions[ord]); 86 | functions[ord] = (char *)newFunctionPtr - (char *)ModuleBase; 87 | 88 | VirtualProtect(&functions[ord], sizeof(ULONG), oldProtect, &oldProtect); 89 | return oldFunctionPtr; 90 | } 91 | } 92 | #endif 93 | 94 | return NULL; 95 | }; 96 | 97 | /* -------- Popup menu hook --------*/ 98 | 99 | enum MenuAction{ 100 | MENU_ACTION_NONE, 101 | MENU_ACTION_ABOUT_PIPELIGHT, 102 | MENU_ACTION_TOGGLE_EMBED, 103 | MENU_ACTION_TOGGLE_STRICT, 104 | MENU_ACTION_TOGGLE_STAY_IN_FULLSCREEN 105 | }; 106 | 107 | struct MenuEntry{ 108 | UINT identifier; 109 | MenuAction action; 110 | 111 | MenuEntry(UINT identifier, MenuAction action){ 112 | this->identifier = identifier; 113 | this->action = action; 114 | } 115 | }; 116 | 117 | #define MENUID_OFFSET 0x50495045 /* 'PIPE' */ 118 | 119 | std::vector menuAddEntries(HMENU hMenu, HWND hwnd){ 120 | std::vector entries; 121 | MENUITEMINFOA entryInfo; 122 | std::string temp; 123 | 124 | int count = GetMenuItemCount(hMenu); 125 | if(count == -1) 126 | return entries; 127 | 128 | memset(&entryInfo, 0, sizeof(entryInfo)); 129 | entryInfo.cbSize = sizeof(entryInfo); 130 | entryInfo.wID = MENUID_OFFSET; 131 | 132 | /* ------- Separator ------- */ 133 | entryInfo.fMask = MIIM_FTYPE | MIIM_ID; 134 | entryInfo.fType = MFT_SEPARATOR; 135 | InsertMenuItemA(hMenu, count, true, &entryInfo); 136 | entries.emplace_back(entryInfo.wID, MENU_ACTION_NONE); 137 | count++; entryInfo.wID++; 138 | 139 | /* ------- About Pipelight ------- */ 140 | entryInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID; 141 | entryInfo.fType = MFT_STRING; 142 | entryInfo.dwTypeData = (char*)"Pipelight\t" PIPELIGHT_VERSION; 143 | InsertMenuItemA(hMenu, count, true, &entryInfo); 144 | entries.emplace_back(entryInfo.wID, MENU_ACTION_ABOUT_PIPELIGHT); 145 | count++; entryInfo.wID++; 146 | 147 | /* ------- Wine version ------- */ 148 | temp = "Wine\t"; 149 | temp += getWineVersion(); 150 | entryInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_STATE; 151 | entryInfo.fType = MFT_STRING; 152 | entryInfo.fState = MFS_DISABLED; 153 | entryInfo.dwTypeData = (char*)temp.c_str(); 154 | InsertMenuItemA(hMenu, count, true, &entryInfo); 155 | entries.emplace_back(entryInfo.wID, MENU_ACTION_NONE); 156 | count++; entryInfo.wID++; 157 | 158 | /* ------- Separator ------- */ 159 | entryInfo.fMask = MIIM_FTYPE | MIIM_ID; 160 | entryInfo.fType = MFT_SEPARATOR; 161 | InsertMenuItemA(hMenu, count, true, &entryInfo); 162 | entries.emplace_back(entryInfo.wID, MENU_ACTION_NONE); 163 | count++; entryInfo.wID++; 164 | 165 | /* ------- Embed into browser ------- */ 166 | entryInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_STATE; 167 | entryInfo.fType = MFT_STRING; 168 | entryInfo.fState = isEmbeddedMode ? MFS_CHECKED : 0; 169 | entryInfo.dwTypeData = (char*)"Embed into browser"; 170 | InsertMenuItemA(hMenu, count, true, &entryInfo); 171 | entries.emplace_back(entryInfo.wID, MENU_ACTION_TOGGLE_EMBED); 172 | count++; entryInfo.wID++; 173 | 174 | /* ------- Limited HW Acceleration ------- */ 175 | entryInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_STATE; 176 | entryInfo.fType = MFT_STRING; 177 | entryInfo.fState = strictDrawOrdering ? MFS_CHECKED : 0; 178 | entryInfo.dwTypeData = (char*)"Strict Draw Ordering"; 179 | InsertMenuItemA(hMenu, count, true, &entryInfo); 180 | entries.emplace_back(entryInfo.wID, MENU_ACTION_TOGGLE_STRICT); 181 | count++; entryInfo.wID++; 182 | 183 | /* ------- Stay in fullscreen ------- */ 184 | if (windowClassHook){ 185 | entryInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_STATE; 186 | entryInfo.fType = MFT_STRING; 187 | entryInfo.fState = stayInFullscreen ? MFS_CHECKED : 0; 188 | entryInfo.dwTypeData = (char*)"Stay in fullscreen"; 189 | InsertMenuItemA(hMenu, count, true, &entryInfo); 190 | entries.emplace_back(entryInfo.wID, MENU_ACTION_TOGGLE_STAY_IN_FULLSCREEN); 191 | count++; entryInfo.wID++; 192 | } 193 | 194 | return entries; 195 | 196 | } 197 | 198 | void menuRemoveEntries(HMENU hMenu, const std::vector &entries){ 199 | for (std::vector::const_iterator it = entries.begin(); it != entries.end(); it++) 200 | RemoveMenu(hMenu, it->identifier, MF_BYCOMMAND); 201 | } 202 | 203 | bool menuHandler(NPP instance, UINT identifier, const std::vector &entries){ 204 | for (std::vector::const_iterator it = entries.begin(); it != entries.end(); it++){ 205 | if (it->identifier != identifier) continue; 206 | 207 | switch (it->action){ 208 | 209 | case MENU_ACTION_TOGGLE_EMBED: 210 | changeEmbeddedMode(!isEmbeddedMode); 211 | break; 212 | 213 | case MENU_ACTION_ABOUT_PIPELIGHT: 214 | NPN_PushPopupsEnabledState(instance, PR_TRUE); 215 | NPN_GetURL(instance, PIPELIGHT_REPO, "_blank"); 216 | NPN_PopPopupsEnabledState(instance); 217 | break; 218 | 219 | case MENU_ACTION_TOGGLE_STRICT: 220 | strictDrawOrdering = !strictDrawOrdering; 221 | if(!setStrictDrawing(strictDrawOrdering)) 222 | DBG_ERROR("failed to set/unset strict draw ordering!"); 223 | break; 224 | 225 | case MENU_ACTION_TOGGLE_STAY_IN_FULLSCREEN: 226 | stayInFullscreen = !stayInFullscreen; 227 | break; 228 | 229 | default: 230 | break; 231 | 232 | } 233 | return true; 234 | } 235 | 236 | return false; 237 | } 238 | 239 | typedef BOOL (* WINAPI TrackPopupMenuExPtr)(HMENU hMenu, UINT fuFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm); 240 | typedef BOOL (* WINAPI TrackPopupMenuPtr)(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, const RECT *prcRect); 241 | TrackPopupMenuExPtr originalTrackPopupMenuEx = NULL; 242 | TrackPopupMenuPtr originalTrackPopupMenu = NULL; 243 | 244 | /* 245 | One disadvantage of our current implementation of the hook is that the 246 | return value is not completely correct since we are using TPM_RETURNCMD 247 | and we can not distinguish whether the user didn't not select anything 248 | or if there was an error. Both cases would return 0 when using 249 | TPM_RETURNCMD. So we always return true (assuming that there is no error) 250 | if the hook was called without TPM_RETURNCMD as flag and the return value 251 | of originalTrackPopupMenu(Ex) is 0. 252 | 253 | The return value of TrackPopupMenu(Ex) is really defined as BOOL although 254 | it can contain an ID, which may look wrong on the first sight. 255 | */ 256 | 257 | BOOL WINAPI myTrackPopupMenuEx(HMENU hMenu, UINT fuFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm){ 258 | 259 | /* Called from wrong thread -> redirect without intercepting the call */ 260 | if (GetCurrentThreadId() != mainThreadID) 261 | return originalTrackPopupMenuEx(hMenu, fuFlags, x, y, hWnd, lptpm); 262 | 263 | /* Find the specific instance */ 264 | std::map::iterator it = hwndToInstance.find(hWnd); 265 | if (it == hwndToInstance.end()) 266 | return originalTrackPopupMenuEx(hMenu, fuFlags, x, y, hWnd, lptpm); 267 | 268 | NPP instance = it->second; 269 | 270 | /* Don't send messages to windows, but return the identifier as return value */ 271 | UINT newFlags = (fuFlags & ~TPM_NONOTIFY) | TPM_RETURNCMD; 272 | 273 | std::vector entries = menuAddEntries(hMenu, hWnd); 274 | BOOL identifier = originalTrackPopupMenuEx(hMenu, newFlags, x, y, hWnd, lptpm); 275 | menuRemoveEntries(hMenu, entries); 276 | 277 | if (!identifier || menuHandler(instance, identifier, entries)) 278 | return (fuFlags & TPM_RETURNCMD) ? 0 : true; 279 | 280 | if (!(fuFlags & TPM_NONOTIFY)) 281 | PostMessageA(hWnd, WM_COMMAND, identifier, 0); 282 | 283 | return (fuFlags & TPM_RETURNCMD) ? identifier : true; 284 | } 285 | 286 | BOOL WINAPI myTrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, const RECT *prcRect){ 287 | 288 | /* Called from wrong thread -> redirect without intercepting the call */ 289 | if (GetCurrentThreadId() != mainThreadID) 290 | return originalTrackPopupMenu(hMenu, uFlags, x, y, nReserved, hWnd, prcRect); 291 | 292 | /* Find the specific instance */ 293 | std::map::iterator it = hwndToInstance.end(); 294 | HWND instancehWnd = hWnd; 295 | 296 | while (instancehWnd && instancehWnd != GetDesktopWindow()){ 297 | it = hwndToInstance.find(instancehWnd); 298 | if (it != hwndToInstance.end()) break; 299 | instancehWnd = GetParent(instancehWnd); 300 | } 301 | 302 | if (it == hwndToInstance.end()) 303 | return originalTrackPopupMenu(hMenu, uFlags, x, y, nReserved, hWnd, prcRect); 304 | 305 | NPP instance = it->second; 306 | 307 | /* Don't send messages to windows, but return the identifier as return value */ 308 | UINT newFlags = (uFlags & ~TPM_NONOTIFY) | TPM_RETURNCMD; 309 | 310 | std::vector entries = menuAddEntries(hMenu, hWnd); 311 | BOOL identifier = originalTrackPopupMenu(hMenu, newFlags, x, y, nReserved, hWnd, prcRect); 312 | menuRemoveEntries(hMenu, entries); 313 | 314 | if (!identifier || menuHandler(instance, identifier, entries)) 315 | return (uFlags & TPM_RETURNCMD) ? identifier : true; 316 | 317 | if (!(uFlags & TPM_NONOTIFY)) 318 | PostMessageA(hWnd, WM_COMMAND, identifier, 0); 319 | 320 | return (uFlags & TPM_RETURNCMD) ? identifier : true; 321 | } 322 | 323 | bool installPopupHook(){ 324 | if (!originalTrackPopupMenuEx) 325 | originalTrackPopupMenuEx = (TrackPopupMenuExPtr) patchDLLExport(module_user32, "TrackPopupMenuEx", (void*)&myTrackPopupMenuEx); 326 | 327 | if (!originalTrackPopupMenu) 328 | originalTrackPopupMenu = (TrackPopupMenuPtr) patchDLLExport(module_user32, "TrackPopupMenu", (void*)&myTrackPopupMenu); 329 | 330 | return (originalTrackPopupMenuEx && originalTrackPopupMenu); 331 | } 332 | 333 | /* -------- CreateWindowEx hooks --------*/ 334 | 335 | typedef HWND (* WINAPI CreateWindowExAPtr)(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); 336 | typedef HWND (* WINAPI CreateWindowExWPtr)(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); 337 | CreateWindowExAPtr originalCreateWindowExA = NULL; 338 | CreateWindowExWPtr originalCreateWindowExW = NULL; 339 | 340 | std::map prevWndProcMap; 341 | CRITICAL_SECTION prevWndProcCS; 342 | 343 | LRESULT CALLBACK wndHookProcedureA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam){ 344 | WNDPROC prevWndProc = NULL; 345 | 346 | EnterCriticalSection(&prevWndProcCS); 347 | 348 | std::map::iterator it = prevWndProcMap.find(hWnd); 349 | if (it != prevWndProcMap.end()){ 350 | prevWndProc = it->second; 351 | if (Msg == WM_DESTROY){ 352 | prevWndProcMap.erase(it); 353 | DBG_TRACE("fullscreen window %p has been destroyed.", hWnd); 354 | } 355 | } 356 | 357 | LeaveCriticalSection(&prevWndProcCS); 358 | 359 | if (!prevWndProc || (stayInFullscreen && Msg == WM_KILLFOCUS)) 360 | return 0; 361 | 362 | return CallWindowProcA(prevWndProc, hWnd, Msg, wParam, lParam); 363 | } 364 | 365 | LRESULT CALLBACK wndHookProcedureW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam){ 366 | WNDPROC prevWndProc = NULL; 367 | 368 | EnterCriticalSection(&prevWndProcCS); 369 | 370 | std::map::iterator it = prevWndProcMap.find(hWnd); 371 | if (it != prevWndProcMap.end()){ 372 | prevWndProc = it->second; 373 | if (Msg == WM_DESTROY){ 374 | prevWndProcMap.erase(it); 375 | DBG_TRACE("fullscreen window %p has been destroyed.", hWnd); 376 | } 377 | } 378 | 379 | LeaveCriticalSection(&prevWndProcCS); 380 | 381 | if (!prevWndProc || (stayInFullscreen && Msg == WM_KILLFOCUS)) 382 | return 0; 383 | 384 | return CallWindowProcW(prevWndProc, hWnd, Msg, wParam, lParam); 385 | } 386 | 387 | bool hookFullscreenClass(HWND hWnd, std::string classname, bool unicode){ 388 | 389 | if (classname != "AGFullScreenWinClass" && classname != "ShockwaveFlashFullScreen") 390 | return false; 391 | 392 | DBG_INFO("hooking fullscreen window with hWnd %p and classname '%s'.", hWnd, classname.c_str()); 393 | 394 | /* create the actual hook */ 395 | WNDPROC prevWndProc = (WNDPROC)SetWindowLongPtrA(hWnd, GWLP_WNDPROC, (LONG_PTR)(unicode ? &wndHookProcedureW : &wndHookProcedureA)); 396 | 397 | EnterCriticalSection(&prevWndProcCS); 398 | prevWndProcMap[hWnd] = prevWndProc; 399 | LeaveCriticalSection(&prevWndProcCS); 400 | 401 | return true; 402 | } 403 | 404 | HWND WINAPI myCreateWindowExA(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam){ 405 | HWND hWnd = originalCreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); 406 | 407 | if (!IS_INTRESOURCE(lpClassName)){ 408 | std::string classname(lpClassName); 409 | hookFullscreenClass(hWnd, classname, false); 410 | } 411 | 412 | return hWnd; 413 | } 414 | 415 | HWND WINAPI myCreateWindowExW(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam){ 416 | HWND hWnd = originalCreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); 417 | 418 | if (!IS_INTRESOURCE(lpClassName)){ 419 | char name[256]; 420 | WideCharToMultiByte(CP_ACP, 0, lpClassName, -1, name, sizeof(name), NULL, NULL); 421 | std::string classname(name); 422 | hookFullscreenClass(hWnd, classname, true); 423 | } 424 | 425 | return hWnd; 426 | } 427 | 428 | bool installWindowClassHook(){ 429 | if (!originalCreateWindowExA) 430 | originalCreateWindowExA = (CreateWindowExAPtr)patchDLLExport(module_user32, "CreateWindowExA", (void*)&myCreateWindowExA); 431 | 432 | if (!originalCreateWindowExW) 433 | originalCreateWindowExW = (CreateWindowExWPtr)patchDLLExport(module_user32, "CreateWindowExW", (void*)&myCreateWindowExW); 434 | 435 | InitializeCriticalSection(&prevWndProcCS); 436 | return (originalCreateWindowExA && originalCreateWindowExW); 437 | } 438 | -------------------------------------------------------------------------------- /src/windows/pluginloader/apihook.h.in: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2013 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * Sebastian Lackner 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #ifndef ApiHook_h_ 40 | #define ApiHook_h_ 41 | 42 | #define PIPELIGHT_REPO "@@REPO@@" 43 | 44 | extern bool installPopupHook(); 45 | extern bool installWindowClassHook(); 46 | 47 | #endif // ApiHook_h_ 48 | -------------------------------------------------------------------------------- /src/windows/pluginloader/npclass.c: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2013 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * Sebastian Lackner 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #define __WINESRC__ 40 | 41 | #include "common/common.h" 42 | 43 | /* 44 | NP Class 45 | These function *should* never be called from a plugin. 46 | The plugin has to use the browser API instead, so we just 47 | need stubs to detect a violation of the API. 48 | */ 49 | 50 | static void NPInvalidateFunction(NPObject *npobj){ 51 | DBG_TRACE("( npobj=%p )", npobj); 52 | NOTIMPLEMENTED(); 53 | DBG_TRACE(" -> void"); 54 | } 55 | 56 | static bool NPHasMethodFunction(NPObject *npobj, NPIdentifier name){ 57 | DBG_TRACE("( npobj=%p, name=%p )", npobj, name); 58 | NOTIMPLEMENTED(); 59 | DBG_TRACE(" -> result=0"); 60 | return false; 61 | } 62 | 63 | static bool NPInvokeFunction(NPObject *npobj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result){ 64 | DBG_TRACE("( npobj=%p, name=%p, args=%p, argCount=%d, result=%p )", npobj, name, args, argCount, result); 65 | NOTIMPLEMENTED(); 66 | DBG_TRACE(" -> result=0"); 67 | return false; 68 | } 69 | 70 | static bool NPInvokeDefaultFunction(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result){ 71 | DBG_TRACE("( npobj=%p, args=%p, argCount=%d, result=%p )", npobj, args, argCount, result); 72 | NOTIMPLEMENTED(); 73 | DBG_TRACE(" -> result=0"); 74 | return false; 75 | } 76 | 77 | static bool NPHasPropertyFunction(NPObject *npobj, NPIdentifier name){ 78 | DBG_TRACE("( npobj=%p, name=%p )", npobj, name); 79 | NOTIMPLEMENTED(); 80 | DBG_TRACE(" -> result=0"); 81 | return false; 82 | } 83 | 84 | static bool NPGetPropertyFunction(NPObject *npobj, NPIdentifier name, NPVariant *result){ 85 | DBG_TRACE("( npobj=%p, name=%p, result=%p )", npobj, name, result); 86 | NOTIMPLEMENTED(); 87 | DBG_TRACE(" -> result=0"); 88 | return false; 89 | } 90 | 91 | static bool NPSetPropertyFunction(NPObject *npobj, NPIdentifier name, const NPVariant *value){ 92 | DBG_TRACE("( npobj=%p, name=%p, result=%p )", npobj, name, value); 93 | NOTIMPLEMENTED(); 94 | DBG_TRACE(" -> result=0"); 95 | return false; 96 | } 97 | 98 | static bool NPRemovePropertyFunction(NPObject *npobj, NPIdentifier name){ 99 | DBG_TRACE("( npobj=%p, name=%p )", npobj, name); 100 | NOTIMPLEMENTED(); 101 | DBG_TRACE(" -> result=0"); 102 | return false; 103 | } 104 | 105 | static bool NPEnumerationFunction(NPObject *npobj, NPIdentifier **value, uint32_t *count){ 106 | DBG_TRACE("( npobj=%p, value=%p, count=%p )", npobj, value, count); 107 | NOTIMPLEMENTED(); 108 | DBG_TRACE(" -> result=0"); 109 | return false; 110 | } 111 | 112 | static bool NPConstructFunction(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result){ 113 | DBG_TRACE("( npobj=%p, args=%p, argCount=%d, result=%p )", npobj, args, argCount, result); 114 | NOTIMPLEMENTED(); 115 | DBG_TRACE(" -> result=0"); 116 | return false; 117 | } 118 | 119 | NPClass proxy_class = { 120 | NP_CLASS_STRUCT_VERSION, 121 | NULL, /* NPAllocateFunction, */ 122 | NULL, /* NPDeallocateFunction, */ 123 | NPInvalidateFunction, 124 | NPHasMethodFunction, 125 | NPInvokeFunction, 126 | NPInvokeDefaultFunction, 127 | NPHasPropertyFunction, 128 | NPGetPropertyFunction, 129 | NPSetPropertyFunction, 130 | NPRemovePropertyFunction, 131 | NPEnumerationFunction, 132 | NPConstructFunction 133 | }; 134 | -------------------------------------------------------------------------------- /src/windows/pluginloader/pluginloader.h: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2013 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * Sebastian Lackner 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #ifndef PluginLoader_h_ 40 | #define PluginLoader_h_ 41 | 42 | #include 43 | #include 44 | 45 | #include "common/common.h" 46 | 47 | extern std::map hwndToInstance; 48 | extern std::set instanceList; 49 | 50 | /* variables */ 51 | extern bool isEmbeddedMode; 52 | extern bool isWindowlessMode; 53 | extern bool isLinuxWindowlessMode; 54 | 55 | extern bool stayInFullscreen; 56 | extern bool forceSetWindow; 57 | extern bool strictDrawOrdering; 58 | 59 | /* hooks */ 60 | extern bool windowClassHook; 61 | 62 | /* user agent and plugin data */ 63 | extern char strUserAgent[1024]; 64 | 65 | /* pending actions */ 66 | extern bool pendingInvalidateLinuxWindowless; 67 | extern LONG pendingAsyncCalls; 68 | 69 | extern std::string np_MimeType; 70 | extern std::string np_FileExtents; 71 | extern std::string np_FileOpenName; 72 | extern std::string np_ProductName; 73 | extern std::string np_FileDescription; 74 | extern std::string np_Language; 75 | 76 | extern NPPluginFuncs pluginFuncs; 77 | extern NPNetscapeFuncs browserFuncs; 78 | 79 | /* libraries */ 80 | extern HMODULE module_msvcrt; 81 | extern HMODULE module_advapi32; 82 | extern HMODULE module_user32; 83 | extern HMODULE module_kernel32; 84 | extern HMODULE module_ntdll; 85 | 86 | /* 87 | NPN Browser functions 88 | */ 89 | NPError NP_LOADDS NPN_GetURL(NPP instance, const char* url, const char* window); 90 | NPError NP_LOADDS NPN_PostURL(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file); 91 | NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* rangeList); 92 | NPError NP_LOADDS NPN_NewStream(NPP instance, NPMIMEType type, const char* window, NPStream** stream); 93 | int32_t NP_LOADDS NPN_Write(NPP instance, NPStream* stream, int32_t len, void* buffer); 94 | NPError NP_LOADDS NPN_DestroyStream(NPP instance, NPStream* stream, NPReason reason); 95 | void NP_LOADDS NPN_Status(NPP instance, const char* message); 96 | const char* NP_LOADDS NPN_UserAgent(NPP instance); 97 | void* NP_LOADDS NPN_MemAlloc(uint32_t size); 98 | void NP_LOADDS NPN_MemFree(void* ptr); 99 | uint32_t NP_LOADDS NPN_MemFlush(uint32_t size); 100 | void NP_LOADDS NPN_ReloadPlugins(NPBool reloadPages); 101 | void* NP_LOADDS NPN_GetJavaEnv(void); 102 | void* NP_LOADDS NPN_GetJavaPeer(NPP instance); 103 | NPError NP_LOADDS NPN_GetURLNotify(NPP instance, const char* url, const char* target, void* notifyData); 104 | NPError NP_LOADDS NPN_PostURLNotify(NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file, void* notifyData); 105 | NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable, void *value); 106 | NPError NP_LOADDS NPN_SetValue(NPP instance, NPPVariable variable, void *value); 107 | void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *rect); 108 | void NP_LOADDS NPN_InvalidateRegion(NPP instance, NPRegion region); 109 | void NP_LOADDS NPN_ForceRedraw(NPP instance); 110 | NPIdentifier NP_LOADDS NPN_GetStringIdentifier(const NPUTF8* name); 111 | void NP_LOADDS NPN_GetStringIdentifiers(const NPUTF8** names, int32_t nameCount, NPIdentifier* identifiers); 112 | NPIdentifier NP_LOADDS NPN_GetIntIdentifier(int32_t intid); 113 | bool NP_LOADDS NPN_IdentifierIsString(NPIdentifier identifier); 114 | NPUTF8* NP_LOADDS NPN_UTF8FromIdentifier(NPIdentifier identifier); 115 | int32_t NP_LOADDS NPN_IntFromIdentifier(NPIdentifier identifier); 116 | NPObject* NP_LOADDS NPN_CreateObject(NPP npp, NPClass *aClass); 117 | NPObject* NP_LOADDS NPN_RetainObject(NPObject *obj); 118 | void NP_LOADDS NPN_ReleaseObject(NPObject *obj); 119 | bool NP_LOADDS NPN_Invoke(NPP npp, NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result); 120 | bool NP_LOADDS NPN_InvokeDefault(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result); 121 | bool NP_LOADDS NPN_Evaluate(NPP npp, NPObject *obj, NPString *script, NPVariant *result); 122 | bool NP_LOADDS NPN_GetProperty(NPP npp, NPObject *obj, NPIdentifier propertyName, NPVariant *result); 123 | bool NP_LOADDS NPN_SetProperty(NPP npp, NPObject *obj, NPIdentifier propertyName, const NPVariant *value); 124 | bool NP_LOADDS NPN_RemoveProperty(NPP npp, NPObject *obj, NPIdentifier propertyName); 125 | bool NP_LOADDS NPN_HasProperty(NPP npp, NPObject *obj, NPIdentifier propertyName); 126 | bool NP_LOADDS NPN_HasMethod(NPP npp, NPObject *obj, NPIdentifier propertyName); 127 | void NP_LOADDS NPN_SetException(NPObject *obj, const NPUTF8 *message); 128 | void NP_LOADDS NPN_PushPopupsEnabledState(NPP npp, NPBool enabled); 129 | void NP_LOADDS NPN_PopPopupsEnabledState(NPP npp); 130 | bool NP_LOADDS NPN_Enumerate(NPP npp, NPObject *obj, NPIdentifier **identifier, uint32_t *count); 131 | void NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance, void (*func)(void *), void *userData); 132 | bool NP_LOADDS NPN_Construct(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result); 133 | NPError NP_LOADDS NPN_GetValueForURL(NPP npp, NPNURLVariable variable, const char *url, char **value, uint32_t *len); 134 | NPError NP_LOADDS NPN_SetValueForURL(NPP npp, NPNURLVariable variable, const char *url, const char *value, uint32_t len); 135 | NPError NP_LOADDS NPN_GetAuthenticationInfo(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); 136 | uint32_t NP_LOADDS NPN_ScheduleTimer(NPP instance, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID)); 137 | void NP_LOADDS NPN_UnscheduleTimer(NPP instance, uint32_t timerID); 138 | NPError NP_LOADDS NPN_PopUpContextMenu(NPP instance, NPMenu* menu); 139 | NPBool NP_LOADDS NPN_ConvertPoint(NPP instance, DOUBLE sourceX, DOUBLE sourceY, NPCoordinateSpace sourceSpace, DOUBLE *destX, DOUBLE *destY, NPCoordinateSpace destSpace); 140 | NPBool NP_LOADDS NPN_HandleEvent(NPP instance, void *event, NPBool handled); 141 | NPBool NP_LOADDS NPN_UnfocusInstance(NPP instance, NPFocusDirection direction); 142 | void NP_LOADDS NPN_URLRedirectResponse(NPP instance, void* notifyData, NPBool allow); 143 | NPError NP_LOADDS NPN_InitAsyncSurface(NPP instance, NPSize *size, NPImageFormat format, void *initData, NPAsyncSurface *surface); 144 | NPError NP_LOADDS NPN_FinalizeAsyncSurface(NPP instance, NPAsyncSurface *surface); 145 | void NP_LOADDS NPN_SetCurrentAsyncSurface(NPP instance, NPAsyncSurface *surface, NPRect *changed); 146 | 147 | /* libX11 definitions */ 148 | typedef unsigned long int XID; 149 | 150 | #define ShiftMask (1<<0) 151 | #define LockMask (1<<1) 152 | #define ControlMask (1<<2) 153 | #define Button1Mask (1<<8) 154 | #define Button2Mask (1<<9) 155 | #define Button3Mask (1<<10) 156 | #define Button4Mask (1<<11) 157 | #define Button5Mask (1<<12) 158 | 159 | #define Button1 1 160 | #define Button2 2 161 | #define Button3 3 162 | #define Button4 4 163 | #define Button5 5 164 | 165 | struct AsyncCallback { 166 | AsyncCallback *next; 167 | AsyncCallback *prev; 168 | 169 | void (*func)(void *); 170 | void *userData; 171 | }; 172 | 173 | /* public */ 174 | struct NetscapeData{ 175 | bool windowlessMode; 176 | bool embeddedMode; 177 | 178 | NPObject* cache_pluginElementNPObject; 179 | NPIdentifier cache_clientWidthIdentifier; 180 | 181 | RECT browser; 182 | NPWindow window; 183 | 184 | /* regular mode */ 185 | HWND hWnd; 186 | 187 | /* linux windowless mode */ 188 | HDC hDC; 189 | XID lastDrawableDC; 190 | int invalidate; 191 | NPRect invalidateRect; 192 | unsigned char keystate[256]; 193 | 194 | /* async calls */ 195 | AsyncCallback *asyncCalls; 196 | 197 | }; 198 | 199 | extern void changeEmbeddedMode(bool newEmbed); 200 | extern std::string getWineVersion(); 201 | extern bool setStrictDrawing(int value); 202 | 203 | #endif // PluginLoader_h_ -------------------------------------------------------------------------------- /src/windows/winecheck/Makefile: -------------------------------------------------------------------------------- 1 | include ../../../config.make 2 | winelibdir = $(dir $(wine_path))../lib 3 | LDFLAGS := -lgdi32 -lopengl32 -L$(winelibdir) -L$(winelibdir)/wine 4 | export 5 | 6 | SOURCE = $(wildcard *.c) 7 | OBJECTS = $(SOURCE:.c=$(suffix).o) 8 | 9 | .PHONY: all 10 | all: winecheck$(suffix).exe 11 | 12 | winecheck$(suffix).exe: $(OBJECTS) 13 | rm -f "winecheck$(suffix).exe.so" 14 | $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(OBJECTS) $(LDFLAGS) -o winecheck$(suffix).exe 15 | 16 | if [ -f "winecheck$(suffix).exe.so" ]; then \ 17 | rm -f "winecheck$(suffix).exe"; \ 18 | mv "winecheck$(suffix).exe.so" "winecheck$(suffix).exe"; \ 19 | fi 20 | 21 | %$(suffix).o: %.c 22 | $(CXX) $(CXXFLAGS) -MMD -MP -o $@ -c $< 23 | 24 | -include $(SOURCE:.c=.d) 25 | 26 | .PHONY: clean 27 | clean: 28 | rm -f *.exe *.exe.so *.o 29 | -------------------------------------------------------------------------------- /src/windows/winecheck/check.c: -------------------------------------------------------------------------------- 1 | /* ***** BEGIN LICENSE BLOCK ***** 2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 3 | * 4 | * The contents of this file are subject to the Mozilla Public License Version 5 | * 1.1 (the "License"); you may not use this file except in compliance with 6 | * the License. You may obtain a copy of the License at 7 | * http://www.mozilla.org/MPL/ 8 | * 9 | * Software distributed under the License is distributed on an "AS IS" basis, 10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 11 | * for the specific language governing rights and limitations under the 12 | * License. 13 | * 14 | * The Original Code is fds-team.de code. 15 | * 16 | * The Initial Developer of the Original Code is 17 | * Michael Müller 18 | * Portions created by the Initial Developer are Copyright (C) 2013 19 | * the Initial Developer. All Rights Reserved. 20 | * 21 | * Contributor(s): 22 | * Michael Müller 23 | * Sebastian Lackner 24 | * 25 | * Alternatively, the contents of this file may be used under the terms of 26 | * either the GNU General Public License Version 2 or later (the "GPL"), or 27 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 28 | * in which case the provisions of the GPL or the LGPL are applicable instead 29 | * of those above. If you wish to allow use of your version of this file only 30 | * under the terms of either the GPL or the LGPL, and not to allow others to 31 | * use your version of this file under the terms of the MPL, indicate your 32 | * decision by deleting the provisions above and replace them with the notice 33 | * and other provisions required by the GPL or the LGPL. If you do not delete 34 | * the provisions above, a recipient may use your version of this file under 35 | * the terms of any one of the MPL, the GPL or the LGPL. 36 | * 37 | * ***** END LICENSE BLOCK ***** */ 38 | 39 | #include 40 | #include 41 | #include 42 | #include 43 | #include 44 | #include 45 | #include 46 | #include 47 | 48 | #ifdef MINGW32_FALLBACK 49 | typedef LONG (* WINAPI RegGetValueAPtr)(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData); 50 | typedef BOOL (* WINAPI CreateWellKnownSidPtr)(int WellKnownSidType, PSID DomainSid, PSID pSid, DWORD *cbSid); 51 | RegGetValueAPtr RegGetValueA = NULL; 52 | CreateWellKnownSidPtr CreateWellKnownSid = NULL; 53 | #define RRF_RT_ANY 0x0000FFFF 54 | #define RRF_RT_REG_SZ 0x00000002 55 | #define SECURITY_MAX_SID_SIZE 0x44 56 | #define WinBuiltinAdministratorsSid 26 57 | HMODULE module_advapi32; 58 | #endif 59 | 60 | const char *badOpenGLVendors[] = 61 | { 62 | "VMware, Inc." 63 | }; 64 | 65 | const char *badOpenGLRenderer[] = 66 | { 67 | "Software Rasterizer", 68 | "Mesa GLX Indirect", 69 | "llvmpipe" 70 | }; 71 | 72 | struct fontsToCheck 73 | { 74 | const char *name; 75 | bool found; 76 | }; 77 | 78 | struct fontsToCheck fonts[] = 79 | { 80 | { "Arial", false }, 81 | { "Verdana", false }, 82 | }; 83 | 84 | static inline uint16_t bswap16( uint16_t a ) 85 | { 86 | return (a<<8) | (a>>8); 87 | } 88 | 89 | static inline uint32_t bswap32( uint32_t a ) 90 | { 91 | return ((uint32_t)bswap16(a)<<16) | bswap16(a>>16); 92 | } 93 | 94 | struct TTF_TableDirectory 95 | { 96 | int32_t version; 97 | USHORT numTables; 98 | USHORT searchRange; 99 | USHORT entrySelector; 100 | USHORT rangeShift; 101 | } __attribute__((packed)); 102 | 103 | struct TTF_DirectoryEntry 104 | { 105 | ULONG tag; 106 | ULONG checksum; 107 | ULONG offset; 108 | ULONG length; 109 | } __attribute__((packed)); 110 | 111 | struct TTF_NameTable 112 | { 113 | USHORT selector; 114 | USHORT count; 115 | USHORT offset; 116 | } __attribute__((packed)); 117 | 118 | struct TTF_NameRecord 119 | { 120 | USHORT platformID; 121 | USHORT platformEncoding; 122 | USHORT language; 123 | USHORT name; 124 | USHORT length; 125 | USHORT offset; 126 | } __attribute__((packed)); 127 | 128 | 129 | char clsName[] = "Systemcheck"; 130 | 131 | LRESULT CALLBACK wndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 132 | { 133 | return DefWindowProcA(hWnd, Msg, wParam, lParam); 134 | } 135 | 136 | bool registerClass() 137 | { 138 | /* Create the application window */ 139 | WNDCLASSEXA WndClsEx; 140 | WndClsEx.cbSize = sizeof(WndClsEx); 141 | WndClsEx.style = CS_HREDRAW | CS_VREDRAW; 142 | WndClsEx.lpfnWndProc = &wndProcedure; 143 | WndClsEx.cbClsExtra = 0; 144 | WndClsEx.cbWndExtra = 0; 145 | WndClsEx.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); 146 | WndClsEx.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW); 147 | WndClsEx.hbrBackground = NULL; /* (HBRUSH)GetStockObject(LTGRAY_BRUSH); */ 148 | WndClsEx.lpszMenuName = NULL; 149 | WndClsEx.lpszClassName = clsName; 150 | WndClsEx.hInstance = GetModuleHandleA(NULL); 151 | WndClsEx.hIconSm = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); 152 | 153 | ATOM classAtom = RegisterClassExA(&WndClsEx); 154 | if (!classAtom) 155 | return false; 156 | 157 | return true; 158 | } 159 | 160 | bool checkOpenGL() 161 | { 162 | HWND hWnd = 0; 163 | HDC hDC = 0; 164 | HGLRC context = NULL; 165 | bool result = false; 166 | int pixelformat; 167 | const char* renderer = NULL; 168 | const char* vendor = NULL; 169 | const char* extensions = NULL; 170 | unsigned int i; 171 | bool badOpenGL = false; 172 | bool directRendering = false; 173 | 174 | PIXELFORMATDESCRIPTOR pfd = 175 | { 176 | sizeof(PIXELFORMATDESCRIPTOR), 177 | 1, 178 | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL, 179 | PFD_TYPE_RGBA, 180 | 32, 181 | 0, 0, 0, 0, 0, 0, 182 | 0, 183 | 0, 184 | 0, 185 | 0, 0, 0, 0, 186 | 0, 187 | 0, 188 | 0, 189 | PFD_MAIN_PLANE, 190 | 0, 191 | 0, 0, 0 192 | }; 193 | 194 | hWnd = CreateWindowExA(0, clsName, "OpenGL Test", WS_TILEDWINDOW, 0, 0, 100, 100, 0, 0, 0, 0); 195 | if (!hWnd) 196 | return false; 197 | 198 | hDC = GetDC(hWnd); 199 | if (!hDC) 200 | goto error; 201 | 202 | pixelformat = ChoosePixelFormat(hDC, &pfd); 203 | if (!pixelformat) 204 | goto error; 205 | 206 | if (!SetPixelFormat(hDC, pixelformat, &pfd)) 207 | goto error; 208 | 209 | context = wglCreateContext(hDC); 210 | if (!context) 211 | goto error; 212 | 213 | if (!wglMakeCurrent(hDC, context)) 214 | goto error; 215 | 216 | vendor = (const char *)glGetString(GL_VENDOR); 217 | renderer = (const char *)glGetString(GL_RENDERER); 218 | extensions = (const char *)glGetString(GL_EXTENSIONS); 219 | 220 | if (extensions && strstr(extensions, "WINE_EXT_direct_rendering")) 221 | directRendering = true; 222 | 223 | printf("OpenGL Vendor: %s\n", vendor); 224 | printf("OpenGL Renderer: %s\n", renderer); 225 | printf("OpenGL Direct Rendering: %s\n", 226 | directRendering ? "True" : "False (or old/wrong wine version)"); 227 | 228 | if (!vendor || !renderer) 229 | goto error; 230 | 231 | for (i = 0; i < sizeof(badOpenGLVendors) / sizeof(badOpenGLVendors[0]); i++) 232 | { 233 | if (strstr(vendor, badOpenGLVendors[i])) 234 | { 235 | printf("ERROR: found bad OpenGL Vendor: %s\n", badOpenGLVendors[i]); 236 | badOpenGL = true; 237 | break; 238 | } 239 | } 240 | 241 | for (i = 0; i < sizeof(badOpenGLRenderer) / sizeof(badOpenGLRenderer[0]); i++) 242 | { 243 | if (strstr(renderer, badOpenGLRenderer[i])) 244 | { 245 | printf("ERROR: found bad OpenGL Renderer: %s\n", badOpenGLRenderer[i]); 246 | badOpenGL = true; 247 | break; 248 | } 249 | } 250 | 251 | if (!badOpenGL && directRendering) 252 | result = true; 253 | 254 | error: 255 | if (context) wglDeleteContext(context); 256 | if (hDC) ReleaseDC(hWnd, hDC); 257 | DestroyWindow(hWnd); 258 | return result; 259 | } 260 | 261 | #define READ_SAFE(file, ptr, length) \ 262 | if (fread((ptr), 1, (length), (file)) != (length)) \ 263 | goto error 264 | 265 | bool checkFontFile(const char *pattern, const char *name, const char *path) 266 | { 267 | FILE *file = NULL; 268 | bool result = false; 269 | struct TTF_TableDirectory directory; 270 | struct TTF_DirectoryEntry entry; 271 | struct TTF_NameTable nameTable; 272 | struct TTF_NameRecord nameEntry; 273 | ULONG i, j, k, l; 274 | ULONG offset; 275 | ULONG nameOffset; 276 | char fontFamily[256]; 277 | ULONG fontFamilyLength; 278 | 279 | file = fopen(path, "rb"); 280 | if (!file) 281 | return false; 282 | 283 | READ_SAFE(file, &directory, sizeof(directory)); 284 | 285 | for (i = 0; i < bswap16(directory.numTables); i++) 286 | { 287 | READ_SAFE(file, &entry, sizeof(entry)); 288 | 289 | if (memcmp(&entry.tag, "name", 4) != 0) 290 | continue; 291 | 292 | offset = bswap32(entry.offset); 293 | if (fseek(file, offset, SEEK_SET) != 0) 294 | goto error; 295 | 296 | READ_SAFE(file, &nameTable, sizeof(nameTable)); 297 | for (j = 0; j < bswap16(nameTable.count); j++) 298 | { 299 | READ_SAFE(file, &nameEntry, sizeof(nameEntry)); 300 | if (bswap16(nameEntry.name) != 1) 301 | continue; 302 | 303 | fontFamilyLength = bswap16(nameEntry.length); 304 | if (fontFamilyLength > sizeof(fontFamily) - 1) 305 | fontFamilyLength = sizeof(fontFamily) - 1; 306 | 307 | nameOffset = offset + bswap16(nameTable.offset) + bswap16(nameEntry.offset); 308 | if (fseek(file, nameOffset, SEEK_SET) != 0) 309 | goto error; 310 | 311 | READ_SAFE(file, fontFamily, fontFamilyLength); 312 | fontFamily[fontFamilyLength] = 0; 313 | 314 | /* check for MS encoding */ 315 | if (bswap16(nameEntry.platformEncoding) == 3) 316 | { 317 | /* convert big endian wide char strings into ascii */ 318 | for (l = 0, k = 1; k < fontFamilyLength; k +=2) 319 | fontFamily[l++] = fontFamily[k]; 320 | fontFamily[l] = 0; 321 | } 322 | 323 | if (strcmp(pattern, fontFamily) == 0) 324 | result = true; 325 | 326 | break; 327 | } 328 | break; 329 | } 330 | 331 | error: 332 | fclose(file); 333 | return result; 334 | } 335 | 336 | bool checkFonts() 337 | { 338 | LPCTSTR path = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; 339 | HKEY hKey = 0; 340 | bool result = false; 341 | DWORD index = 0; 342 | char fontName[256]; 343 | char fontPath[256]; 344 | DWORD lengthName = sizeof(fontName); 345 | DWORD lengthPath; 346 | unsigned int i; 347 | 348 | /* reset found flag */ 349 | for (i = 0; i < sizeof(fonts) / sizeof(fonts[0]); i++) 350 | fonts[i].found = false; 351 | 352 | if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &hKey) != ERROR_SUCCESS) 353 | return false; 354 | 355 | while (RegEnumValue(hKey, index, fontName, &lengthName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) 356 | { 357 | lengthName = sizeof(fontName); 358 | index++; 359 | 360 | for (i = 0; i < sizeof(fonts) / sizeof(fonts[0]); i++) 361 | { 362 | if (strstr(fontName, fonts[i].name)) 363 | { 364 | lengthPath = sizeof(fontPath); 365 | if (RegGetValueA(hKey, NULL, fontName, RRF_RT_REG_SZ, NULL, fontPath, &lengthPath) != ERROR_SUCCESS) 366 | continue; 367 | 368 | if (checkFontFile(fonts[i].name, fontName, fontPath)) 369 | { 370 | printf("Found %s in %s\n", fonts[i].name, fontPath); 371 | fonts[i].found = true; 372 | } 373 | break; 374 | } 375 | } 376 | } 377 | 378 | result = true; 379 | for (i = 0; i < sizeof(fonts) / sizeof(fonts[0]); i++) 380 | { 381 | if (!fonts[i].found) 382 | { 383 | printf("Missing %s\n", fonts[i].name); 384 | result = false; 385 | } 386 | } 387 | 388 | RegCloseKey(hKey); 389 | return result; 390 | } 391 | 392 | bool checkACLs() 393 | { 394 | char sidStorage[SECURITY_MAX_SID_SIZE]; 395 | char daclStorage[100]; 396 | PSID sid = (PSID) &sidStorage; 397 | DWORD sidSize = sizeof(sidStorage); 398 | PACL dacl = (PACL) &daclStorage; 399 | PACL daclResult; 400 | DWORD daclSize = sizeof(daclStorage); 401 | SECURITY_DESCRIPTOR secDescriptor; 402 | SECURITY_ATTRIBUTES secAttrs; 403 | PSECURITY_DESCRIPTOR secDescriptorResult; 404 | HANDLE file; 405 | char *testFile = (char*)"C:\\acl-test.txt"; 406 | bool result = false; 407 | 408 | if (!CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, sid, &sidSize)) 409 | return false; 410 | 411 | if (!InitializeSecurityDescriptor(&secDescriptor, SECURITY_DESCRIPTOR_REVISION)) 412 | return false; 413 | 414 | if(!InitializeAcl(dacl, daclSize, ACL_REVISION)) 415 | return false; 416 | 417 | if (!AddAccessAllowedAceEx(dacl, ACL_REVISION, OBJECT_INHERIT_ACE|CONTAINER_INHERIT_ACE, GENERIC_ALL, sid)) 418 | return false; 419 | 420 | if (!SetSecurityDescriptorDacl(&secDescriptor, TRUE, dacl, FALSE)) 421 | return false; 422 | 423 | secAttrs.nLength = sizeof(secAttrs); 424 | secAttrs.lpSecurityDescriptor = &secDescriptor; 425 | secAttrs.bInheritHandle = false; 426 | 427 | if (GetFileAttributes(testFile) != INVALID_FILE_ATTRIBUTES) 428 | { 429 | if (!DeleteFile(testFile)) 430 | { 431 | printf("Failed to delete old test file!\n"); 432 | return false; 433 | } 434 | } 435 | 436 | file = CreateFileA(testFile, GENERIC_WRITE, 0, &secAttrs, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 437 | if (file == INVALID_HANDLE_VALUE) 438 | return false; 439 | 440 | CloseHandle(file); 441 | 442 | if (GetNamedSecurityInfo(testFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &daclResult, NULL, &secDescriptorResult) == ERROR_SUCCESS) 443 | { 444 | ACL_SIZE_INFORMATION aclSize; 445 | unsigned int i; 446 | 447 | if (GetAclInformation(daclResult, &aclSize, sizeof(aclSize), AclSizeInformation)) 448 | { 449 | for (i = 0; i < aclSize.AceCount; i++) 450 | { 451 | ACE_HEADER *pAceHeader; 452 | ACCESS_ALLOWED_ACE *pAceAllow; 453 | 454 | if (!GetAce(daclResult, i, (VOID**)&pAceHeader)) 455 | continue; 456 | 457 | if (pAceHeader->AceType != ACCESS_ALLOWED_ACE_TYPE) 458 | continue; 459 | 460 | pAceAllow = (ACCESS_ALLOWED_ACE *)pAceHeader; 461 | if (EqualSid(&pAceAllow->SidStart, sid)) 462 | { 463 | result = true; 464 | break; 465 | } 466 | } 467 | } 468 | 469 | LocalFree(secDescriptorResult); 470 | } 471 | 472 | DeleteFile(testFile); 473 | return result; 474 | } 475 | 476 | 477 | int main() 478 | { 479 | bool test, ret = 0; 480 | 481 | #ifdef MINGW32_FALLBACK 482 | module_advapi32 = LoadLibraryA("advapi32.dll"); 483 | assert(module_advapi32); 484 | 485 | RegGetValueA = (RegGetValueAPtr)GetProcAddress(module_advapi32, "RegGetValueA"); 486 | CreateWellKnownSid = (CreateWellKnownSidPtr)GetProcAddress(module_advapi32, "CreateWellKnownSid"); 487 | assert(RegGetValueA && CreateWellKnownSid); 488 | #endif 489 | 490 | if (!registerClass()) ret = 1; 491 | 492 | printf("Checking OpenGL ...\n"); 493 | test = checkOpenGL(); 494 | if (!test) ret = 1; 495 | printf("OpenGL: %s\n", test ? "PASSED" : "FAILURE"); 496 | printf("\n"); 497 | 498 | printf("Checking fonts ...\n"); 499 | test = checkFonts(); 500 | if (!test) ret = 1; 501 | printf("Fonts: %s\n", test ? "PASSED" : "FAILURE"); 502 | printf("\n"); 503 | 504 | printf("Checking ACLs / XATTR ...\n"); 505 | test = checkACLs(); 506 | if (!test) ret = 1; 507 | printf("ACLs: %s\n", test ? "PASSED" : "FAILURE"); 508 | 509 | exit(ret); 510 | } -------------------------------------------------------------------------------- /wine-patches/README: -------------------------------------------------------------------------------- 1 | IMPORTANT NOTICE: the patches that used to be stored here have MOVED to a new git branch. 2 | 3 | Browsable URL: 4 | https://github.com/compholio/wine-compholio-daily 5 | 6 | Tarball (Mirror): 7 | http://fds-team.de/mirror/wine-patches.tar.gz 8 | 9 | One-liner to get the wine patches in the current working directory: 10 | wget -O- "http://fds-team.de/mirror/wine-patches.tar.gz" | tar -xz --transform="s,^wine-patches/,," 11 | --------------------------------------------------------------------------------