openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #15623
[Merge] lp:~smpettit/openlp/windows-installer-portable into lp:openlp
Stevan Pettit has proposed merging lp:~smpettit/openlp/windows-installer-portable into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
For more details, see:
https://code.launchpad.net/~smpettit/openlp/windows-installer-portable/+merge/106061
Added code to allow the building of a "portable" installer.
The portable install is created using therr pieces of software from PortableApps.com
1. PortableApps.com Installer
2. PortableApps.com Launcher:
3. NSIS Portable (Unicode version)
Added new parm to install script:
-p (portable build path)
Added new parms to config.ini.default file:
portablelauncher (path to the launcher builder)
portableinstaller (path to the portable app install builder)
portable (path location for the portable build)
If no portable path is specified, the portable app build is not executed.
After OpenLP is built and a portable build is requested, the following is performed:
1. A check is made to insure all the portable path sub-directories are created and correct. this is to insure the build layout meets the PortableApps directory specifications. If the correct directories are not present, they are created. This also allows the portable build to be performed in an empty directory specified by the user.
2. Appinfo.ini is created by reading Appinfo.ini.default and inserting the current OpenLP version (decimal only) information.
3. The newly built OpenLP is copied from branch\build to the portable app direcrtory
4. The current Openlp icons (from the script directory) are copied to the portable app directory
5. A "help.html" file is copied from the script directory to the portable app directory. (I just picked and created one. Whatever is needed can simply be placed in the script folder).
6. The OpenLPPortableLauncher.ini file is copied to the portable app directory and the PortableApp Launcher builder is run. This creates OpenLPPortable.exe in the portable app directory.
7. The PortableApp Installer is run creating the actual PortableInstall.exe. This installer is created in the parent path of the portable app directory. This executable is copied to the ...branch\Dist folder.
I have run and tested the install numerous times. I have also requested that the directory structure and names of various ini files be checked by a PortableApp developer.
--
https://code.launchpad.net/~smpettit/openlp/windows-installer-portable/+merge/106061
Your team OpenLP Core is requested to review the proposed merge of lp:~smpettit/openlp/windows-installer-portable into lp:openlp.
=== added file 'Help.html'
--- Help.html 1970-01-01 00:00:00 +0000
+++ Help.html 2012-05-16 22:00:26 +0000
@@ -0,0 +1,668 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>OpenLP | free church worship software | presentation application for songs | open source lyrics projection</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<!--[if IE]>
+ <style type="text/css" media="all">@import "/sites/all/themes/openlp_v2_1/style-IE6.css";</style>
+ <![endif]-->
+<link rel="alternate" type="application/rss+xml" title="OpenLP RSS" href="http://openlp.org/en/rss.xml" />
+<link rel="shortcut icon" href="/sites/all/themes/openlp_v2_1/favicon.ico" type="image/x-icon" />
+ <link type="text/css" rel="stylesheet" media="all" href="/files/css/css_65acc70aec026e7f00c83b746d0cdc38.css" />
+ <script type="text/javascript" src="/files/js/js_54473a22c7dca8b92a365dadb505ad65.js"></script>
+<script type="text/javascript">
+<!--//--><![CDATA[//><!--
+jQuery.extend(Drupal.settings, { "basePath": "/", "googleanalytics": { "trackOutgoing": 1, "trackMailto": 1, "trackDownload": 1, "trackDownloadExtensions": "7z|aac|arc|arj|asf|asx|avi|bin|csv|doc|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|msi|msp|pdf|phps|png|ppt|qtm?|ra(m|r)?|sea|sit|tar|tgz|torrent|txt|wav|wma|wmv|wpd|xls|xml|z|zip" } });
+//--><!]]>
+</script>
+<script type="text/javascript">
+<!--//--><![CDATA[//><!--
+$(document).ready(function(){ $('img').pngFix(); });
+//--><!]]>
+</script>
+</head>
+
+<body>
+ <!-- BEGIN Contaner -->
+ <div id="container" class="clear-block">
+ <div class="c1"> <!-- Top Shadow -->
+ <div class="c2"> <!-- Right Shadow -->
+ <div class="c3"> <!-- Bottom Shadow -->
+ <div class="c4"> <!-- left Shadow -->
+ <div class="c5"> <!-- Left Gradient -->
+ <div class="c6"> <!-- Right Gradient -->
+
+ <!-- BEGIN Header -->
+ <div id="header">
+ <div class="h1">
+ <div class="h2">
+ <div class="h3">
+ <a href="/" title="Home"><img src="/sites/all/themes/openlp_v2_1/logo.png" alt="Home" id="logo" /></a> <ul class="links" id="primary"><li class="menu-48 active-trail first active"><a href="/en" title="" class="active">Home</a></li>
+<li class="menu-51"><a href="/en/features" title="The list of capabilties of openlp.org">Features</a></li>
+<li class="menu-52"><a href="/en/download" title="Download the latest version of OpenLP">Download</a></li>
+<li class="menu-58"><a href="/en/blog" title="">Blog</a></li>
+<li class="menu-78"><a href="/en/forums" title="Discuss openlp.org">Forums</a></li>
+<li class="menu-244 last"><a href="/en/development.html" title="More information on OpenLP development.">Development</a></li>
+</ul> <form action="/" accept-charset="UTF-8" method="post" id="search-theme-form">
+<div><div id="search" class="container-inline">
+ <div class="form-item">
+ <input type="text" maxlength="128" name="search_theme_form" id="edit-search-theme-form-keys" size="15" value="" title="Enter the terms you wish to search for." class="form-text" /><input type="image" src="/sites/all/themes/openlp_v2_1/images/search_button.png" name="op" id="edit-submit" value="Search" class="form-submit" />
+ </div>
+ <input type="hidden" name="form_token" id="edit-search-theme-form-form-token" value="42dd57df69fb267f9a17ab4f8547c10c" />
+ <input type="hidden" name="form_id" id="edit-search-theme-form" value="search_theme_form" />
+</div>
+
+</div></form>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- END Header -->
+
+ <!-- BEGIN Body -->
+ <div id="body" class="clear-block">
+ <div id="content-wrapper"> <!-- For IE6 jump on hover bug -->
+ <div id="content" class="column">
+ <div id="mission" class="clear-block"><div class="m1"><div class="m2"><div class="m3"><div class="m4"><img src="/files/images/projector1.gif" alt="projector" class="right" />
+<h2>Empower Your Church</h2>
+<p>Your church was just given a data projector and you want to use it to display the lyrics of songs. You were thinking of using PowerPoint, but after a test found it very unwieldy. Then someone suggested that you look at commercial church presentation software, but when you looked at the price tag, you knew your church could not afford that kind of money. You begin to wonder if you should just go back to hymn books and just leave projection of song words to bigger churches who can afford to do it.</p>
+<p>Allow us to present the solution to the problem: <strong>OpenLP</strong><br /> </p>
+<img src="/files/images/cross1.png" alt="cross" class="left" />
+<h2>Unlimited Freedom</h2>
+<p>openlp.org is <em>free</em>. And it's not just a below-standard freebie thing, it's a powerful, elegant <em>open source</em> application. What does that mean? It means that the code that the developers write is available to you. But more than that, it means that openlp.org is, and always will be, free. Free to download, free to use, free to give to all your friends. Unlimited freedom, like the freedom we find in Christ.<br /> </p>
+<img src="/files/images/more_info.png" alt="more info" class="right" />
+<h2>Find Out More</h2>
+<p>Want to learn more about openlp.org? Have a look at the <a href="http://manual.openlp.org/">Manual</a>, which contains everything from <a href="http://manual.openlp.org/install_windows_mac.html">installing</a>, to <a href="http://manual.openlp.org/troubleshooting.html">troubleshooting</a>. Discuss problems and issues with other users of openlp.org in the <a href="/en/forums">forums</a>, and read up on what the developers are doing via the <a href="/en/blog">developer blogs</a>. See what other <a href="/en/testimonials" title="Testimonials">people are saying</a>. If you wanna take a sneak peek at OpenLP before downloading it, have a look at the <a href="http://sourceforge.net/projects/openlp/#screenshots">screenshots</a>. Lastly, <a href="/en/download">download</a> and install OpenLP.</p></div></div></div></div></div> <div id="main">
+ <h1 class="title"></h1>
+ <div class="tabs"></div>
+ <div id="node-1748" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/05/01/quick-video-tutorial" title="A Quick Video Tutorial">A Quick Video Tutorial</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By raoul on 30 April 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p>Hi folks,</p>
+<p>I've just put together a very basic tutorial on how to get your first service up and running. I've embedded it below in HTML5 video. If you can't see it, you can download it and watch it in VLC using the link below, or you'll have to wait a little until I've uploaded it to our YouTube channel.</p>
+<p style="text-align: center;"><video width="640" height="360" controls="controls"><br />
+ <source src="http://openlp.org/files/openlp-service-tutorial.webm" type="video/webm"/><br />
+ Your browser does not support the video tag or WebM videos.<br />
+</source></video></p>
+<p style="text-align: center;"><a href="/files/openlp-service-tutorial.webm" title="Download OpenLP Service Tutorial Video">Download OpenLP Service Tutorial Video</a></p>
+ </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/05/01/quick-video-tutorial" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/05/01/quick-video-tutorial" data-text="A Quick Video Tutorial" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/05/01/quick-video-tutorial">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/05/01/quick-video-tutorial" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/05/01/quick-video-tutorial"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/raoul/blog" title="Read raoul's latest blog entries.">raoul's blog</a></li>
+<li class="comment_comments last"><a href="/en/blog/2012/05/01/quick-video-tutorial#comments" title="Jump to the first comment of this posting.">2 comments</a></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1696" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/03/25/announcing-openlp-199-last-beta" title="Announcing OpenLP 1.9.9: The Last Beta">Announcing OpenLP 1.9.9: The Last Beta</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By raoul on 25 March 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p>Yes, ladies and gentlemen, you read that correctly. OpenLP 1.9.9 is the last of the beta series. From now on, OpenLP is in release candidate phase! Release candidate phase means that we will not be adding any more features and will be concentrating on fixing bugs.</p><p>We believe that all the functionality which was in version 1.2 has now been included in version 2.0, and for the next few months we will be focusing our efforts on fixing as many outstanding bugs as we can.</p><p>Features added:</p><ul><li>Transparent themes, for background videos (theme video backgrounds not yet possible)</li><li>On-the-fly changing of backing tracks</li><li>Repeating of backing track list</li><li>Use <a href="http://manual.openlp.org/configure.html?highlight=vlc#available-media-players">VLC for displaying videos</a> - not on Mac OS X yet, unfortunately. (Note: To be able to use this feature the <a href="http://www.videolan.org/vlc/">VLC media player</a> has to be installed on your computer.)</li><li>Search songs by song book/number</li><li>Configurable <a href="http://manual.openlp.org/configure.html#default-service-name">automatic service file names</a> using the date</li><li>The reference format used to look up Bible verses has been localised, and can be changed along with the interface language</li><li>Configure the "next slide" action when at the end of the current item in the slide controller to either move to the first slide again, to the next slide of the next item, or nothing.</li></ul><p>Of course we have also fixed over 46 bugs in this release!</p><p>The full list of changes can be seen on <a href="https://launchpad.net/openlp/+milestone/1.9.9">our launchpad page</a>.</p><p> <span class="read-more"><a href="/en/blog/2012/03/25/announcing-openlp-199-last-beta" title="Read the whole post" rel="nofollow"><strong>read more »</strong></a></span></p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/03/25/announcing-openlp-199-last-beta" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/03/25/announcing-openlp-199-last-beta" data-text="Announcing OpenLP 1.9.9: The Last Beta" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/03/25/announcing-openlp-199-last-beta">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/03/25/announcing-openlp-199-last-beta" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/03/25/announcing-openlp-199-last-beta"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/raoul/blog" title="Read raoul's latest blog entries.">raoul's blog</a></li>
+<li class="comment_comments last"><a href="/en/blog/2012/03/25/announcing-openlp-199-last-beta#comments" title="Jump to the first comment of this posting.">3 comments</a></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1690" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/03/19/facebook-timeline-photo" title="Wanted: Facebook Timeline photo">Wanted: Facebook Timeline photo</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By gushie on 19 March 2012</div>
+
+ </div>
+
+ <div class="content">
+ <div style="float: right; width: 320px; margin: 0 0 0.5em 0.5em;"><img src="http://sourceforge.net/projects/openlp/screenshots/57331" alt="OpenLP v1 in use" width="320" height="240" /></div>
+<p>In just over a weeks time, the OpenLP <a href="http://facebook.com/openlp">facebook page</a> will be switched over to the new Timeline view. The new view gives us the opportunity to add a cover image to go along the top of the page, and this is where we would like your help...</p>
+<p>Ideally we would like to use a picture of OpenLP being used, with a full worshipping congregation and both the operators screen and the projector screen in view. For example a long time ago when v1 was just being born and monitors were still the size of a small car, the photo on the right was taken. We would like to bring it up to date..</p>
+<p> <span class="read-more"><a href="/en/blog/2012/03/19/facebook-timeline-photo" title="Read the whole post" rel="nofollow"><strong>read more »</strong></a></span></p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/03/19/facebook-timeline-photo" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/03/19/facebook-timeline-photo" data-text="Wanted: Facebook Timeline photo" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/03/19/facebook-timeline-photo">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/03/19/facebook-timeline-photo" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/03/19/facebook-timeline-photo"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/gushie/blog.html" title="Read gushie's latest blog entries.">gushie's blog</a></li>
+<li class="comment_forbidden last"><span><a href="/en/user/login?destination=comment%2Freply%2F1690%23comment-form">Login</a> or <a href="/en/user/register?destination=comment%2Freply%2F1690%23comment-form">register</a> to post comments</span></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1672" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/03/11/openlp-officially-part-opensuse" title="OpenLP is officially part of openSUSE!">OpenLP is officially part of openSUSE!</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By raoul on 11 March 2012</div>
+
+ </div>
+
+ <div class="content">
+ <div style="float: right; width: 120px; margin: 0 0 0.5em 0.5em;"><img src="/files/u2/120px-Geeko-button-bling3.png" alt="openSUSE" /></div>
+<p>OpenLP has officially been accepted into openSUSE Factory, which means that in openSUSE 12.2 users will be able to install openLP right out of the box, without having to add any additional repositories. openSUSE 12.2 is scheduled to be released on July 11th.</p>
+<p>If you're currently running Factory all you have to do to install OpenLP is run 'zypper install openlp'. For more information, you can visit the OpenLP build page: <a href="https://build.opensuse.org/request/show/106648" class="moz-txt-link-freetext">https://build.opensuse.org/request/show/106648</a></p>
+<p>Many thanks go to Joseph Mulloy who tirelessly working at it for many months. He had to fix bugs in other packages and prod people to compile their packages properly, just so that he could get OpenLP into openSUSE. It really was quite a mission, but he did so anyways.</p>
+ </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/03/11/openlp-officially-part-opensuse" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/03/11/openlp-officially-part-opensuse" data-text="OpenLP is officially part of openSUSE!" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/03/11/openlp-officially-part-opensuse">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/03/11/openlp-officially-part-opensuse" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/03/11/openlp-officially-part-opensuse"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/raoul/blog" title="Read raoul's latest blog entries.">raoul's blog</a></li>
+<li class="comment_forbidden last"><span><a href="/en/user/login?destination=comment%2Freply%2F1672%23comment-form">Login</a> or <a href="/en/user/register?destination=comment%2Freply%2F1672%23comment-form">register</a> to post comments</span></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1642" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/02/20/site-software-upgrade-successful" title="Site Software Upgrade Successful!">Site Software Upgrade Successful!</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By raoul on 20 February 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p>I'm happy to announce that the software upgrade of the site went well, and things should be mostly back to normal. If you have any issues with the site, please just drop us a line in our IRC channel. Please make sure you mention the page you were going to, the URL you ended up on, and the exact error you got. Also please note that most folks are only awake and active in the afternoon and evening hours of UTC/GMT.</p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/02/20/site-software-upgrade-successful" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/02/20/site-software-upgrade-successful" data-text="Site Software Upgrade Successful!" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/02/20/site-software-upgrade-successful">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/02/20/site-software-upgrade-successful" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/02/20/site-software-upgrade-successful"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/raoul/blog" title="Read raoul's latest blog entries.">raoul's blog</a></li>
+<li class="comment_comments last"><a href="/en/blog/2012/02/20/site-software-upgrade-successful#comments" title="Jump to the first comment of this posting.">2 comments</a></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1638" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/02/19/upgrading-openlp-site" title="Upgrading the OpenLP Site">Upgrading the OpenLP Site</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By raoul on 19 February 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p>Tomorrow evening we will be giving the OpenLP site a much-needed software upgrade. We will have to take the site offline for a few hours while we perform the upgrade, but don't worry, you can still find us in IRC, and the OpenLP 2.0 manual will still be available.</p>
+<p>The site will be offline from around 17:00 UTC until approximately midnight UTC.</p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/02/19/upgrading-openlp-site" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/02/19/upgrading-openlp-site" data-text="Upgrading the OpenLP Site" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/02/19/upgrading-openlp-site">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/02/19/upgrading-openlp-site" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/02/19/upgrading-openlp-site"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/raoul/blog" title="Read raoul's latest blog entries.">raoul's blog</a></li>
+<li class="comment_forbidden last"><span><a href="/en/user/login?destination=comment%2Freply%2F1638%23comment-form">Login</a> or <a href="/en/user/register?destination=comment%2Freply%2F1638%23comment-form">register</a> to post comments</span></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1617" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/02/09/use-vlc-play-videos-right-inside-openlp" title="Use VLC to play videos right inside OpenLP!">Use VLC to play videos right inside OpenLP!</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By raoul on 09 February 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p>A few months ago, we rewrote how media (videos, etc) works in OpenLP. Part of the reason for the rewrite of how media is handled was to be able to use VLC as your video player inside OpenLP. Today we are happy to announce that we now have VLC support in OpenLP, via the nightly builds.</p>
+<p>Please keep in mind that the VLC support might contain bugs since it has not yet been fully tested. Feel free, however, to test it out. As usual, please report any bugs you find.</p>
+<p><em>Note:</em> You will need to install VLC and enable VLC support in the media setting (Settings -> Configure OpenLP...) before you can use it.</p>
+<p>Best Regards and may God be with you,<br />OpenLP Team</p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/02/09/use-vlc-play-videos-right-inside-openlp" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/02/09/use-vlc-play-videos-right-inside-openlp" data-text="Use VLC to play videos right inside OpenLP!" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/02/09/use-vlc-play-videos-right-inside-openlp">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/02/09/use-vlc-play-videos-right-inside-openlp" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/02/09/use-vlc-play-videos-right-inside-openlp"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/raoul/blog" title="Read raoul's latest blog entries.">raoul's blog</a></li>
+<li class="comment_comments last"><a href="/en/blog/2012/02/09/use-vlc-play-videos-right-inside-openlp#comments" title="Jump to the first comment of this posting.">7 comments</a></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1599" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/01/23/new-android-release" title="New Android Release">New Android Release</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By TRB143 on 23 January 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p></p>
+<p>Hot on the heels of the Christmas 1.9.8 release, an updated version of the Android client has been added to the Android Market.</p>
+<p>This release contains two updates:</p>
+<ul>
+<li>The ability to blank the screen to the theme or desktop as well as the screen.<br /><em><strong>This change requires version 1.9.8 to function fully.</strong></em></li>
+<li>A number of translations.</li>
+</ul>
+<p>The next release should be available at the same time as 1.9.9 is released.</p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/01/23/new-android-release" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/01/23/new-android-release" data-text="New Android Release" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/01/23/new-android-release">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/01/23/new-android-release" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/01/23/new-android-release"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/blog/506" title="Read TRB143's latest blog entries.">TRB143's blog</a></li>
+<li class="comment_comments last"><a href="/en/blog/2012/01/23/new-android-release#comments" title="Jump to the first comment of this posting.">1 comment</a></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1592" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/01/15/automated-nightly-mac-os-x-builds" title="Automated Nightly Mac OS X Builds">Automated Nightly Mac OS X Builds</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By matysek on 15 January 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p>This weekend we were able to set up the necessary infrastructure for doing test builds for Mac OS X automatically.</p>
+<p>Nightly builds are created every day around 10pm GMT. These builds are created on Mac OS X 10.7 (Lion) and should also work on Mac OS X 10.6 (Snow Leopard). These builds include latest development changes in OpenLP. The latest test build is available on the download page.</p>
+<p>I would like to encourage Mac OS X users and testers to test OpenLP builds and report bugs periodically since we do not have a lot of Mac OS X developers and the support for Mac platform is not perfect.</p>
+<p>Happy testing and reporting!</p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/01/15/automated-nightly-mac-os-x-builds" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/01/15/automated-nightly-mac-os-x-builds" data-text="Automated Nightly Mac OS X Builds" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/01/15/automated-nightly-mac-os-x-builds">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/01/15/automated-nightly-mac-os-x-builds" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/01/15/automated-nightly-mac-os-x-builds"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/users/matysek/blog" title="Read matysek's latest blog entries.">matysek's blog</a></li>
+<li class="comment_comments last"><a href="/en/blog/2012/01/15/automated-nightly-mac-os-x-builds#comments" title="Jump to the first comment of this posting.">3 comments</a></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div id="node-1593" class="node front blog">
+<div class="n1">
+ <div class="n2">
+ <div class="n3">
+ <div class="n4 clear-block">
+
+
+ <h2><a href="/en/blog/2012/01/15/videos-wanted" title="Videos Wanted">Videos Wanted</a></h2>
+
+ <div class="meta">
+ <div class="submitted">By wstout on 15 January 2012</div>
+
+ </div>
+
+ <div class="content">
+ <p></p>
+<p>Hello everyone! OpenLP's popularity is on the rise. We just hit 1,200 fans. That is a large accomplishment in itself for a project like OpenLP. With this rise in popularity we could use some help from the community. As you probably already know we have been hard at work on a manual and support is always available through chat, but OpenLP also has a YouTube channel. Many times a video is worth more than a thousand words when demonstrating a feature or helping out with a technical issue. <span class="read-more"><a href="/en/blog/2012/01/15/videos-wanted" title="Read the whole post" rel="nofollow"><strong>read more »</strong></a></span></p> </div>
+
+ <div style="height:24px; line-height: 24px;">
+ <div class="fb-like" data-href="http://openlp.org/en/blog/2012/01/15/videos-wanted" data-send="false" data-layout="button_count" data-width="90" data-show-faces="false" data-font="verdana"></div>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://openlp.org/en/blog/2012/01/15/videos-wanted" data-text="Videos Wanted" data-count="horizontal" data-via="openlp" data-counturl="http://openlp.org/en/blog/2012/01/15/videos-wanted">Tweet</a>
+ <g:plusone href="http://openlp.org/en/blog/2012/01/15/videos-wanted" size="medium" count="true"></g:plusone>
+ <su:badge layout="2" location="http://openlp.org/en/blog/2012/01/15/videos-wanted"></su:badge>
+ </div>
+
+ <div class="more-links"><ul class="links inline"><li class="blog_usernames_blog first"><a href="/en/blog/1284" title="Read wstout's latest blog entries.">wstout's blog</a></li>
+<li class="comment_forbidden last"><span><a href="/en/user/login?destination=comment%2Freply%2F1593%23comment-form">Login</a> or <a href="/en/user/register?destination=comment%2Freply%2F1593%23comment-form">register</a> to post comments</span></li>
+</ul></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div><div class="item-list"><ul class="pager"><li class="pager-current first">1</li>
+<li class="pager-item"><a href="/en/node?page=1" title="Go to page 2" class="active">2</a></li>
+<li class="pager-item"><a href="/en/node?page=2" title="Go to page 3" class="active">3</a></li>
+<li class="pager-item"><a href="/en/node?page=3" title="Go to page 4" class="active">4</a></li>
+<li class="pager-item"><a href="/en/node?page=4" title="Go to page 5" class="active">5</a></li>
+<li class="pager-item"><a href="/en/node?page=5" title="Go to page 6" class="active">6</a></li>
+<li class="pager-item"><a href="/en/node?page=6" title="Go to page 7" class="active">7</a></li>
+<li class="pager-item"><a href="/en/node?page=7" title="Go to page 8" class="active">8</a></li>
+<li class="pager-item"><a href="/en/node?page=8" title="Go to page 9" class="active">9</a></li>
+<li class="pager-ellipsis">…</li>
+<li class="pager-next"><a href="/en/node?page=1" title="Go to next page" class="active">next ›</a></li>
+<li class="pager-last last"><a href="/en/node?page=22" title="Go to last page" class="active">last »</a></li>
+</ul></div> <a href="http://openlp.org/en/rss.xml" class="feed-icon"><img src="/sites/all/themes/openlp_v2_1/images/feed.png" alt="Syndicate content" title="Syndicate content" width="16" height="16" /></a> </div>
+ </div>
+ <div id="left-sidebar" class="column"><div id="block-block-5" class="block block-block">
+
+ <div class="content">
+ <div style="text-align: center;">
+<a href="https://twitter.com/openlp" class="twitter-follow-button" data-show-count="true" data-lang="en" data-size="large" data-show-screen-name="false">Follow @openlp</a>
+<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script><!-- a href="http://www.facebook.com/openlp" title="openlp.org Facebook Page"><img src="/files/logos/FaceBook_32x32.png" /></a>
+<a href="http://www.facebook.com/group.php?gid=2256543575" title="openlp.org Facebook Group"><img src="/files/logos/FaceBook_32x32.png" /></a>
+<a href="http://twitter.com/openlp" title="OpenLP Twitter Page"><img src="/files/logos/Twitter_32x32.png" /></a>
+<a href="http://www.linkedin.com/groups?gid=96031" title="OpenLP LinkedIn Group"><img src="/files/logos/LinkedIn_32x32.png" /></a --><!-- a href="http://www.facebook.com/openlp" title="openlp.org Facebook Page"><img src="/files/logos/FaceBook_32x32.png" /></a>
+<a href="http://www.facebook.com/group.php?gid=2256543575" title="openlp.org Facebook Group"><img src="/files/logos/FaceBook_32x32.png" /></a>
+<a href="http://twitter.com/openlp" title="OpenLP Twitter Page"><img src="/files/logos/Twitter_32x32.png" /></a>
+<a href="http://www.linkedin.com/groups?gid=96031" title="OpenLP LinkedIn Group"><img src="/files/logos/LinkedIn_32x32.png" /></a --></div>
+ </div>
+</div>
+<div id="block-menu-menu-main-menu" class="block block-menu">
+ <h2>Main Menu</h2>
+
+ <div class="content">
+ <ul class="menu"><li class="leaf first active-trail"><a href="/en" title="The home page" class="active">Home</a></li>
+<li class="leaf"><a href="http://manual.openlp.org/" title="Reference Manual for OpenLP 2.0">Manual (v2)</a></li>
+<li class="leaf"><a href="http://wiki.openlp.org/OpenLP_2_Introduction_and_FAQ" title="">Frequently Asked Questions</a></li>
+<li class="leaf"><a href="/en/testimonials" title="What people have said about openlp.org">Testimonials</a></li>
+<li class="leaf"><a href="/en/documentation">Documentation (v1)</a></li>
+<li class="leaf"><a href="http://wiki.openlp.org/Version_2_Milestones" title="">Roadmap</a></li>
+<li class="leaf"><a href="/en/forums" title="">Forums</a></li>
+<li class="leaf"><a href="/en/requirements">Requirements</a></li>
+<li class="collapsed"><a href="/en/search" title="">Search</a></li>
+<li class="leaf"><a href="/en/theme-gallery" title="">Theme Gallery</a></li>
+<li class="expanded"><a href="/en/contact-us" title="">Contact Us</a><ul class="menu"><li class="leaf first last"><a href="/en/contact-us/live-chat-irc" title="Chat with the developers in IRC">Live Chat in IRC</a></li>
+</ul></li>
+<li class="leaf last"><a href="/en/worldwide-usage" title="Churches using OpenLP">Worldwide Usage</a></li>
+</ul> </div>
+</div>
+<div id="block-block-13" class="block block-block">
+ <h2>Translate Site</h2>
+
+ <div class="content">
+ <div id="google_translate_element"></div>
+<script>
+function googleTranslateElementInit() {
+ new google.translate.TranslateElement({
+ pageLanguage: 'en',
+ gaTrack: true,
+ gaId: 'UA-663353-1'
+ }, 'google_translate_element');
+}
+</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> </div>
+</div>
+<div id="block-user-0" class="block block-user">
+ <h2>User login</h2>
+
+ <div class="content">
+ <form action="/en/node?destination=node" accept-charset="UTF-8" method="post" id="user-login-form">
+<div><div class="form-item" id="edit-name-wrapper">
+ <label for="edit-name">Username: <span class="form-required" title="This field is required.">*</span></label>
+ <input type="text" maxlength="60" name="name" id="edit-name" size="15" value="" class="form-text required" />
+</div>
+<div class="form-item" id="edit-pass-wrapper">
+ <label for="edit-pass">Password: <span class="form-required" title="This field is required.">*</span></label>
+ <input type="password" name="pass" id="edit-pass" maxlength="60" size="15" class="form-text required" />
+</div>
+<div class="item-list"><ul><li class="first"><a href="/en/user/register" title="Create a new user account.">Create new account</a></li>
+<li class="last"><a href="/en/user/password" title="Request new password via e-mail.">Request new password</a></li>
+</ul></div><input type="hidden" name="form_build_id" id="form-b9fa5d557aac1348b646c12fb0a4870e" value="form-b9fa5d557aac1348b646c12fb0a4870e" />
+<input type="hidden" name="form_id" id="edit-user-login-block" value="user_login_block" />
+<div class="edit-feed-me-wrapper"><div class="form-item" id="edit-feed-me-wrapper">
+ <input type="text" maxlength="128" name="feed_me" id="edit-feed-me" size="20" value="" class="form-text" />
+ <div class="description">To prevent automated spam submissions leave this field empty.</div>
+</div>
+</div><input type="submit" name="op" id="edit-submit" value="Log in" class="form-submit" />
+
+</div></form>
+ </div>
+</div>
+<div id="block-block-8" class="block block-block">
+
+ <div class="content">
+ <div class="fb-like-box" data-href="http://www.facebook.com/openlp" data-width="182" data-height="355" data-show-faces="true" data-stream="false" data-header="false"></div>
+ </div>
+</div>
+</div> <div id="right-sidebar" class="column"><div id="block-block-9" class="block block-block">
+
+ <div class="content">
+ <style>
+a.download-button {
+ display: block;
+ line-height: 24px;
+ font-size: 14px;
+ font-weight: bold;
+ color: #ffffff;
+ padding: 8px;
+ background: -moz-linear-gradient(
+ top,
+ #7ebf4d 0%,
+ #62a62f);
+ background: -webkit-gradient(
+ linear, left top, left bottom,
+ from(#7ebf4d),
+ to(#62a62f));
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border: 1px solid #4b9021;
+ -moz-box-shadow:
+ 0px 1px 5px rgba(000,000,000,0.8),
+ inset 0px 1px 1px rgba(149,202,109,1);
+ -webkit-box-shadow:
+ 0px 1px 5px rgba(000,000,000,0.8),
+ inset 0px 1px 1px rgba(149,202,109,1);
+ text-shadow:
+ 1px 1px 1px rgba(126,191,77,1),
+ -1px -1px 1px rgba(75,144,33,1);
+ text-align: center;
+ text-decoration: none;
+}
+</style><p><a href="/en/download" class="download-button" title="Download OpenLP Now!">Download Now! <img src="/files/u2/download_arrow.png" alt="Download OpenLP Now!" style="margin: -8px 0 -7px 5px" /></a></p>
+ </div>
+</div>
+<div id="block-forum-0" class="block block-forum">
+ <h2>Active forum topics</h2>
+
+ <div class="content">
+ <div class="item-list"><ul><li class="first"><a href="/en/forums/general-support/troubleshooting/songs-fellowship-import-problem" title="9 comments">Songs of Fellowship Import problem</a></li>
+<li><a href="/en/forums/general-support/development/location-data-files" title="1 comment">Location of data files</a></li>
+<li><a href="/en/forums/general-support/development/continuous-display">Continuous display</a></li>
+<li><a href="/en/forums/general-support/general-discussion/wireless-projectors" title="1 comment">Wireless Projectors</a></li>
+<li><a href="/en/forums/general-support/troubleshooting/bible-import-biblegateway-openlp-199-windows-7" title="5 comments">Bible import from Biblegateway Openlp 1.9.9 on Windows 7</a></li>
+<li><a href="/en/forums/general-support/troubleshooting/error-import-previously-exported-songs" title="6 comments">Error in import previously exported songs</a></li>
+<li><a href="/en/forums/general-support/development/easy-edit-songs" title="12 comments">Easy edit of songs!?</a></li>
+<li><a href="/en/forums/general-support/development/adding-verses-choruses-etc" title="1 comment">Adding verses, choruses, etc</a></li>
+<li><a href="/en/forums/general-support/troubleshooting/video-jumping-full-screen" title="1 comment">Video jumping to full screen</a></li>
+<li class="last"><a href="/en/forums/general-support/general-discussion/anyone-have-experience-running-olp-1204-precise-pangolin" title="3 comments">Anyone have experience running OLP on 12.04 Precise Pangolin?</a></li>
+</ul></div><div class="more-link"><a href="/en/forums" title="Read the latest forum topics.">more</a></div> </div>
+</div>
+<div id="block-forum-1" class="block block-forum">
+ <h2>New forum topics</h2>
+
+ <div class="content">
+ <div class="item-list"><ul><li class="first"><a href="/en/forums/general-support/development/continuous-display">Continuous display</a></li>
+<li><a href="/en/forums/general-support/development/location-data-files" title="1 comment">Location of data files</a></li>
+<li><a href="/en/forums/general-support/general-discussion/wireless-projectors" title="1 comment">Wireless Projectors</a></li>
+<li><a href="/en/forums/general-support/troubleshooting/bible-import-biblegateway-openlp-199-windows-7" title="5 comments">Bible import from Biblegateway Openlp 1.9.9 on Windows 7</a></li>
+<li class="last"><a href="/en/forums/general-support/development/adding-verses-choruses-etc" title="1 comment">Adding verses, choruses, etc</a></li>
+</ul></div><div class="more-link"><a href="/en/forums" title="Read the latest forum topics.">more</a></div> </div>
+</div>
+<div id="block-block-1" class="block block-block">
+
+ <div class="content">
+ <div style="text-align: center;"><a href="http://sourceforge.net/projects/openlp"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=102060&type=11" alt="Get openlp.org at SourceForge.net. Fast, secure and Free Open Source software downloads" width="120" height="30" /></a></div>
+ </div>
+</div>
+<div id="block-block-3" class="block block-block">
+
+ <div class="content">
+ <div style="text-align: center;">
+<script type="text/javascript" src="http://www.ohloh.net/p/12602/widgets/project_thin_badge.js"></script></div>
+ </div>
+</div>
+<div id="block-block-10" class="block block-block">
+
+ <div class="content">
+ <form style="border: 1px solid #ccc; padding: 3px; text-align: center;" action="http://feedburner.google.com/fb/a/mailverify" method="post" onsubmit="window.open('http://feedburner.google.com/fb/a/mailverify?uri=openlp', 'popupwindow', 'scrollbars=yes,width=550,height=520');return true" target="popupwindow">
+<p>Enter your email address:</p>
+<p><input style="width: 140px;" type="text" name="email" /></p>
+<p><input type="hidden" name="uri" value="openlp" /><input type="hidden" name="loc" value="en_US" /><input type="submit" value="Subscribe" />
+</p><p>Delivered by <a href="http://feedburner.google.com" target="_blank">FeedBurner</a></p>
+</form>
+ </div>
+</div>
+</div> </div>
+ </div>
+ <!-- END Body -->
+
+ <!-- BEGIN Footer -->
+ <div id="footer" class="clear-block">
+ <div class="f1">
+ <div class="f2">
+ <div class="f3">
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- END Footer -->
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- END Contaner -->
+
+ <div id="copyright"><strong>Copyright © 2006-2012</strong> | Hosted by <a href="http://www.datapoint.co.za/">DataPoint</a> | Designed by <a href="http://sourcewave.net/">Richard Banks</a> | Powered by <a href="http://drupal.org/">Drupal</a></div>
+ <script type="text/javascript">
+<!--//--><![CDATA[//><!--
+var _gaq = _gaq || [];_gaq.push(["_setAccount", "UA-663353-1"]);_gaq.push(["_trackPageview"]);(function() {var ga = document.createElement("script");ga.type = "text/javascript";ga.async = true;ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ga, s);})();
+//--><!]]>
+</script>
+ <div id="fb-root"></div>
+<script>(function(d, s, id) {
+ var js, fjs = d.getElementsByTagName(s)[0];
+ if (d.getElementById(id)) return;
+ js = d.createElement(s); js.id = id;
+ js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1&appId=133271503417377";
+ fjs.parentNode.insertBefore(js, fjs);
+}(document, 'script', 'facebook-jssdk'));</script>
+ <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
+ <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
+ <script type="text/javascript">
+ (function() {
+ var li = document.createElement('script'); li.type = 'text/javascript'; li.async = true;
+ li.src = 'https://platform.stumbleupon.com/1/widgets.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(li, s);
+ })();
+ </script>
+<script type="text/javascript">
+var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type="text/javascript">
+var pageTracker = _gat._getTracker("UA-663353-1");
+pageTracker._trackPageview();
+</script>
+</body>
+</html>
=== added file 'LICENSE.txt'
--- LICENSE.txt 1970-01-01 00:00:00 +0000
+++ LICENSE.txt 2012-05-16 22:00:26 +0000
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
=== added file 'OpenLP-2.0.iss.default'
--- OpenLP-2.0.iss.default 1970-01-01 00:00:00 +0000
+++ OpenLP-2.0.iss.default 2012-05-16 22:00:26 +0000
@@ -0,0 +1,184 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#define AppName "OpenLP"
+#define AppVerName "OpenLP 2.0"
+#define AppPublisher "OpenLP Developers"
+#define AppURL "http://openlp.org/"
+#define AppExeName "OpenLP.exe"
+
+#define FileHandle FileOpen("%(branch)s\dist\OpenLP\.version")
+#define FileLine FileRead(FileHandle)
+#define RealVersion FileLine
+#expr FileClose(FileHandle)
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppID={{AA7699FA-B2D2-43F4-8A70-D497D03C9485}
+AppName={#AppName}
+AppVerName={#AppVerName}
+AppPublisher={#AppPublisher}
+AppPublisherURL={#AppURL}
+AppSupportURL={#AppURL}
+AppUpdatesURL={#AppURL}
+DefaultDirName={pf}\{#AppName}
+DefaultGroupName={#AppVerName}
+AllowNoIcons=true
+LicenseFile=LICENSE.txt
+OutputDir=%(branch)s\dist
+OutputBaseFilename=OpenLP-{#RealVersion}-setup
+Compression=lzma/Max
+SolidCompression=true
+SetupIconFile=OpenLP.ico
+WizardImageFile=WizImageBig.bmp
+WizardSmallImageFile=WizImageSmall.bmp
+ChangesAssociations=true
+
+[Languages]
+Name: english; MessagesFile: compiler:Default.isl
+Name: basque; MessagesFile: compiler:Languages\Basque.isl
+Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl
+Name: catalan; MessagesFile: compiler:Languages\Catalan.isl
+Name: czech; MessagesFile: compiler:Languages\Czech.isl
+Name: danish; MessagesFile: compiler:Languages\Danish.isl
+Name: dutch; MessagesFile: compiler:Languages\Dutch.isl
+Name: finnish; MessagesFile: compiler:Languages\Finnish.isl
+Name: french; MessagesFile: compiler:Languages\French.isl
+Name: german; MessagesFile: compiler:Languages\German.isl
+Name: hebrew; MessagesFile: compiler:Languages\Hebrew.isl
+Name: hungarian; MessagesFile: compiler:Languages\Hungarian.isl
+Name: italian; MessagesFile: compiler:Languages\Italian.isl
+Name: japanese; MessagesFile: compiler:Languages\Japanese.isl
+Name: norwegian; MessagesFile: compiler:Languages\Norwegian.isl
+Name: polish; MessagesFile: compiler:Languages\Polish.isl
+Name: portuguese; MessagesFile: compiler:Languages\Portuguese.isl
+Name: russian; MessagesFile: compiler:Languages\Russian.isl
+Name: slovak; MessagesFile: compiler:Languages\Slovak.isl
+Name: slovenian; MessagesFile: compiler:Languages\Slovenian.isl
+Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
+
+[Tasks]
+Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
+Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; OnlyBelowVersion: 0, 6.1
+
+[Files]
+Source: %(branch)s\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
+; DLL used to check if the target program is running at install time
+Source: psvince.dll; flags: dontcopy
+; psvince is installed in {app} folder, so it will be loaded at
+; uninstall time to check if the target program is running
+Source: psvince.dll; DestDir: {app}
+
+[Icons]
+Name: {group}\{#AppName}; Filename: {app}\{#AppExeName}
+Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug
+Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm; Check: FileExists(ExpandConstant('{app}\{#AppName}.chm'))
+Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL}
+Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}
+Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon
+Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: quicklaunchicon
+
+[Run]
+Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent
+
+[Registry]
+Root: HKCR; Subkey: .osz; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue
+Root: HKCR; Subkey: OpenLP; ValueType: string; ValueName: ; ValueData: OpenLP Service; Flags: uninsdeletekey
+Root: HKCR; Subkey: OpenLP\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\OpenLP.exe,0
+Root: HKCR; Subkey: OpenLP\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\OpenLP.exe"" ""%1"""
+
+[UninstallDelete]
+; Remove support directory created when program is run:
+Type: filesandordirs; Name: {app}\support
+; Remove program directory if empty:
+Name: {app}; Type: dirifempty
+
+[Code]
+// Function to call psvince.dll at install time
+function IsModuleLoadedInstall(modulename: AnsiString ): Boolean;
+external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
+
+// Function to call psvince.dll at uninstall time
+function IsModuleLoadedUninstall(modulename: AnsiString ): Boolean;
+external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ;
+
+function GetUninstallString(): String;
+var
+ sUnInstPath: String;
+ sUnInstallString: String;
+begin
+ sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
+ sUnInstallString := '';
+ if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
+ RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
+ Result := sUnInstallString;
+end;
+
+function IsUpgrade(): Boolean;
+begin
+ Result := (GetUninstallString() <> '');
+end;
+
+// Return Values:
+// 1 - uninstall string is empty
+// 2 - error executing the UnInstallString
+// 3 - successfully executed the UnInstallString
+function UnInstallOldVersion(): Integer;
+var
+ sUnInstallString: String;
+ iResultCode: Integer;
+begin
+ Result := 0;
+ sUnInstallString := GetUninstallString();
+ if sUnInstallString <> '' then
+ begin
+ sUnInstallString := RemoveQuotes(sUnInstallString);
+ if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
+ Result := 3
+ else
+ Result := 2;
+ end
+ else
+ Result := 1;
+end;
+
+function InitializeSetup(): Boolean;
+begin
+ Result := true;
+ while IsModuleLoadedInstall( 'OpenLP.exe' ) and Result do
+ begin
+ if MsgBox( 'Openlp is currently running, please close it to continue the install.',
+ mbError, MB_OKCANCEL ) = IDCANCEL then
+ begin
+ Result := false;
+ end;
+ end;
+end;
+
+procedure CurStepChanged(CurStep: TSetupStep);
+begin
+ if (CurStep=ssInstall) then
+ begin
+ if (IsUpgrade()) then
+ begin
+ UnInstallOldVersion();
+ end;
+ end;
+end;
+
+function InitializeUninstall(): Boolean;
+begin
+ Result := true;
+ while IsModuleLoadedUninstall( 'OpenLP.exe' ) and Result do
+ begin
+ if MsgBox( 'Openlp is currently running, please close it to continue the uninstall.',
+ mbError, MB_OKCANCEL ) = IDCANCEL then
+ begin
+ Result := false;
+ end;
+ end;
+// Unload psvince.dll, otherwise it is not deleted
+ UnloadDLL(ExpandConstant('{app}\psvince.dll'));
+end;
=== added file 'OpenLP.ico'
Binary files OpenLP.ico 1970-01-01 00:00:00 +0000 and OpenLP.ico 2012-05-16 22:00:26 +0000 differ
=== added file 'OpenLP.reg'
Binary files OpenLP.reg 1970-01-01 00:00:00 +0000 and OpenLP.reg 2012-05-16 22:00:26 +0000 differ
=== added file 'OpenLPPortableLauncher.ini'
--- OpenLPPortableLauncher.ini 1970-01-01 00:00:00 +0000
+++ OpenLPPortableLauncher.ini 2012-05-16 22:00:26 +0000
@@ -0,0 +1,6 @@
+[Launch]
+ProgramExecutable=OpenLP\OpenLP.exe
+CommandLineArguments="-p"
+WaitForProgram=False
+WorkingDirectory=%PAL:AppDir%\AppName
+SinglePortableAppInstance=True
\ No newline at end of file
=== added file 'WizImageBig.bmp'
Binary files WizImageBig.bmp 1970-01-01 00:00:00 +0000 and WizImageBig.bmp 2012-05-16 22:00:26 +0000 differ
=== added file 'WizImageSmall.bmp'
Binary files WizImageSmall.bmp 1970-01-01 00:00:00 +0000 and WizImageSmall.bmp 2012-05-16 22:00:26 +0000 differ
=== added file 'appinfo.ini.default'
--- appinfo.ini.default 1970-01-01 00:00:00 +0000
+++ appinfo.ini.default 2012-05-16 22:00:26 +0000
@@ -0,0 +1,26 @@
+[Format]
+Type=PortableApps.comFormat
+Version=3.0
+
+[Details]
+Name=OpenLP Portable
+AppID=OpenLPPortable
+Publisher=OpenLP.org
+Homepage=openlp.org
+Category=Utilities
+Description=Lyrics Projection
+Language=Multilingual
+
+[License]
+Shareable=true
+OpenSource=true
+Freeware=true
+CommercialUse=true
+
+[Version]
+DisplayVersion=%(Version)s
+PackageVersion=%(Version)s
+
+[Control]
+Icons=1
+Start=OpenLPPortable.exe
=== added file 'config.ini.default'
--- config.ini.default 1970-01-01 00:00:00 +0000
+++ config.ini.default 2012-05-16 22:00:26 +0000
@@ -0,0 +1,21 @@
+[executables]
+innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe
+sphinx = %(pyroot)s\Scripts\sphinx-build.exe
+pyinstaller = %(here)s\..\pyinstaller\pyinstaller.py
+vcbuild = %(progfiles)s\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe
+htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe
+psvince = %(here)s\psvince.dll
+lrelease = %(sitepackages)s\PyQt4\bin\lrelease.exe
+portablelauncher = %(progfiles)s\PortableApps.comLauncher\PortableApps.comLauncherGenerator.exe
+portableinstaller = %(progfiles)s\PortableApps.comInstaller\PortableApps.comInstaller.exe
+
+[paths]
+branch = %(projects)s\trunk
+documentation = %(projects)s\documentation
+win32icon = %(here)s\OpenLP.ico
+hooks = %(here)s
+portable = %(projects)s\OpenLPPortable
+
+[transifex]
+username =
+password =
=== added file 'openlp-logo-16x16.png'
Binary files openlp-logo-16x16.png 1970-01-01 00:00:00 +0000 and openlp-logo-16x16.png 2012-05-16 22:00:26 +0000 differ
=== added file 'openlp-logo-32x32.png'
Binary files openlp-logo-32x32.png 1970-01-01 00:00:00 +0000 and openlp-logo-32x32.png 2012-05-16 22:00:26 +0000 differ
=== added file 'openlp.conf'
--- openlp.conf 1970-01-01 00:00:00 +0000
+++ openlp.conf 2012-05-16 22:00:26 +0000
@@ -0,0 +1,26 @@
+[bibles]
+status = 1
+
+[media]
+status = 1
+
+[alerts]
+status = 1
+
+[presentations]
+status = 1
+
+[custom]
+status = 1
+
+[remotes]
+status = 0
+
+[images]
+status = 1
+
+[songusage]
+status = 1
+
+[songs]
+status = 1
=== added file 'psvince.dll'
Binary files psvince.dll 1970-01-01 00:00:00 +0000 and psvince.dll 2012-05-16 22:00:26 +0000 differ
=== added file 'windows-builder.py'
--- windows-builder.py 1970-01-01 00:00:00 +0000
+++ windows-builder.py 2012-05-16 22:00:26 +0000
@@ -0,0 +1,675 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2011 Raoul Snyman #
+# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael #
+# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, #
+# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, #
+# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode #
+# Woldsund #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it #
+# under the terms of the GNU General Public License as published by the Free #
+# Software Foundation; version 2 of the License. #
+# #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
+# more details. #
+# #
+# You should have received a copy of the GNU General Public License along #
+# with this program; if not, write to the Free Software Foundation, Inc., 59 #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
+###############################################################################
+
+"""
+Windows Build Script
+--------------------
+
+This script is used to build the Windows binary and the accompanying installer.
+For this script to work out of the box, it depends on a number of things:
+
+Python 2.6/2.7
+
+PyQt4
+ You should already have this installed, OpenLP doesn't work without it. The
+ version the script expects is the packaged one available from River Bank
+ Computing.
+
+PyEnchant
+ This script expects the precompiled, installable version of PyEnchant to be
+ installed. You can find this on the PyEnchant site.
+
+Inno Setup 5
+ Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5"
+
+Sphinx
+ This is used to build the documentation. The documentation trunk must be at
+ the same directory level as OpenLP trunk and named "documentation".
+
+HTML Help Workshop
+ This is used to create the help file.
+
+PyInstaller
+ PyInstaller should be a checkout of revision 1470 of trunk, and in a
+ directory called, "pyinstaller" on the same level as OpenLP's Bazaar shared
+ repository directory. The revision is very important as there is currently
+ a major regression in HEAD.
+
+ To install PyInstaller, first checkout trunk from Subversion. The easiest
+ way is to install TortoiseSVN and then checkout the following URL to a
+ directory called "pyinstaller"::
+
+ http://svn.pyinstaller.org/trunk
+
+Bazaar
+ You need the command line "bzr" client installed.
+
+OpenLP
+ A checkout of the latest code, in a branch directory, which is in a Bazaar
+ shared repository directory. This means your code should be in a directory
+ structure like this: "openlp\branch-name".
+
+Visual C++ 2008 Express Edition
+ This is to build pptviewlib.dll, the library for controlling the
+ PowerPointViewer.
+
+windows-builder.py
+ This script, of course. It should be in the "windows-installer" directory
+ at the same level as OpenLP trunk.
+
+psvince.dll
+ This dll is used during the actual install of OpenLP to check if OpenLP is
+ running on the users machine prior to the setup. If OpenLP is running,
+ the install will fail. The dll can be obtained from here:
+
+ http://www.vincenzo.net/isxkb/index.php?title=PSVince)
+
+ The dll is presently included with this script.
+
+Mako
+ Mako Templates for Python. This package is required for building the
+ remote plugin. It can be installed by going to your
+ python_directory\scripts\.. and running "easy_install Mako". If you do not
+ have easy_install, the Mako package can be obtained here:
+
+ http://www.makotemplates.org/download.html
+
+SQLAlchemy Migrate
+ Required for the databases used in OpenLP. The package can be
+ obtained here:
+
+ http://code.google.com/p/sqlalchemy-migrate/
+
+Portable App Builds
+ The following are required if you are planning to make a portable build of
+ OpenLP. The portable build conforms to the standards published by
+ PortableApps.com:
+
+ http://portableapps.com/development/portableapps.com_format
+
+ PortableApps.com Installer:
+
+ http://portableapps.com/apps/development/portableapps.com_installer
+
+ PortableApps.com Launcher:
+
+ http://portableapps.com/apps/development/portableapps.com_launcher
+
+ NSIS Portable (Unicode version):
+
+ http://portableapps.com/apps/development/nsis_portable
+"""
+
+import os
+import sys
+from shutil import copy, rmtree, copytree
+from subprocess import Popen, PIPE
+from ConfigParser import SafeConfigParser as ConfigParser
+from argparse import ArgumentParser
+
+
+class WindowsBuilder(object):
+ """
+ The :class:`WindowsBuilder` class encapsulates everything that is needed
+ to build a Windows installer.
+ """
+ def __init__(self):
+ self.setup_args()
+ self.setup_system_paths()
+ self.read_config()
+ self.setup_executables()
+ self.setup_paths()
+ self.version =u''
+
+ def _print(self, text, *args):
+ """
+ Print stuff out. Later we might want to use a log file.
+ """
+ if len(args) > 0:
+ text = text % tuple(args)
+ print text
+
+ def _print_verbose(self, text, *args):
+ """
+ Print output, obeying "verbose" mode.
+ """
+ if self.args.verbose:
+ self._print(text, *args)
+
+ def setup_args(self):
+ """
+ Set up an argument parser and parse the command line arguments.
+ """
+ parser = ArgumentParser()
+ parser.add_argument('-b', '--branch', metavar='BRANCH', dest='branch',
+ help='Specify the path to the branch you wish to build.',
+ default='../trunk')
+ parser.add_argument('-d', '--documentation', metavar='DOCS',
+ dest='docs', default=os.path.join('..', 'documentation'),
+ help='Specify the path to the documentation branch.')
+ parser.add_argument('-c', '--config', metavar='CONFIG', dest='config',
+ help='Specify the path to the configuration file.',
+ default=os.path.abspath(os.path.join('.', 'config.ini')))
+ parser.add_argument('-u', '--skip-update', dest='skip_update',
+ action='store_true', default=False,
+ help='Do NOT update the branch before building.')
+ parser.add_argument('-p', '--portable', metavar='PORTABLE',
+ dest='portable', default=u'',
+ help='Specify the path to build the portable installation.')
+ parser.add_argument('-t', '--skip-translations',
+ dest='skip_translations', action='store_true', default=False,
+ help='Do NOT update the language translation files.')
+ parser.add_argument('-v', '--verbose', dest='verbose',
+ action='store_true', default=False,
+ help='Print out additional information.')
+ self.args = parser.parse_args()
+
+ def read_config(self):
+ """
+ Read the configuration from the configuration file.
+ """
+ self.config = ConfigParser(defaults={
+ u'pyroot': self.python_root,
+ u'progfiles': self.program_files,
+ u'sitepackages': self.site_packages,
+ u'here': self.script_path
+ })
+ self.config.read(os.path.abspath(self.args.config))
+
+ def setup_system_paths(self):
+ """
+ Set up some system paths.
+ """
+ self.script_path = os.path.split(os.path.abspath(__file__))[0]
+ self.python = sys.executable
+ self.python_root = os.path.split(self.python)[0]
+ self.site_packages = os.path.join(self.python_root,
+ u'Lib', u'site-packages')
+ self.program_files = os.getenv(u'PROGRAMFILES')
+
+ def setup_executables(self):
+ """
+ Set up the paths to the executables we use.
+ """
+ self.innosetup = os.path.abspath(
+ self.config.get(u'executables', u'innosetup'))
+ self.sphinx = os.path.abspath(
+ self.config.get(u'executables', u'sphinx'))
+ self.pyinstaller = os.path.abspath(
+ self.config.get(u'executables', u'pyinstaller'))
+ self.vcbuild = os.path.abspath(
+ self.config.get(u'executables', u'vcbuild'))
+ self.hhc = os.path.abspath(
+ self.config.get(u'executables', u'htmlhelp'))
+ self.psvince = os.path.abspath(
+ self.config.get(u'executables', u'psvince'))
+ self.portableinstaller = os.path.abspath(
+ self.config.get(u'executables', u'portableinstaller'))
+ self.portablelauncher = os.path.abspath(
+ self.config.get(u'executables', u'portablelauncher'))
+ if os.path.exists(os.path.join(self.site_packages, u'PyQt4', u'bin')):
+ # Older versions of the PyQt4 Windows installer put their binaries
+ # in the "bin" directory
+ self.lrelease = os.path.join(self.site_packages, u'PyQt4',
+ u'bin', u'lrelease.exe')
+ else:
+ # Newer versions of the PyQt4 Windows installer put their binaries
+ # in the base directory of the installation
+ self.lrelease = os.path.join(self.site_packages, u'PyQt4',
+ u'lrelease.exe')
+
+ def setup_paths(self):
+ """
+ Set up a variety of paths that we use throughout the build process.
+ """
+ if self.args.branch:
+ branch_path = self.args.branch
+ else:
+ branch_path = self.config.get(u'paths', u'branch')
+ self.branch_path = os.path.abspath(branch_path)
+ if self.args.docs:
+ docs_path = self.args.docs
+ else:
+ docs_path = self.config.get(u'paths', u'documentation')
+ self.docs_path = os.path.abspath(docs_path)
+ if self.args.portable:
+ portable_path = self.args.portable
+ else:
+ portable_path = self.config.get(u'paths', u'portable')
+ self.portable_path = os.path.abspath(portable_path)
+ self.openlp_script = os.path.abspath(
+ os.path.join(branch_path, u'openlp.pyw'))
+ self.hooks_path = os.path.abspath(self.config.get(u'paths', u'hooks'))
+ self.win32_icon = os.path.abspath(
+ self.config.get(u'paths', u'win32icon'))
+ self.i18n_utils = os.path.join(self.branch_path, u'scripts',
+ u'translation_utils.py')
+ self.source_path = os.path.join(self.branch_path, u'openlp')
+ self.manual_path = os.path.join(self.docs_path, u'manual')
+ self.manual_build_path = os.path.join(self.manual_path, u'build')
+ self.helpfile_path = os.path.join(self.manual_build_path, u'htmlhelp')
+ self.i18n_path = os.path.join(self.branch_path, u'resources', u'i18n')
+ self.winres_path = os.path.join(self.branch_path, u'resources',
+ u'windows')
+ self.build_path = os.path.join(self.branch_path, u'build')
+ self.dist_path = os.path.join(self.branch_path, u'dist', u'OpenLP')
+ self.pptviewlib_path = os.path.join(self.source_path, u'plugins',
+ u'presentations', u'lib', u'pptviewlib')
+
+ def update_code(self):
+ """
+ Update the code in the branch.
+ """
+ os.chdir(self.branch_path)
+ self._print(u'Reverting any changes to the code...')
+ bzr = Popen((u'bzr', u'revert'), stdout=PIPE)
+ output = bzr.communicate()[0]
+ code = bzr.wait()
+ if code != 0:
+ self._print(output)
+ raise Exception(u'Error reverting the code')
+ self._print(u'Updating the code...')
+ bzr = Popen((u'bzr', u'update'), stdout=PIPE)
+ output = bzr.communicate()[0]
+ code = bzr.wait()
+ if code != 0:
+ self._print(output)
+ raise Exception(u'Error updating the code')
+
+ def run_pyinstaller(self):
+ """
+ Run PyInstaller on the branch to build an executable.
+ """
+ self._print(u'Running PyInstaller...')
+ os.chdir(self.branch_path)
+ pyinstaller = Popen((self.python, self.pyinstaller,
+ u'--noconfirm',
+ u'--windowed',
+ u'--noupx',
+ u'--additional-hooks-dir', self.hooks_path,
+ u'--log-level=ERROR',
+ u'-o', self.branch_path,
+ u'-i', self.win32_icon,
+ u'-p', self.branch_path,
+ u'-n', u'OpenLP',
+ self.openlp_script),
+ stdout=PIPE)
+ output = pyinstaller.communicate()[0]
+ code = pyinstaller.wait()
+ if code != 0:
+ self._print(output)
+ raise Exception(u'Error running PyInstaller')
+
+ def write_version_file(self):
+ """
+ Write the version number to a file for reading once installed.
+ """
+ self._print(u'Writing version file...')
+ os.chdir(self.branch_path)
+ bzr = Popen((u'bzr', u'tags', u'--sort', u'time'), stdout=PIPE)
+ output = bzr.communicate()[0]
+ code = bzr.wait()
+ if code != 0:
+ raise Exception(u'Error running bzr tags')
+ lines = output.splitlines()
+ if len(lines) == 0:
+ tag = u'0.0.0'
+ revision = u'0'
+ else:
+ tag, revision = lines[-1].split()
+ bzr = Popen((u'bzr', u'log', u'--line', u'-r', u'-1'), stdout=PIPE)
+ output, error = bzr.communicate()
+ code = bzr.wait()
+ if code != 0:
+ raise Exception(u'Error running bzr log')
+ output_ascii = unicode(output, errors=u'ignore')
+ latest = output_ascii.split(u':')[0]
+ version_string = latest == revision and tag or \
+ u'%s-bzr%s' % (tag, latest)
+ # Save decimal version in case we need to do a portable build.
+ self.version = latest == revision and tag or\
+ u'%s.%s' % (tag, latest)
+ version_file = open(os.path.join(self.dist_path, u'.version'), u'w')
+ version_file.write(version_string)
+ version_file.close()
+
+ def copy_plugins(self):
+ """
+ Copy all the plugins to the correct directory so that OpenLP sees that
+ it has plugins.
+ """
+ self._print(u'Copying plugins...')
+ source = os.path.join(self.source_path, u'plugins')
+ dest = os.path.join(self.dist_path, u'plugins')
+ for root, dirs, files in os.walk(source):
+ for filename in files:
+ if not filename.endswith(u'.pyc'):
+ dest_path = os.path.join(dest, root[len(source)+1:])
+ if not os.path.exists(dest_path):
+ os.makedirs(dest_path)
+ self._print_verbose(u'... %s', filename)
+ copy(os.path.join(root, filename),
+ os.path.join(dest_path, filename))
+
+ def copy_media_player(self):
+ """
+ Copy the media players to the correct directory for OpenLP.
+ """
+ self._print(u'Copying media player...')
+ source = os.path.join(self.source_path, u'core', u'ui', u'media')
+ dest = os.path.join(self.dist_path, u'core', u'ui', u'media')
+ for root, dirs, files in os.walk(source):
+ for filename in files:
+ if not filename.endswith(u'.pyc'):
+ dest_path = os.path.join(dest, root[len(source)+1:])
+ if not os.path.exists(dest_path):
+ os.makedirs(dest_path)
+ self._print_verbose(u'... %s', filename)
+ copy(os.path.join(root, filename),
+ os.path.join(dest_path, filename))
+
+ def copy_windows_files(self):
+ """
+ Copy all the Windows-specific files.
+ """
+ self._print(u'Copying extra files for Windows...')
+ self._print_verbose(u'... OpenLP.ico')
+ copy(os.path.join(self.script_path, u'OpenLP.ico'),
+ os.path.join(self.dist_path, u'OpenLP.ico'))
+ self._print_verbose(u'... LICENSE.txt')
+ copy(os.path.join(self.script_path, u'LICENSE.txt'),
+ os.path.join(self.dist_path, u'LICENSE.txt'))
+ self._print_verbose(u'... psvince.dll')
+ copy(self.psvince, os.path.join(self.dist_path, u'psvince.dll'))
+ if os.path.isfile(os.path.join(self.helpfile_path, u'OpenLP.chm')):
+ self._print_verbose(u'... OpenLP.chm')
+ copy(os.path.join(self.helpfile_path, u'OpenLP.chm'),
+ os.path.join(self.dist_path, u'OpenLP.chm'))
+ else:
+ self._print(u'... WARNING: Windows help file not found')
+
+ def update_translations(self):
+ """
+ Update the translations.
+ """
+ self._print(u'Updating translations...')
+ if not self.config.has_section('transifex'):
+ raise Exception(u'No section named "transifex" found.')
+ if not self.config.has_option('transifex', 'username'):
+ raise Exception(u'No option named "username" found.')
+ if not self.config.has_option('transifex', 'password'):
+ raise Exception(u'No option named "password" found.')
+ username = self.config.get(u'transifex', u'username')
+ password = self.config.get(u'transifex', u'password')
+ os.chdir(os.path.split(self.i18n_utils)[0])
+ translation_utils = Popen([self.python, self.i18n_utils, u'-qdpu',
+ u'-U', username, u'-P', password])
+ code = translation_utils.wait()
+ if code != 0:
+ raise Exception(u'Error running translation_utils.py')
+
+ def compile_translations(self):
+ """
+ Compile the translations for Qt.
+ """
+ self._print(u'Compiling translations...')
+ files = os.listdir(self.i18n_path)
+ if not os.path.exists(os.path.join(self.dist_path, u'i18n')):
+ os.makedirs(os.path.join(self.dist_path, u'i18n'))
+ for file in files:
+ if file.endswith(u'.ts'):
+ self._print_verbose(u'... %s', file)
+ source_path = os.path.join(self.i18n_path, file)
+ dest_path = os.path.join(self.dist_path, u'i18n',
+ file.replace(u'.ts', u'.qm'))
+ lconvert = Popen((self.lrelease, u'-compress', u'-silent',
+ source_path, u'-qm', dest_path))
+ code = lconvert.wait()
+ if code != 0:
+ raise Exception(u'Error running lconvert on %s' % \
+ source_path)
+ self._print(u'Copying qm files...')
+ source = os.path.join(self.site_packages, u'PyQt4', u'translations')
+ files = os.listdir(source)
+ for filename in files:
+ if filename.startswith(u'qt_') and filename.endswith(u'.qm') and \
+ len(filename) == 8:
+ self._print_verbose(u'... %s', filename)
+ copy(os.path.join(source, filename),
+ os.path.join(self.dist_path, u'i18n', filename))
+
+ def run_sphinx(self):
+ """
+ Run Sphinx to build an HTML Help project.
+ """
+ self._print(u'Deleting previous manual build... %s',
+ self.manual_build_path)
+ if os.path.exists(self.manual_build_path):
+ rmtree(self.manual_build_path)
+ self._print(u'Running Sphinx...')
+ os.chdir(self.manual_path)
+ sphinx = Popen((self.sphinx, u'-b', u'htmlhelp', u'-d',
+ u'build/doctrees', u'source', u'build/htmlhelp'), stdout=PIPE)
+ output, error = sphinx.communicate()
+ code = sphinx.wait()
+ if code != 0:
+ self._print(output)
+ raise Exception(u'Error running Sphinx')
+
+ def run_htmlhelp(self):
+ """
+ Run HTML Help Workshop to convert the Sphinx output into a manual.
+ """
+ self._print(u'Running HTML Help Workshop...')
+ os.chdir(os.path.join(self.manual_build_path, u'htmlhelp'))
+ hhc = Popen((self.hhc, u'OpenLP.chm'), stdout=PIPE)
+ output, error = hhc.communicate()
+ code = hhc.wait()
+ if code != 1:
+ self._print(u'Exit code:', code)
+ self._print(output)
+ raise Exception(u'Error running HTML Help Workshop')
+
+ def create_innosetup_file(self):
+ """
+ Create an InnoSetup file pointing to the branch being built.
+ """
+ self._print(u'Creating Inno Setup file...')
+ input = open(os.path.join(self.script_path,
+ u'OpenLP-2.0.iss.default'), u'r').read()
+ output = input.replace(u'%(branch)s', self.branch_path)
+ outfile = open(os.path.join(self.script_path,
+ u'OpenLP-2.0.iss'), u'w')
+ outfile.write(output)
+ outfile.close()
+
+ def check_portableapp_directory(self):
+ """
+ Checks the PortableApp directory structure amd creates
+ missing subdirs
+ """
+ self._print(u' Checking PortableApps directory structure...')
+ launcher_path = os.path.join(self.portable_path, u'App',
+ u'Appinfo', u'Launcher')
+ if not os.path.exists(launcher_path):
+ os.makedirs(launcher_path)
+ settings_path = os.path.join(self.portable_path, u'Data',
+ u'Settings')
+ if not os.path.exists(settings_path):
+ os.makedirs(settings_path)
+
+ def create_portableapps_appinfo_file(self):
+ """
+ Create a Portabbleapps appinfo.ini file.
+ """
+ self._print(u' Creating PortableApps appinfo file ...')
+ input = open(os.path.join(self.script_path,
+ u'appinfo.ini.default'), u'r').read()
+ output = input.replace(u'%(Version)s', self.version)
+ outfile = open(os.path.join(self.portable_path, u'app',
+ u'appinfo', u'appinfo.ini'), u'w')
+ outfile.write(output)
+ outfile.close()
+
+ def run_innosetup(self):
+ """
+ Run InnoSetup to create an installer.
+ """
+ self._print(u'Running Inno Setup...')
+ os.chdir(self.script_path)
+ innosetup = Popen((self.innosetup,
+ os.path.join(self.script_path, u'OpenLP-2.0.iss'), u'/q'))
+ code = innosetup.wait()
+ if code != 0:
+ raise Exception(u'Error running Inno Setup')
+
+ def run_portableapp_builder(self):
+ """
+ Creates a portable installer.
+ 1 Copies the distribution to the portable apps directory
+ 2 Builds the PortableApps Launcher
+ 3 Builds the PortableApps Install
+ """
+ self._print(u'Running PortableApps Builder...')
+ self.check_portableapp_directory()
+ self.create_portableapps_appinfo_file()
+ self._print(u' Copying distribution files')
+ portable_app_path = os.path.join(self.portable_path, u'App', u'OpenLP')
+ # Copy distribution files to portableapp build directory.
+ if os.path.exists(portable_app_path):
+ rmtree(portable_app_path)
+ copytree(self.dist_path, portable_app_path)
+ # Copy the icons.
+ copy(os.path.join(self.script_path, u'OpenLP.ico'),
+ os.path.join(self.portable_path, u'app',
+ u'appinfo', u'appicon.ico'))
+ copy(os.path.join(self.script_path, u'openlp-logo-16x16.png'),
+ os.path.join(self.portable_path, u'app',
+ u'appinfo', u'appicon_16.png'))
+ copy(os.path.join(self.script_path, u'openlp-logo-32x32.png'),
+ os.path.join(self.portable_path, u'app',
+ u'appinfo', u'appicon_32.png'))
+ # Copy the launcher config ini file
+ launcher_path = os.path.join(self.portable_path, u'app',
+ u'appinfo', u'Launcher')
+ if not os.path.exists(launcher_path):
+ os.mkdir(launcher_path)
+ copy(os.path.join(self.script_path, u'OpenLPPortableLauncher.ini'),
+ os.path.join(launcher_path, u'OpenLPPortable.ini'))
+ # Copy the Help.html file
+ copy(os.path.join(self.script_path, u'Help.html'),self.portable_path)
+ # Build the launcher.
+ self._print(u' Building PortableApps Launcher')
+ portableapps = Popen((self.portablelauncher, self.portable_path),
+ stdout=PIPE)
+ code = portableapps.wait()
+ if code != 0:
+ raise Exception(u'Error Portableapps Launcher')
+ # Build the portable installer.
+ self._print(u' Building PortableApps Installer')
+ portableapps = Popen((self.portableinstaller, self.portable_path),
+ stdout=PIPE)
+ code = portableapps.wait()
+ if code != 0:
+ raise Exception(u'Error Portableapps Installer')
+ portable_app = os.path.abspath(os.path.join(self.portable_path, u'..',
+ u'OpenLPPortable_%s.paf.exe' % self.version))
+ if os.path.exists(portable_app):
+ copy(portable_app, os.path.abspath(
+ os.path.join(self.dist_path, u'..')))
+ self._print(u' PortableApp build complete')
+ else:
+ raise Exception(u'Error Portableapps Installer')
+
+ def build_pptviewlib(self):
+ """
+ Build the PowerPoint Viewer DLL using Visual Studio.
+ """
+ self._print(u'Building PPTVIEWLIB.DLL...')
+ vcbuild = Popen((self.vcbuild, u'/rebuild',
+ os.path.join(self.pptviewlib_path, u'pptviewlib.vcproj'),
+ u'Release|Win32'))
+ code = vcbuild.wait()
+ if code != 0:
+ raise Exception(u'Error building pptviewlib.dll')
+ copy(os.path.join(self.pptviewlib_path, u'Release',
+ u'pptviewlib.dll'), self.pptviewlib_path)
+
+ def main(self):
+ """
+ The main function to run the Windows builder.
+ """
+ self._print_verbose(u'OpenLP main script: ......%s',
+ self.openlp_script)
+ self._print_verbose(u'Script path: .............%s',
+ os.path.split(os.path.abspath(__file__))[0])
+ self._print_verbose(u'Branch path: .............%s', self.branch_path)
+ self._print_verbose(u'Source path: .............%s', self.source_path)
+ self._print_verbose(u'"dist" path: .............%s', self.dist_path)
+ self._print_verbose(u'"Portable" path: .........%s',
+ self.portable_path)
+ self._print_verbose(u'PyInstaller: .............%s', self.pyinstaller)
+ self._print_verbose(u'Documentation branch path:%s', self.docs_path)
+ self._print_verbose(u'Help file build path: ....%s',
+ self.helpfile_path)
+ self._print_verbose(u'Inno Setup path: .........%s', self.innosetup)
+ self._print_verbose(u'PortableApp Launcher......%s',
+ self.portablelauncher)
+ self._print_verbose(u'PortableApp Installer.....%s',
+ self.portableinstaller)
+ self._print_verbose(u'Windows resources: .......%s', self.winres_path)
+ self._print_verbose(u'VCBuild path: ............%s', self.vcbuild)
+ self._print_verbose(u'PPTVIEWLIB path: .........%s',
+ self.pptviewlib_path)
+ self._print_verbose(u'')
+ if not self.args.skip_update:
+ self.update_code()
+ self.build_pptviewlib()
+ self.run_pyinstaller()
+ self.write_version_file()
+ self.copy_plugins()
+ self.copy_media_player()
+ if os.path.exists(self.manual_path):
+ self.run_sphinx()
+ self.run_htmlhelp()
+ else:
+ self._print(u'')
+ self._print(u'WARNING: Documentation trunk not found. Windows')
+ self._print(u' Help file will not be included in build')
+ self._print(u'')
+ self.copy_windows_files()
+ if not self.args.skip_translations:
+ self.update_translations()
+ self.compile_translations()
+ self.create_innosetup_file()
+ self.run_innosetup()
+ if self.args.portable:
+ self.run_portableapp_builder()
+ self._print(u'Done.')
+
+if __name__ == u'__main__':
+ WindowsBuilder().main()
Follow ups