<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mariush T. - Flex Developer, Blogger &#187; Adobe AIR</title>
	<atom:link href="http://mariusht.com/blog/tag/adobe-air/feed/" rel="self" type="application/rss+xml" />
	<link>http://mariusht.com/blog</link>
	<description>A blog about Flex Development.</description>
	<lastBuildDate>Tue, 11 Oct 2011 08:56:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Creating a custom application updater</title>
		<link>http://mariusht.com/blog/2009/12/08/creating-a-custom-application-updater/</link>
		<comments>http://mariusht.com/blog/2009/12/08/creating-a-custom-application-updater/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 16:40:20 +0000</pubDate>
		<dc:creator>Mariush T.</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[application updater]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Updater UI]]></category>

		<guid isPermaLink="false">http://mariusht.com/blog/?p=1548</guid>
		<description><![CDATA[In above image you can see the custom application updater interface I have created for my NoteList application. You would see this updater interface only if updated application is available for download. Clicking the &#8216;Download and Upload&#8217; button downloads updated .air file and updates current application.

Below you can see the source code for updating an [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="border: 1px solid #CCCCCC;" src="http://mariusht.com/files/blog/custom_application_updater/customUpdater.jpg" alt="" width="656" height="113" />In above image you can see the custom application updater interface I have created for my <a href="http://mariusht.com/products/notelist/">NoteList</a> application. You would see this updater interface only if updated application is available for download. Clicking the &#8216;Download and Upload&#8217; button downloads updated .air file and updates current application.<br />
<span id="more-1548"></span><br />
Below you can see the source code for updating an AIR app. The following code shows you how to:<br />
1. Load the update descriptor file.</p>
<pre class="MXML"><span class="ActionScriptComment">// load the update-descriptor
</span><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">loader</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">URLLoader</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">URLLoader</span>;
<span class="ActionScriptDefault_Text">loader</span>.<span class="ActionScriptDefault_Text">addEventListener</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">Event</span>.<span class="ActionScriptDefault_Text">COMPLETE</span>, <span class="ActionScriptDefault_Text">onLoadComplete</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScriptDefault_Text">loader</span>.<span class="ActionScriptDefault_Text">load</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">URLRequest</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&apos;http://mariusht.com/files/products/notelist/update.xml&apos;</span><span class="ActionScriptBracket/Brace">))</span>;</pre>
<p>2. Check and see if a user has the latest version of an AIR app installed.</p>
<pre class="MXML"><span class="ActionScriptReserved">private</span> <span class="ActionScriptfunction">function</span> <span class="ActionScriptDefault_Text">onLoadComplete</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">event</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Event</span><span class="ActionScriptBracket/Brace">)</span><span class="ActionScriptOperator">:</span><span class="ActionScriptReserved">void</span>
<span class="ActionScriptBracket/Brace">{</span>
    <span class="ActionScriptComment">// ignore xml declaration
</span>    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">str</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">String</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">URLLoader</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">event</span>.<span class="ActionScriptDefault_Text">target</span><span class="ActionScriptBracket/Brace">)</span>.<span class="ActionScriptDefault_Text">data</span> <span class="ActionScriptReserved">as</span> <span class="ActionScriptDefault_Text">String</span>;
    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">index</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">int</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">str</span>.<span class="ActionScriptDefault_Text">indexOf</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&apos;&lt;update&apos;</span><span class="ActionScriptBracket/Brace">)</span>;
    <span class="ActionScriptDefault_Text">str</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">str</span>.<span class="ActionScriptDefault_Text">substr</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">index</span>, <span class="ActionScriptDefault_Text">str</span>.<span class="ActionScriptDefault_Text">length</span><span class="ActionScriptBracket/Brace">)</span>;

    <span class="ActionScriptComment">// convert String to XML
</span>    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">remoteAppXML</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">XML</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">XML</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">str</span><span class="ActionScriptBracket/Brace">)</span>;
    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">ns</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Namespace</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">remoteAppXML</span>.<span class="ActionScriptDefault_Text">namespace</span><span class="ActionScriptBracket/Brace">()</span>;

    <span class="ActionScriptComment">// get new version number
</span>    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">version</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">String</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">remoteAppXML</span>.<span class="ActionScriptDefault_Text">ns</span><span class="ActionScriptOperator">::</span><span class="ActionScriptDefault_Text">version</span>;

    <span class="ActionScriptComment">// get current version number
</span>    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">appXML</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">XML</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">NativeApplication</span>.<span class="ActionScriptDefault_Text">nativeApplication</span>.<span class="ActionScriptDefault_Text">applicationDescriptor</span>;
    <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">ns</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Namespace</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">appXML</span>.<span class="ActionScriptDefault_Text">namespace</span><span class="ActionScriptBracket/Brace">()</span>;
    <span class="ActionScriptDefault_Text">currentVersion</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">appXML</span>.<span class="ActionScriptDefault_Text">ns</span><span class="ActionScriptOperator">::</span><span class="ActionScriptDefault_Text">version</span>;

    <span class="ActionScriptReserved">if</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">currentVersion</span> <span class="ActionScriptOperator">!=</span> <span class="ActionScriptDefault_Text">version</span><span class="ActionScriptBracket/Brace">)</span>
    <span class="ActionScriptBracket/Brace">{</span>
        <span class="ActionScriptComment">// download AIR file
</span>    <span class="ActionScriptBracket/Brace">}</span>
<span class="ActionScriptBracket/Brace">}</span></pre>
<p>3. Download and save the AIR file. Don&#8217;t forget to call Updater.update() function.</p>
<pre class="MXML"><span class="ActionScriptReserved">public</span> <span class="ActionScriptclass">class</span> <span class="ActionScriptDefault_Text">UpdateAppCommand</span> <span class="ActionScriptReserved">extends</span> <span class="ActionScriptDefault_Text">SimpleCommand</span> <span class="ActionScriptReserved">implements</span> <span class="ActionScriptDefault_Text">ICommand</span>
<span class="ActionScriptBracket/Brace">{</span>
    <span class="ActionScriptReserved">override</span> <span class="ActionScriptReserved">public</span> <span class="ActionScriptfunction">function</span> <span class="ActionScriptDefault_Text">execute</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">note</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">INotification</span><span class="ActionScriptBracket/Brace">)</span><span class="ActionScriptOperator">:</span><span class="ActionScriptReserved">void</span>
    <span class="ActionScriptBracket/Brace">{</span>
        <span class="ActionScriptComment">// download updated .air file
</span>        <span class="ActionScriptDefault_Text">urlStream</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">URLStream</span><span class="ActionScriptBracket/Brace">()</span>;
        <span class="ActionScriptDefault_Text">fileData</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">ByteArray</span><span class="ActionScriptBracket/Brace">()</span>;
        <span class="ActionScriptDefault_Text">urlStream</span>.<span class="ActionScriptDefault_Text">addEventListener</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">Event</span>.<span class="ActionScriptDefault_Text">COMPLETE</span>, <span class="ActionScriptDefault_Text">loaded</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptDefault_Text">urlStream</span>.<span class="ActionScriptDefault_Text">load</span><span class="ActionScriptBracket/Brace">(</span>
            <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">URLRequest</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&apos;http://mariusht.com/files/products/notelist/NoteList.air&apos;</span><span class="ActionScriptBracket/Brace">))</span>;
    <span class="ActionScriptBracket/Brace">}</span> 

    <span class="ActionScriptReserved">private</span> <span class="ActionScriptfunction">function</span> <span class="ActionScriptDefault_Text">loaded</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">event</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Event</span><span class="ActionScriptBracket/Brace">)</span><span class="ActionScriptOperator">:</span><span class="ActionScriptReserved">void</span>
    <span class="ActionScriptBracket/Brace">{</span>
        <span class="ActionScriptDefault_Text">urlStream</span>.<span class="ActionScriptDefault_Text">readBytes</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">fileData</span>, 0, <span class="ActionScriptDefault_Text">urlStream</span>.<span class="ActionScriptDefault_Text">bytesAvailable</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptDefault_Text">writeAirFile</span><span class="ActionScriptBracket/Brace">()</span>;
    <span class="ActionScriptBracket/Brace">}</span> 

    <span class="ActionScriptReserved">private</span> <span class="ActionScriptfunction">function</span> <span class="ActionScriptDefault_Text">writeAirFile</span><span class="ActionScriptBracket/Brace">()</span><span class="ActionScriptOperator">:</span><span class="ActionScriptReserved">void</span>
    <span class="ActionScriptBracket/Brace">{</span>
        <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">file</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">File</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">File</span>.<span class="ActionScriptDefault_Text">applicationStorageDirectory</span>.<span class="ActionScriptDefault_Text">resolvePath</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">&apos;NoteList.air&apos;</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">fileStream</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">FileStream</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">FileStream</span>;
        <span class="ActionScriptDefault_Text">fileStream</span>.<span class="ActionScriptDefault_Text">open</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">file</span>, <span class="ActionScriptDefault_Text">FileMode</span>.<span class="ActionScriptDefault_Text">WRITE</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptDefault_Text">fileStream</span>.<span class="ActionScriptDefault_Text">writeBytes</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">fileData</span>, 0, <span class="ActionScriptDefault_Text">fileData</span>.<span class="ActionScriptDefault_Text">length</span><span class="ActionScriptBracket/Brace">)</span>;
        <span class="ActionScriptDefault_Text">fileStream</span>.<span class="ActionScriptDefault_Text">close</span><span class="ActionScriptBracket/Brace">()</span>;

        <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">versionProxy</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">VersionProxy</span> <span class="ActionScriptOperator">=</span>
            <span class="ActionScriptDefault_Text">facade</span>.<span class="ActionScriptDefault_Text">retrieveProxy</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">VersionProxy</span>.<span class="ActionScriptDefault_Text">NAME</span><span class="ActionScriptBracket/Brace">)</span> <span class="ActionScriptReserved">as</span> <span class="ActionScriptDefault_Text">VersionProxy</span>;
        <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">updater</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Updater</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptReserved">new</span> <span class="ActionScriptDefault_Text">Updater</span>;
        <span class="ActionScriptDefault_Text">updater</span>.<span class="ActionScriptDefault_Text">update</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">file</span>, <span class="ActionScriptDefault_Text">versionProxy</span>.<span class="ActionScriptDefault_Text">version</span><span class="ActionScriptBracket/Brace">)</span>;
    <span class="ActionScriptBracket/Brace">}</span> 

    <span class="ActionScriptReserved">private</span> <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">urlStream</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">URLStream</span>;
    <span class="ActionScriptReserved">private</span> <span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">fileData</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">ByteArray</span>;</pre>
<p>Related Links:<br />
<a href="http://help.adobe.com/en_US/AIR/1.5/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7ff2.html">Updating AIR applications (Adobe AIR 1.5 LiveDocs)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mariusht.com/blog/2009/12/08/creating-a-custom-application-updater/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

