<?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>64k &#187; programming</title>
	<atom:link href="http://www.64k-tec.de/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.64k-tec.de</link>
	<description>Software development and more ...</description>
	<lastBuildDate>Tue, 10 Jan 2012 21:58:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Test, 1, 2, 3, test, test</title>
		<link>http://www.64k-tec.de/2011/03/test-1-2-3-test-test/</link>
		<comments>http://www.64k-tec.de/2011/03/test-1-2-3-test-test/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 20:51:27 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Callgrind]]></category>
		<category><![CDATA[compile time tests]]></category>
		<category><![CDATA[dynamic analyzer]]></category>
		<category><![CDATA[dynamic tests]]></category>
		<category><![CDATA[fortify]]></category>
		<category><![CDATA[GUI tests]]></category>
		<category><![CDATA[Instruments]]></category>
		<category><![CDATA[leak check]]></category>
		<category><![CDATA[panic]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[static tests]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tinderbox]]></category>
		<category><![CDATA[unit tests]]></category>
		<category><![CDATA[Valgrind]]></category>
		<category><![CDATA[VirtualBox]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=1631</guid>
		<description><![CDATA[Everybody know these words. You say it when you have to check a microphone which were plugged into some sound system. It's just test if the microphone is working well and the spoken words are reflected by the amplifier. It's a simple test to check the functionality of the microphone or the whole sound system. [...]]]></description>
			<content:encoded><![CDATA[<p>Everybody know these words. You say it when you have to check a microphone which were plugged into some sound system. It's just test if the microphone is working well and the spoken words are reflected by the amplifier. It's a simple test to check the functionality of the microphone or the whole sound system. Why should I write about sound systems? No, I don't try to learn playing a guitar or any other instrument, I like to share some thoughts about software testing. After writing a post about <a href="http://www.64k-tec.de/2010/10/using-suppression-files-with-valgrind/">Valgrind</a>, I had the feeling that I should try to show some ways of testing software. In the following post I will analyze what can be tested, what is useful and which tools are available. I don't aim to make a full overview of software testing itself, I just like to highlight some tools (or thoughts) which are useful and every developer should know of.</p>
<h2>Why should I test my software</h2>
<p>This is easy to answer. Humans write software and humans tend to make mistakes. Even if something is working <a href="http://en.wikipedia.org/wiki/TeX#Development" target="_blank">perfect</a>, a bug fix or new feature can break it. Testing software will not prevent you from bugs, but it can boost your user satisfaction a lot, by removing errors which are common and avoidable.</p>
<h2>What can be tested</h2>
<p>First of all, you should think about what should be tested at all. The following list tries to categorizes different tests from a technical perspective:</p>
<ol>
<li>Static tests</li>
<li>Compile time tests</li>
<li>Runtime test</li>
</ol>
<p>Also we have to differ between automatic tests and manual tests done by an operator. In the following I will prioritize the automatic tests, simply because once they are setup, they are easier to handle. Manuel tests means, setting up a test plan, making someone responsible for checking the test plan and forcing the test to be done before a release. On the other side automatic tests could be done by a machine at day and night with every software level your application is currently in.</p>
<h3>Static tests</h3>
<p>Static tests analyze the code base and try to predict error paths. There are several applications on the market, but most of them are not free. First you need a product which speaks your language. If you develop in C, C++, Java, C# or whatever makes a huge difference here. There are many static analyzer out there which can analyze C, but not many can successfully parse any of the widely used higher programming languages. One of them, which can analyze C++, is <a href="https://www.fortify.com/" target="_blank">Fortify</a>. Fortify uses rules to find different errors a developer can do. There are of course default rules, but a developer can define rules himself. This product is specialized in detecting errors which may end in security holes. One such error in terms of security considerations is file input handling. When one is reading a string directly out of a file, some assumptions are done. Strings in the C/C++ world are zero terminated. All string handling/manipulation function, which are available e.g. from the glibc, are working over the single characters as long as they didn't find the termination byte. Now, if a developer is reading a string out of a file and doesn't check if the terminating zero is there, he open a security hole. If an attacker is using this knowledge he is able to provoke a buffer overflow. Fortify can detect such blindly faith to input data. Of course it can detect much more. On the down side, as most software projects are really complex, static code analyzer tend to produce many false/positive. Working through this false/positive and defining filters for the own software project needs much time. On the other side these tools help in finding error paths, which even runtime tests doesn't show, cause they are so unusual. But exactly these errors are used by attackers to abuse your software for bad things.</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/fortify.png"><img class="aligncenter size-medium wp-image-1662" title="Fortify" src="/wordpress/wp-content/uploads/fortify-300x203.png" alt="" width="300" height="203" /></a></p>
<h3>Compile time tests</h3>
<p>Compile tests make sure your application compiles on different architectures, bit depth, or with other resources like external dependencies (e.g. depending third-party libraries). They are important when you develop for and/or if your team is using different platforms. They make sure a software is at least compiling on every important system. This doesn't mean the current status works well, it just makes sure every developer involved in the progress of the product is able to build an actual version, even if he is working on a different part of the software itself. Such a situation happens often in open source products, like Mozilla, which invented <a href="http://en.wikipedia.org/wiki/Tinderbox_%28software%29" target="_blank">tinderbox</a> for making these tests. It allows you to set up different build environments for your software and watch the result of every check-in you made in terms of compatibility to this environment. The following shows a screenshot of the <a href="http://tinderbox.mozilla.org/showbuilds.cgi?tree=Firefox-Ports" target="_blank">Firefox-Ports</a> tinderbox with one broken build box. As everybody know, <span style="color: #ff0000;">red</span> is bad:</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/tinderbox.png"><img class="aligncenter size-medium wp-image-1661" title="Tinderbox" src="/wordpress/wp-content/uploads/tinderbox-300x165.png" alt="" width="300" height="165" /></a></p>
<p style="text-align: left;">Red means a burning tree. It shows you that your last check-in doesn't compile on a specific system. The cool thing is that you can look at the log and spot the error with ease. You know why it doesn't compile and can fix it. This will prevent you from being blamed by other team members because they can't work with the current <a href="http://en.wikipedia.org/wiki/Trunk_%28software%29" target="_blank">trunk</a>.</p>
<h3 style="text-align: left;">Runtime tests</h3>
<p>Runtime tests are of course the biggest part of testing. They try to make sure the application does the job it was written for. This also means these tests are the hardest one. It may help to try to separate them as well. I use the following separation:</p>
<ol>
<li>Unit tests</li>
<li>Dynamic analyzer</li>
<li>GUI tests</li>
</ol>
<h4>Unit tests</h4>
<p>Unit tests check that the specialized functionality a unit provide is working correctly. A well-known example is string handling. String handling is necessary in almost all software projects out there. May it printing the help section of a command line tool or the information presentation in an GUI application. A unit test tries to test anything a user of this unit may do with it. This could be adding a string to another, replacing parts of a string, converting a string to other formats (like to another encoding or to an integer) or much more complex operations like searching within a string with a regular expression. All these operations could be relatively easy tested with unit tests. There is no general usable software out there which could be used for unit testing, but most software frameworks offer some help to write unit tests. Qt has a <a href="http://doc.trolltech.com/latest/qtestlib-manual.html" target="_blank">unit test framework</a> and VirtualBox has a <a href="http://www.virtualbox.org/browser/trunk/include/iprt/test.h" target="_blank">integrated system</a>, as well. Here is a screenshot from a just <a href="http://labs.qt.nokia.com/2010/10/29/making-auto-testing-easier/" target="_blank">announced</a> graphical tool by Nokia, which makes spotting errors in Qt unit tests much more easier. The second screenshot shows the output of a VirtualBox unit test.</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/qt-autotester12.png"><img class="alignnone size-medium wp-image-1592" style="margin-left: 10px; margin-right: 10px;" title="Qt Autotester" src="/wordpress/wp-content/uploads/qt-autotester12-300x220.png" alt="" width="190" height="140" /></a><a href="/wordpress/wp-content/uploads/tstRTStrFormat1.png"><img class="alignnone size-medium wp-image-1663" style="margin-left: 10px; margin-right: 10px;" title="tstRTStrFormat" src="/wordpress/wp-content/uploads/tstRTStrFormat1-300x162.png" alt="" width="259" height="140" /></a></p>
<p>Please also note that unit testing not just means testing functionality. It could also mean testing performance regression. If some function needed an amount of time in an existing version, it should be at least equal or faster in means of execution time in a new version. Unit tests are evolutionary like the software itself. It is illusionary to believe a unit test is finished sometime. The test will/should grow as long as users will report errors. Often a unit test is called by the bugtracker id, which showed some specific problem the first time.</p>
<h4>Dynamic analyzer</h4>
<p>This field of testing is a little bit different from the other one, cause the developer needs to interact here. Although it would be possible to automate some of these tests, they are more designed to be done by the developer from time to time (usually after a feature is completed) to check for some basic errors. The most common dynamic analyzer in the open source world is the Valgrind instrumentation framework. It has a tool for checking memory management errors, like I showed in this <a href="http://www.64k-tec.de/2010/10/using-suppression-files-with-valgrind/" target="_blank">post</a>. As already written there, memory leak errors can happen to everyone, so having a tool for finding and eliminating them, is very useful. On the other side there is a tool called Callgrind, which <a href="http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29" target="_blank">profiles</a> a given software in detail. After profiling some software, a developer is able to see execution times relatively to each other. This makes it possible to find the places an algorithm spend the most time. With this information a developer has the chance to find bottlenecks, which maybe could be eliminated. Beside that, is the knowledge of the <a href="http://en.wikipedia.org/wiki/Call_graph" target="_blank">call graph</a> sometimes from great information, especially if you develop graphical applications, like in Qt. Having events, slots or asynchrony window systems, like in X11, make it sometimes hard to predict how the code will <a href="http://en.wikipedia.org/wiki/Control_flow" target="_blank">flow</a>. It may also be helpful in deciding if some subroutine is a candidate for parallel execution. The following screenshot shows the result of analyzing some parts of VirtualBox. To visualize the output of Callgrind (and to interactively work with this data), <a href="http://kcachegrind.sourceforge.net/html/Home.html" target="_blank">KCachegrind</a> is the number one tool. The second screenshot shows some similar profiling with <a href="http://developer.apple.com/technologies/tools/" target="_blank">Instruments</a> from Xcode.</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/kcachegrind.png"><img class="size-medium wp-image-1672 alignnone" style="margin: 5px 10px;" title="KCachegrind" src="/wordpress/wp-content/uploads/kcachegrind-300x190.png" alt="" width="221" height="140" /></a><a href="/wordpress/wp-content/uploads/instruments.png"><img class="alignnone size-medium wp-image-1677" style="margin: 5px 10px;" title="Instruments" src="/wordpress/wp-content/uploads/instruments-300x182.png" alt="" width="230" height="140" /></a></p>
<h4>GUI tests</h4>
<p>GUI's have the advantage to do several tasks in an independent order and users tend to do tasks in a way a developer don't expect. Developer tends to do tasks in the way they have programmed it. On the other side GUI testing tools do only things they are programmed for. To be honest, we don't do any automatic GUI testing in VirtualBox. It's such a wide field and doing it right is hard. Anyway, there are products out there which can be helpful. Qt itself have possibilities for GUI testing build in. Another product is from <a href="http://www.froglogic.com/" target="_blank">froglogic</a>. Squish is specialized in GUI testing, especially for Qt applications. But of course there are other tools as well. Just have a look at your preferred build environment.</p>
<h2>Conclusion</h2>
<p>Testing produces work. It is also something developers don't like. On the other side it helps to prevent further work by bypassing errors which are preventable. Everybody should ask himself how much time he will sacrifice in setting up test machines or unit tests to make a product much more stable. Errors in freshly released products which don't happen in an <a href="http://en.wikipedia.org/wiki/Software_regression" target="_blank">older release</a> are always bad marketing. If there is a chance to prevent them by just adding some lines of code, everyone should use this chance. This post doesn't show all available tools for testing. For example, the big players like Apple and Microsoft have also testing and analyzing software build into there IDE's. I just want to give a brief overview what is possible, so that everybody could check the own environment for possibilities of doing testing.</p>
<p>As a last word which touches my personal work environment: Please be assured that we are trying hard to make VirtualBox as stable and save as much as possible <img src='http://www.64k-tec.de/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2011/03/test-1-2-3-test-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kernel driver code signing with the VeriSign Class 3 Primary CA &#8211; G5 certificate</title>
		<link>http://www.64k-tec.de/2011/02/kernel-driver-code-signing-with-the-verisign-class-3-primary-ca-g5-certificate/</link>
		<comments>http://www.64k-tec.de/2011/02/kernel-driver-code-signing-with-the-verisign-class-3-primary-ca-g5-certificate/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 20:58:11 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[Applications]]></category>
		<category><![CDATA[CA]]></category>
		<category><![CDATA[Certificate]]></category>
		<category><![CDATA[Certificate Authority]]></category>
		<category><![CDATA[chain of trust]]></category>
		<category><![CDATA[code signing]]></category>
		<category><![CDATA[cross certificate]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[installer]]></category>
		<category><![CDATA[intermediate certificate]]></category>
		<category><![CDATA[kernel driver module]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Signature]]></category>
		<category><![CDATA[signtool]]></category>
		<category><![CDATA[trustworthy]]></category>
		<category><![CDATA[VeriSign]]></category>
		<category><![CDATA[VirtualBox]]></category>
		<category><![CDATA[WDK]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=2101</guid>
		<description><![CDATA[Since the first 64-bit version of Windows Vista it is necessary to digital sign any kernel mode driver. Without a proper code signing the driver isn't loaded by the system. Although it is also possible to sign drivers and applications for the 32-bit versions of Windows (as far as I know starting with Windows XP) [...]]]></description>
			<content:encoded><![CDATA[<p>Since the first <a href="http://msdn.microsoft.com/en-us/library/bb530195.aspx" target="_blank">64-bit version of Windows Vista</a> it is necessary to digital sign any kernel mode driver. Without a proper <a href="http://en.wikipedia.org/wiki/Code_signing" target="_blank">code signing</a> the driver isn't loaded by the system. Although it is also possible to sign drivers and applications for the 32-bit versions of Windows (as far as I know starting with Windows XP) it became mandatory in the 64-bit versions for any kernel mode driver. A serious software provider always sign its own software to make sure the user can rely on the authenticity of the package he e.g. downloaded from the Internet. It also prevent a question about installing a driver from an untrusted source which could be denied by the user and therefore makes the own software unusable. In any case the user has to confirm an installation of a driver, even if this driver is correctly signed, if the driver isn't <em><a href="http://en.wikipedia.org/wiki/WHQL_Testing" target="_blank">Windows Hardware Quality Labs</a></em> (WHQL) certificated. In the following post I will not explain the basics of how to sign Windows drivers, there are many articles out there like the one from Microsoft itself, but I will look at changes which have to be made to correctly code sign drivers with a certificate signed by the <a href="http://www.verisign.com/support/roots.html" target="_blank">VeriSign Class 3 Primary CA - G5</a> root certificate, which is in use by the end of 2010.</p>
<h2>Chain of trust</h2>
<p>To ensure the validity of every component in a computer system (hardware or software) a <a href="http://en.wikipedia.org/wiki/Chain_of_trust" target="_blank">chain of trust</a> is build. This basically means there is some root institution (in computer cryptography this is called <em><a href="http://en.wikipedia.org/wiki/Certificate_Authority" target="_blank">Certificate Authority</a></em> (CA)) which is trusted per se. Any following part in this hierarchy is signed by the parent authority. This allows a flexible mechanism where only the connected parties have to make sure they trust each other to make the full chain trustworthy. This concept is also used for code signing, cause it allows to be trustworthy in the eyes of Microsoft without ever being in touch with them. As Microsoft don't trust (for code signing) every root CA they have in their certificate store, they explicit allow only a handful of root CA's to be in this trust of chain. They archive this by cross signing root CA's with their own CA. The full concept is described in this <a href="http://www.microsoft.com/whdc/driver/install/drvsign/crosscert.mspx" target="_blank">article</a>. It basically means the software maker certificate has to be trusted by an official CA included in every Windows version and this root CA has to be cross signed by Microsoft for code signing. This is the point where the problems start with the new VeriSign Primary CA.</p>
<h2>Finding the little differences</h2>
<p>The old code signing CA is the VeriSign Class 3 Public Primary CA, available since 1996. This certificate uses an 1024 bit key, which isn't considered save anymore in the future. Therefor VeriSign decided to replace this root CA with a stronger one, which uses an 2048 bit key. If you simply replace an old software maker certificate (signed with the old root CA) with one which is signed by the new CA you get a surprise. Installing a kernel mode driver signed with the new certificate ends up with a message like this:</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/unsigned_driver.png"><img class="aligncenter size-medium wp-image-2126" title="Error, because an unsigned driver." src="/wordpress/wp-content/uploads/unsigned_driver-300x284.png" alt="" width="201" height="190" /></a></p>
<p>A look into the security log of the event viewer shows this error message:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Code integrity determined that the image hash of a file is not valid. The
file could be corrupt due to unauthorized modification or the invalid hash
could indicate a potential disk device error.</pre></div></div>

<p>To be honest: This information doesn't contain any useful hint. If you compare the old signed driver with the new signed driver you will not see any difference. Both could be successful verified as shown next:</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/certs_both.png"><img class="aligncenter size-medium wp-image-2142" title="Old and new driver verification." src="/wordpress/wp-content/uploads/certs_both-300x172.png" alt="" width="300" height="172" /></a></p>
<p>Even if you compare all the sub-dialogs side by side you will not find any difference, beside the different root CA of course. So whats the difference? Well, you can't rely on the graphical representation of this trust of chain. When you invoke the <code>signtool</code> of the <a href="http://en.wikipedia.org/wiki/Windows_Driver_Kit" target="_blank"><em>Windows Driver Kit</em></a> (WDK) with the <code>verify</code> option, you will see the difference:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">C:\Program Files\Oracle\VirtualBox_Sun&gt;signtool.exe verify /v /kp drivers/vboxdrv/VBoxDrv.sys
&nbsp;
Verifying: drivers/vboxdrv/VBoxDrv.sys
SHA1 hash of file: 9E58611C764D5AE04140E4CC7782B3229D1BCB8A
Signing Certificate Chain:
    Issued to: Microsoft Code Verification Root
    Issued by: Microsoft Code Verification Root
    Expires:   01.11.2025 14:54:03
    SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3
&nbsp;
        Issued to: Class 3 Public Primary Certification Authority
        Issued by: Microsoft Code Verification Root
        Expires:   23.05.2016 18:11:29
        SHA1 hash: 58455389CF1D0CD6A08E3CE216F65ADFF7A86408
&nbsp;
            Issued to: VeriSign Class 3 Code Signing 2004 CA
            Issued by: Class 3 Public Primary Certification Authority
            Expires:   16.07.2014 00:59:59
            SHA1 hash: 197A4AEBDB25F0170079BB8C73CB2D655E0018A4
&nbsp;
                Issued to: Sun Microsystems, Inc.
                Issued by: VeriSign Class 3 Code Signing 2004 CA
                Expires:   12.06.2011 00:59:59
                SHA1 hash: 1D4458051589B47A06260125F6EC6BBB6C24472E
&nbsp;
The signature is timestamped: 08.02.2011 00:23:54
Timestamp Verified by:
    Issued to: Thawte Timestamping CA
    Issued by: Thawte Timestamping CA
    Expires:   01.01.2021 00:59:59
    SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656
&nbsp;
        Issued to: VeriSign Time Stamping Services CA
        Issued by: Thawte Timestamping CA
        Expires:   04.12.2013 00:59:59
        SHA1 hash: F46AC0C6EFBB8C6A14F55F09E2D37DF4C0DE012D
&nbsp;
            Issued to: VeriSign Time Stamping Services Signer - G2
            Issued by: VeriSign Time Stamping Services CA
            Expires:   15.06.2012 00:59:59
            SHA1 hash: ADA8AAA643FF7DC38DD40FA4C97AD559FF4846DE
&nbsp;
Successfully verified: drivers/vboxdrv/VBoxDrv.sys
&nbsp;
Number of files successfully Verified: 1
Number of warnings: 0
Number of errors: 0
&nbsp;
C:\Program Files\Oracle\VirtualBox_Sun&gt;</pre></div></div>

<p>and</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">C:\Program Files\Oracle\VirtualBox_Oracle_Wrong\&gt;signtool.exe verify /v /kp drivers/vboxdrv/VBoxDrv.sys
&nbsp;
Verifying: drivers/vboxdrv/VBoxDrv.sys
SHA1 hash of file: F398B7124B0A8C32DBFB262343AC1180807505D0
Signing Certificate Chain:
    Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
    Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
    Expires:   17.07.2036 00:59:59
    SHA1 hash: 4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5
&nbsp;
        Issued to: VeriSign Class 3 Code Signing 2010 CA
        Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
        Expires:   08.02.2020 00:59:59
        SHA1 hash: 495847A93187CFB8C71F840CB7B41497AD95C64F
&nbsp;
            Issued to: Oracle Corporation
            Issued by: VeriSign Class 3 Code Signing 2010 CA
            Expires:   08.02.2014 00:59:59
            SHA1 hash: A88FD9BDAA06BC0F3C491BA51E231BE35F8D1AD5
&nbsp;
The signature is timestamped: 10.02.2011 09:30:08
Timestamp Verified by:
    Issued to: Thawte Timestamping CA
    Issued by: Thawte Timestamping CA
    Expires:   01.01.2021 00:59:59
    SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656
&nbsp;
        Issued to: VeriSign Time Stamping Services CA
        Issued by: Thawte Timestamping CA
        Expires:   04.12.2013 00:59:59
        SHA1 hash: F46AC0C6EFBB8C6A14F55F09E2D37DF4C0DE012D
&nbsp;
            Issued to: VeriSign Time Stamping Services Signer - G2
            Issued by: VeriSign Time Stamping Services CA
            Expires:   15.06.2012 00:59:59
            SHA1 hash: ADA8AAA643FF7DC38DD40FA4C97AD559FF4846DE
&nbsp;
Successfully verified: drivers/vboxdrv/VBoxDrv.sys
&nbsp;
Number of files successfully Verified: 1
Number of warnings: 0
Number of errors: 0
&nbsp;
C:\Program Files\Oracle\VirtualBox_Oracle_Wrong&gt;</pre></div></div>

<p>As you can see, the chain of trust of the old certificate contains the Microsoft Code Verification Root, the new signed driver not. As Microsoft released the cross certificate somewhere in 2006, it makes sense that the new VeriSign certificate isn't signed by them. So first of all, we have to blame the <code>signtool</code> for <strong>silently</strong> ignoring a cross certificate which, obviously, doesn't trust the root certificate. When you have this information you can search for additional information and probably find an <a href="https://knowledge.verisign.com/support/code-signing-support/index?page=content&amp;actp=CROSSLINK&amp;id=AD220" target="_blank">advisory of VeriSign</a>. There you learn you need <a href="http://www.verisign.com/support/verisign-intermediate-ca/code-signing-intermediate/index.html" target="_blank">intermediate certificates</a> for the new root CA.</p>
<h2>Installing the right certificates on the build machine</h2>
<p>The rest is easy. The certificate store of any Windows installation contains the new VeriSign Root CA as shown here:</p>
<p style="text-align: left;"><a href="/wordpress/wp-content/uploads/g5_root_ca.png"><img class="aligncenter size-medium wp-image-2168" title="VeriSign Class 3 Primary CA - G5 in the Windows certificate store." src="/wordpress/wp-content/uploads/g5_root_ca-300x164.png" alt="" width="300" height="164" /></a>Delete this root CA and replace it by the intermediate certificates you fetched from the website shown above. Just place the certificate in a text file, add the extension <code>.der</code> and double-click to install it. Make sure to replace really all versions of this certificate, even the one in the global store. When you now sign your driver with your new certificate the Microsoft Code Verification Root is in the trust of chain, as shown in the following:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">C:\Program Files\Oracle\VirtualBox_Oracle_Correct&gt;signtool.exe verify /v /kp drivers/vboxdrv/VBoxDrv.sys
&nbsp;
Verifying: drivers/vboxdrv/VBoxDrv.sys
SHA1 hash of file: 201B7F97473D7F015A104D7841371C5AE4F22FF2
Signing Certificate Chain:
    Issued to: Microsoft Code Verification Root
    Issued by: Microsoft Code Verification Root
    Expires:   01.11.2025 14:54:03
    SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3
&nbsp;
        Issued to: Class 3 Public Primary Certification Authority
        Issued by: Microsoft Code Verification Root
        Expires:   23.05.2016 18:11:29
        SHA1 hash: 58455389CF1D0CD6A08E3CE216F65ADFF7A86408
&nbsp;
            Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
            Issued by: Class 3 Public Primary Certification Authority
            Expires:   08.11.2021 00:59:59
            SHA1 hash: 32F30882622B87CF8856C63DB873DF0853B4DD27
&nbsp;
                Issued to: VeriSign Class 3 Code Signing 2010 CA
                Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
                Expires:   08.02.2020 00:59:59
                SHA1 hash: 495847A93187CFB8C71F840CB7B41497AD95C64F
&nbsp;
                    Issued to: Oracle Corporation
                    Issued by: VeriSign Class 3 Code Signing 2010 CA
                    Expires:   08.02.2014 00:59:59
                    SHA1 hash: A88FD9BDAA06BC0F3C491BA51E231BE35F8D1AD5
&nbsp;
The signature is timestamped: 10.02.2011 15:03:30
Timestamp Verified by:
    Issued to: Thawte Timestamping CA
    Issued by: Thawte Timestamping CA
    Expires:   01.01.2021 00:59:59
    SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656
&nbsp;
        Issued to: VeriSign Time Stamping Services CA
        Issued by: Thawte Timestamping CA
        Expires:   04.12.2013 00:59:59
        SHA1 hash: F46AC0C6EFBB8C6A14F55F09E2D37DF4C0DE012D
&nbsp;
            Issued to: VeriSign Time Stamping Services Signer - G2
            Issued by: VeriSign Time Stamping Services CA
            Expires:   15.06.2012 00:59:59
            SHA1 hash: ADA8AAA643FF7DC38DD40FA4C97AD559FF4846DE
&nbsp;
Successfully verified: drivers/vboxdrv/VBoxDrv.sys
&nbsp;
Number of files successfully Verified: 1
Number of warnings: 0
Number of errors: 0
&nbsp;
C:\Program Files\Oracle\VirtualBox_Oracle_Correct&gt;</pre></div></div>

<p>You see the old certificate (which is trusted by Microsoft) is the parent of the new certificate, which completes the trust of chain again. I guess this is only some temporary solution as long as Microsoft doesn't release a new cross certificate (that's why it is called intermediate). Luckily, you only need the intermediate certificates on the build machine. For your end users nothing has to be changed.</p>
<h2>Conclusion</h2>
<p>This article shows how a service provider make an easy task hard to do. Signing a kernel mode driver with the new certificate isn't hard, but finding the right information is. Although there is an advisory from VeriSign, it doesn't really explain what to do. As I believe in the future many other people will be in the same situation, I hope this article will save them from some sleepless nights.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2011/02/kernel-driver-code-signing-with-the-verisign-class-3-primary-ca-g5-certificate/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Adding a badge to the unified toolbar on Mac OS X</title>
		<link>http://www.64k-tec.de/2011/01/adding-a-badge-to-the-unified-toolbar-on-mac-os-x/</link>
		<comments>http://www.64k-tec.de/2011/01/adding-a-badge-to-the-unified-toolbar-on-mac-os-x/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 21:41:56 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[bagde]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[NSResponder]]></category>
		<category><![CDATA[NSView]]></category>
		<category><![CDATA[objc]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[toolbar]]></category>
		<category><![CDATA[unified titlebar]]></category>
		<category><![CDATA[VirtualBox]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=2013</guid>
		<description><![CDATA[Mac OS X and the applications running on it are known for being sometimes unusual in the look and feel. For some reason developer on Mac OS X seems to be more creative than on other platforms. For an application developer which deals with user input it is important to make any user interaction as [...]]]></description>
			<content:encoded><![CDATA[<p>Mac OS X and the applications running on it are known for being sometimes unusual in the look and feel. For some reason developer on Mac OS X seems to be more creative than on other platforms. For an application developer which deals with user input it is important to make any user interaction as useful as possible and present this information in a way which is on the one side as much less annoying as possible but also attractive and informative on the other side. Lastly I was thinking about how to show the users they are using a beta version, which should remind them that this is not production ready software, but on the same time make it easy to respond to bugs they find in this pre-release. The solution, I came up with, was a badge in the toolbar which shows this is a release which is definitely in a testing phase, but also allows the user to double-click to give a respond to this particular version. In the following post I will show how to do this.</p>
<h2>Getting the superview</h2>
<p>In Cocoa all user displayed content is a <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html" target="_blank">NSView</a> (most of the time; forget about the Dock). This is really nice, cause you could manipulate them. Although there are no public methods for getting the NSView of the toolbar or even the titlebar, they exist as an NSView. The NSView of the toolbar could be accessed by a private method. As always in Objective C you could ask for a particular method by using the <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/respondsToSelector:" target="_blank"><code>respondsToSelector</code></a> statement like in the following:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSToolbar</span> <span style="color: #002200;">*</span>tb <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>pWindow toolbar<span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>tb respondsToSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>_toolbarView<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
 <span style="color: #400080;">NSView</span> <span style="color: #002200;">*</span>tbv <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tb performSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>_toolbarView<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
 <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>tbv<span style="color: #002200;">&#41;</span>
 <span style="color: #002200;">&#123;</span>
  <span style="color: #11740a; font-style: italic;">/* do something with tbv */</span>
 <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>This return the NSView of the toolbar at least until 10.6. But be warned this is a private method and of course this could be changed in a future version of Mac OS X. At least the shown method will correctly fail in the case Apple change his mind which will result in doing nothing. Anyway this will not include the area of the titlebar. To get the NSView which covers both the title bar and the toolbar you need another trick. The titlebar usual has a close, minimize or maximize button. These buttons are NSButton's and added by the system depending of the window type. As a NSButton is also a NSView it also has a parent. This dependency allows us to access the view which is responsible for displaying the unified titlebar and the toolbar. The following code shows how to get the responsible view and how to add an additional <a href="http://developer.apple.com/library/mac/#documentation/cocoa/reference/ApplicationKit/Classes/NSImageView_Class/Reference/Reference.html" target="_blank">NSImageView</a> to it:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSView</span> <span style="color: #002200;">*</span>wv <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>pWindow standardWindowButton<span style="color: #002200;">:</span>NSWindowCloseButton<span style="color: #002200;">&#93;</span> superview<span style="color: #002200;">&#93;</span>;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>wv<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
 <span style="color: #11740a; font-style: italic;">/* We have to calculate the size of the title bar for the center case. */</span>
 NSSize s <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>pImage size<span style="color: #002200;">&#93;</span>;
 NSSize s1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>wv frame<span style="color: #002200;">&#93;</span>.size;
 NSSize s2 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>pWindow contentView<span style="color: #002200;">&#93;</span> frame<span style="color: #002200;">&#93;</span>.size;
 <span style="color: #11740a; font-style: italic;">/* Correctly position the label. */</span>
 <span style="color: #400080;">NSImageView</span> <span style="color: #002200;">*</span>iv <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImageView</span> alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>
        NSMakeRect<span style="color: #002200;">&#40;</span>s1.width <span style="color: #002200;">-</span> s.width <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>fCenter ? <span style="color: #2400d9;">10</span> <span style="color: #002200;">:</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>,
                   fCenter ? s2.height <span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span>s1.height <span style="color: #002200;">-</span> s2.height <span style="color: #002200;">-</span> s.height<span style="color: #002200;">&#41;</span> <span style="color: #002200;">/</span> <span style="color: #2400d9;">2</span> <span style="color: #002200;">:</span> s1.height <span style="color: #002200;">-</span> s.height <span style="color: #002200;">-</span> <span style="color: #2400d9;">1</span>,
  	           s.width, s.height<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
 <span style="color: #11740a; font-style: italic;">/* Configure the NSImageView for auto moving. */</span>
 <span style="color: #002200;">&#91;</span>iv setImage<span style="color: #002200;">:</span>pImage<span style="color: #002200;">&#93;</span>;
 <span style="color: #002200;">&#91;</span>iv setAutoresizesSubviews<span style="color: #002200;">:</span><span style="color: #a61390;">true</span><span style="color: #002200;">&#93;</span>;
 <span style="color: #002200;">&#91;</span>iv setAutoresizingMask<span style="color: #002200;">:</span>NSViewMinXMargin | NSViewMinYMargin<span style="color: #002200;">&#93;</span>;
 <span style="color: #11740a; font-style: italic;">/* Add it to the parent of the close button. */</span>
 <span style="color: #002200;">&#91;</span>wv addSubview<span style="color: #002200;">:</span>iv positioned<span style="color: #002200;">:</span>NSWindowBelow relativeTo<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>This code needs a NSWindow, a NSImage as label and the flag fCenter for deciding if the image is vertically centered within the titlebar. Also the badge is pinned on the right side by setting the <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setAutoresizingMask:" target="_blank"><code>AutoresizingMask</code></a>. The following shows how this could be look like:</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/badge.png"><img class="size-medium wp-image-2056 aligncenter" style="vertical-align: middle;" title="badge" src="/wordpress/wp-content/uploads/badge-300x281.png" alt="" width="300" height="281" /></a></p>
<h2>Adding functionality to the badge</h2>
<p>First we should add some information about this release by using the <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setToolTip:" target="_blank"><code>setToolTip</code></a> method of an NSView. Simply add this call to the code:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"> <span style="color: #002200;">&#91;</span>iv setToolTip<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Some info about the beta version.&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>To make this beta hint more useful, we should make it clickable. Getting mouse down events in Cocoa is only possible by handling the <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/NSResponder/mouseDown:" target="_blank"><code>mouseDown</code></a> event of the <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html" target="_blank">NSResponder</a> sub-class. Also the view must accept first responder events. How to do this is shown in the following code:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> BetaImageView<span style="color: #002200;">:</span> <span style="color: #400080;">NSImageView</span>
<span style="color: #002200;">&#123;</span><span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>acceptsFirstResponder;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>mouseDown<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSEvent</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pEvent;
<span style="color: #a61390;">@end</span>
<span style="color: #a61390;">@implementation</span> BetaImageView
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>acceptsFirstResponder
<span style="color: #002200;">&#123;</span>
 <span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>mouseDown<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSEvent</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pEvent
<span style="color: #002200;">&#123;</span>
 <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>pEvent clickCount<span style="color: #002200;">&#93;</span> &gt; <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>
  <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSWorkspace</span> sharedWorkspace<span style="color: #002200;">&#93;</span> openURL<span style="color: #002200;">:</span>
        <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://www.virtualbox.org/&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
 <span style="color: #a61390;">else</span>
  <span style="color: #002200;">&#91;</span>super mouseDown<span style="color: #002200;">:</span>pEvent<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Replace NSImageView with BetaViewImage in the allocation call in listing 2 and you are done. Change the URL to one where the user can respond to the beta questions, like a bug tracker or forum.</p>
<h2>Conclusion</h2>
<p>This post showed how to add an nice looking badge to the unified toolbar on Mac OS X. The user is reminded he is using some pre-release software all the time, but at the same time has an easy way to report problems with this release. Of course could such a badge used for anything else.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2011/01/adding-a-badge-to-the-unified-toolbar-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating file shortcuts on three different operation systems</title>
		<link>http://www.64k-tec.de/2010/11/creating-file-shortcuts-on-three-different-operation-systems/</link>
		<comments>http://www.64k-tec.de/2010/11/creating-file-shortcuts-on-three-different-operation-systems/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 13:44:50 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[AESend]]></category>
		<category><![CDATA[Alias]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[COM]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[Desktop Entry Specification]]></category>
		<category><![CDATA[file shortcuts]]></category>
		<category><![CDATA[freeedesktop.org]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[hard link]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[IPersistFile]]></category>
		<category><![CDATA[IShellLink]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[objc]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[platform]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[VirtualBox]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[X11]]></category>
		<category><![CDATA[Xorg]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=1838</guid>
		<description><![CDATA[As you may know, developing for multiple platforms is one of my strengths. Strictly speaking, it's a basic requirement if you are involved in such a product like VirtualBox, which runs on every major (and several minor) platform available today. Beside the GUI, which uses Qt and therewith is portable without any additional cost (which [...]]]></description>
			<content:encoded><![CDATA[<p>As you may know, developing for multiple platforms is one of my strengths. Strictly speaking, it's a basic requirement if you are involved in such a product like VirtualBox, which runs on every major (and several minor) platform available today. Beside the GUI, which uses <a href="http://qt.nokia.com/" target="_blank">Qt</a> and therewith is portable without any additional cost (which isn't fully true if you want <a href="http://www.64k-tec.de/2009/12/integrating-native-cocoa-controls-into-qt/" target="_blank">real native look and feel on every platform, especially on Mac OS X</a>), all the rest of VirtualBox is written in a portable way. This is done by using only C/C++ and Assembler when necessary. Everything which needs a different approach, because of the design of the OS (and the API's which are available there), is implemented in a platform dependent way. In the history of VirtualBox, several <a href="http://www.virtualbox.org/browser/trunk/src/VBox/Runtime" target="_blank">modules</a> are created and grown by the time, which makes it really easy to deal with this differences. For stuff like file handling, paths, strings, semaphores or any other basic functionality, you can just use the modules which are available. On the other side it might be necessary, for a new feature we implement, to write it from the ground. In the following post I will show how to create a <a href="http://en.wikipedia.org/wiki/File_shortcut" target="_blank">file shortcut</a> for the three major operation systems available today.</p>
<h2>Why do you want to use file shortcuts</h2>
<p>On the classical UNIX systems you have <a href="http://en.wikipedia.org/wiki/Hard_link" target="_blank">hard</a> and <a href="http://en.wikipedia.org/wiki/Soft_link" target="_blank">soft</a> links. These are implemented by the filesystem and make it possible to link to another file or folder without any trouble. Most of the time soft links are used, but it really depends on the use case. Unfortunately these kind of links are not available on Windows (yes, I know there are also hard links and junctions on NTFS, but they are not common and difficult to handle), these links doesn't allow any additional attributes. For example one like to add a different icon to the link or provide more information through a comment field. Beside on Mac OS X, shortcuts can also be work as an application launcher, where the link contain the information what application should be started and how. In contrast to filesystem links which are handled by the operation system, these shortcuts are handled by the window system (or shell) running on the host (which doesn't mean there is no filesystem support for it). On Windows this is the Explorer, on Mac OS X the Finder and on Linux a <a href="http://www.freedesktop.org/" target="_blank">freedesktop.org</a> conforming file manager.</p>
<h2>Creating a Desktop file on Linux</h2>
<p>Desktop files on Linux (or any other UNIX system which conforms to freedesktop.org) is easy. It's a simple text file which implement the <a href="http://standards.freedesktop.org/desktop-entry-spec/latest/" target="_blank">Desktop Entry Specification</a>. In version 1.0 there are 18 possible entries, where not all of them are mandatory. In the following example I use Qt to write these files, but it should be no problem to use any other toolkit or plain C.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #0057AE;">bool</span> createShortcut<span style="color: #006E28;">&#40;</span><span style="color: #0057AE;">const</span> <span style="color: #22aadd;">QString</span> <span style="color: #006E28;">&amp;</span>strSrcFile<span style="color: #006E28;">,</span>
                    <span style="color: #0057AE;">const</span> <span style="color: #22aadd;">QString</span> <span style="color: #006E28;">&amp;</span>strDstPath<span style="color: #006E28;">,</span>
                    <span style="color: #0057AE;">const</span> <span style="color: #22aadd;">QString</span> <span style="color: #006E28;">&amp;</span>strName<span style="color: #006E28;">&#41;</span>
<span style="color: #006E28;">&#123;</span>
 <span style="color: #22aadd;">QFile</span> link<span style="color: #006E28;">&#40;</span>strDstPath <span style="color: #006E28;">+</span> <span style="color: #22aadd;">QDir</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">separator</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">+</span> strName <span style="color: #006E28;">+</span> <span style="color: #BF0303;">&quot;.desktop&quot;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
 <span style="color: #000000; font-weight:bold;">if</span> <span style="color: #006E28;">&#40;</span>link.<span style="color: #2B74C7;">open</span><span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">QFile</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">WriteOnly</span> <span style="color: #006E28;">|</span> <span style="color: #22aadd;">QFile</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">Truncate</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span>
 <span style="color: #006E28;">&#123;</span>
  <span style="color: #22aadd;">QTextStream</span> out<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&amp;</span>link<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
  out.<span style="color: #2B74C7;">setCodec</span><span style="color: #006E28;">&#40;</span><span style="color: #BF0303;">&quot;UTF-8&quot;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
  out <span style="color: #006E28;">&lt;&lt;</span> <span style="color: #BF0303;">&quot;[Desktop Entry]&quot;</span> <span style="color: #006E28;">&lt;&lt;</span> endl
      <span style="color: #006E28;">&lt;&lt;</span> <span style="color: #BF0303;">&quot;Encoding=UTF-8&quot;</span> <span style="color: #006E28;">&lt;&lt;</span> endl
      <span style="color: #006E28;">&lt;&lt;</span> <span style="color: #BF0303;">&quot;Version=1.0&quot;</span> <span style="color: #006E28;">&lt;&lt;</span> endl
      <span style="color: #006E28;">&lt;&lt;</span> <span style="color: #BF0303;">&quot;Type=Link&quot;</span> <span style="color: #006E28;">&lt;&lt;</span> endl
      <span style="color: #006E28;">&lt;&lt;</span> <span style="color: #BF0303;">&quot;Name=&quot;</span> <span style="color: #006E28;">&lt;&lt;</span> strName <span style="color: #006E28;">&lt;&lt;</span> endl
      <span style="color: #006E28;">&lt;&lt;</span> <span style="color: #BF0303;">&quot;URL=&quot;</span> <span style="color: #006E28;">&lt;&lt;</span> strSrcFile <span style="color: #006E28;">&lt;&lt;</span> endl
      <span style="color: #006E28;">&lt;&lt;</span> <span style="color: #BF0303;">&quot;Icon=icon-name&quot;</span> <span style="color: #006E28;">&lt;&lt;</span> endl<span style="color: #006E28;">;</span>
  <span style="color: #000000; font-weight:bold;">return</span> true<span style="color: #006E28;">;</span>
 <span style="color: #006E28;">&#125;</span>
 <span style="color: #000000; font-weight:bold;">return</span> false<span style="color: #006E28;">;</span>
<span style="color: #006E28;">&#125;</span></pre></div></div>

<p>Replace <code>icon-name</code> by a registered icon on the system and you are done.</p>
<h2>Creating a Shell link on Windows</h2>
<p>Windows provides an interface for <a href="http://msdn.microsoft.com/en-us/library/bb774950%28VS.85%29.aspx" target="_blank"><code>IShellLink</code></a> since Windows XP. The following example shows how to use it:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> createShortcut<span style="color: #008000;">&#40;</span>LPCSTR lpszSrcFile,
                    LPCSTR lpszDstPath,
                    LPCSTR lpszName<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
 IShellLink <span style="color: #000040;">*</span>pShl <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
 IPersistFile <span style="color: #000040;">*</span>pPPF <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
 HRESULT rc <span style="color: #000080;">=</span> CoCreateInstance<span style="color: #008000;">&#40;</span>CLSID_ShellLink,
                               <span style="color: #0000ff;">NULL</span>,
                               CLSCTX_INPROC_SERVER,
                               IID_IShellLink,
                               <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000040;">**</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>pShl<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FAILED<span style="color: #008000;">&#40;</span>rc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
 <span style="color: #0000ff;">do</span>
 <span style="color: #008000;">&#123;</span>
  rc <span style="color: #000080;">=</span> pShl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>SetPath<span style="color: #008000;">&#40;</span>lpszSrcFile<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FAILED<span style="color: #008000;">&#40;</span>rc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
   <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
  rc <span style="color: #000080;">=</span> pShl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>QueryInterface<span style="color: #008000;">&#40;</span>IID_IPersistFile, <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000040;">**</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;</span>pPPF<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FAILED<span style="color: #008000;">&#40;</span>rc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
   <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
  WORD wsz<span style="color: #008000;">&#91;</span>MAX_PATH<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  TCHAR path<span style="color: #008000;">&#91;</span>MAX_PATH<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">0</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
  lstrcat<span style="color: #008000;">&#40;</span>path, lpszDstPath<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  lstrcat<span style="color: #008000;">&#40;</span>path, <span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  lstrcat<span style="color: #008000;">&#40;</span>path, lpszName<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  lstrcat<span style="color: #008000;">&#40;</span>path, <span style="color: #FF0000;">&quot;.lnk&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  MultiByteToWideChar<span style="color: #008000;">&#40;</span>CP_ACP, <span style="color: #0000dd;">0</span>, buf, <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>, wsz, MAX_PATH<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  rc <span style="color: #000080;">=</span> pPPF<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>Save<span style="color: #008000;">&#40;</span>wsz, TRUE<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pPPF<span style="color: #008000;">&#41;</span>
  pPPF<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>Release<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pShl<span style="color: #008000;">&#41;</span>
  pShl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>Release<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
 <span style="color: #0000ff;">return</span> SUCCEEDED<span style="color: #008000;">&#40;</span>rc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>As you may noticed this uses <a href="http://en.wikipedia.org/wiki/Component_Object_Model" target="_blank">COM</a>. Many API's on Windows using the COM interface to communicate between processes. If you don't use COM in your application you have to initialize it first. This is achieved by adding the following call to the front of the function:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FAILED<span style="color: #008000;">&#40;</span>CoInitialize<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span></pre></div></div>

<p>Depending on your application it might be worth to unitialize COM after usage by appending the following to the function:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"> CoUninitialize<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>The function itself isn't any magic. It gets a COM interface to the <code>IShellLink</code> interface and then work with it, by setting the source path and adding a target path by using the <a href="http://msdn.microsoft.com/en-us/library/ms687223%28VS.85%29.aspx" target="_blank"><code>IPersistFile</code></a> interface. As I wrote before you could do much more. Providing a path to a specific application or adding your own parameters is no problem. Have a look at the documentation.</p>
<h2>Creating an Alias file on Mac OS X</h2>
<p>Shortcut files on Mac OS X are a little bit different. At first, they aren't one. There are the classical filesystem links and <a href="http://en.wikipedia.org/wiki/Alias_%28Mac_OS%29" target="_blank">Alias</a> files. Alias files are links which targeting a specific file, but they haven't all the possibilities of shortcuts like on Windows or Linux. As the name suggest they are really only an alias for another file or directory. So specifying an application to start or things like that aren't possible. Anyway they allow changing the icon and they are more persistent than on Window or Linux cause they are working with several attributes of the target file. Even if you rename or move the target, an Alias file will resolve the target correctly (if it is possible). On the other side, being such special means also being hard to create. In principle there are two possibilities. The first one is, creating a file which is no file at all, but has several <a href="http://en.wikipedia.org/wiki/Resource_fork" target="_blank">resources forks</a> attached. Therefor you need to know exactly how Alias files are built of and make sure with every release of Mac OS X you are following the development. There is a free project which does exactly that: <a href="https://github.com/nathanday/ndalias" target="_blank">NDAlias</a>. If you are like me and a little bit more lazy, you ask someone who should know how to create Alias files. This is Finder. Although writing the files itself isn't easy, asking the Finder to do the job is not really easier, cause the information about doing exactly that are really rare. The following code shows how to achieve it:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">bool createShortcut<span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>pstrSrcFile,
                    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>pstrDstPath,
                    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>pstrName<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
 <span style="color: #11740a; font-style: italic;">/* First of all we need to figure out which process Id the Finder
  * currently has. */</span>
 <span style="color: #400080;">NSWorkspace</span> <span style="color: #002200;">*</span>pWS <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSWorkspace</span> sharedWorkspace<span style="color: #002200;">&#93;</span>;
 <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>pApps <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>pWS launchedApplications<span style="color: #002200;">&#93;</span>;
 bool fFFound <span style="color: #002200;">=</span> <span style="color: #a61390;">false</span>;
 ProcessSerialNumber psn;
 <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span>pDict <span style="color: #a61390;">in</span> pApps<span style="color: #002200;">&#41;</span>
 <span style="color: #002200;">&#123;</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>pDict valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;NSApplicationBundleIdentifier&quot;</span><span style="color: #002200;">&#93;</span>
         isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;com.apple.finder&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
  <span style="color: #002200;">&#123;</span>
   psn.highLongOfPSN <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>pDict
                          valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;NSApplicationProcessSerialNumberHigh&quot;</span><span style="color: #002200;">&#93;</span> intValue<span style="color: #002200;">&#93;</span>;
   psn.lowLongOfPSN  <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>pDict
                          valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;NSApplicationProcessSerialNumberLow&quot;</span><span style="color: #002200;">&#93;</span> intValue<span style="color: #002200;">&#93;</span>;
   fFFound <span style="color: #002200;">=</span> <span style="color: #a61390;">true</span>;
   <span style="color: #a61390;">break</span>;
  <span style="color: #002200;">&#125;</span>
 <span style="color: #002200;">&#125;</span>
 <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>fFFound<span style="color: #002200;">&#41;</span>
  <span style="color: #a61390;">return</span> <span style="color: #a61390;">false</span>;
 <span style="color: #11740a; font-style: italic;">/* Now the event fun begins. */</span>
 OSErr err <span style="color: #002200;">=</span> noErr;
 AliasHandle hSrcAlias <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
 AliasHandle hDstAlias <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
 <span style="color: #a61390;">do</span>
 <span style="color: #002200;">&#123;</span>
  <span style="color: #11740a; font-style: italic;">/* Create a descriptor which contains the target psn. */</span>
  <span style="color: #400080;">NSAppleEventDescriptor</span> <span style="color: #002200;">*</span>finderPSNDesc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAppleEventDescriptor</span>
                                            descriptorWithDescriptorType<span style="color: #002200;">:</span>typeProcessSerialNumber
                                            bytes<span style="color: #002200;">:&amp;</span>psn
                                            length<span style="color: #002200;">:</span><span style="color: #a61390;">sizeof</span><span style="color: #002200;">&#40;</span>psn<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>finderPSNDesc<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  <span style="color: #11740a; font-style: italic;">/* Create the Apple event descriptor which points to the Finder
   * target already. */</span>
  <span style="color: #400080;">NSAppleEventDescriptor</span> <span style="color: #002200;">*</span>finderEventDesc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAppleEventDescriptor</span>
                                              appleEventWithEventClass<span style="color: #002200;">:</span>kAECoreSuite
                                              eventID<span style="color: #002200;">:</span>kAECreateElement
                                              argetDescriptor<span style="color: #002200;">:</span>finderPSNDesc
                                              returnID<span style="color: #002200;">:</span>kAutoGenerateReturnID
                                              transactionID<span style="color: #002200;">:</span>kAnyTransactionID<span style="color: #002200;">&#93;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>finderEventDesc<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  <span style="color: #11740a; font-style: italic;">/* Create and add an event type descriptor: Alias */</span>
  <span style="color: #400080;">NSAppleEventDescriptor</span> <span style="color: #002200;">*</span>osTypeDesc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAppleEventDescriptor</span> descriptorWithTypeCode<span style="color: #002200;">:</span>typeAlias<span style="color: #002200;">&#93;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>osTypeDesc<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  <span style="color: #002200;">&#91;</span>finderEventDesc setParamDescriptor<span style="color: #002200;">:</span>osTypeDesc forKeyword<span style="color: #002200;">:</span>keyAEObjectClass<span style="color: #002200;">&#93;</span>;
  <span style="color: #11740a; font-style: italic;">/* Now create the source Alias, which will be attached to the event. */</span>
  err <span style="color: #002200;">=</span> FSNewAliasFromPath<span style="color: #002200;">&#40;</span><span style="color: #a61390;">nil</span>, <span style="color: #002200;">&#91;</span>pstrSrcFile fileSystemRepresentation<span style="color: #002200;">&#93;</span>, <span style="color: #2400d9;">0</span>, <span style="color: #002200;">&amp;</span>hSrcAlias, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>err <span style="color: #002200;">!=</span> noErr<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  <span style="color: #a61390;">char</span> handleState;
  handleState <span style="color: #002200;">=</span> HGetState<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hSrcAlias<span style="color: #002200;">&#41;</span>;
  HLock<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hSrcAlias<span style="color: #002200;">&#41;</span>;
  <span style="color: #400080;">NSAppleEventDescriptor</span> <span style="color: #002200;">*</span>srcAliasDesc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAppleEventDescriptor</span>
                                           descriptorWithDescriptorType<span style="color: #002200;">:</span>typeAlias
                                           bytes<span style="color: #002200;">:*</span>hSrcAlias
                                           length<span style="color: #002200;">:</span>GetAliasSize<span style="color: #002200;">&#40;</span>hSrcAlias<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>srcAliasDesc<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  <span style="color: #002200;">&#91;</span>finderEventDesc setParamDescriptor<span style="color: #002200;">:</span>srcAliasDesc
    forKeyword<span style="color: #002200;">:</span>keyASPrepositionTo<span style="color: #002200;">&#93;</span>;
  HSetState<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hSrcAlias, handleState<span style="color: #002200;">&#41;</span>;
  <span style="color: #11740a; font-style: italic;">/* Next create the target Alias and attach it to the event. */</span>
  err <span style="color: #002200;">=</span> FSNewAliasFromPath<span style="color: #002200;">&#40;</span><span style="color: #a61390;">nil</span>, <span style="color: #002200;">&#91;</span>pstrDstPath fileSystemRepresentation<span style="color: #002200;">&#93;</span>, <span style="color: #2400d9;">0</span>, <span style="color: #002200;">&amp;</span>hDstAlias, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>err <span style="color: #002200;">!=</span> noErr<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  handleState <span style="color: #002200;">=</span> HGetState<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hDstAlias<span style="color: #002200;">&#41;</span>;
  HLock<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hDstAlias<span style="color: #002200;">&#41;</span>;
  <span style="color: #400080;">NSAppleEventDescriptor</span> <span style="color: #002200;">*</span>dstAliasDesc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAppleEventDescriptor</span>
                                           descriptorWithDescriptorType<span style="color: #002200;">:</span>t ypeAlias
                                           bytes<span style="color: #002200;">:*</span>hDstAlias
                                           length<span style="color: #002200;">:</span>GetAliasSize<span style="color: #002200;">&#40;</span>hDstAlias<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>dstAliasDesc<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  <span style="color: #002200;">&#91;</span>finderEventDesc setParamDescriptor<span style="color: #002200;">:</span>dstAliasDesc
    forKeyword<span style="color: #002200;">:</span>keyAEInsertHere<span style="color: #002200;">&#93;</span>;
  HSetState<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hDstAlias, handleState<span style="color: #002200;">&#41;</span>;
  <span style="color: #11740a; font-style: italic;">/* Finally a property descriptor containing the target
   * Alias name. */</span>
  <span style="color: #400080;">NSAppleEventDescriptor</span> <span style="color: #002200;">*</span>finderPropDesc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAppleEventDescriptor</span> recordDescriptor<span style="color: #002200;">&#93;</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>finderPropDesc<span style="color: #002200;">&#41;</span>
   <span style="color: #a61390;">break</span>;
  <span style="color: #002200;">&#91;</span>finderPropDesc setDescriptor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAppleEventDescriptor</span> descriptorWithString<span style="color: #002200;">:</span>pstrName<span style="color: #002200;">&#93;</span>
    forKeyword<span style="color: #002200;">:</span>keyAEName<span style="color: #002200;">&#93;</span>;
  <span style="color: #002200;">&#91;</span>finderEventDesc setParamDescriptor<span style="color: #002200;">:</span>finderPropDesc forKeyword<span style="color: #002200;">:</span>keyAEPropData<span style="color: #002200;">&#93;</span>;
  <span style="color: #11740a; font-style: italic;">/* Now send the event to the Finder. */</span>
  err <span style="color: #002200;">=</span> AESend<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>finderEventDesc aeDesc<span style="color: #002200;">&#93;</span>,
               <span style="color: #a61390;">NULL</span>,
               kAENoReply,
               kAENormalPriority,
               kNoTimeOut,
               <span style="color: #2400d9;">0</span>,
               <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>;
 <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">while</span><span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;
 <span style="color: #11740a; font-style: italic;">/* Cleanup */</span>
 <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>hSrcAlias<span style="color: #002200;">&#41;</span>
  DisposeHandle<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hSrcAlias<span style="color: #002200;">&#41;</span>;
 <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>hDstAlias<span style="color: #002200;">&#41;</span>
  DisposeHandle<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>Handle<span style="color: #002200;">&#41;</span>hDstAlias<span style="color: #002200;">&#41;</span>;
 <span style="color: #a61390;">return</span> err <span style="color: #002200;">==</span> noErr ? <span style="color: #a61390;">true</span> <span style="color: #002200;">:</span> <span style="color: #a61390;">false</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Although the code above looks a little bit scary, it does not much. It fetch the process serial number of the current Finder process, creates an Application event for creating an Alias file and send this event to the Finder.</p>
<h2>Conclusion</h2>
<p>Beside showing how to create file shortcuts on different platforms, this article also shows which work is necessary to create platform independent code. It's a simple example. But it also makes clear that one simple solution for platform one, not necessarily mean it's such simple on platform two.</p>
<p>Making this easy accessible to any developer is the next step. I will leave this exercise to the reader, but have a look at the <a href="http://www.virtualbox.org/browser/trunk/src/VBox/Frontends/VirtualBox/src/platform" target="_blank">platform code of the VirtualBox GUI</a> and the corresponding <a href="http://www.virtualbox.org/browser/trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk" target="_blank">Makefile</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2010/11/creating-file-shortcuts-on-three-different-operation-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Understanding some of the mysteries of launchd</title>
		<link>http://www.64k-tec.de/2010/11/understanding-some-of-the-mysteries-of-launchd/</link>
		<comments>http://www.64k-tec.de/2010/11/understanding-some-of-the-mysteries-of-launchd/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 00:11:55 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Applications]]></category>
		<category><![CDATA[bundle]]></category>
		<category><![CDATA[file types]]></category>
		<category><![CDATA[Info.plist]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[installer]]></category>
		<category><![CDATA[launchd]]></category>
		<category><![CDATA[LaunchServices]]></category>
		<category><![CDATA[lsregister]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[plist]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=1716</guid>
		<description><![CDATA[Have you ever wondered how Mac OS X knows which file type belongs to which application? On Windows there is the registry. An installer writes the necessary info into it. Most applications on Mac OS X doesn't come with an installer, they are just moved from the downloaded DMG file to the /Applications folder. So [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever wondered how Mac OS X knows which file type belongs to which application? On Windows there is the registry. An installer writes the necessary info into <a href="http://msdn.microsoft.com/en-us/library/ee872121%28v=VS.85%29.aspx" target="_blank">it</a>. Most applications on Mac OS X doesn't come with an installer, they are just moved from the downloaded <a href="http://en.wikipedia.org/wiki/Apple_Disk_Image" target="_blank">DMG</a> file to the <code class="path">/Applications</code> folder. So a developer doesn't have the ability to take action when the user "install" the application. Anyway there is no need to provide an installer for just this task, cause Mac OS X register file type associations on the first start of the application. In the following post, I will show how to do this, but furthermore I will show where this information is stored and how it could be reseted.</p>
<h2>Providing the necessary information to Mac OS X</h2>
<p>Applications on Mac OS X need some defined structure. They are so-called <a href="http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html" target="_blank">bundles</a>, which means on the filesystem layer they are directories. You can prove this by checking the Applications directory within the Terminal.app. You could also right-click on an application and select "Show Package Contents". The content of the bundle directory is usually hidden from the user when he works with the Finder or any other high level function of Mac OS X (like the open dialog). Additional to this layout on the filesystem, an application provide information about itself to the system with a plist file. This file has to be named <code class="path">Application.app/Content/Info.plist</code>. The following shows exemplary the content of the <a href="http://code.google.com/p/tunnelblick/" target="_blank">Tunnelblick</a> application:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #00bbdd;">&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plist</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleDevelopmentRegion<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>     <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>English<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleExecutable<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Tunnelblick<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleIconFile<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>              <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>tunnelblick.icns<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleIdentifier<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>com.openvpn.tunnelblick<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleInfoDictionaryVersion<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>6.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundlePackageType<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>APPL<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleShortVersionString<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>3.1beta20 (build 2132)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleSignature<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>             <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>OVPN<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleVersion<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>               <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2132<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>NSMainNibFile<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>MainMenu<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>NSPrincipalClass<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>              <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>NSApplication<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>NSUIElement<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>                   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SUEnableSystemProfiling<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;true</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SUFeedURL<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>                     <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://tunnelblick.net/appcast.rss<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SUPublicDSAKeyFile<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>dsa_pub.pem<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>The keys are mostly self explaining, you can find a full list <a href="http://developer.apple.com/library/mac/#documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009247" target="_blank">here</a>.</p>
<p>To register a file type association you have to add an array of the type <code>CFBundleDocumentTypes</code>. Again, here is an extraction of the Tunnelblick application, which shows the registration of the <code class="path">tblk</code> extension:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"> <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleDocumentTypes<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleTypeExtensions<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;array<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>tblk<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleTypeIconFile<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>     <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>tunnelblick_package.icns<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleTypeName<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Tunnelblick VPN Configuration<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>CFBundleTypeRole<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Editor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>LSTypeIsPackage<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;true</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>NSPersistentStoreTypeKey<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Binary<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>You have to provide a file extension or mime-type, can add an icon and give a hint what your application can do with this type of file (viewer, editor or nothing).</p>
<p>Beside this passive way of announcing this information, there is also an active way (e.g. for use in an installer). See <a href="http://developer.apple.com/library/mac/documentation/Carbon/Reference/LaunchServicesReference/Reference/reference.html#//apple_ref/doc/uid/TP30000998-CH1g-LSRegisterFSRef" target="_blank">here</a> for further information.</p>
<h2>Where is this information stored</h2>
<p>Although Mac OS X hasn't a registry like windows, some information are stored in global databases, too. Applications are registered at the <code class="cmd">launchd</code>. The launchd is the central place for starting all kind of programs, from a background service to any common application, like Thunderbird. E.g. background services can register itself and even made their start depending on different events. VirtualBox has an example configuration included, which let launchd start the <a href="http://www.virtualbox.org/browser/trunk/src/VBox/Installer/darwin/VirtualBox/org.virtualbox.vboxwebsrv.plist" target="_blank">vbox webservice</a> on activity on a certain port. Although this isn't used by many users out there (and therefore disabled by default), it shows some generic usage of this functionality.</p>
<p>If you look around in Mac OS X you have the tool <code class="cmd">launchctl</code>, which allows you to start jobs or register background services with launchd. But it seems there is no tool which is able to get some information about the knowledge of launchd. Well, there is one. It's a little bit hidden in <code class="cmd">/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister</code>. To be more comfortable with it, we should include it into the user path by linking it to a known path, like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>Frameworks<span style="color: #000000; font-weight: bold;">/</span>CoreServices.framework<span style="color: #000000; font-weight: bold;">/</span>Versions<span style="color: #000000; font-weight: bold;">/</span>A<span style="color: #000000; font-weight: bold;">/</span>Frameworks<span style="color: #000000; font-weight: bold;">/</span>LaunchServices.framework<span style="color: #000000; font-weight: bold;">/</span>Versions<span style="color: #000000; font-weight: bold;">/</span>A<span style="color: #000000; font-weight: bold;">/</span>Support<span style="color: #000000; font-weight: bold;">/</span>lsregister <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>lsregister</pre></div></div>

<p>With this tiny tool we are able to dump the launchd database. <code class="cmd">lsregister -dump | grep -n10 Tunnelblick</code> displays something like this for Tunnelblick:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000;">10823</span>---------------------------------------------------------------------------------
<span style="color: #000000;">10824</span>-bundle    <span style="color: #c20cb9; font-weight: bold;">id</span>:            <span style="color: #000000;">6984</span>
<span style="color: #000000;">10825</span>:  path:          <span style="color: #000000; font-weight: bold;">/</span>Applications<span style="color: #000000; font-weight: bold;">/</span>Tunnelblick.app
<span style="color: #000000;">10826</span>-  name:
<span style="color: #000000;">10827</span>-  identifier:    com.openvpn.tunnelblick <span style="color: #7a0874; font-weight: bold;">&#40;</span>0x800097b8<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">10828</span>-  version:       <span style="color: #000000;">2132</span>
<span style="color: #000000;">10829</span>-  mod <span style="color: #c20cb9; font-weight: bold;">date</span>:      <span style="color: #000000;">10</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">31</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2010</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">37</span>:08
<span style="color: #000000;">10830</span>-  reg <span style="color: #c20cb9; font-weight: bold;">date</span>:      <span style="color: #000000;">11</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">19</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2010</span> <span style="color: #000000;">11</span>:<span style="color: #000000;">13</span>:<span style="color: #000000;">39</span>
<span style="color: #000000;">10831</span>-  <span style="color: #7a0874; font-weight: bold;">type</span> code:     <span style="color: #ff0000;">'APPL'</span>
<span style="color: #000000;">10832</span>-  creator code:  <span style="color: #ff0000;">'OVPN'</span>
<span style="color: #000000;">10833</span>-  sys version:   <span style="color: #000000;">0</span>
<span style="color: #000000;">10834</span>-  flags:         relative-icon-path  ui-element
<span style="color: #000000;">10835</span>-  item flags:    container  package  application  extension-hidden  native-app  ppc  i386
<span style="color: #000000;">10836</span>-  icon:          Contents<span style="color: #000000; font-weight: bold;">/</span>Resources<span style="color: #000000; font-weight: bold;">/</span>tunnelblick.icns
<span style="color: #000000;">10837</span>:  executable:    Contents<span style="color: #000000; font-weight: bold;">/</span>MacOS<span style="color: #000000; font-weight: bold;">/</span>Tunnelblick
<span style="color: #000000;">10838</span>-  inode:         <span style="color: #000000;">3800129</span>
<span style="color: #000000;">10839</span>-  <span style="color: #7a0874; font-weight: bold;">exec</span> inode:    <span style="color: #000000;">3800213</span>
<span style="color: #000000;">10840</span>-  container <span style="color: #c20cb9; font-weight: bold;">id</span>:  <span style="color: #000000;">32</span>
<span style="color: #000000;">10841</span>-  library:
<span style="color: #000000;">10842</span>-  library items:
<span style="color: #000000;">10843</span>-  <span style="color: #660033;">--------------------------------------------------------</span>
<span style="color: #000000;">10844</span>-  claim   <span style="color: #c20cb9; font-weight: bold;">id</span>:            <span style="color: #000000;">17864</span>
<span style="color: #000000;">10845</span>:          name:          Tunnelblick VPN Configuration
<span style="color: #000000;">10846</span>-          rank:          Default
<span style="color: #000000;">10847</span>-          roles:         Editor
<span style="color: #000000;">10848</span>-          flags:         relative-icon-path  package
<span style="color: #000000;">10849</span>-          icon:          Contents<span style="color: #000000; font-weight: bold;">/</span>Resources<span style="color: #000000; font-weight: bold;">/</span>tunnelblick_package.icns
<span style="color: #000000;">10850</span>-          bindings:      .tblk
<span style="color: #000000;">10851</span>---------------------------------------------------------------------------------</pre></div></div>

<p>As you see, all the information provided by the plist file is registered. Beside other information, it also has the registration and modification times stored. To let launchd reread the plist file, usual its only necessary to change the modification time of the application. This could be done by simply executing <code class="cmd">touch /Applications/Application.app</code>. Anyway, it's sometimes necessary to reset the content of this database for the own application. This could be done by executing the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">lsregister <span style="color: #660033;">-u</span> <span style="color: #000000; font-weight: bold;">/</span>Applications<span style="color: #000000; font-weight: bold;">/</span>Application.app</pre></div></div>

<p>To register the application again, just remove the <code>-u</code> parameter. You should also check if your application isn't registered more than once, with different paths, by using the <code>-dump</code> parameter. To fully reset the launchd database, you could use <code>-kill</code>. This will remove any file type association and registered application. You have been <span style="color: #ff0000;">warned</span>.</p>
<h2>Conclusion</h2>
<p>This article shows how Mac OS X handle informations about installed applications. With this knowledge a developer is able to register the own application into the launchd ecosystem and see how launchd interpret this information. Furthermore, the usage of lsregister allows a developer to analyze the content of the launchd database and make changes to it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2010/11/understanding-some-of-the-mysteries-of-launchd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting the backtrace from a kernel panic</title>
		<link>http://www.64k-tec.de/2010/10/getting-the-backtrace-from-a-kernel-panic/</link>
		<comments>http://www.64k-tec.de/2010/10/getting-the-backtrace-from-a-kernel-panic/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 17:56:31 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[backtrace]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[graphical modes]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[kernel mode settings]]></category>
		<category><![CDATA[KMS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[netconsole]]></category>
		<category><![CDATA[panic]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[remote access]]></category>
		<category><![CDATA[X11]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=1423</guid>
		<description><![CDATA[You may know the following situation. You arrive in the morning in the office, do what you always do and check out the latest changes of the software you are working on. After a little bit of compile time and the first coffee you start the just build application. Bumm, kernel panic. After rebooting and [...]]]></description>
			<content:encoded><![CDATA[<p>You may know the following situation. You arrive in the morning in the office, do what you always do and check out the latest changes of the software you are working on. After a little bit of compile time and the first coffee you start the just build application. Bumm, <a href="http://en.wikipedia.org/wiki/Kernel_panic" target="_blank"><strong>kernel panic</strong></a>. After rebooting and locking through the changes you may have an idea what the reason for this could be. A colleague of you is working on a fancy new feature which needed changes to a kernel module. As you almost know nothing about this code you seek for help and, as it of course not happen on his computer, he is asking for a <a href="http://en.wikipedia.org/wiki/Stack_trace" target="_blank">backtrace</a> of this panic. You have two problems now. First you need to see the panic yourself and second it would be nice to get a copy of the backtrace for sharing this info within a bugtracker. In the following post I will show how both aims could be easily archived.</p>
<h2>Let the kernel manage the graphical modes</h2>
<p>As most people are working under X11 they don't see the output of an kernel panic. When a kernel panic happens the kernel prints the reason for the panic and a kernel backtrace to the console window and stops immediately its own execution. It is not written into a log file or somewhere else. In consequence you don't have the ability to look into the panic text, cause the graphical mode is still on. Historically the mode settings are done by the graphic driver of the X11 system. So the kernel has no idea that or which graphic mode is currently in use. Fortunately the kernel hackers invented a new infrastructure which let the kernel do the mode switch. This subsystem is called <a href="https://fedoraproject.org/wiki/Features/KernelModesetting" target="_blank">Kernel-Mode-Settings (KMS)</a>. As the kernel do the mode settings, he can switch back to the console on a panic, regardless which graphical mode is currently configured. Beside this, KMS has other improvements like Fast User Switching or a flicker free switch between text and graphic mode. On the other side is this highly hardware dependent and even if it was introduced with version 2.6.28, not all today available hardware can make use of it. If you are an owner of an Intel graphic card you are in good shape. Radeon and NVidia cards have limited support through the in kernel drivers <a href="http://wiki.x.org/wiki/radeonhd" target="_blank">radeonhd</a> and <a href="http://nouveau.freedesktop.org/wiki/" target="_blank">nouveau</a>. For an Intel i915 card you need to enable the following kernel options:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">CONFIG_DRM_I915</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
Location:
-&gt; Device Drivers
-&gt; Graphics support
-&gt; Direct Rendering Manager <span style="">&#40;</span>XFree86 4.1.0 and higher DRI support<span style="">&#41;</span> <span style="">&#40;</span>DRM <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span><span style="color: #000066; font-weight:bold;">=</span>y<span style="">&#93;</span></span><span style="">&#41;</span>
-&gt; Intel 830M, 845G, 852GM, 855GM, 865G <span style="">&#40;</span> <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span><span style="color: #000066; font-weight:bold;">=</span>y<span style="">&#93;</span></span><span style="">&#41;</span>
&nbsp;
<span style="color: #000099;">CONFIG_DRM_I915_KMS</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">y</span>
Location:
-&gt; Device Drivers
-&gt; Graphics support
-&gt; Direct Rendering Manager <span style="">&#40;</span>XFree86 4.1.0 and higher DRI support<span style="">&#41;</span> <span style="">&#40;</span>DRM <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span><span style="color: #000066; font-weight:bold;">=</span>y<span style="">&#93;</span></span><span style="">&#41;</span>
-&gt; Intel 830M, 845G, 852GM, 855GM, 865G <span style="">&#40;</span> <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span><span style="color: #000066; font-weight:bold;">=</span>y<span style="">&#93;</span></span><span style="">&#41;</span>
-&gt; i915 driver <span style="">&#40;</span>DRM_I915 <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span><span style="color: #000066; font-weight:bold;">=</span>y<span style="">&#93;</span></span><span style="">&#41;</span></pre></div></div>

<p>The kernel line in your favorite boot loader needs the following additional parameter:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">i915.modeset=1</pre></div></div>

<p>X11 should have this minimal configuration for the device section:</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;"><span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;Device&quot;</span>
 <span style="color: #990000;">Identifier</span>    <span style="color: #0000ff;">&quot;i915&quot;</span>
 <span style="color: #990000;">Driver</span>        <span style="color: #0000ff;">&quot;intel&quot;</span>
 <span style="color: #990000;">Option</span>        <span style="color: #0000ff;">&quot;DRI&quot;</span>   <span style="color: #0000ff;">&quot;true&quot;</span>
<span style="color: #b1b100;">EndSection</span></pre></div></div>

<p>Please note that you need of course some recent kernel, X11 version and Intel X11 driver to make this work. After a compile, install and boot of the new kernel, KMS should be in use. You will notice it, cause the boot messages will be printed in a much higher graphical resolution, than the usual text mode provide. The next time a kernel panic occurs, the kernel will switch back to the console before the panic is printed. This allows you to see the info printed and maybe you get a useful hint for the reason of the panic.</p>
<h2>Post the panic</h2>
<p>If you can't use KMS or don't want transcribe the panic text by hand into the bugtracker, it would be nice if the text could be made available on another computer. Kernel hackers usual use the serial port for that. Unfortunately most modern computers doesn't have such a serial port anymore. Also you need two hosts with a serial port and the setup is complex (you have to know about <a href="http://en.wikipedia.org/wiki/Serial_port#Settings" target="_blank">baud-rates, parity</a> and stuff like this). But there is a simpler solution: <a href="http://www.mjmwired.net/kernel/Documentation/networking/netconsole.txt" target="_blank">netconsole</a>. Netconsole is a kernel module, which sends kernel messages anywhere to the net using UDP. The setup is really simple. In the kernel configuration you need the following setting:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">CONFIG_NETCONSOLE</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">m</span>
Location:
-&gt; Device Drivers
-&gt; Network device support <span style="">&#40;</span>NETDEVICES <span style="color: #000066; font-weight:bold;"><span style="">&#91;</span><span style="color: #000066; font-weight:bold;">=</span>y<span style="">&#93;</span></span><span style="">&#41;</span></pre></div></div>

<p>I prefer to compile it as module, which allows me to turn it on only when I need it. Load it with the following command:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">modprobe netconsole <span style="color: #007800;">netconsole</span>=<span style="color: #000000; font-weight: bold;">@/</span>,<span style="color: #000000; font-weight: bold;">@</span>192.168.220.10<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>The ip has to be replaced by the one of your target computer. You can of course tune it much more, like setting source and target ports or even let netconsole send the text to more than one host. On your client you need a network tool which can read from a socket and print the read text to stdout. Netcat or nc are two tools which are able to do just that. The call for nc looks like the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">nc <span style="color: #660033;">-l</span> <span style="color: #660033;">-u</span> <span style="color: #000000;">6666</span></pre></div></div>

<p>Now if a kernel panic will happen you will see an output like this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">BUG: unable to handle kernel NULL pointer dereference at (null)
IP: [] rb_erase+0x15c/0x320
PGD 6942f067 PUD a1e4067 PMD 0
Oops: 0000 [#1] SMP
last sysfs file: /sys/devices/virtual/block/md1/dev
CPU 3
Modules linked in: vboxnetadp vboxnetflt vboxdrv netconsole ...
&nbsp;
Pid: 18887, comm: VirtualBox Tainted: G        W   2.6.36-gentoo #4 DG33TL/
RIP: 0010:[]  [] rb_erase+0x15c/0x320
RSP: 0018:ffff8800b430db58  EFLAGS: 00010046
RAX: 0000000000000000 RBX: ffff880069557a68 RCX: 0000000000000001
RDX: ffff880069557a68 RSI: ffff880001d8ed58 RDI: 0000000000000000
RBP: ffff8800b430db68 R08: 0000000000000001 R09: 000000008edcb5d6
R10: 0000000000000000 R11: 0000000000000202 R12: ffff880001d8ed58
R13: 0000000000000000 R14: 000000000000ed00 R15: 0000000000000002
FS:  00007fffde457710(0000) GS:ffff880001d80000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000000 CR3: 00000000064f9000 CR4: 00000000000026e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process VirtualBox (pid: 18887, threadinfo ffff8800b430c000, task ffff880091e227f0)
Stack:
 ffff88000a03ba18 ffff880001d8ed48 ffff8800b430dba8 ffffffff8105bf06
&lt;0&gt; ffff8800b430dba8 ffffffff8105c97c ffff8800b430dbc8 ffff88000a03ba18
&lt;0&gt; 00004ff8a86ba455 ffff880001d8ed48 ffff8800b430dc48 ffffffff8105ce77
Call Trace:
 [] __remove_hrtimer+0x36/0xb0
 [] ? lock_hrtimer_base+0x2c/0x60
 [] __hrtimer_start_range_ns+0x2b7/0x3c0
 [] ? rtR0SemEventMultiLnxWait+0x250/0x3d0 [vboxdrv]
 [] ? RTLogLoggerExV+0x12f/0x180 [vboxdrv]
 [] hrtimer_start+0x13/0x20
 [] rtTimerLnxStartSubTimer+0x60/0x120 [vboxdrv]
 [] rtTimerLnxStartOnSpecificCpu+0x21/0x30 [vboxdrv]
 [] rtmpLinuxWrapper+0x23/0x30 [vboxdrv]
 [] RTMpOnSpecific+0x99/0xa0 [vboxdrv]
 [] ? rtTimerLnxStartOnSpecificCpu+0x0/0x30 [vboxdrv]
 [] RTTimerStart+0x2a6/0x2e0 [vboxdrv]
 [] ? g_abExecMemory+0x33665/0x180000 [vboxdrv]
 [] g_abExecMemory+0xc678/0x180000 [vboxdrv]
 [] g_abExecMemory+0x328d7/0x180000 [vboxdrv]
 [] supdrvIOCtlFast+0x6a/0x70 [vboxdrv]
 [] VBoxDrvLinuxIOCtl+0x47/0x1e0 [vboxdrv]
 [] ? pick_next_task_fair+0xde/0x150
 [] do_vfs_ioctl+0xa1/0x590
 [] ? sys_futex+0x76/0x170
 [] sys_ioctl+0x4a/0x80
 [] system_call_fastpath+0x16/0x1b
Code: 07 a8 01 75 9d eb 81 0f 1f 84 00 00 00 00 00 48 3b 78 10 0f 84 ...
RIP  [] rb_erase+0x15c/0x320
 RSP
CR2: 0000000000000000
---[ end trace 4eaa2a86a8e2da24 ]---</pre></div></div>

<p>Normally only kernel panics are sent to the console. You can increase the verbosity level by executing <code>dmesg -n 8</code> as root.</p>
<h2>Conclusion</h2>
<p>To continue with the story from the beginning: With the shown methods you can hope your colleague get enough information to find the reason for the kernel panic. To be more helpful, the next step would be to try to debug the problem yourself. Even if the <a href="https://kgdb.wiki.kernel.org/index.php/Main_Page" target="_blank">KGDB</a> was merged into the kernel in version 2.6.35, it is not really usable for me. The reason is that it seems kernel hackers usually have really old hardware which either has a serial port, a PS/2 keyboard or both. Otherwise I can't find a reason why USB keyboards don't work. I <a href="http://sourceforge.net/mailarchive/forum.php?thread_name=4CC99477.8010801%40oracle.com&amp;forum_name=kgdb-bugreport" target="_blank">asked</a> on the mailing list of KGDB about the status of USB keyboard support and I can only hope support will be integrated soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2010/10/getting-the-backtrace-from-a-kernel-panic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using suppression files with Valgrind</title>
		<link>http://www.64k-tec.de/2010/10/using-suppression-files-with-valgrind/</link>
		<comments>http://www.64k-tec.de/2010/10/using-suppression-files-with-valgrind/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 19:10:22 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[glibc]]></category>
		<category><![CDATA[leak check]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[memory checker]]></category>
		<category><![CDATA[memory leaks]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[suppression lists]]></category>
		<category><![CDATA[symbol names]]></category>
		<category><![CDATA[Valgrind]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=1195</guid>
		<description><![CDATA[Valgrind is one of the great tools in the long list of freely available applications for development. Beside several profiling tools it also contains a memory checker. Leaking memory is one of the more common errors a programmer could step into. Basically it means to forget freeing memory (or in a more general sense: any [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://valgrind.org/" target="_blank">Valgrind</a> is one of the great tools in the long list of freely available applications for development. Beside several profiling tools it also contains a memory checker. <a href="http://en.wikipedia.org/wiki/Memory_leak" target="_blank">Leaking memory</a> is one of the more common errors a programmer could step into. Basically it means to forget freeing memory (or in a more general sense: any resource) a program has acquired. If you are a perfect developer, this will never happen to you. If you are a good developer it may happen and that's where Valgrind will save you some trouble. As most of the developers out there are more or less good developers, their programs produce memory leaks, too <img src='http://www.64k-tec.de/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . The right solution for this, is of course to write a bug report. But there are times where this isn't possible or you are in hurry and don't want to see all the errors of a third-party library you link against.</p>
<p>In the following post, I will show how to suppress such unwanted error messages to make it much more easier to analyze the output of Valgrind for your own application.</p>
<h2>Installing Valgrind</h2>
<p>On Mac OS X you can use MacPorts to install Valgrind. You have to use valgrind-devel if you are on Snow Leopard, because Snow Leopard is supported in the current development version only. It's as simply as typing <code>sudo port install valgrind-devel</code>.</p>
<p>On Gentoo it can become a bit harder. The current stable version is 3.5 (like in MacPorts). If you try this version (at least on an unstable Gentoo like mine) with <code>valgrind ls</code>, you will get the following error:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">valgrind:  Fatal error at startup: a function redirection
valgrind:  which is mandatory for this platform-tool combination
valgrind:  cannot be set up.  Details of the redirection are:
valgrind:
valgrind:  A must-be-redirected function
valgrind:  whose name matches the pattern:      strlen
valgrind:  in an object with soname matching:   ld-linux-x86-64.so.2
valgrind:  was not found whilst processing
valgrind:  symbols from the object with soname: ld-linux-x86-64.so.2
valgrind:
valgrind:  Possible fixes: (1, short term): install glibc's debuginfo
valgrind:  package on this machine.  (2, longer term): ask the packagers
valgrind:  for your Linux distribution to please in future ship a non-
valgrind:  stripped ld.so (or whatever the dynamic linker .so is called)
valgrind:  that exports the above-named function using the standard
valgrind:  calling conventions for this platform.
valgrind:
valgrind:  Cannot continue -- exiting now.  Sorry.</pre></div></div>

<p>The reason is a striped glibc. To work properly, Valgrind needs to overwrite some of the system functions the glibc provide. It does this by getting the symbols by name out of this library. This is of course not possible if all the symbol names are removed. You can prove this by executing <code>nm /lib/ld-linux-x86-64.so.2</code>. Gentoo provides a <em>FEATURE=splitdebug</em>, which adds debug libraries to the installation. Unfortunately setting this feature in <code class="path">/etc/make.conf</code>, means setting it global. Gentoo is known as being configurable as no other distribution out there and of course we can set a feature for one program only. To do so, create a file called <code class="path">glibc</code> in <code class="path">/etc/portage/env/sys-libs/</code> and add the following content to it.</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">FEATURES</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #933;">&quot;splitdebug&quot;</span></pre></div></div>

<p>After a rebuild of glibc by executing <code>emerge --oneshot glibc</code>, we have a working Valgrind.</p>
<p>As all programs, Valgrind isn't perfect. Version 3.5 shows many false/positive hits on my system, but fortunately the development goes on. Currently there is no newer version available in the Gentoo tree. Anyway it is not necessary to build one yourself, to get a more recent version. Using <strong>layman</strong> and the overlay tree of <a href="http://gentoo-overlays.zugaina.org/flameeyes-overlay/dev-util.html.en" target="_blank">Flameeyes</a> will let you integrate the development version of Valgrind seamlessly into your system. For a general How-to of layman check out this <a href="http://www.gentoo.org/proj/en/overlays/userguide.xml" target="_blank">Users' guide</a>. In short, something like the following should be sufficient:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">layman <span style="color: #660033;">-a</span> flameeyes-overlay
layman <span style="color: #660033;">-s</span> flameeyes-overlay
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;=dev-util/valgrind-9999 **&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>portage<span style="color: #000000; font-weight: bold;">/</span>package.keywords
emerge <span style="color: #c20cb9; font-weight: bold;">valgrind</span></pre></div></div>

<p>Installing the development version of Valgrind is optional of course.</p>
<h2>Know your tools</h2>
<p>One usage of Valgrind could be look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">valgrind</span> <span style="color: #660033;">--leak-check</span>=full <span style="color: #660033;">--leak-resolution</span>=high .<span style="color: #000000; font-weight: bold;">/</span>VirtualBox</pre></div></div>

<p>Beside other errors it also shows this error message on my system:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">==27174==    at 0x4C26C09: memalign (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==27174==    by 0x4C26CB9: posix_memalign (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==27174==    by 0xBA8967F: ??? (in /usr/lib64/libglib-2.0.so.0.2400.2)
==27174==    by 0xBA89E9D: g_slice_alloc (in /usr/lib64/libglib-2.0.so.0.2400.2)
==27174==    by 0xBA89F86: g_slice_alloc0 (in /usr/lib64/libglib-2.0.so.0.2400.2)
==27174==    by 0xC204847: g_type_create_instance (in /usr/lib64/libgobject-2.0.so.0.2400.2)
==27174==    by 0xC1EB8A5: ??? (in /usr/lib64/libgobject-2.0.so.0.2400.2)
==27174==    by 0xC1ECE5D: g_object_newv (in /usr/lib64/libgobject-2.0.so.0.2400.2)
==27174==    by 0xC1ED494: g_object_new (in /usr/lib64/libgobject-2.0.so.0.2400.2)
==27174==    by 0x72A495F: ??? (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x72A0D4F: ??? (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x7289264: QGtkStyle::QGtkStyle() (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x7215DB6: QStyleFactory::create(QString const&amp;amp;) (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x6F5B7FC: QApplication::style() (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x6F61DFF: QApplicationPrivate::initialize() (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x6F61E88: QApplicationPrivate::construct(_XDisplay*, unsigned long, unsigned long) (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x6F61FF3: QApplication::QApplication(_XDisplay*, int&amp;amp;, char**, unsigned long, unsigned long, int) (in /usr/lib64/qt4/libQtGui.so.4.6.3)
==27174==    by 0x44BC38: TrustedMain (main.cpp:371)
==27174==    by 0x44C649: main (main.cpp:651)</pre></div></div>

<p>If you analyze the backtrace, you see that something in <em>libQtGui</em> is leaking memory. I don't want to blame someone for it or make a statement if this is right or wrong, I just want to get rid of it, to be able to easily spot errors VirtualBox itself produce. To do so, add <code>--gen-suppressions=all</code> to the Valgrind call. This will produce something similar like this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">{
 Memcheck:Leak
 fun:memalign
 fun:posix_memalign
 obj:/usr/lib64/libglib-2.0.so.0.2400.2
 fun:g_slice_alloc
 fun:g_slice_alloc0
 fun:g_type_create_instance
 obj:/usr/lib64/libgobject-2.0.so.0.2400.2
 fun:g_object_newv
 fun:g_object_new
 obj:/usr/lib64/qt4/libQtGui.so.4.6.3
 obj:/usr/lib64/qt4/libQtGui.so.4.6.3
 fun:_ZN9QGtkStyleC1Ev
 fun:_ZN13QStyleFactory6createERK7QString
 fun:_ZN12QApplication5styleEv
 fun:_ZN19QApplicationPrivate10initializeEv
 fun:_ZN19QApplicationPrivate9constructEP9_XDisplaymm
 fun:_ZN12QApplicationC1EP9_XDisplayRiPPcmmi
 fun:TrustedMain
 fun:main
}</pre></div></div>

<p>To let Valgrind ignore this error in the future, copy the text into a file vbox.supp and start Valgrind with <code>--suppressions=vbox.supp</code>. Viola, this specific error isn't shown anymore. The format used there is easy to understand and you can of course tweak this much more. E.g. you could replace some of the <code>fun:</code> entries by "<code>...</code>". This is a placeholder for one or more functions calls with any name. Beside making suppression rules more general you can of course add as much as you like. Adding a name at the top make it easy to identify the different rules. For all the possibilities have a look at the <a href="http://valgrind.org/docs/manual/mc-manual.html#mc-manual.suppfiles" target="_blank">documentation</a>. Just for the curious, Valgrind is using such a file itself. Have a look at /usr/lib/valgrind/default.supp. You may also have noted that the function names in the normal error message differ  from the one in the suppression list. The former is in the <a href="http://en.wikipedia.org/wiki/Name_mangling" target="_blank">demangled</a> form  and the later in the saved form. You could force Valgrind to print  mangled function names by adding the <code>--demangle=no</code> parameter to the call. This becomes handy if you manually create suppression lists.</p>
<h2>Conclusion</h2>
<p>By using suppression rules for the own application, unimportant errors could be eliminated in the output of Valgrind. With this is in mind there is no excuse anymore for memory leaks in the self developed applications. Beside memory leaks, Valgrind also finds places where uninitialized variables are in use or where memory is used which isn't allocated by the application. Also these tests could be filtered out by suppression rules.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2010/10/using-suppression-files-with-valgrind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changing the default behavior of built-in Cocoa controls</title>
		<link>http://www.64k-tec.de/2010/06/changing-the-default-behavior-of-built-in-cocoa-controls/</link>
		<comments>http://www.64k-tec.de/2010/06/changing-the-default-behavior-of-built-in-cocoa-controls/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 11:34:47 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Archive]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[NSCell]]></category>
		<category><![CDATA[NSControl]]></category>
		<category><![CDATA[NSSearchField]]></category>
		<category><![CDATA[objc]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[search field]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=251</guid>
		<description><![CDATA[Apple has many task specific controls built into Cocoa. They are all well designed and have most of the functionality a user and a developer expect. One of this controls is the NSSearchField. This control has a special design which allows the user to recognize the provided functionality with ease. It is so well-known that [...]]]></description>
			<content:encoded><![CDATA[<p>Apple has many task specific controls built into Cocoa. They are all well designed and have most of the functionality a user and a developer expect. One of this controls is the <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSearchField_Class/Reference/Reference.html" target="_blank">NSSearchField</a>. This control has a special design which allows the user to recognize the provided functionality with ease. It is so well-known that Apple uses the design even on there website. It has support for menus (e.g. for recent search items), auto completion, a cancel button, and so one. Although this is mostly feature complete, there are sometimes cases where you like to extend it. In this post, I will show how to add another visual hint to this control when a search term isn't found. The aim is to change the background of the underlying text edit to become light red to visual mark the failed search.</p>
<h2>Understanding how Cocoa works</h2>
<p>The NSSearchField class inherits from an <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSControl_Class/Reference/Reference.html" target="_blank">NSControl</a>. NSControls are responsible for the interaction with the user. This implies displaying the content in a <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html" target="_blank">NSView</a>, reacting to user input like mouse or keyboard events and sending actions to other objects in the case the status of the control has changed. Usually a control delegate the first two tasks to a <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html" target="_blank">NSCell</a>. The main reasons for this are to persist on good performance even if there are many cells of the same type (like in the case of a table) and to be able to exchange the behavior of the control easily (like in the case of a combobox which also allow typing in a text field). With this information in mind we know that we need to overwrite the drawing routine of the cell (<a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSearchFieldCell_Class/Reference/Reference.html" target="_blank">NSSearchFieldCell</a>) to achieve our goal. The implementation is straight forward and shown in the following:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MySearchFieldCell<span style="color: #002200;">:</span> <span style="color: #400080;">NSSearchFieldCell</span>
<span style="color: #002200;">&#123;</span>
  <span style="color: #400080;">NSColor</span> <span style="color: #002200;">*</span>m_pBGColor;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSColor</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pBGColor;
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> MySearchFieldCell
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init
<span style="color: #002200;">&#123;</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
    m_pBGColor <span style="color: #002200;">=</span> <span style="color: #a61390;">Nil</span>;
  <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSColor</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pBGColor
<span style="color: #002200;">&#123;</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>m_pBGColor <span style="color: #002200;">!=</span> pBGColor<span style="color: #002200;">&#41;</span>
  <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>m_pBGColor release<span style="color: #002200;">&#93;</span>;
    m_pBGColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>pBGColor retain<span style="color: #002200;">&#93;</span>;
  <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>drawInteriorWithFrame<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRect</span><span style="color: #002200;">&#41;</span>cellFrame inView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSView</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>controlView
<span style="color: #002200;">&#123;</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>m_pBGColor <span style="color: #002200;">!=</span> <span style="color: #a61390;">Nil</span><span style="color: #002200;">&#41;</span>
  <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>m_pBGColor setFill<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">NSRect</span> frame <span style="color: #002200;">=</span> cellFrame;
    <span style="color: #a61390;">double</span> radius <span style="color: #002200;">=</span> MIN<span style="color: #002200;">&#40;</span>NSWidth<span style="color: #002200;">&#40;</span>frame<span style="color: #002200;">&#41;</span>, NSHeight<span style="color: #002200;">&#40;</span>frame<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">/</span> <span style="color: #2400d9;">2.0</span>;
    <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBezierPath</span> bezierPathWithRoundedRect<span style="color: #002200;">:</span>frame
          xRadius<span style="color: #002200;">:</span>radius yRadius<span style="color: #002200;">:</span>radius<span style="color: #002200;">&#93;</span> fill<span style="color: #002200;">&#93;</span>;
  <span style="color: #002200;">&#125;</span>
  <span style="color: #002200;">&#91;</span>super drawInteriorWithFrame<span style="color: #002200;">:</span>cellFrame inView<span style="color: #002200;">:</span>controlView<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>The user can set a custom background color by using setBackgroundColor. Also it is possible to reset the background color by passing Nil to this method. The method drawInteriorWithFrame draws a rounded rectangle on the background and forwards the call to the super class afterward.</p>
<h2>Replacing the cell class of a control</h2>
<p>The next step is tell the control to use our own cell class and not the default one. Although there is a <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSControl_Class/Reference/Reference.html#//apple_ref/occ/instm/NSControl/setCell:" target="_blank">setCell</a> method defined in NSControl it is not as easy as one might think. Creating an instance of MySearchFieldCell and passing it to setCell after the NSSearchField is created will not have the expected effect. The reason for this comes from the fact that the cell is initialized when the control is created. This includes setting all properties and targets for the actions. If one replaces the cell afterward these setting will be get lost. Later on, I will show a method how to keep this configuration, but for now we will start with an easier approach.</p>
<p>When the control creates a cell object it asks a static method for the class name to use. This method is called <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSControl_Class/Reference/Reference.html#//apple_ref/occ/clm/NSControl/cellClass" target="_blank">cellClass</a>. If we overriding this method with our own one, we are able to return MySearchFieldCell. The following code demonstrates this:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MySearchField<span style="color: #002200;">:</span> <span style="color: #400080;">NSSearchField</span>
<span style="color: #002200;">&#123;</span><span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> MySearchField
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">Class</span><span style="color: #002200;">&#41;</span>cellClass
<span style="color: #002200;">&#123;</span>
  <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>MySearchFieldCell class<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Now, if you use MySearchField instead of NSSearchField when creating search fields, you are done. Unfortunately this isn't always possible. First you may not be able to inherit from NSSearchField for whatever reason and second this will not work when you are use the Interface Builder (<em>IB</em>) from Xcode. There you can't easily use your own version of NSSearchField, but you have to stick with the original one. Before we proceed the obligatory screenshot:</p>
<p style="text-align: center;"><a href="/wordpress/wp-content/uploads/MySearchField.png"><img class="aligncenter size-full wp-image-1071" title="MySearchField" src="/wordpress/wp-content/uploads/MySearchField.png" alt="" width="180" height="21" /></a></p>
<h2>The power of Archives</h2>
<p>What we need is a method of setting our own cell class even when the control is already instantiated. In Cocoa it is possible to Archive and Serialize any object which implements the <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html" target="_blank">NSCoding</a> protocol. Archiving means that the whole class hierarchy, with all properties and connections, is saved into a stream. Xcode makes heavy use of this in the nib file format where all the project data of the IB is written in. This alone doesn't help us much, but additional to the archiving and unarchiving work, it is possible to replace classes in the decoding step. The relevant classes are <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedArchiver_Class/Reference/Reference.html" target="_blank">NSKeyedArchiver</a> and <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/Reference/Reference.html" target="_blank">NSKeyedUnarchiver</a>. NSKeyedUnarchiver has a method <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/Reference/Reference.html#//apple_ref/occ/clm/NSKeyedUnarchiver/setClass:forClassName:" target="_blank">setClass:forClassName</a> which allow this inline replacement and the following code shows how to use it:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSSearchField</span> <span style="color: #002200;">*</span>pSearch <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSSearchField</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">/* Replace the cell class used for the NSSearchField */</span>
<span style="color: #002200;">&#91;</span><span style="color: #400080;">NSKeyedArchiver</span> setClassName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;MySearchFieldCell&quot;</span>
      forClass<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSSearchFieldCell</span> class<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>pSearch setCell<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSKeyedUnarchiver</span>
      unarchiveObjectWithData<span style="color: #002200;">:</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSKeyedArchiver</span>
        archivedDataWithRootObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>pSearch cell<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">/* Get the original behavior back */</span>
<span style="color: #002200;">&#91;</span><span style="color: #400080;">NSKeyedArchiver</span> setClassName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;NSSearchFieldCell&quot;</span>
      forClass<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSSearchFieldCell</span> class<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Basically this creates an archive of the current NSSearchFieldCell of the NSSearchField, which is instantly unarchived, but with the difference that the NSSearchFieldCell class is replaced by MySearchFieldCell. Because the archiving preserve all settings the new created class will have the same settings like the old one. The last call to NSKeyedArchiver will restore the default behavior.</p>
<h2>Conclusion</h2>
<p>This post should have removed some of the mysteries of the control and cell relationship in Cocoa. Additional to a simple derivation approach, a much more advanced way for setting the cell of a control was shown. This allows the replacement of any class hierarchy without loosing any runtime settings. If you need such replacements much more often or working with the IB, you should have a look at <a href="http://www.mikeash.com/pyblog/custom-nscells-done-right.html" target="_blank">Mike's</a> post which shows a more generic way of the archive/unarchive trick.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2010/06/changing-the-default-behavior-of-built-in-cocoa-controls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A simple WordPress plugin</title>
		<link>http://www.64k-tec.de/2010/01/a-simple-wordpress-plugin/</link>
		<comments>http://www.64k-tec.de/2010/01/a-simple-wordpress-plugin/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 23:03:30 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[phlogger]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[statistic]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/?p=449</guid>
		<description><![CDATA[As you may noticed I use WordPress for my blog. This is an unbelievable great piece of software. It has uncountable possibilities for enhancements and as soon as you begin to explore these, you start adding some of them to your own blog. One of the plugins I added was WPtouch. This plugin wraps your [...]]]></description>
			<content:encoded><![CDATA[<p>As you may noticed I use <a href="http://wordpress.org" target="_blank">WordPress</a> for my blog. This is an unbelievable great piece of software. It has uncountable possibilities for enhancements and as soon as you begin to explore these, you start adding some of them to your own blog. One of the plugins I added was <a href="http://www.bravenewcode.com/products/wptouch/" target="_blank">WPtouch</a>. This plugin wraps your blog into a theme for mobile devices if they are detected. This works for the iPhone, the Android platform or even Palms webOS. The theme is styled in a way it makes the content more readable on such (screen) limited devices and moves the menus to some extra place.</p>
<h2>Why writing a plugin if there are so many</h2>
<p>On our web server we are using <a href="http://pphlogger.phpee.com/" target="_blank">Power PHLogger</a> for a simple user statistic tracking. Unfortunately this software isn't maintained anymore, but it does it job very well. To use it you have to embed some JavaScript code and a blind image to every website you want to track. My first try was to add this code to the theme I use. This worked ok, but I soon realized that this has to be done on every update of the theme. Additionally this doesn't work with plugins like WPtouch, as there the whole theme is replaced. I searched for a plugin which takes this job, but I didn't find one. So what, I'm a programmer, time for writing it myself.</p>
<h2>Creating the necessary bits of code</h2>
<p>Plugins in WordPress are located at the <code class="path">wp-content/plugins</code> directory below the WordPress installation path. You have to choose a name, I used phlogger, and create a directory with that name. The plugin itself is written in PHP and named like the directory with the php extension. As the title says, it's a simple plugin with one public method only, as shown in the following code.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">/*
Plugin Name: phlogger
Plugin URI:
Description: Adds the power phlogger code to the footer.
Version: 0.1
Author: Christian Pötzsch
Author URI: http://www.64k-tec.de
*/</span>
&nbsp;
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp_footer'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'phlogger_footer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> phlogger_footer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #000088;">$l</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;script type=&quot;text/&lt;span class=&quot;&gt;&lt;!--mce:0--&gt;&lt;/script&gt;'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;noscript&gt;mce:1&lt;/noscript&gt;'</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$l</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>The method just outputs the code for the phlogger tracking. WordPress executes this method because of the <code>add_filter</code> call. <a href="http://codex.wordpress.org/Plugin_API/Action_Reference/wp_footer" target="_blank"><code>wp_footer</code></a> is the filter keyword for content which should be added to the footer of a webpage, just before the <code>&lt;/body&gt;</code> tag. The comment on the top of the file isn't only there for cosmetic reasons. It's parsed by WordPress and shown in the Plugin admin page of your blog settings. So it have to be there.</p>
<p>Of course I could have been adding methods for setting the phlogger link or the user name, but for my case this wasn't necessary. For more information on writing WordPress plugins have a look at the good <a href="http://codex.wordpress.org/Writing_a_Plugin" target="_blank">documentation</a>.</p>
<h2>Conclusion</h2>
<p>Starting to write WordPress plugins is easy. It makes even sense for so simple tasks like this, because it offers the possibility to inject code (and functionality) without changing WordPress or the theme itself.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2010/01/a-simple-wordpress-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrating native Cocoa controls into Qt</title>
		<link>http://www.64k-tec.de/2009/12/integrating-native-cocoa-controls-into-qt/</link>
		<comments>http://www.64k-tec.de/2009/12/integrating-native-cocoa-controls-into-qt/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 13:52:01 +0000</pubDate>
		<dc:creator>cp</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[help button]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.64k-tec.de/wordpress/?p=15</guid>
		<description><![CDATA[Making applications looking and feeling as native as possible on every supported platform is one of my main responsibilities within the VirtualBox development. Most of the work therefor is done by the Qt framework which we are using for our GUI. Qt does a nice job for Windows and most of the currently popular X11 [...]]]></description>
			<content:encoded><![CDATA[<p>Making applications looking and feeling as native as possible on every supported platform is one of my main responsibilities within the VirtualBox development. Most of the work therefor is done by the Qt framework which we are using for our GUI. Qt does a nice job for Windows and most of the currently popular X11 window toolkits used under Unix and Linux. They are behaving and looking similar in many ways which make it easy to develop for both architectures. Unfortunately this doesn't count in any case for Mac OS X, which often uses very different approaches or uses very specialized controls to reach a specific aim. One of this controls is the Mac OS X help button who every Mac user is familiar with. If an Mac OS X application doesn't use this help button, it breaks the design rules and the application, lets say, smells a little bit "under designed". The following little example shows how to integrate a <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSButton_Class/Reference/Reference.html" target="_blank">NSButton</a> seamlessly into your Qt application.</p>
<h2>Qt make it easy</h2>
<p>Nokia added the <a href="http://doc.trolltech.com/latest/qmaccocoaviewcontainer.html" target="_blank">QMacCocoaViewContainer</a> class with Qt 4.5. This class make it easy to integrate any NSView or deviate of the NSView class into the QWidget hierarchy of an application. The best integration is archived if one deviate from QMacCocoaViewContainer. To use Cocoa code and C++ classes at once the Objective-C++ compiler is necessary. The gcc uses the Objective-C++ compiler automatically if the source file ends with mm. We start with the C++ interface which looks like the following:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;">ADD_COCOA_NATIVE_REF<span style="color: #006E28;">&#40;</span>NSButton<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #0057AE;">class</span> CocoaHelpButton<span style="color: #006E28;">:</span> <span style="color: #0057AE;">public</span> QMacCocoaViewContainer
<span style="color: #006E28;">&#123;</span>
    <span style="color: #0057AE;">Q_OBJECT</span>
<span style="color: #0057AE;">public</span><span style="color: #006E28;">:</span>
    CocoaHelpButton<span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">QWidget</span> <span style="color: #006E28;">*</span>pParent <span style="color: #006E28;">=</span> <span style="color: #B08000;">0</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #22aadd;">QSize</span> sizeHint<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span> const<span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> onClicked<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #0057AE;">signals</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> clicked<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #0057AE;">private</span><span style="color: #006E28;">:</span>
    NativeNSButtonRef m_pButton<span style="color: #006E28;">;</span>
<span style="color: #006E28;">&#125;</span><span style="color: #006E28;">;</span></pre></div></div>

<p>For any Qt programmer this class definition is easy to understand. The only unusual is the ADD_COCOA_NATIVE_REF macro call and the NativeNSButtonRef type itself. One could say NativeNSButtonRef should be NSButton* and you are done, but it's not that easy. The reason for this is that the include file will be included first in the Objective-C++ source code file, where the NSButton* definition wouldn't be a problem, but secondly in every C++ source file which will use the CocoaHelpButton, where on the other side any Cocoa code is forbidden. The ADD_COCOA_NATIVE_REF macro avoid this problem by expanding NativeNSButtonRef to NSButton* if Objective-C++ code is compiled and to void* if C++ code is compiled. The macro itself looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifdef __OBJC__</span>
<span style="color: #339900;"># define ADD_COCOA_NATIVE_REF(CocoaClass) \
    @class CocoaClass; \
    typedef CocoaClass *Native##CocoaClass##Ref</span>
<span style="color: #339900;">#else /* __OBJC__ */</span>
<span style="color: #339900;"># define ADD_COCOA_NATIVE_REF(CocoaClass) typedef void *Native##CocoaClass##Ref</span>
<span style="color: #339900;">#endif /* __OBJC__ */</span></pre></div></div>

<p>The advantage of using such a macro is that one can use all methods of the NSButton in the Cocoa part of the source code without any casting.</p>
<h2>A little bit of Cocoa</h2>
<p>The initialization of the CocoaHelpButton class is straight forward as seen in the next code part:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">CocoaHelpButton<span style="color: #002200;">::</span>CocoaHelpButton<span style="color: #002200;">&#40;</span>QWidget <span style="color: #002200;">*</span>pParent <span style="color: #11740a; font-style: italic;">/* = 0 */</span><span style="color: #002200;">&#41;</span>
  <span style="color: #002200;">:</span>QMacCocoaViewContainer<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, pParent<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    m_pButton <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSButton</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>m_pButton setTitle<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>m_pButton setBezelStyle<span style="color: #002200;">:</span> NSHelpButtonBezelStyle<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>m_pButton setBordered<span style="color: #002200;">:</span> <span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>m_pButton setAlignment<span style="color: #002200;">:</span> NSCenterTextAlignment<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>m_pButton sizeToFit<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">NSRect</span> frame <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_pButton frame<span style="color: #002200;">&#93;</span>;
    frame.size.width <span style="color: #002200;">+=</span> <span style="color: #2400d9;">12</span>; <span style="color: #11740a; font-style: italic;">/* Margin */</span>
    <span style="color: #002200;">&#91;</span>m_pButton setFrame<span style="color: #002200;">:</span>frame<span style="color: #002200;">&#93;</span>;
    <span style="color: #11740a; font-style: italic;">/* We need a target for the click selector */</span>
    NSButtonTarget <span style="color: #002200;">*</span>bt <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>NSButtonTarget alloc<span style="color: #002200;">&#93;</span> initWithObject<span style="color: #002200;">:</span> this<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>m_pButton setTarget<span style="color: #002200;">:</span> bt<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>m_pButton setAction<span style="color: #002200;">:</span> <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>clicked<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #11740a; font-style: italic;">/* Make sure all is properly resized */</span>
    resize<span style="color: #002200;">&#40;</span>frame.size.width, frame.size.height<span style="color: #002200;">&#41;</span>;
    setSizePolicy<span style="color: #002200;">&#40;</span>QSizePolicy<span style="color: #002200;">::</span>Fixed, QSizePolicy<span style="color: #002200;">::</span>Fixed<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
QSize CocoaHelpButton<span style="color: #002200;">::</span>sizeHint<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span> <span style="color: #a61390;">const</span>
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">NSRect</span> frame <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_pButton frame<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">return</span> QSize<span style="color: #002200;">&#40;</span>frame.size.width, frame.size.height<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">void</span> CocoaHelpButton<span style="color: #002200;">::</span>onClicked<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    emit clicked<span style="color: #002200;">&#40;</span><span style="color: #a61390;">false</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>This set up the NSButton object and make sure that everything has the right size. As shown there, to make a standard button a help button the bezel style has been set to NSHelpButtonBezelStyle. To get the click notification the wrapper class NSButtonTarget is necessary.  As highlighted in the code above the target action is set to the selector "clicked".  The NSButtonTarget class looks as follow:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> NSButtonTarget<span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
    CocoaHelpButton <span style="color: #002200;">*</span>m_pTarget;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CocoaHelpButton<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>object;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>clicked<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;
<span style="color: #a61390;">@end</span>
<span style="color: #a61390;">@implementation</span> NSButtonTarget
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CocoaHelpButton<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>object
<span style="color: #002200;">&#123;</span>
    self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;
    m_pTarget <span style="color: #002200;">=</span> object;
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>clicked<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender;
<span style="color: #002200;">&#123;</span>
    m_pTarget<span style="color: #002200;">-</span>&gt;onClicked<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>If you put all this together and add the CocoaHelpButton class to your project you will get some output like this:</p>
<p style="text-align: left;"><a href="http://www.64k-tec.de/wordpress/wp-content/uploads/help1.png"><img class="size-full wp-image-220  aligncenter" title="help" src="http://www.64k-tec.de/wordpress/wp-content/uploads/help1.png" alt="" width="38" height="37" /></a>More integration could be reached by adding wrapper methods for e.g. setting the tooltip, but this is left out as an exercise for the reader.</p>
<h2>Conclusion</h2>
<p>For more complex controls like a NSSearchField more interaction with Cocoa will be necessary. On the other hand this little excursion to the Cocoa world should make it easy for everyone to add shiny new Mac OS X controls to the own Qt application.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.64k-tec.de/2009/12/integrating-native-cocoa-controls-into-qt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

