<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Creative in Austria &#187; Development</title>
	<atom:link href="http://creativeinaustria.wordpress.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://creativeinaustria.wordpress.com</link>
	<description>Just another WordPress.com site</description>
	<lastBuildDate>Tue, 08 May 2012 13:54:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='creativeinaustria.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Creative in Austria &#187; Development</title>
		<link>http://creativeinaustria.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://creativeinaustria.wordpress.com/osd.xml" title="Creative in Austria" />
	<atom:link rel='hub' href='http://creativeinaustria.wordpress.com/?pushpress=hub'/>
		<item>
		<title>AudioSessionInitialize Workarounds</title>
		<link>http://creativeinaustria.wordpress.com/2008/12/25/audiosessioninitialize-workarounds/</link>
		<comments>http://creativeinaustria.wordpress.com/2008/12/25/audiosessioninitialize-workarounds/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 19:17:44 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/?p=118</guid>
		<description><![CDATA[Yesterday I decided to go after one of my audio bugs by take a look how AVAudioPlayer does it right, and I discovered a little thing about Audio Session. Here are two workarounds for AudioSessionInitialize. I never liked AudioSessionInitialize because &#8230; <a href="http://creativeinaustria.wordpress.com/2008/12/25/audiosessioninitialize-workarounds/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=118&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:20px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2008/12/7bbf2217-d3fc-4c96-8948-8b7e1b16c17b.jpg" alt="Core Audio" border="0" width="96" height="96" /></div>
<p>
Yesterday I decided to go after one of my audio bugs by take a look how <a href="http://developer.apple.com/iphone/library/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html" target="_blank">AVAudioPlayer</a> does it right, and I discovered a little thing about Audio Session.
</p>
<p>
Here are two workarounds for <a href="http://developer.apple.com/iphone/library/documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html#//apple_ref/c/func/AudioSessionInitialize" target="_blank">AudioSessionInitialize</a>.
</p>
<p><span id="more-118"></span>
<p>
I never liked AudioSessionInitialize because you can set the InterruptionListener and it&#8217;s ClientData just once:
</p>
<div style="text-align:left;color:#000000;background-color:#ffffff;border:solid black 1px;overflow:auto;font-size:small;font-family:monospace;padding:.5em 1em;"><span style="color:#236e25;">/*<br />
&nbsp;* Discussion<br />
&nbsp;* Your application must call this function before making any other Audio<br />
&nbsp;* Session Services calls. You may activate and deactivate your audio session<br />
&nbsp;* as needed (see AudioSessionSetActive), but should initialize it only once.<br />
&nbsp;*/</span><br />
OSStatus <span style="color:#003369;">AudioSessionInitialize </span>(<br />
&nbsp;&nbsp;&nbsp;CFRunLoopRef &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inRunLoop,<br />
&nbsp;&nbsp;&nbsp;CFStringRef &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inRunLoopMode,<br />
&nbsp;&nbsp;&nbsp;AudioSessionInterruptionListener &nbsp;&nbsp;&nbsp;inInterruptionListener,<br />
&nbsp;&nbsp;&nbsp;<span style="color:#881350;">void</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*inClientData<br />
);</div>
<p>So you need a helper class like this where you have to set the active AudioPlayer:</p>
<div style="text-align:left;color:#000000;background-color:#ffffff;border:solid black 1px;overflow:auto;font-size:small;font-family:monospace;padding:.5em 1em;">
<span style="color:#683821;">#import &quot;AudioInterruptionListener.h&quot;<br />
</span><br />
<span style="color:#881350;">void</span> <span style="color:#003369;">interruptionListenerCallback </span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">void</span> *inUserData,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">UInt32</span> &nbsp;&nbsp;interruptionState<br />
) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;AudioInterruptionListener *listener = (AudioInterruptionListener *) <span style="color:#6c0540;">inUserData</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;DoItYourselfPlayer *player = listener.doItYourselfPlayer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">if</span><span style="color:#003369;"> </span>(!player)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">return</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">if</span><span style="color:#003369;"> </span>(interruptionState == kAudioSessionBeginInterruption) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[player <span style="color:#6c0540;">performSelectorOnMainThread:</span><span style="color:#881350;">@selector</span>(audioStreamPlayerBeginInterruption)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">withObject:</span><span style="color:#881350;">nil</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">waitUntilDone:</span><span style="color:#881350;">YES</span>]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <span style="color:#881350;">else</span> <span style="color:#881350;">if</span><span style="color:#003369;"> </span>((interruptionState == kAudioSessionEndInterruption)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[player <span style="color:#6c0540;">performSelectorOnMainThread:</span><span style="color:#881350;">@selector</span>(audioStreamPlayerEndInterruption)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">withObject:</span><span style="color:#881350;">nil</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">waitUntilDone:</span><span style="color:#881350;">YES</span>]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p><span style="color:#881350;">@implementation</span> AudioInterruptionListener</p>
<p><span style="color:#881350;">static</span> AudioInterruptionListener *sharedAudioInterruptionListener;</p>
<p><span style="color:#881350;">@synthesize</span> doItYourselfPlayer;</p>
<p>+ (<span style="color:#881350;">void</span>)<span style="color:#6c0540;">initialize</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">if</span><span style="color:#003369;"> </span>(!sharedAudioInterruptionListener) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sharedAudioInterruptionListener = [[AudioInterruptionListener <span style="color:#ff0000;">alloc</span>] <span style="color:#6c0540;">init</span>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#003369;">AudioSessionInitialize </span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">NULL</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">NULL</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interruptionListenerCallback,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sharedAudioInterruptionListener<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p>+ (AudioInterruptionListener *)sharedAudioInterruptionListener <br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">return</span> sharedAudioInterruptionListener;<br />
}</p>
<p><span style="color:#881350;">@end</span>
</div>
<p>This is fine, but I was no big fan of this helper class when I wrote it.</p>
<p><a href="http://developer.apple.com/iphone/library/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html" target="_blank">AVAudioPlayer</a> works without such helper class, but how? Well don&#8217;t do this at home, because &#8216;intr&#8217; is not documented in <a href="http://developer.apple.com/iphone/library/documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html#//apple_ref/doc/constant_group/Audio_Session_Services_Property_Identifiers" target="_blank">“Audio Session Services Property Identifiers.”</a>, but you can also add an InterruptionListener with <a href="http://developer.apple.com/iphone/library/documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html#//apple_ref/c/func/AudioSessionAddPropertyListener" target="_blank">AudioSessionAddPropertyListener</a>, the code should look something along this lines:</p>
<div style="text-align:left;color:#000000;background-color:#ffffff;border:solid black 1px;overflow:auto;font-size:small;font-family:monospace;padding:.5em 1em;">
- (<span style="color:#881350;">BOOL</span>)<span style="color:#6c0540;">prepareToPlay</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#003369;">pthread_once</span>(&amp;interruptionListenerOneTimeInit, interruptionListenerInit);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#003369;">AudioSessionAddPropertyListener</span>(&#8216;intr&#8217;, interruptionListenerCallback, <span style="color:#881350;">self</span>);<br />
}</p>
<p>- (<span style="color:#881350;">void</span>)<span style="color:#6c0540;">stop</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#003369;">AudioSessionRemovePropertyListenerWithUserData</span>(&#8216;intr&#8217;, interruptionListenerCallback, <span style="color:#881350;">self</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
}</p>
<p><span style="color:#683821;">#pragma mark -<br />
#pragma mark Audio Session Implementations<br />
</span><br />
pthread_once_t &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interruptionListenerOneTimeInit = PTHREAD_ONCE_INIT;</p>
<p><span style="color:#881350;">void</span> <span style="color:#003369;">interruptionListenerInit</span>(<span style="color:#881350;">void</span>)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#003369;">AudioSessionInitialize</span>(<span style="color:#881350;">NULL</span>, <span style="color:#881350;">NULL</span>, <span style="color:#881350;">NULL</span>, <span style="color:#881350;">NULL</span>);<br />
}</p>
<p><span style="color:#881350;">void</span> <span style="color:#003369;">interruptionListenerCallback </span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">void</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*inClientData,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AudioSessionPropertyID &nbsp;&nbsp;&nbsp;inID,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">UInt32</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inDataSize,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">const</span> <span style="color:#881350;">void</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*inData<br />
) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;DoItYourselfPlayer *player = inClientData;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">if</span><span style="color:#003369;"> </span>(inID == &#8216;intr&#8217;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">UInt32</span> *interruptionState = (<span style="color:#881350;">UInt32</span> *)<span style="color:#6c0540;">inData</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">if</span><span style="color:#003369;"> </span>(*interruptionState == kAudioSessionBeginInterruption) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[player <span style="color:#6c0540;">performSelectorOnMainThread:</span><span style="color:#881350;">@selector</span>(audioStreamPlayerBeginInterruption)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">withObject:</span><span style="color:#881350;">nil</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">waitUntilDone:</span><span style="color:#881350;">YES</span>]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <span style="color:#881350;">else</span> <span style="color:#881350;">if</span><span style="color:#003369;"> </span>(*interruptionState == kAudioSessionEndInterruption) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[player <span style="color:#6c0540;">performSelectorOnMainThread:</span><span style="color:#881350;">@selector</span>(audioStreamPlayerEndInterruption)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">withObject:</span><span style="color:#881350;">nil</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#6c0540;">waitUntilDone:</span><span style="color:#881350;">YES</span>]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<p>If you agree that Apple should expose this functionality to third parties, please submit a duplicate for Radar ID# <a href="//problem/6467253">6467253</a>.</p>
<p>Happy Holidays hacking!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=118&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2008/12/25/audiosessioninitialize-workarounds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2008/12/7bbf2217-d3fc-4c96-8948-8b7e1b16c17b.jpg" medium="image">
			<media:title type="html">Core Audio</media:title>
		</media:content>
	</item>
		<item>
		<title>Apple Mail Plugins Developer Group</title>
		<link>http://creativeinaustria.wordpress.com/2008/12/12/apple-mail-plugins-developer-group/</link>
		<comments>http://creativeinaustria.wordpress.com/2008/12/12/apple-mail-plugins-developer-group/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 18:39:14 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/?p=109</guid>
		<description><![CDATA[After talking with Scott Morrison of Indev Software at C4[2] about a mail list for Mail Plugin developers we finally started one. If you are interested in this topic you are welcome to join us: Google Groups &#8211; Apple Mail &#8230; <a href="http://creativeinaustria.wordpress.com/2008/12/12/apple-mail-plugins-developer-group/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=109&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:20px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/12/bundle.png" alt="bundle.png" border="0" width="96" height="96" /></div>
<p>
After talking with Scott Morrison of <a href="http://www.indev.ca/" target="_blank">Indev Software</a> at <a href="http://rentzsch.com/c4/twoOpen" target="_blank">C4[2]</a> about a mail list for Mail Plugin developers we finally started one.
</p>
<p>
If you are interested in this topic you are welcome to join us: <a href="http://groups.google.com/group/apple-mail-dev" target="_blank">Google Groups &#8211; Apple Mail Dev</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/109/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=109&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2008/12/12/apple-mail-plugins-developer-group/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/12/bundle.png" medium="image">
			<media:title type="html">bundle.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Crash Reporter for iPhone Applications (Part 2)</title>
		<link>http://creativeinaustria.wordpress.com/2008/10/20/crash-reporter-for-iphone-applications-part-2/</link>
		<comments>http://creativeinaustria.wordpress.com/2008/10/20/crash-reporter-for-iphone-applications-part-2/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 22:07:43 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[crash reporter]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/?p=83</guid>
		<description><![CDATA[In part one I describe how to set up an Exception Handler, Uli discovered as first one that this handles not all cases. The missing part is a signal handler to get information of SIGSEGV, SIGBUS, &#8230; signals. I thought &#8230; <a href="http://creativeinaustria.wordpress.com/2008/10/20/crash-reporter-for-iphone-applications-part-2/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=83&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:15px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2008/10/crashduck.png" alt="crashDuck.png" border="0" width="96" height="96" /></div>
<p>
In <a href="http://www.restoroot.com/Blog/2008/10/18/crash-reporter-for-iphone-applications/">part one</a> I describe how to set up an Exception Handler, <a href="http://www.zathras.de/angelweb/blog-crash-reporting-on-iphone.htm" target="_blank">Uli</a> discovered as first one that this handles not all cases. The missing part is a signal handler to get information of SIGSEGV, SIGBUS, &#8230; signals.
</p>
<p>
I thought the hard part of this is getting the backtrace inside a signal handler. I already found code for this, but I couldn&#8217;t use it because it was GPL. I tried the easy way, offering the author money to release it under public domain, oh boy this was a waste of time. But now that I found my own solution for this I&#8217;m happy that I didn&#8217;t spend money on this. (1 line versus 20 lines of code)
</p>
<p><span id="more-83"></span>
<p>
Let&#8217;s start with setting up a signal handler, the good old <a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/sigaction.2.html" target="_blank">man page</a> helps.</p>
<p>/* GeSHi (C) 2004 &#8211; 2007 Nigel McNie (http://qbnz.com/highlighter) */<br />
.objc .de1, .objc .de2 {font-family: &#8216;Courier New&#8217;, Courier, monospace; font-weight: normal; font-size: 11px; }<br />
.objc  {font-family: monospace;}<br />
.objc .imp {font-weight: bold; color: red;}<br />
.objc li {background: #f8f8f8;}<br />
.objc li.li2 {background: #f8f8f8;}<br />
.objc .kw1 {color: #0000ff;}<br />
.objc .kw2 {color: #0000ff;}<br />
.objc .kw3 {color: #0000dd;}<br />
.objc .kw4 {color: #0000ff;}<br />
.objc .kw5 {color: #0000ff;}<br />
.objc .kw6 {color: #0000ff;}<br />
.objc .co1 {color: #ff0000;}<br />
.objc .co2 {color: #339900;}<br />
.objc .coMULTI {color: #ff0000; font-style: italic;}<br />
.objc .es0 {color: #666666; font-weight: bold;}<br />
.objc .br0 {color: #002200;}<br />
.objc .st0 {color: #666666;}<br />
.objc .nu0 {color: #0000dd;}<br />
html&gt;body .entry .objc ol li { margin: 0 0 0 0; }<br />
.syntax { padding-left: 15px; background-color: #E8E8E8; text-align:left; }</p>
<div class="syntax">
<div class="objc" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#040;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#091;</span><span class="br0">&#093;</span><span class="br0">&#041;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> sigaction mySigAction;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mySigAction.sa_sigaction = mysighandler;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; mySigAction.sa_flags = SA_SIGINFO;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigemptyset<span class="br0">&#040;</span>&amp;mySigAction.sa_mask<span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGQUIT, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span><span class="kw2">SIGILL</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGTRAP, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span><span class="kw2">SIGABRT</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGEMT, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span><span class="kw2">SIGFPE</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGBUS, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span><span class="kw2">SIGSEGV</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGSYS, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGPIPE, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGALRM, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGXCPU, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#040;</span>SIGXFSZ, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSAutoreleasePool.html"><span class="kw5">NSAutoreleasePool</span></a> * pool = <span class="br0">&#091;</span><span class="br0">&#091;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSAutoreleasePool.html"><span class="kw5">NSAutoreleasePool</span></a> alloc<span class="br0">&#093;</span> init<span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> retVal = UIApplicationMain<span class="br0">&#040;</span>argc, argv, <span class="kw2">nil</span>, <span class="kw2">nil</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>pool release<span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> retVal;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>
And here the line of code I was searching for over two days: <a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/backtrace.3.html" target="_blank">backtrace(3)</a>. You don&#8217;t find this little bastard if you search in Xcode Help with iPhone OS Library selected (there goes my two days)
</p>
<div class="syntax">
<div class="objc" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> mysighandler<span class="br0">&#040;</span><span class="kw4">int</span> sig, siginfo_t *info, <span class="kw4">void</span> *context<span class="br0">&#041;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> *backtraceFrames<span class="br0">&#091;</span><span class="nu0">128</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> frameCount = backtrace<span class="br0">&#040;</span>backtraceFrames, <span class="nu0">128</span><span class="br0">&#041;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// report the error</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>
Like in the Exception Handler you now just use <a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/backtrace_symbols.3.html" target="_blank">backtrace_symbols(3)</a>. (<a href="http://www.cocoadev.com/index.pl?StackTraces" target="_blank">Example</a>)
</p>
<p>
Good luck with working down the crash reports you will get now <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
<p align="center">
<a href="http://www.restoroot.com/Blog/2008/10/18/crash-reporter-for-iphone-applications/">Crash Reporter for iPhone Applications (Part 1)</a><br />
Crash Reporter for iPhone Applications (Part 2)
</p>
<p></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=83&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2008/10/20/crash-reporter-for-iphone-applications-part-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2008/10/crashduck.png" medium="image">
			<media:title type="html">crashDuck.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Crash Reporter for iPhone Applications (Part 1)</title>
		<link>http://creativeinaustria.wordpress.com/2008/10/18/crash-reporter-for-iphone-applications/</link>
		<comments>http://creativeinaustria.wordpress.com/2008/10/18/crash-reporter-for-iphone-applications/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 18:58:14 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[crash reporter]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/?p=59</guid>
		<description><![CDATA[I&#8217;m getting ready to send my iPhone Application to the first beta testers and so I started thinking about crash reports. On the Mac you have two options to get the crash report of your application. The first one is &#8230; <a href="http://creativeinaustria.wordpress.com/2008/10/18/crash-reporter-for-iphone-applications/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=59&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:15px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2008/10/crashduck.png" alt="crashDuck.png" border="0" width="96" height="96" /></div>
<p>
I&#8217;m getting ready to send my iPhone Application to the first beta testers and so I started thinking about crash reports.
</p>
<p>
On the Mac you have two options to get the crash report of your application. The first one is to check on startup if there is a new crash report file in ~/Library/Logs/CrashReporter for your application and simply send it. (Example: <a href="http://www.profcast.com/developers/HDCrashReporter.php" target="_blank"> HDCrashReporter </a>, <a href="http://www.zathras.de/angelweb/sourcecode.htm" target="_blank">UKCrashReporter</a>)
</p>
<p><span id="more-59"></span>
<p>
The other option is to use NSExceptionHandler, which let you report the problem as it happens. (Example: <a href="http://www.mactech.com/articles/mactech/Vol.19/19.12/CocoaDebug/" target="_blank">A simple debugging tool for Cocoa</a>)
</p>
<p>
On the iPhone you can&#8217;t access the crash report file form your application because it&#8217;s running in a sandbox (rdar://problem/6296554). iTunes synchronizes the crash reports of all applications, so although a user could in theory  send it to you, this seems rather complicated to me (<a href="http://www.anoshkin.net/blog/2008/09/09/iphone-crash-logs/" target="_blank">Locations of Crash Logs</a>).
</p>
<p>
So what about NSExceptionHandler? Well, there isn&#8217;t a NSExceptionHandler in the iPhone SDK. But wait, there is a <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSSetUncaughtExceptionHandler" target="_blank">NSUncaughtExceptionHandler</a>!
</p>
<p>/* GeSHi (C) 2004 &#8211; 2007 Nigel McNie (http://qbnz.com/highlighter) */<br />
.objc .de1, .objc .de2 {font-family: &#8216;Courier New&#8217;, Courier, monospace; font-weight: normal; font-size: 11px; }<br />
.objc  {font-family: monospace;}<br />
.objc .imp {font-weight: bold; color: red;}<br />
.objc li {background: #f8f8f8;}<br />
.objc li.li2 {background: #f8f8f8;}<br />
.objc .kw1 {color: #0000ff;}<br />
.objc .kw2 {color: #0000ff;}<br />
.objc .kw3 {color: #0000dd;}<br />
.objc .kw4 {color: #0000ff;}<br />
.objc .kw5 {color: #0000ff;}<br />
.objc .kw6 {color: #0000ff;}<br />
.objc .co1 {color: #ff0000;}<br />
.objc .co2 {color: #339900;}<br />
.objc .coMULTI {color: #ff0000; font-style: italic;}<br />
.objc .es0 {color: #666666; font-weight: bold;}<br />
.objc .br0 {color: #002200;}<br />
.objc .st0 {color: #666666;}<br />
.objc .nu0 {color: #0000dd;}<br />
html&gt;body .entry .objc ol li { margin: 0 0 0 0; }<br />
.syntax { padding-left: 15px; background-color: #E8E8E8; text-align:left; }</p>
<div class="syntax">
<div class="objc" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> MyUncaughtExceptionHandler<span class="br0">&#040;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSException.html"><span class="kw5">NSException</span></a> *exception<span class="br0">&#041;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSArray.html"><span class="kw5">NSArray</span></a> *callStackArray = <span class="br0">&#091;</span>exception callStackReturnAddresses<span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">int</span> frameCount = <span class="br0">&#091;</span>callStackArray count<span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> *backtraceFrames<span class="br0">&#091;</span>frameCount<span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#040;</span><span class="kw4">int</span> i=<span class="nu0">0</span>; i&lt;frameCount; i++<span class="br0">&#041;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; backtraceFrames<span class="br0">&#091;</span>i<span class="br0">&#093;</span> = <span class="br0">&#040;</span><span class="kw4">void</span> *<span class="br0">&#041;</span><span class="br0">&#091;</span><span class="br0">&#091;</span>callStackArray objectAtIndex:i<span class="br0">&#093;</span> unsignedIntegerValue<span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">// report the exception</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@implementation</span> AppDelegate</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>applicationDidFinishLaunching:<span class="br0">&#040;</span>UIApplication *<span class="br0">&#041;</span>application <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; NSSetUncaughtExceptionHandler<span class="br0">&#040;</span>&amp;MyUncaughtExceptionHandler<span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
</ol>
</div>
</div>
<p>
Now you can get the backtrace in MyUncaughtExceptionHandler with <a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/backtrace_symbols.3.html" target="_blank">backtrace_symbols(3)</a>. (<a href="http://www.cocoadev.com/index.pl?StackTraces" target="_blank">Example</a>)<br />
You still have to <a href="http://furbo.org/2008/08/08/symbolicatifination/" target="_blank">symbolicate</a> the crash reports.
</p>
<p>
As a big fan of Fogbugz, I also wanted to use <a href="http://www.fogcreek.com/FogBugz/docs/60/topics/customers/BugzScout.html" target="_blank">BugzScout</a>. It&#8217;s just a HTTP POST, but here is the code:
</p>
<div class="syntax">
<div class="objc" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> bugzScout<span class="br0">&#040;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *description, <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *extra<span class="br0">&#041;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSMutableString.html"><span class="kw5">NSMutableString</span></a> *post = <span class="br0">&#091;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSMutableString.html"><span class="kw5">NSMutableString</span></a> <span class="kw4">string</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:@<span class="st0">&quot;ScoutUserName=&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:urlEncodeValue<span class="br0">&#040;</span>@<span class="st0">&quot;Your BugzScout User&quot;</span><span class="br0">&#041;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:@<span class="st0">&quot;&amp;ScoutProject=&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:urlEncodeValue<span class="br0">&#040;</span>@<span class="st0">&quot;Your Project&quot;</span><span class="br0">&#041;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:@<span class="st0">&quot;&amp;ScoutArea=&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:urlEncodeValue<span class="br0">&#040;</span>@<span class="st0">&quot;Your Area&quot;</span><span class="br0">&#041;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:@<span class="st0">&quot;&amp;Description=&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:urlEncodeValue<span class="br0">&#040;</span>description<span class="br0">&#041;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:@<span class="st0">&quot;&amp;Extra=&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:urlEncodeValue<span class="br0">&#040;</span>extra<span class="br0">&#041;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>post appendString:@<span class="st0">&quot;&amp;ScoutDefaultMessage=&amp;FriendlyResponse=0&amp;ForceNewBug=0&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//NSLog(post);</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSData.html"><span class="kw5">NSData</span></a> *postData = <span class="br0">&#091;</span>post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES<span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *postLength = <span class="br0">&#091;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> stringWithFormat:@<span class="st0">&quot;%d&quot;</span>, <span class="br0">&#091;</span>postData length<span class="br0">&#093;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSURL.html"><span class="kw5">NSURL</span></a> *webServiceURL = <span class="br0">&#091;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSURL.html"><span class="kw5">NSURL</span></a> URLWithString:@<span class="st0">&quot;https://yourcompany.fogbugz.com/ScoutSubmit.asp&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSMutableURLRequest.html"><span class="kw5">NSMutableURLRequest</span></a> *req = <span class="br0">&#091;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSMutableURLRequest.html"><span class="kw5">NSMutableURLRequest</span></a> requestWithURL:webServiceURL<span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>req setHTTPMethod:@<span class="st0">&quot;POST&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>req addValue:@<span class="st0">&quot;application/x-www-form-urlencoded&quot;</span> forHTTPHeaderField: @<span class="st0">&quot;Content-Type&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>req addValue:postLength forHTTPHeaderField: @<span class="st0">&quot;Content-Length&quot;</span><span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span>req setHTTPBody:postData<span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#091;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSURLConnection.html"><span class="kw5">NSURLConnection</span></a> sendSynchronousRequest:req returningResponse:<span class="kw2">nil</span> error:<span class="kw2">nil</span><span class="br0">&#093;</span>;&nbsp; &nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *urlEncodeValue<span class="br0">&#040;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *str<span class="br0">&#041;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes<span class="br0">&#040;</span>kCFAllocatorDefault,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#040;</span>CFStringRef<span class="br0">&#041;</span>str, <span class="kw2">NULL</span>, CFSTR<span class="br0">&#040;</span><span class="st0">&quot;;/?:@&amp;=+$,&quot;</span><span class="br0">&#041;</span>, kCFStringEncodingUTF8<span class="br0">&#041;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#091;</span><span class="br0">&#040;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *<span class="br0">&#041;</span>urlString autorelease<span class="br0">&#093;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p align="center">
Crash Reporter for iPhone Applications (Part 1)<br />
<a href="http://www.restoroot.com/Blog/2008/10/20/crash-reporter-for-iphone-applications-part-2/">Crash Reporter for iPhone Applications (Part 2)</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/59/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=59&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2008/10/18/crash-reporter-for-iphone-applications/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2008/10/crashduck.png" medium="image">
			<media:title type="html">crashDuck.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Microsoft Entourage 2008 Plug-in development</title>
		<link>http://creativeinaustria.wordpress.com/2008/01/15/microsoft-entourage-2008-plug-in-development/</link>
		<comments>http://creativeinaustria.wordpress.com/2008/01/15/microsoft-entourage-2008-plug-in-development/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 20:25:50 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Entourage]]></category>
		<category><![CDATA[Plug-in]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/index.php/2008/01/15/microsoft-entourage-2008-plug-in-development/</guid>
		<description><![CDATA[Today is the release day of Microsoft Office for Mac 2008. Let&#8217;s take a look if it is possible to develop a Plug-in for Entourage 2008. As far as I know, there was no way in Entourage 2004 for a &#8230; <a href="http://creativeinaustria.wordpress.com/2008/01/15/microsoft-entourage-2008-plug-in-development/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=45&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:10px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/entourage.png" alt="Entourage Icon" border="0" width="96" height="96" /></div>
<p>
Today is the release day of Microsoft Office for Mac 2008. Let&#8217;s take a look if it is possible to develop a Plug-in for Entourage 2008.
</p>
<p>
As far as I know, there was no way in Entourage 2004 for a Third Party Developer, and there is still no support from Microsoft. But after four years, things a little different now&#8230;
</p>
<p><span id="more-45"></span></p>
<p>In the Entourage application bundle I discovered a Plugins folder, which contain a Plug-in named EntouragePrintPDE. So what is EntouragePrintPDE? This is an <a href="http://developer.apple.com/DOCUMENTATION/Printing/Conceptual/ExtPrintingDialogs/Introduction/chapter_1_section_1.html" target="_blank">Extending Printing Dialogs</a> Plug-in, I found a example for such a Plug-in at <a href="http://lxr.mozilla.org/mozilla/source/embedding/components/printingui/src/mac/printpde/" target="_blank">mozilla</a>.</p>
<div style="text-align:center;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/bild-1.png" alt="Bild 1.png" border="0" width="600" /></div>
<p>
So here we go, lets learn more about <a href="http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html" target="_blank">CFPlugIn</a>, which is little uncommon for us Cocoa guys who use NSBundle. <a href="http://developer.apple.com/samplecode/BasicPlugIn/" target="_blank">BasicPlugIn</a> is a good example to start with.
</p>
<p>And yeah, after setting up a Xcode project with this I was able get the Plug-in loaded:</p>
<div style="text-align:center;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/bild-3.png" alt="Bild 3.png" border="0" width="646" height="399" /></div>
<p>
This is not all good news. Because it is based on a Extending Printing Dialogs Plug-in, it gets only loaded when you open the print dialog. The CFPlugInTypes UUID in the Info.plist is BCB07250-E57F-11D3-8CA6-0050E4603277 which described as &#8220;Application pane for the Print dialog&#8221; Interface type:
</p>
<div style="text-align:center;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/bild-4.png" alt="Bild 4.png" border="0" width="644" height="398" /></div>
<p>
Is this the end of the story? Almost, without Interface descriptions and the UUIDs we are out of luck here. I searched for standard UUIDs, but didn&#8217;t find any &#8220;load on start of host app&#8221; UUIDs.
</p>
<p>
But wait, I don&#8217;t like to close this with a &#8220;it&#8217;s impossible, don&#8217;t even dream of it&#8221;. Here the class-dump output of Entourage 2008. It is pretty short for such a big application because it is mostly a Carbon application, never mind, I like what it shows.
</p>
<p>/* GeSHi (C) 2004 &#8211; 2007 Nigel McNie (http://qbnz.com/highlighter) */<br />
.objc .de1, .objc .de2 {font-family: &#8216;Courier New&#8217;, Courier, monospace; font-weight: normal;}<br />
.objc  {font-family: monospace;}<br />
.objc .imp {font-weight: bold; color: red;}<br />
.objc li {background: #f8f8f8;}<br />
.objc li.li2 {background: #f8f8f8;}<br />
.objc .kw1 {color: #0000ff;}<br />
.objc .kw2 {color: #0000ff;}<br />
.objc .kw3 {color: #0000dd;}<br />
.objc .kw4 {color: #0000ff;}<br />
.objc .kw5 {color: #0000ff;}<br />
.objc .kw6 {color: #0000ff;}<br />
.objc .co1 {color: #ff0000;}<br />
.objc .co2 {color: #339900;}<br />
.objc .coMULTI {color: #ff0000; font-style: italic;}<br />
.objc .es0 {color: #666666; font-weight: bold;}<br />
.objc .br0 {color: #002200;}<br />
.objc .st0 {color: #666666;}<br />
.objc .nu0 {color: #0000dd;}<br />
html&gt;body .entry .objc ol li { margin: 0 0 0 0; }<br />
.syntax { padding-left: 15px; background-color: #E8E8E8; text-align:left; }</p>
<div class="syntax">
<div class="objc" style="font-family:monospace;font-size:12px;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* &nbsp; &nbsp; Generated by class-dump 3.1.1.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* &nbsp; &nbsp; class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2006 by Steve Nygard.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> CToolTip;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> CURLToolTip <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">struct</span> CToolTip *_field1;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> OpaqueMenuRef;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">struct</span> _NSPoint <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">float</span> _field1;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">float</span> _field2;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">struct</span> _NSZone;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">struct</span> __CFString;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* File: /Applications/Microsoft Office 2008/Microsoft Entourage.app/Contents/MacOS/Microsoft Entourage</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* Arch: Intel 80&#215;86 (i386)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@protocol</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSObject.html"><span class="kw5">NSObject</span></a></div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>isEqual:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">unsigned</span> <span class="kw4">int</span><span class="br0">&#041;</span>hash;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">Class</span><span class="br0">&#041;</span>superclass;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">Class</span><span class="br0">&#041;</span><span class="kw4">class</span>;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>self;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">struct</span> _NSZone *<span class="br0">&#041;</span>zone;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>performSelector:<span class="br0">&#040;</span><span class="kw4">SEL</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>performSelector:<span class="br0">&#040;</span><span class="kw4">SEL</span><span class="br0">&#041;</span>fp8 withObject:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>performSelector:<span class="br0">&#040;</span><span class="kw4">SEL</span><span class="br0">&#041;</span>fp8 withObject:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 withObject:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>isProxy;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>isKindOfClass:<span class="br0">&#040;</span><span class="kw4">Class</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>isMemberOfClass:<span class="br0">&#040;</span><span class="kw4">Class</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>conformsToProtocol:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>respondsToSelector:<span class="br0">&#040;</span><span class="kw4">SEL</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>retain;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span>oneway <span class="kw4">void</span><span class="br0">&#041;</span>release;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>autorelease;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">unsigned</span> <span class="kw4">int</span><span class="br0">&#041;</span>retainCount;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>description;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@protocol</span> WebDocumentText &lt;NSObject&gt;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>supportsTextEncoding;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span><span class="kw4">string</span>;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>attributedString;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>selectedString;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>selectedAttributedString;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>selectAll;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>deselectAll;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@interface</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSView.html"><span class="kw6">NSView</span></a> <span class="br0">&#040;</span>Undocumented<span class="br0">&#041;</span></div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>preparePageForPrinting:<span class="br0">&#040;</span><span class="kw4">float</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@interface</span> MessagePrintoutController : <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSObject.html"><span class="kw5">NSObject</span></a></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">BOOL</span> loading;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>isLoading;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>setLoading:<span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 didStartProvisionalLoadForFrame:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 didFinishLoadForFrame:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 didFailProvisionalLoadWithError:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 forFrame:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 didFailLoadWithError:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 forFrame:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@interface</span> MessageViewController : <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSObject.html"><span class="kw5">NSObject</span></a></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; WebView *webView;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">void</span> *view;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">id</span> messageRecordID;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">BOOL</span> networkBlocked;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">BOOL</span> networkResources;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSURL.html"><span class="kw5">NSURL</span></a> *hrefURL;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *currentURL;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html"><span class="kw5">NSString</span></a> *currentHRef;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">struct</span> CURLToolTip *toolTip;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">+ <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>initialize;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>dealloc;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>init;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>webView;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>setWebView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span> *<span class="br0">&#041;</span>view;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>setView:<span class="br0">&#040;</span><span class="kw4">void</span> *<span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span> *<span class="br0">&#041;</span>message;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>setMessage:<span class="br0">&#040;</span><span class="kw4">void</span> *<span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>isNetworkBlocked;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>setNetworkBlocked:<span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>hasNetworkResources;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>buildExecuteScriptMenu:<span class="br0">&#040;</span><span class="kw4">struct</span> OpaqueMenuRef *<span class="br0">&#041;</span>fp8 withParent:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>openLink:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>copyImage:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>openImage:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>executeScriptCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">struct</span> __CFString *<span class="br0">&#041;</span>getSelectedText;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>selectAllCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>decreaseFontSizeCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>increaseFontSizeCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>translateCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>dictionaryCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>synonymCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>encyclopediaCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webSearchCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>helpCommand:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>download:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 decideDestinationWithSuggestedFilename:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 didStartProvisionalLoadForFrame:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 decidePolicyForNewWindowAction:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 request:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16 newFrameName:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp20 decisionListener:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp24;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 decidePolicyForNavigationAction:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 request:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16 frame:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp20 decisionListener:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp24;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 resource:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 willSendRequest:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16 redirectResponse:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp20 fromDataSource:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp24;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 willPerformDragSourceAction:<span class="br0">&#040;</span><span class="kw4">int</span><span class="br0">&#041;</span>fp12 fromPoint:<span class="br0">&#040;</span><span class="kw4">struct</span> _NSPoint<span class="br0">&#041;</span>fp16 withPasteboard:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp24;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 mouseDidMoveOverElement:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 modifierFlags:<span class="br0">&#040;</span><span class="kw4">unsigned</span> <span class="kw4">int</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>webView:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 contextMenuItemsForElement:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 defaultMenuItems:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">@end</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">@interface</span> MessageViewController <span class="br0">&#040;</span>Private<span class="br0">&#041;</span></div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>decidePolicyForAction:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 request:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 decisionListener:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">struct</span> _NSPoint<span class="br0">&#041;</span>mouseLocation;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@interface</span> MHTMLProtocol : <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSURLProtocol.html"><span class="kw5">NSURLProtocol</span></a></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">+ <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>canInitWithRequest:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">+ <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>canonicalRequestForRequest:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>initWithRequest:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 cachedResponse:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 client:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>startLoading;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>stopLoading;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@interface</span> NetworkBlock : <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSURLProtocol.html"><span class="kw5">NSURLProtocol</span></a></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">+ <span class="br0">&#040;</span><span class="kw4">BOOL</span><span class="br0">&#041;</span>canInitWithRequest:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">+ <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>canonicalRequestForRequest:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>initWithRequest:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp8 cachedResponse:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp12 client:<span class="br0">&#040;</span><span class="kw4">id</span><span class="br0">&#041;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>startLoading;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#040;</span><span class="kw4">void</span><span class="br0">&#041;</span>stopLoading;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">@end</span></div>
</li>
</ol>
</div>
</div>
<p>
&nbsp;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/creativeinaustria.wordpress.com/45/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/creativeinaustria.wordpress.com/45/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=45&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2008/01/15/microsoft-entourage-2008-plug-in-development/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/entourage.png" medium="image">
			<media:title type="html">Entourage Icon</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/bild-1.png" medium="image">
			<media:title type="html">Bild 1.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/bild-3.png" medium="image">
			<media:title type="html">Bild 3.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2008/01/bild-4.png" medium="image">
			<media:title type="html">Bild 4.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Sparkle in large deployments</title>
		<link>http://creativeinaustria.wordpress.com/2007/11/10/sparkle-in-large-deployments/</link>
		<comments>http://creativeinaustria.wordpress.com/2007/11/10/sparkle-in-large-deployments/#comments</comments>
		<pubDate>Sat, 10 Nov 2007 17:12:51 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/index.php/2007/11/10/sparkle-in-large-deployments/</guid>
		<description><![CDATA[I&#8217;m happy that I have some customer which have large enough deployments that they use Apple Remote Desktop (ARD) to install OMiC. In such a deployment the administrator don&#8217;t want that a update dialog pop up by his users, which &#8230; <a href="http://creativeinaustria.wordpress.com/2007/11/10/sparkle-in-large-deployments/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=26&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:10px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/11/sparkle.png" alt="Sparkle.png" border="0" width="96" height="96" /></div>
<p>
I&#8217;m happy that I have some customer which have large enough deployments that they use Apple Remote Desktop (ARD) to install OMiC. In such a deployment the administrator don&#8217;t want that a update dialog pop up by his users, which has most the time not the rights to perform the update.
</p>
<p>
For this cases I add to Sparkle the <a href="http://sparkle.andymatuschak.org/ticket/77" target="_blank">SUIgnoreChecks</a> key, which the administrator can set over Apple Remote Desktop (ARD) in the application preferences file.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/creativeinaustria.wordpress.com/26/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/creativeinaustria.wordpress.com/26/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=26&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2007/11/10/sparkle-in-large-deployments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/11/sparkle.png" medium="image">
			<media:title type="html">Sparkle.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Sparkle for Plug-ins</title>
		<link>http://creativeinaustria.wordpress.com/2007/11/09/sparkle-for-plug-ins/</link>
		<comments>http://creativeinaustria.wordpress.com/2007/11/09/sparkle-for-plug-ins/#comments</comments>
		<pubDate>Fri, 09 Nov 2007 14:48:31 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/index.php/2007/11/09/sparkle-for-plug-ins/</guid>
		<description><![CDATA[OMiC use Sparkle for updating since version 1.7.2, but you can&#8217;t use Sparkle do update Plug-ins out of the box. So I spend the last days do turn my home cooked solution into something which work for other Plug-ins as &#8230; <a href="http://creativeinaustria.wordpress.com/2007/11/09/sparkle-for-plug-ins/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=25&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:10px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/11/sparkle.png" alt="Sparkle.png" border="0" width="96" height="96" /></div>
<p>
OMiC use <a href="http://sparkle.andymatuschak.org" target="_blank">Sparkle</a> for updating since version 1.7.2, but you can&#8217;t use Sparkle do update Plug-ins out of the box. So I spend the last days do turn my home cooked solution into something which work for other Plug-ins as well. If you are interested, checkout the Sparkle subversion repository.
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/creativeinaustria.wordpress.com/25/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/creativeinaustria.wordpress.com/25/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=25&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2007/11/09/sparkle-for-plug-ins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/11/sparkle.png" medium="image">
			<media:title type="html">Sparkle.png</media:title>
		</media:content>
	</item>
		<item>
		<title>PackageMaker 3.0</title>
		<link>http://creativeinaustria.wordpress.com/2007/11/01/packagemaker-30/</link>
		<comments>http://creativeinaustria.wordpress.com/2007/11/01/packagemaker-30/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 18:17:24 +0000</pubDate>
		<dc:creator>catlan</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.restoroot.com/Blog/index.php/2007/11/01/packagemaker-30/</guid>
		<description><![CDATA[Yesterday I switched to PackageMaker 3.0 to generate packages. My Plug-in OMiC is build separate for Mac OS X 10.3 and 10.4 to support the different features. So the simplest solution maybe offer two downloads and give user the choice &#8230; <a href="http://creativeinaustria.wordpress.com/2007/11/01/packagemaker-30/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=23&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="float:left;padding-right:10px;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/packagemakericon.png" alt="packagemakerIcon.png" border="0" width="96" height="96" /></div>
<p>
Yesterday I switched to PackageMaker 3.0 to generate packages. My Plug-in OMiC is build separate for Mac OS X 10.3 and 10.4 to support the different features.</p>
<p>So the simplest solution maybe offer two downloads and give user the choice which version he needs. But thanks to <a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/Managed_Installs/chapter_5_section_2.html#//apple_ref/doc/uid/10000145i-CH6-SW11" target="_blank">Metapackages</a> and <a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/Managed_Installs/chapter_5_section_2.html#//apple_ref/doc/uid/10000145i-CH6-DontLinkElementID_25" target="_blank">Distribution Packages</a> the installer choice which version is needed.
</p>
<p>So let us start PackageMaker (<i>/Developer/Applications/Utilities/PackageMaker</i>) &#8230;</p>
<p><span id="more-23"></span></p>
<div style="text-align:center;padding:10px;">
<img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm1.png" alt="pm1.png" border="0" width="450" />
</div>
<p>Add the two releases for my project build folder:</p>
<div style="text-align:center;padding:10px;">
<img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm2.png" alt="pm2.png" border="0" width="225" /><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm3.png" alt="pm3.png" border="0" width="225" />
</div>
<p>Enter the name and description in each Choice:</p>
<div style="text-align:center;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm4.png" alt="pm4.png" border="0" width="500" /></div>
<p>Now the interesting part, the Requirements for each Choice. Add the two the requirements <b>&#8220;is greater than or equal to &#8217;10.3&#8242;&#8221; and &#8220;is less than &#8217;10.4&#8242;&#8221;</b> for the Panther Choice and just <b>&#8220;is greater than or equal to &#8217;10.4&#8242;&#8221;</b> for Tiger:</p>
<div style="text-align:center;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm5.png" alt="pm5.png" border="0" width="500" /></div>
<p>In Package Configuration is one important thing, the Package Identifier. The two packages must have a different identifier, I first try it with the same and PackageMaker gave me no error. But when you save and reopen it with the same identifier, PackageMaker is confused because it can&#8217;t make the relation between choices and packages.</p>
<div style="text-align:center;"><img src="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm6.png" alt="pm6.png" border="0" width="500" /></div>
<p>So when you now build the package you get this warnings:</p>
<p>/* GeSHi (C) 2004 &#8211; 2007 Nigel McNie (http://qbnz.com/highlighter) */<br />
.bash .de1, .bash .de2 {font-family: &#8216;Courier New&#8217;, Courier, monospace; font-weight: normal;}<br />
.bash  {font-family: monospace;}<br />
.bash .imp {font-weight: bold; color: red;}<br />
.bash li {background: #f8f8f8;  /* DEDEDE;*/}<br />
.bash li.li2 {background: #f8f8f8;}<br />
.bash .kw1 {color: #000000; font-weight: bold;}<br />
.bash .kw2 {color: #c20cb9; font-weight: bold;}<br />
.bash .kw3 {color: #7a0874; font-weight: bold;}<br />
.bash .es0 {color: #000099; font-weight: bold;}<br />
.bash .br0 {color: #000000; font-weight: bold;}<br />
.bash .st0 {color: #ff0000;}<br />
.bash .nu0 {color: #000000;}<br />
.bash .re0 {color: #007800;}<br />
.bash .re1 {color: #007800;}<br />
.bash .re2 {color: #007800;}<br />
.bash .re3 {color: #808080; font-style: italic;}<br />
.bash .re4 {color: #007800;}<br />
html&gt;body .entry .bash ol li { margin: 0 0 0 0; }<br />
.syntax { margin: 10px 0; background-color: #E8E8E8; text-align:left; }</p>
<div class="syntax">
<div class="bash" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">Warning: Requirement <span class="st0">&quot;System OS Version (e.g. 10.x.x)&quot;</span> of choice <span class="st0">&quot;OMiC for Mac OS X v10.3 (Panther)&quot;</span> is not supported prior to Mac OS X v10<span class="nu0">.4</span>.</div>
</li>
</ol>
</div>
</div>
<p>To support Panther we need some tricks, we need a <a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/Legacy_Requirements/chapter_950_section_1.html" target="_blank">InstallationCheck</a> script. Here as example my script:</p>
<div class="syntax">
<div class="bash" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/sh</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">MAJOR=</span>`sw_vers -productVersion | <span class="kw2">awk</span> -F <span class="st0">&quot;.&quot;</span> <span class="st0">&#8216;{ print $2 }&#8217;</span>`</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#091;</span> <span class="st0">&quot;${MAJOR}&quot;</span> = <span class="st0">&quot;3&quot;</span> <span class="br0">&#093;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">then</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">64</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">fi</span></div>
</li>
</ol>
</div>
</div>
<p>You need to copy the InstallationCheck scripts into the Resources folder of each package. Copy this by hand is very error-prone, so I use a script for building and copying:</p>
<div class="syntax">
<div class="bash" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/sh</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">PACKAGEMAKER=</span><span class="st0">&quot;/Developer/usr/bin/packagemaker&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re1">$PACKAGEMAKER</span> &#8211;doc PackageMaker/OMiC.pmdoc &#8211;out ./build/OMiC.mpkg</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw3">echo</span> <span class="st0">&quot;Patch OMiC.mpkg with InstallationCheck&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">cp</span> PackageMaker/<span class="nu0">10.3</span>/Resources/InstallationCheck build/OMiC.mpkg/Contents/Packages/omic.pkg/Contents/Resources</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">cp</span> PackageMaker/<span class="nu0">10.4</span>/Resources/InstallationCheck build/OMiC.mpkg/Contents/Packages/omic<span class="nu0">-1</span>.pkg/Contents/Resources</div>
</li>
</ol>
</div>
</div>
<p>That&#8217;s it, overall I like the improvements of new PackageMaker.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/creativeinaustria.wordpress.com/23/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/creativeinaustria.wordpress.com/23/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/creativeinaustria.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/creativeinaustria.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/creativeinaustria.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/creativeinaustria.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/creativeinaustria.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/creativeinaustria.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/creativeinaustria.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/creativeinaustria.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/creativeinaustria.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/creativeinaustria.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/creativeinaustria.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/creativeinaustria.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/creativeinaustria.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/creativeinaustria.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=creativeinaustria.wordpress.com&#038;blog=22140872&#038;post=23&#038;subd=creativeinaustria&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://creativeinaustria.wordpress.com/2007/11/01/packagemaker-30/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1db0c3636130f11f07fa4b1656f924eb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">catlan</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/packagemakericon.png" medium="image">
			<media:title type="html">packagemakerIcon.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm1.png" medium="image">
			<media:title type="html">pm1.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm2.png" medium="image">
			<media:title type="html">pm2.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm3.png" medium="image">
			<media:title type="html">pm3.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm4.png" medium="image">
			<media:title type="html">pm4.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm5.png" medium="image">
			<media:title type="html">pm5.png</media:title>
		</media:content>

		<media:content url="http://www.restoroot.com/Blog/wp-content/uploads/2007/10/pm6.png" medium="image">
			<media:title type="html">pm6.png</media:title>
		</media:content>
	</item>
	</channel>
</rss>
