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

<channel>
	<title>restoroot.com &#187; Development</title>
	<atom:link href="http://www.restoroot.com/Blog/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.restoroot.com/Blog</link>
	<description></description>
	<lastBuildDate>Fri, 04 Sep 2009 13:18:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>AudioSessionInitialize Workarounds</title>
		<link>http://www.restoroot.com/Blog/2008/12/25/audiosessioninitialize-workarounds/</link>
		<comments>http://www.restoroot.com/Blog/2008/12/25/audiosessioninitialize-workarounds/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 19:17:44 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 you can set the InterruptionListener and it&#8217;s ClientData just once:

/*
&#160;* Discussion
&#160;* Your application must call this function [...]]]></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; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; "><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; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; ">
<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; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; ">
- (<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>(&#8217;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>(&#8217;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="rdar://problem/6467253">6467253</a>.</p>
<p>Happy Holidays hacking!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2008/12/25/audiosessioninitialize-workarounds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple Mail Plugins Developer Group</title>
		<link>http://www.restoroot.com/Blog/2008/12/12/apple-mail-plugins-developer-group/</link>
		<comments>http://www.restoroot.com/Blog/2008/12/12/apple-mail-plugins-developer-group/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 18:39:14 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 Dev



]]></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>
<p><br/><br />
<br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2008/12/12/apple-mail-plugins-developer-group/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Crash Reporter for iPhone Applications (Part 2)</title>
		<link>http://www.restoroot.com/Blog/2008/10/20/crash-reporter-for-iphone-applications-part-2/</link>
		<comments>http://www.restoroot.com/Blog/2008/10/20/crash-reporter-for-iphone-applications-part-2/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 22:07:43 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 the hard part of this is getting the backtrace inside a signal handler. I already found [...]]]></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>
<style type="text/css">/* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter) */
.objc .de1, .objc .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal; font-size: 11px; }
.objc  {font-family: monospace;}
.objc .imp {font-weight: bold; color: red;}
.objc li {background: #f8f8f8;}
.objc li.li2 {background: #f8f8f8;}
.objc .kw1 {color: #0000ff;}
.objc .kw2 {color: #0000ff;}
.objc .kw3 {color: #0000dd;}
.objc .kw4 {color: #0000ff;}
.objc .kw5 {color: #0000ff;}
.objc .kw6 {color: #0000ff;}
.objc .co1 {color: #ff0000;}
.objc .co2 {color: #339900;}
.objc .coMULTI {color: #ff0000; font-style: italic;}
.objc .es0 {color: #666666; font-weight: bold;}
.objc .br0 {color: #002200;}
.objc .st0 {color: #666666;}
.objc .nu0 {color: #0000dd;}
html>body .entry .objc ol li { margin: 0 0 0 0; }
.syntax { padding-left: 15px; background-color: #E8E8E8; text-align:left; }
</style>
<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">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</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">&#40;</span>&amp;mySigAction.sa_mask<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGQUIT, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span><span class="kw2">SIGILL</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGTRAP, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span><span class="kw2">SIGABRT</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGEMT, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span><span class="kw2">SIGFPE</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGBUS, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span><span class="kw2">SIGSEGV</span>, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGSYS, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGPIPE, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGALRM, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGXCPU, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sigaction<span class="br0">&#40;</span>SIGXFSZ, &amp;mySigAction, <span class="kw2">NULL</span><span class="br0">&#41;</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">&#91;</span><span class="br0">&#91;</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">&#93;</span> init<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> retVal = UIApplicationMain<span class="br0">&#40;</span>argc, argv, <span class="kw2">nil</span>, <span class="kw2">nil</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>pool release<span class="br0">&#93;</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">&#40;</span><span class="kw4">int</span> sig, siginfo_t *info, <span class="kw4">void</span> *context<span class="br0">&#41;</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">&#91;</span><span class="nu0">128</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> frameCount = backtrace<span class="br0">&#40;</span>backtraceFrames, <span class="nu0">128</span><span class="br0">&#41;</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://www.restoroot.com/Blog/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><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2008/10/20/crash-reporter-for-iphone-applications-part-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Crash Reporter for iPhone Applications (Part 1)</title>
		<link>http://www.restoroot.com/Blog/2008/10/18/crash-reporter-for-iphone-applications/</link>
		<comments>http://www.restoroot.com/Blog/2008/10/18/crash-reporter-for-iphone-applications/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 18:58:14 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 to check on startup if there is a new crash report file in ~/Library/Logs/CrashReporter for your [...]]]></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>
<style type="text/css">/* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter) */
.objc .de1, .objc .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal; font-size: 11px; }
.objc  {font-family: monospace;}
.objc .imp {font-weight: bold; color: red;}
.objc li {background: #f8f8f8;}
.objc li.li2 {background: #f8f8f8;}
.objc .kw1 {color: #0000ff;}
.objc .kw2 {color: #0000ff;}
.objc .kw3 {color: #0000dd;}
.objc .kw4 {color: #0000ff;}
.objc .kw5 {color: #0000ff;}
.objc .kw6 {color: #0000ff;}
.objc .co1 {color: #ff0000;}
.objc .co2 {color: #339900;}
.objc .coMULTI {color: #ff0000; font-style: italic;}
.objc .es0 {color: #666666; font-weight: bold;}
.objc .br0 {color: #002200;}
.objc .st0 {color: #666666;}
.objc .nu0 {color: #0000dd;}
html>body .entry .objc ol li { margin: 0 0 0 0; }
.syntax { padding-left: 15px; background-color: #E8E8E8; text-align:left; }
</style>
<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">&#40;</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">&#41;</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">&#91;</span>exception callStackReturnAddresses<span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">int</span> frameCount = <span class="br0">&#91;</span>callStackArray count<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> *backtraceFrames<span class="br0">&#91;</span>frameCount<span class="br0">&#93;</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">&#40;</span><span class="kw4">int</span> i=<span class="nu0">0</span>; i&lt;frameCount; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; backtraceFrames<span class="br0">&#91;</span>i<span class="br0">&#93;</span> = <span class="br0">&#40;</span><span class="kw4">void</span> *<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span>callStackArray objectAtIndex:i<span class="br0">&#93;</span> unsignedIntegerValue<span class="br0">&#93;</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">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>applicationDidFinishLaunching:<span class="br0">&#40;</span>UIApplication *<span class="br0">&#41;</span>application <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; NSSetUncaughtExceptionHandler<span class="br0">&#40;</span>&amp;MyUncaughtExceptionHandler<span class="br0">&#41;</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">&#40;</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">&#41;</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">&#91;</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">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>post appendString:@<span class="st0">&quot;ScoutUserName=&quot;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>post appendString:urlEncodeValue<span class="br0">&#40;</span>@<span class="st0">&quot;Your BugzScout User&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</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">&#91;</span>post appendString:@<span class="st0">&quot;&amp;ScoutProject=&quot;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>post appendString:urlEncodeValue<span class="br0">&#40;</span>@<span class="st0">&quot;Your Project&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</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">&#91;</span>post appendString:@<span class="st0">&quot;&amp;ScoutArea=&quot;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>post appendString:urlEncodeValue<span class="br0">&#40;</span>@<span class="st0">&quot;Your Area&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</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">&#91;</span>post appendString:@<span class="st0">&quot;&amp;Description=&quot;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>post appendString:urlEncodeValue<span class="br0">&#40;</span>description<span class="br0">&#41;</span><span class="br0">&#93;</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">&#91;</span>post appendString:@<span class="st0">&quot;&amp;Extra=&quot;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>post appendString:urlEncodeValue<span class="br0">&#40;</span>extra<span class="br0">&#41;</span><span class="br0">&#93;</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">&#91;</span>post appendString:@<span class="st0">&quot;&amp;ScoutDefaultMessage=&amp;FriendlyResponse=0&amp;ForceNewBug=0&quot;</span><span class="br0">&#93;</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">&#91;</span>post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES<span class="br0">&#93;</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">&#91;</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">&#91;</span>postData length<span class="br0">&#93;</span><span class="br0">&#93;</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">&#91;</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">&#93;</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">&#91;</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">&#93;</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">&#91;</span>req setHTTPMethod:@<span class="st0">&quot;POST&quot;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</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">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>req addValue:postLength forHTTPHeaderField: @<span class="st0">&quot;Content-Length&quot;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>req setHTTPBody:postData<span class="br0">&#93;</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">&#91;</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">&#93;</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">&#40;</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">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes<span class="br0">&#40;</span>kCFAllocatorDefault,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>CFStringRef<span class="br0">&#41;</span>str, <span class="kw2">NULL</span>, CFSTR<span class="br0">&#40;</span><span class="st0">&quot;;/?:@&amp;=+$,&quot;</span><span class="br0">&#41;</span>, kCFStringEncodingUTF8<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#91;</span><span class="br0">&#40;</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">&#41;</span>urlString autorelease<span class="br0">&#93;</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>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2008/10/18/crash-reporter-for-iphone-applications/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Microsoft Entourage 2008 Plug-in development</title>
		<link>http://www.restoroot.com/Blog/2008/01/15/microsoft-entourage-2008-plug-in-development/</link>
		<comments>http://www.restoroot.com/Blog/2008/01/15/microsoft-entourage-2008-plug-in-development/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 20:25:50 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 Third Party Developer, and there is still no support from Microsoft. But after four years, things [...]]]></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>
<style type="text/css">/* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter) */
.objc .de1, .objc .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.objc  {font-family: monospace;}
.objc .imp {font-weight: bold; color: red;}
.objc li {background: #f8f8f8;}
.objc li.li2 {background: #f8f8f8;}
.objc .kw1 {color: #0000ff;}
.objc .kw2 {color: #0000ff;}
.objc .kw3 {color: #0000dd;}
.objc .kw4 {color: #0000ff;}
.objc .kw5 {color: #0000ff;}
.objc .kw6 {color: #0000ff;}
.objc .co1 {color: #ff0000;}
.objc .co2 {color: #339900;}
.objc .coMULTI {color: #ff0000; font-style: italic;}
.objc .es0 {color: #666666; font-weight: bold;}
.objc .br0 {color: #002200;}
.objc .st0 {color: #666666;}
.objc .nu0 {color: #0000dd;}
html>body .entry .objc ol li { margin: 0 0 0 0; }
.syntax { padding-left: 15px; background-color: #E8E8E8; text-align:left; }
</style>
<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">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>isEqual:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">int</span><span class="br0">&#41;</span>hash;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">Class</span><span class="br0">&#41;</span>superclass;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">Class</span><span class="br0">&#41;</span><span class="kw4">class</span>;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>self;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">struct</span> _NSZone *<span class="br0">&#41;</span>zone;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>performSelector:<span class="br0">&#40;</span><span class="kw4">SEL</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>performSelector:<span class="br0">&#40;</span><span class="kw4">SEL</span><span class="br0">&#41;</span>fp8 withObject:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>performSelector:<span class="br0">&#40;</span><span class="kw4">SEL</span><span class="br0">&#41;</span>fp8 withObject:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 withObject:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>isProxy;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>isKindOfClass:<span class="br0">&#40;</span><span class="kw4">Class</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>isMemberOfClass:<span class="br0">&#40;</span><span class="kw4">Class</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>conformsToProtocol:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>respondsToSelector:<span class="br0">&#40;</span><span class="kw4">SEL</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>retain;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span>oneway <span class="kw4">void</span><span class="br0">&#41;</span>release;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>autorelease;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">int</span><span class="br0">&#41;</span>retainCount;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</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">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>supportsTextEncoding;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span><span class="kw4">string</span>;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>attributedString;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>selectedString;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>selectedAttributedString;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>selectAll;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</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">&#40;</span>Undocumented<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>preparePageForPrinting:<span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</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">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>isLoading;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setLoading:<span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 didStartProvisionalLoadForFrame:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 didFinishLoadForFrame:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 didFailProvisionalLoadWithError:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 forFrame:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 didFailLoadWithError:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 forFrame:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</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">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>initialize;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>dealloc;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>init;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>webView;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setWebView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span> *<span class="br0">&#41;</span>view;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setView:<span class="br0">&#40;</span><span class="kw4">void</span> *<span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span> *<span class="br0">&#41;</span>message;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setMessage:<span class="br0">&#40;</span><span class="kw4">void</span> *<span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>isNetworkBlocked;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>setNetworkBlocked:<span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>hasNetworkResources;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>buildExecuteScriptMenu:<span class="br0">&#40;</span><span class="kw4">struct</span> OpaqueMenuRef *<span class="br0">&#41;</span>fp8 withParent:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>openLink:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>copyImage:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>openImage:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>executeScriptCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">struct</span> __CFString *<span class="br0">&#41;</span>getSelectedText;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>selectAllCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>decreaseFontSizeCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>increaseFontSizeCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>translateCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>dictionaryCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>synonymCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>encyclopediaCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webSearchCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>helpCommand:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>download:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 decideDestinationWithSuggestedFilename:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 didStartProvisionalLoadForFrame:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 decidePolicyForNewWindowAction:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 request:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16 newFrameName:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp20 decisionListener:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp24;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 decidePolicyForNavigationAction:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 request:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16 frame:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp20 decisionListener:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp24;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 resource:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 willSendRequest:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16 redirectResponse:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp20 fromDataSource:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp24;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 willPerformDragSourceAction:<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>fp12 fromPoint:<span class="br0">&#40;</span><span class="kw4">struct</span> _NSPoint<span class="br0">&#41;</span>fp16 withPasteboard:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp24;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 mouseDidMoveOverElement:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 modifierFlags:<span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">int</span><span class="br0">&#41;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>webView:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 contextMenuItemsForElement:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 defaultMenuItems:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</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">&#40;</span>Private<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>decidePolicyForAction:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 request:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 decisionListener:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">struct</span> _NSPoint<span class="br0">&#41;</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">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>canInitWithRequest:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">+ <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>canonicalRequestForRequest:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>initWithRequest:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 cachedResponse:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 client:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>startLoading;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</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">&#40;</span><span class="kw4">BOOL</span><span class="br0">&#41;</span>canInitWithRequest:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li2">
<div class="de2">+ <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>canonicalRequestForRequest:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>initWithRequest:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp8 cachedResponse:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp12 client:<span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span>fp16;</div>
</li>
<li class="li2">
<div class="de2">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>startLoading;</div>
</li>
<li class="li1">
<div class="de1">- <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</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>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2008/01/15/microsoft-entourage-2008-plug-in-development/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Sparkle in large deployments</title>
		<link>http://www.restoroot.com/Blog/2007/11/10/sparkle-in-large-deployments/</link>
		<comments>http://www.restoroot.com/Blog/2007/11/10/sparkle-in-large-deployments/#comments</comments>
		<pubDate>Sat, 10 Nov 2007 17:12:51 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 has most the time not the rights to perform the update.


For this cases I add [...]]]></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>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2007/11/10/sparkle-in-large-deployments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sparkle for Plug-ins</title>
		<link>http://www.restoroot.com/Blog/2007/11/09/sparkle-for-plug-ins/</link>
		<comments>http://www.restoroot.com/Blog/2007/11/09/sparkle-for-plug-ins/#comments</comments>
		<pubDate>Fri, 09 Nov 2007 14:48:31 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 well. If you are interested, checkout the Sparkle subversion repository.

&#160;
&#160;
]]></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>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2007/11/09/sparkle-for-plug-ins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PackageMaker 3.0</title>
		<link>http://www.restoroot.com/Blog/2007/11/01/packagemaker-30/</link>
		<comments>http://www.restoroot.com/Blog/2007/11/01/packagemaker-30/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 18:17:24 +0000</pubDate>
		<dc:creator>Christopher Atlan</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 which version he needs. But thanks to Metapackages and Distribution Packages the installer choice which version [...]]]></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 &#8216;10.3&#8242;&#8221; and &#8220;is less than &#8216;10.4&#8242;&#8221;</b> for the Panther Choice and just <b>&#8220;is greater than or equal to &#8216;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:<br/></p>
<style type="text/css">/* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter) */
.bash .de1, .bash .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.bash  {font-family: monospace;}
.bash .imp {font-weight: bold; color: red;}
.bash li {background: #f8f8f8;  /* DEDEDE;*/}
.bash li.li2 {background: #f8f8f8;}
.bash .kw1 {color: #000000; font-weight: bold;}
.bash .kw2 {color: #c20cb9; font-weight: bold;}
.bash .kw3 {color: #7a0874; font-weight: bold;}
.bash .es0 {color: #000099; font-weight: bold;}
.bash .br0 {color: #000000; font-weight: bold;}
.bash .st0 {color: #ff0000;}
.bash .nu0 {color: #000000;}
.bash .re0 {color: #007800;}
.bash .re1 {color: #007800;}
.bash .re2 {color: #007800;}
.bash .re3 {color: #808080; font-style: italic;}
.bash .re4 {color: #007800;}
html>body .entry .bash ol li { margin: 0 0 0 0; }
.syntax { margin: 10px 0; background-color: #E8E8E8; text-align:left; }
</style>
<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:<br/></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">&#91;</span> <span class="st0">&quot;${MAJOR}&quot;</span> = <span class="st0">&quot;3&quot;</span> <span class="br0">&#93;</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:<br/></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>
]]></content:encoded>
			<wfw:commentRss>http://www.restoroot.com/Blog/2007/11/01/packagemaker-30/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
