<?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>NIX/WIN/WEB &#187; learn c++</title>
	<atom:link href="http://www.formboss.net/blog/tag/learn-c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.formboss.net/blog</link>
	<description>Modern Web Application Development</description>
	<lastBuildDate>Thu, 02 Feb 2012 18:43:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 4</title>
		<link>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/</link>
		<comments>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 01:45:48 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=329</guid>
		<description><![CDATA[Having created a shell of our app in step 2, porting the image cleaner code in step 3, we&#8217;re now at the stage where we can to port our command line XML cleaner code to Qt. At the end of this post we&#8217;ll have a fully functioning C++ Qt app. The Original &#8216;Command Line&#8217; Code [...]]]></description>
			<content:encoded><![CDATA[<p>Having created a shell of our app in step 2, porting the image cleaner code in step 3, we&#8217;re now at the stage where we can to port our command line XML cleaner code to Qt. At the end of this post we&#8217;ll have a fully functioning C++ Qt app.</p>
<p><span id="more-329"></span></p>
<h2>The Original &#8216;Command Line&#8217; Code</h2>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// xml files</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Starting file clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; string fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; d <span class="sy1">=</span> opendir<span class="br0">&#40;</span>storyPath.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>d<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// low memory, no parallelization</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy1">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name <span class="sy1">=</span> dir<span class="sy2">-</span><span class="sy1">&gt;</span>d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location <span class="sy1">=</span> storyPath <span class="sy2">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy2">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;.&quot;</span> <span class="sy3">&amp;&amp;</span> name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;..&quot;</span> <span class="sy3">&amp;&amp;</span> name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ==&gt; buffer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// alternative version of buffer &#8211; we lose the</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// BOM issue, but have to create \r\n</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string fileData2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff <span class="sy2">+</span><span class="sy1">=</span> fileData2 <span class="sy2">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy1">=</span> buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// == remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hl1Start <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span> <span class="sy3">&amp;&amp;</span> hl1End <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy1">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>hl1Start,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>hl1End <span class="sy2">-</span> hl1Start<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy2">-</span> hl1Start<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1 exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// == replace all instances with open p then find</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// the next \r\n and add a </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>bodyStart <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span> <span class="sy3">&amp;&amp;</span> bodyEnd <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy1">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>bodyStart,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>bodyEnd <span class="sy2">-</span> bodyStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> matchingP <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; innerp <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rn, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>innerp <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>matchingP <span class="sy1">==</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Hanging p&quot;</span> <span class="sy1">&lt;&lt;</span> endl;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter<span class="sy2">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy2">-</span> bodyStart<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// bodyEnd exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// save file</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location <span class="sy2">+</span> <span class="st0">&quot;-debug.xml&quot;</span><span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream<span class="sy4">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location<span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ofstream<span class="sy4">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outfile.<span class="me1">write</span><span class="br0">&#40;</span>fileData.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, fileData.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// while()</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We perform a couple of distinct steps in this code. First, we open our directory for iteration with:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy1">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">name <span class="sy1">=</span> dir<span class="sy2">-</span><span class="sy1">&gt;</span>d_name;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
</ol>
</div>
<p>And then write the contents of the file into a buffer with:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// BOM issue, but have to create \r\n</span></div>
</li>
<li class="li1">
<div class="de1">string fileData2;</div>
</li>
<li class="li1">
<div class="de1">string buff;</div>
</li>
<li class="li1">
<div class="de1">ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">buff <span class="sy2">+</span><span class="sy1">=</span> fileData2 <span class="sy2">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">fileData <span class="sy1">=</span> buff;</div>
</li>
</ol>
</div>
<p>Not too complicated: We use getline() to only get the raw text of a line, to which we then add a \r\n. We do this because part of our task is to recreate proper tags, and it just so happens that so long as we know where our line breaks are, we can do so reliably. Adding our own line break tags means cross-platform differences will be eliminated, plus our p tag code will run exactly as intended.</p>
<p>The remainder of the code removes extra formatting from headline elements, as well as adds p tags in proper order and sequence. Most of this logic, as it turns out, was the same in Qt, though we did have some significant differences in key locations.</p>
<h2>The New Code</h2>
<p>The new code segment is the result of a fair bit of experimentation. The command line version was in fact easier to create, though only because of the higher availability of resources for performing file opening, string manipulation, and file writing in plain old C++.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanXMLStoryFiles</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting XML File Clean&#8230;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// locals</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> replaceString;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// create buffer for semaphores</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; uint count <span class="sy0">=</span> <span class="kw5">QDir</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath<span class="br0">&#41;</span>.<span class="me1">count</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> t <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>count<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// loop and clean</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// reset on every turn</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// open file data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f<span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>f.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QIODevice</span><span class="sy0">::</span><span class="me2">ReadWrite</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> in<span class="br0">&#40;</span><span class="sy0">&amp;</span>f<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">+=</span> in.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>in.<span class="me1">atEnd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>hl1Start <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> hl1End <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> fileData.<span class="me1">mid</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;br, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;rl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;nl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove p tags and extra spaces</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>bodyStart <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> bodyEnd <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> fileData.<span class="me1">mid</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, this<span class="sy0">-</span>&gt;openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; innerp <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>rn, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>innerp <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>doublebr, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>matchingP <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>Hanging P Found And Fixed<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// innner p</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// write file</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;-new.xml&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> outData<span class="br0">&#40;</span>outPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outData.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QFile</span><span class="sy0">::</span><span class="me2">WriteOnly</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> outFile<span class="br0">&#40;</span><span class="sy0">&amp;</span>outData<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outFile &lt;&lt; fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>XML File Clean Complete.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> this<span class="sy0">-</span>&gt;statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Some key points are as follows:</p>
<p>The method used to iterate through a directory:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>&#8230;feels a bit strange to me, almost as if I&#8217;m missing something. Specifically, the while() statement checks for an empty string if no further files are found. This just seems&#8230;wrong to me, but I could be mistaken. For the record, examples given in Qt help documentation had a flaw of never returning the <em>last</em> element of a directory. For example, if we had four items, only three would be iterated through. The do { } while() was the only way I found to hit all files.</p>
<p>As similar as the core logic is, here&#8217;s where things take a pretty radical departure from the command line version.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// reset on every turn</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// open file data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f<span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>f.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QIODevice</span><span class="sy0">::</span><span class="me2">ReadWrite</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> in<span class="br0">&#40;</span><span class="sy0">&amp;</span>f<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">+=</span> in.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>in.<span class="me1">atEnd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In this code we&#8217;re using the handy QTextStream on an address of a QFile object to read each line of text, to which we add the \r\n to, just like the command line version.</p>
<p>We also save a chunk of time here by using REGEX enabled replace method to remove unwanted tags from the headline text:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;br, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;rl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;nl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>As you may recall in the old code we used a more complex:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The last part, the section where we add our properly closed p tags, is largely untouched, save for using <strong>indexOf() </strong>instead of <strong>find()</strong>, as well as using <strong>mid()</strong> to build our temporary string for editing.</p>
<p>The last step was to write the fixed file back to the file system. In the first version we used the rather succinct <strong>ofstream</strong> to do the job, The new version used a more complex series of command as:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;-new.xml&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> outData<span class="br0">&#40;</span>outPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outData.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QFile</span><span class="sy0">::</span><span class="me2">WriteOnly</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> outFile<span class="br0">&#40;</span><span class="sy0">&amp;</span>outData<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outFile &lt;&lt; fileData;</div>
</li>
</ol>
</div>
<p>Of course we may have a more simplistic way of doing this, but I didn&#8217;t find one.</p>
<h2>Closing Thoughts</h2>
<p>The end result of our project is a slick little Qt desktop app that removed the burden of command line operation for its use. However, as nice as this may be for the end-user, as a developer what I was most curious to see was if Qt would stand up to the challenge of being user friendly, powerful, and at the same time, a joy to work with.</p>
<p>Simple answer: It was. Qt is simply brilliant&#8211;I&#8217;m sold, hooked, and thoroughly excited to learn and do more with this library. It&#8217;s all the power and functionality of C++, but wrapped into a cross platform, easy to use deployment platform with powerful tools and solid documentation.</p>
<p>Though of course this is somewhat relative when it comes to porting command line app to a GUI. Our command line app weighed in at 223 lines, Qt: 368. While it was very easy to find examples of file operation for vanilla C++ on the web, it was markedly more difficult for Qt. In fact, as hinted at in the text I&#8217;m still quite unsure of the &#8220;properness&#8221; of this code. It works well enough, but am I missing something?</p>
<p>Do I really need to used a  <strong>QTextStream</strong> to write data, or should I have used the more low-level write() function inherited from <strong>QIODevice</strong>? This question reminds me of the difference in PHP between using:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$content</span> <span class="sy0">=</span> <span class="st0">&quot;Sample&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$res</span> <span class="sy0">=</span> file_put_contents<span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>verses using:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$content</span> <span class="sy0">=</span> <span class="st0">&quot;Sample&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$handle</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="st0">&quot;somefile.txt&quot;</span><span class="sy0">,</span> <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$res</span> <span class="sy0">=</span> <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re1">$handle</span><span class="sy0">,</span> <span class="re1">$content</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>In short, one simple step vs. a few more obtuse ones. It&#8217;s by no means wrong, but I can&#8217;t help but wonder&#8230;</p>
<p>Of course it should also be said that this program could use more error and sanity checks if it was to ever be released an a commercial app, but in this case, it&#8217;s just for pedagogical purposes.</p>
<h2>Complete Application Source Download</h2>
<p>Being a Qt app you should be able to run this code (build) on any platform Qt supports.<br />
<a href="http://www.formboss.net/blog/wp-content/uploads/2010/06/cleaner.zip">Download cleaner.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 3</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:27:41 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[Porting Code]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=242</guid>
		<description><![CDATA[In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version. The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app. [...]]]></description>
			<content:encoded><![CDATA[<p>In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version.</p>
<p>The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app.</p>
<p>We&#8217;re already getting a valid directory entry from part 2, so the first step in this part is to figure out how we iterate and query files from our base folder.</p>
<p><span id="more-242"></span></p>
<p>As setup for this task, in the first app (the command line one) we defined a few globals:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// path data</span></div>
</li>
<li class="li1">
<div class="de1">string basePath <span class="sy0">=</span> argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">string imagePath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">string storyPath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>We&#8217;ll keep that basic structure, but of course implement them as member private variables. It should be noted that in the new version the &#8216;base&#8217; directory value comes from our Worker constructor with:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">Worker <span class="sy0">*</span>wk <span class="sy0">=</span> <span class="kw3">new</span> Worker<span class="br0">&#40;</span>processPathQLineEdit<span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>In the worker constructor we then:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// create path items</span></div>
</li>
<li class="li1">
<div class="de1">basePath <span class="sy0">=</span> path;</div>
</li>
<li class="li1">
<div class="de1">imagePath <span class="sy0">=</span> path <span class="sy0">+=</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">xmlPath <span class="sy0">+=</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>Same thing as the original version really, though one thing I had to check on is if using / will be a problem for Windows. <a title="QDir" href="http://doc.qt.nokia.com/4.6/qdir.html" target="_blank"><em>*Turns out the answer is no.*</em></a></p>
<p>With the setup tasks done notice that in the GUI we have two buttons: The first allows us to select the base folder, the second kicks off the Process Images task. Notice how we do this: in cleaner.enc__cppqt our clicked() SIGNAL of the <em>processButton </em>button is assigned to the processAction slot, which in turn, after creating our Worker instance object, calls cleanImages(). And so we&#8217;re getting an images directory via the GUI&#8211;so far so good!</p>
<p>This brings us to the next big question question: how do we open and iterate over directories?</p>
<h2>Iterator Over Directories</h2>
<p>As you may recall the first task of our program is to remove all files with a _bw_ in the name from the /images sub-folder. It looks like we have: <strong>QDirIterator</strong> and <strong>QDir</strong> to help us perform this duty, with the possibly of others as well. The former seems to be for general access, the latter for iterating&#8211;we want to iterate.</p>
<h3>Basic QDirIterator Implementation</h3>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;./&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Pretty strait forward really. Iterator over the directory, making sure to skip the path items.</p>
<p>This takes care of the iteration, now we need to find and remove files that have the _bw_.</p>
<p>In the old code we used:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;found <span class="sy0">=</span> name.<span class="me1">rfind</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>found <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;path <span class="sy0">=</span> imagePath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;location <span class="sy0">=</span> imagePath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> &lt;&lt; location &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> t <span class="sy0">=</span> <span class="kw3">remove</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I should step back to mention the first step was to get the file name. In the first attempt we relied on a <strong>struct</strong> returned by <strong>dirent</strong> to store file info for checking, now we have a nice simple fileName() method to call. I&#8217;m not going to lie, the Qt way feels much cleaner than the command line version. <strong>dirent </strong>was tricky to work with at first without having a debugger, this is no longer an issue in Qt. With that out of the way, what of finding the text &#8220;_bw_&#8221;?</p>
<p>I suspected, and was proven right, that QString would have some type of find function. Sure enough:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Beautiful! I can&#8217;t help but show my gratitude over such an elegant and natural thing. Without any documentation look up I was able to basically guess and implement my search function in one line. Yes std::string had the same thing with .find(), but this was a nice treat regardless.</p>
<p>Right, so now how do we delete files?</p>
<p>In the first version we had to use a separate variable (location) and a member function .c_str() to pass to the delete(char*) call. This is fine, but a touch verbose. It would be nice to encapsulate this a bit more.</p>
<h3>Delete File Implementation</h3>
<p>It turns out that we can use the same remove() call, though it wants a char*, we&#8217;ve got a QString. As was the goal anyway, we want to use native solutions for cross-platform consistency. I did some digging and found QFile. QFile has a member function for removing files: <strong>.remove()</strong>. Even better though, QDirIterator has a member function <strong>filePath()</strong> to return the full path to the file (not just file name). Of course I may have missed similar functionality in the first go (such as using QDir), but now we save ourselves the hassle of rebuilding the file path from scratch. The final code is:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Sure it&#8217;s about the same length as the original command line code, if not a bit longer, but it feels more intuitive&#8211;almost like OO PHP coding. I do not however, like the idea of creating a new QFile for each item to remove, but I&#8217;m learning&#8211;I&#8217;m sure we&#8217;ll find a better way in the next few posts.</p>
<h3>Final Method Implementation</h3>
<p>For the sake of completeness, here&#8217;s the final cleanImages() function:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Up next, <a href="porting-to-the-qt-c-framework-part-4">rewriting the cleanXMLStoryFiles() function</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 2</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:05:25 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=252</guid>
		<description><![CDATA[In this post I want to introduce the Qt code I&#8217;ve written so far. One of the strengths of the Qt framework is its well supported in NetBeans, but more importantly, by Nokia via the Qt Creator IDE. In fact, Nokia supplies a host of tools, from the IDE and language tools, an Interface Designer, [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I want to introduce the Qt code I&#8217;ve written so far. One of the strengths of the Qt framework is its well supported in NetBeans, but more importantly, by Nokia via the <a title="QT Creator IDE" href="http://qt.nokia.com/products/developer-tools">Qt Creator IDE</a>. In fact, Nokia supplies a host of tools, from the IDE and language tools, an Interface Designer, and loads of examples.</p>
<p>At the end of this post we&#8217;ll have a shell ready for the actual porting process to being. In other words, a GUI that loads, reacts to button presses, and updates status text.</p>
<p><span id="more-252"></span></p>
<p>So here&#8217;s the code:</p>
<h2>main.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;cleaner.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QApplication</span> app<span class="br0">&#40;</span>argc, argv<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Cleaner cleaner;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cleaner.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> app.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>cleaner.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;cleaner.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;worker.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Cleaner<span class="sy0">::</span><span class="me2">Cleaner</span><span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">:</span> <span class="kw5">QWidget</span><span class="br0">&#40;</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; statusLabel <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLabel</span><span class="br0">&#40;</span><span class="st0">&quot;Conversion Status:&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathLabel <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLabel</span><span class="br0">&#40;</span><span class="st0">&quot;Folder To Process&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QTextEdit</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLineEdit</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; loadButton <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QPushButton</span><span class="br0">&#40;</span><span class="st0">&quot;Select Folder&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; loadButton<span class="sy0">-</span>&gt;setToolTip<span class="br0">&#40;</span><span class="st0">&quot;Select a folder to load Prestige export data from&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QPushButton</span><span class="br0">&#40;</span><span class="st0">&quot;Process Folder&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QGridLayout</span> <span class="sy0">*</span>mainLayout <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QGridLayout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>statusLabel, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processStatusText, <span class="nu0">1</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processPathLabel, <span class="nu0">2</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processPathQLineEdit, <span class="nu0">3</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QVBoxLayout</span> <span class="sy0">*</span>buttonLayout1 <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QVBoxLayout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; buttonLayout1<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>loadButton, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; buttonLayout1<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processButton, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addLayout<span class="br0">&#40;</span>buttonLayout1, <span class="nu0">1</span>, <span class="nu0">1</span>, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setLayout<span class="br0">&#40;</span>mainLayout<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setWindowTitle<span class="br0">&#40;</span><span class="st0">&quot;Prestige Export File Cleaner&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// signal and slots</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>loadButton, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>clicked<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>loadAction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>processButton, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>clicked<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>processAction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Cleaner<span class="sy0">::</span><span class="me2">loadAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// main folder name to use</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPath <span class="sy0">=</span> <span class="kw5">QFileDialog</span><span class="sy0">::</span><span class="me2">getExistingDirectory</span><span class="br0">&#40;</span><span class="kw3">this</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;Prestige Export Folder&quot;</span>, <span class="st0">&quot;&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw5">QFileDialog</span><span class="sy0">::</span><span class="me2">ShowDirsOnly</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>processPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Cleaner<span class="sy0">::</span><span class="me2">processAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span><span class="st0">&quot;Starting Process&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker <span class="sy0">*</span>wk <span class="sy0">=</span> <span class="kw3">new</span> Worker<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>wk<span class="sy0">-</span>&gt;cleanImages<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>cleaner.h</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef CLEANER_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define CLEANER_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QLabel</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QLineEdit</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QTextEdit</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QPushButton</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Cleaner <span class="sy0">:</span> <span class="kw2">public</span> <span class="kw5">QWidget</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">Q_OBJECT</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Cleaner<span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent <span class="sy0">=</span> <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">slots</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> loadAction<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> processAction<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLineEdit</span> <span class="sy0">*</span>processPathQLineEdit;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLabel</span> <span class="sy0">*</span>statusLabel;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLabel</span> <span class="sy0">*</span>processPathLabel;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QTextEdit</span> <span class="sy0">*</span>processStatusText;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QPushButton</span> <span class="sy0">*</span>loadButton;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QPushButton</span> <span class="sy0">*</span>processButton;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> processPath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // CLEANER_H</span></div>
</li>
</ol>
</div>
<h2>worker.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;worker.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Worker<span class="sy0">::</span><span class="me2">Worker</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; br <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; nl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rn <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; openp <span class="sy0">=</span> <span class="st0">&quot;&lt;p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; closep <span class="sy0">=</span> <span class="st0">&quot;&lt;/p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; doublebr <span class="sy0">=</span> <span class="st0">&quot;&lt;br/&gt;&lt;br/&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span><span class="st0">&quot;Done!&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Worker<span class="sy0">::</span><span class="me2">cleanXMLStoryFiles</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>worker.h</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef WORKER_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define WORKER_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Worker</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker<span class="br0">&#40;</span><span class="kw5">QString</span> dir<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// functions</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> cleanImages<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> cleanXMLStoryFiles<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// status</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> statusMessages;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> br;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> rl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> nl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> rn;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> openp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> closep;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> doublebr;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // WORKER_H</span></div>
</li>
</ol>
</div>
<p>The biggest thing to note about this code is that we&#8217;re not using the <em>Qt Designer</em> program to create the UI. It&#8217;s all hand coded, done for the sake of learning the core UI model. If you&#8217;re learning Qt I suggest you try this as well. Yes the Qt Designer tool is fantastic and <em>yes </em>I&#8217;ll use it for most tasks moving forward, but for this project we&#8217;ll keep it low-level.</p>
<h2>Core Implementation</h2>
<p>On the implementation level it&#8217;s important to note that we&#8217;re using a totally object oriented approach to the UI and logic. Speaking of UI and Logic, note how we&#8217;ve split the app in two logical components: cleaner.enc__cppqt which holds the presentation logic, worker.enc__cppqt for the &#8216;model&#8217;.</p>
<p>On a releated note, as the XML logic will almost certainly get parallelized we&#8217;ll take special note of how we add and handle additional classes and data structures. From what I can see Qt may want all parallel code in separate classes, so we&#8217;ll see. We may end up editing the core functionality of worker.enc__cppqt, or possibly add a workerXML.ccp to the mix.</p>
<p>Also note how our call to: <em>QFileDialog::getExistingDirectory()</em> via: <em>void Cleaner::loadAction()</em> in cleaner.enc__cppqt is how we get the file path to process. In short, we&#8217;ve already replaced the command line apps argument with a GUI based equivalent!</p>
<p>To that end notice that as of right now we still have implementation bugs. So for example we create pointer to an instance of Worker on the heap in processAction() but do not call delete() on it. Of course this is wrong, and we&#8217;ll fix that in time&#8211;for now though the main idea is this code creates the UI which reacts to member functions of the worker class.</p>
<h2>Next Steps</h2>
<p>That&#8217;s it for the core UI code, in part 2 we&#8217;ll start porting our base application.</p>
<p>Go To Part 3 &#8211;&gt;<br />
<a href="porting-to-the-qt-c-framework-part-3">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 1</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-1/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-1/#comments</comments>
		<pubDate>Thu, 27 May 2010 04:15:51 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=227</guid>
		<description><![CDATA[In this post we&#8217;ll start the process of porting a simple command line C++ application to the Nokia Qt framework. Well take a quick look at the code in question, then talk about how we&#8217;ll port it. The application in question is a simple tool for cleaning up the export of a Print Publishing CMS [...]]]></description>
			<content:encoded><![CDATA[<p>In this post we&#8217;ll start the process of porting a simple command line C++ application to the <a title="Nokia Qt Framework" href="http://qt.nokia.com/products" target="_blank">Nokia Qt framework</a>. Well take a quick look at the code in question, then talk about how we&#8217;ll port it.</p>
<p>The application in question is a simple tool for cleaning up the export of a Print Publishing CMS system for eventual use in a Web-based CMS. By <em>simple </em>I mean we open a folder and loop through it, diving into sub-folders as needed to:</p>
<ol>
<li>Remove all images tagged with a _bw_</li>
<li>Open XML &#8216;story&#8217; files and remove extra line breaks from headline elements, and clean up content HTML.</li>
</ol>
<p>The application started as an <a title="Apple Xcode" href="http://developer.apple.com/technologies/tools/xcode.html" target="_blank">Apple Xcode</a> project, and has now moved into <a title="Netbeans" href="http://netbeans.org/" target="_blank">NetBeans 6.8</a> on Linux. In the end I hope to learn a good deal about the Qt framework, as well as proper C++ application development.</p>
<p><span id="more-227"></span></p>
<h2>How and why are we doing this?</h2>
<p>Command line apps are only so useful, so the next natural step was to port it to a GUI. I had not done this before, so it would be an education experience. Perhpas you find yourself in a similar situation, stuck with a command line tool when a nice GUI would be preferred. Of course doing so can be intimidating at first, as in most cases the libraries needed to accomplish this task can be quite daunting.</p>
<p>To that end I we&#8217;ll use Qt (read: <em>cute</em>) because it&#8217;s open source for non-commercial  apps, is incredibly powerful, cross-platform, easy to learn, and well documented.</p>
<h2>The Code</h2>
<p>So what have we got to work with? I did a fair bit of experimentation during the first pass, what we see here is the sanitized version with most comments and junk taken out. That said, it should work on *NIX based distributions, Windows is iffy, and not tested.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Clean Up Prestige Export Files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Removes all _bw_ images</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* TODO: Clean up image names (remove non-acceptable characters)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Removes all &lt;br/&gt; and \r \n from headlines</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Transforms body &lt;br/&gt; items into valid p tags</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @author Matthew Grdinic</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @organization Journal Interactive</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @date 5/19/10</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @version 0.2.0008</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* TODO:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;string&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;dirent.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdio.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;fstream&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iterator&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;sys/types.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;sys/stat.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;unistd.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define DEBUG false</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy0">*</span> <span class="kw4">const</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>argc <span class="sy0">!=</span> <span class="nu0">2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">fprintf</span><span class="br0">&#40;</span><span class="kw2">stderr</span>,<span class="st0">&quot;Usage: %s [base xmlout dirname]<span class="es0">\n</span>&quot;</span>,argv<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string br <span class="sy0">=</span> <span class="st0">&quot;&lt;br/&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string rl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string nl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string rn <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string openp <span class="sy0">=</span> <span class="st0">&quot;&lt;p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string closep <span class="sy0">=</span> <span class="st0">&quot;&lt;/p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">const</span> string doublebr <span class="sy0">=</span> <span class="st0">&quot;&lt;br/&gt;&lt;br/&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;======================&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;WELCOME TO THE CLEANER&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;======================&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// path data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;string basePath <span class="sy0">=</span> argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string imagePath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string storyPath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// images</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; endl &lt;&lt; <span class="st0">&quot;Starting image clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;DIR <span class="sy0">*</span>d;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">struct</span> dirent <span class="sy0">*</span>dir;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string location;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string path;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string replaceString;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;d <span class="sy0">=</span> opendir<span class="br0">&#40;</span>imagePath.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> found;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;found <span class="sy0">=</span> name.<span class="me1">rfind</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>found <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; path <span class="sy0">=</span> imagePath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; location <span class="sy0">=</span> imagePath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">cout</span> &lt;&lt; location &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> t <span class="sy0">=</span> <span class="kw3">remove</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>t <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">cout</span> &lt;&lt; counter &lt;&lt; <span class="st0">&quot; image file(s) were removed.&quot;</span> &lt;&lt; endl &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// xml files</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Starting file clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;string fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;d <span class="sy0">=</span> opendir<span class="br0">&#40;</span>storyPath.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// low memory, no parallelization</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;location <span class="sy0">=</span> storyPath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>name <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">&amp;&amp;</span> name <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span> <span class="sy0">&amp;&amp;</span> name <span class="sy0">!=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// ==&gt; buffer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// alternative version of buffer &#8211; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; string fileData2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; string buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;buff <span class="sy0">+=</span> fileData2 <span class="sy0">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fileData <span class="sy0">=</span> buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// == remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;hl1&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;/hl1&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>hl1Start <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> hl1End <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;replaceString <span class="sy0">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1 exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;body.content&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy0">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;/body.content&gt;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>bodyStart <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> bodyEnd <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;replaceString <span class="sy0">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw4">int</span> matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; innerp <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rn, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>innerp <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>matchingP <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Hanging p&quot;</span> &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// bodyEnd exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// save file</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location <span class="sy0">+</span> <span class="st0">&quot;-debug.xml&quot;</span><span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ofstream<span class="sy0">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location<span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ofstream<span class="sy0">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; outfile.<span class="me1">write</span><span class="br0">&#40;</span>fileData.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, fileData.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span> <span class="co1">// while()</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>The Current Program</h2>
<p>The program is broken into several logical sections: The first part of the program takes the user supplied command line argument of a folder and creates a simple variable: <strong>basePath</strong>. This path is then used to build the other locations of our sub-folder structure. Here we also define a few text constants used in the XML file cleanup step.</p>
<p>With a valid path, we loop though the images folder and delete any files with a _bw_ in the name. The _bw_ is for Black and White, and is a known quantity in this work-flow.</p>
<p>I should add at this point the folder structure we are traversing looks like:</p>
<p>xmlout</p>
<p>&#8211;images/</p>
<p>&#8212;-/image_files.jog</p>
<p>&#8211;null/</p>
<p>&#8211;stories/</p>
<p>&#8212;-/story.xml</p>
<p>&#8212;-/story.xml</p>
<p>The next step is slightly longer, here we need to clean up XML files. The process really isn&#8217;t important for the porting process, as we&#8217;ll probably end up with very similar code in the end anyway. The long and short of it though is at several places in the XML output are unclosed &lt;p&gt; tags, extra line breaks and formatting, and other general messiness that cause an XML import of these files to fail when going to the &#8216;target&#8217; system.</p>
<p>The one thing I <em>do</em> want to pay attention to is the file read process. It&#8217;s in this area that we&#8217;ll probably find the most diversion from the command line app. In particular, I want to see how Qt makes file reading easier, and also, I want to explore parallelization at this step. I can envision reading in a batch of files, say, 50 at a time, and then spawning new threads to handle the clean up tasks.</p>
<p>Of course we then write the cleaned up files back to the system, something that again, could probably be done in concert with a parallel processing model.</p>
<p>More generally though, with a port I want to explore a more object oriented way of performing these steps, as well as adding more error and sanity checks.</p>
<h2>Coming In Part 2</h2>
<p>Stay tuned for part 2 where we&#8217;ll take a look at the ported code I&#8217;ve created thus far. We&#8217;ll talk about general Qt development, and what goals I have the project in general.</p>
<h2>Code Download</h2>
<p>A note of caution: This code has not been tested, and may not work on Windows. Of course this is one area a proper Qt port will help with!</p>
<p><a href='http://www.formboss.net/blog/wp-content/uploads/2010/05/main.cpp_.zip'>main.cpp</a><br />
Go To Part 2 &#8211;&gt;<br />
<a href="porting-to-the-qt-c-framework-part-2">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Posix Threads In C++</title>
		<link>http://www.formboss.net/blog/2010/05/202/</link>
		<comments>http://www.formboss.net/blog/2010/05/202/#comments</comments>
		<pubDate>Tue, 04 May 2010 04:14:52 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=202</guid>
		<description><![CDATA[It&#8217;s sometimes hard to find a good example of working with threads in C++. Thus, in the course of implementing a very simple working example I decided it wouldn&#8217;t hurt to post what I came up with. The following code will spawn 2 threads (for a total of three program threads), and calculate 40 iterations [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s sometimes hard to find a good example of working with threads in C++. Thus, in the course of implementing a <strong>very simple</strong> working example I decided it wouldn&#8217;t hurt to post what I came up with.</p>
<p><span id="more-202"></span></p>
<p>The following code will spawn 2 threads (for a total of three program threads), and calculate 40 iterations of the fibonacci_number function. You can make it spawn more threads via <em>threads</em>, as well as change the number of iterations via the <em>iterations &lt; 40 </em>condition.</p>
<p>I also have some test code at the top of our <em>threadfunc</em> method for variable passing. Any time you start working with threads you need to be aware of the pitfalls that come with data access, and this is something I very much look forward to learning more about.</p>
<p><span style="color: #808080;"><em>Please note the code was run on Linux, specifically Ubuntu 10.04. You&#8217;ll need the g++ compiler and other dev libs via individual packages (e.g. libc6-dev) or </em></span><em><span style="color: #888888;"><strong>&lt;sudo aptitude install build-essential&gt;</strong>.<br />
</span></em></p>
<p><span style="color: #808080;"><em>Also, as the in-code comment below states, you need to include the  Posix Threads library in the <strong>Linker  Properties</strong> of the project  properties area when using <strong>NetBeans</strong>, I&#8217;m not sure about other IDE&#8217;s.</em></span></p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;unistd.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;pthread.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdlib.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;string&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// We need to include POSIX threads in the linker properties (project settings)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> fibonacci_number<span class="br0">&#40;</span><span class="kw4">int</span> num<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">switch</span><span class="br0">&#40;</span>num<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">case</span> <span class="nu0">0</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">case</span> <span class="nu0">1</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">default</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> fibonacci_number<span class="br0">&#40;</span>num<span class="nu0">-2</span><span class="br0">&#41;</span> <span class="sy0">+</span> fibonacci_number<span class="br0">&#40;</span>num<span class="nu0">-1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span><span class="sy0">*</span> parallel_threadfunc<span class="br0">&#40;</span><span class="kw4">void</span> <span class="sy0">*</span>arg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;sleep<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Thread called&#8230;&quot;</span> &lt;&lt; arg &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// we cannot get the direct value of our variable, I have to create a</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// new pointer and cast the *arg to that (an int pointer), then dereference it.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> <span class="sy0">*</span> l;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;l <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw4">int</span><span class="sy0">*</span><span class="br0">&#41;</span>arg;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Value Passed&#8230;&quot;</span> &lt;&lt; <span class="sy0">*</span>l &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// loop</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> iteration <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>iteration &lt; <span class="nu0">40</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> value <span class="sy0">=</span> fibonacci_number<span class="br0">&#40;</span>iteration<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;iteration<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;std<span class="sy0">::</span><span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Itteration#&#8230;&quot;</span> &lt;&lt; iteration &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// exit</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_exit<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> threads <span class="sy0">=</span> <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> x<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#123;</span><span class="nu0">0</span>,<span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span>,<span class="nu0">5</span>,<span class="nu0">6</span>,<span class="nu0">7</span>,<span class="nu0">8</span>,<span class="nu0">9</span>,<span class="nu0">10</span><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// thread attributes</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_attr_t attr;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_attr_init<span class="br0">&#40;</span><span class="sy0">&amp;</span>attr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_attr_setdetachstate<span class="br0">&#40;</span><span class="sy0">&amp;</span>attr, PTHREAD_CREATE_DETACHED<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_t t<span class="br0">&#91;</span>threads<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">for</span> <span class="br0">&#40;</span>i <span class="sy0">=</span> <span class="nu0">0</span>; i &lt; threads; <span class="sy0">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;pthread_create<span class="br0">&#40;</span><span class="sy0">&amp;</span>t<span class="br0">&#91;</span>i<span class="br0">&#93;</span>, <span class="sy0">&amp;</span>attr, parallel_threadfunc, <span class="br0">&#40;</span><span class="kw4">void</span><span class="sy0">*</span><span class="br0">&#41;</span><span class="sy0">&amp;</span>x<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> &lt;&lt; x &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> n;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> &lt;&lt; <span class="st0">&quot;Enter a number to quite the program:&quot;</span> &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cin</span> &gt;&gt; n;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw2">EXIT_SUCCESS</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/202/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

