<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>DK Development</title>
 <link href="http://dkdevelopment.net/atom.xml" rel="self"/>
 <link href="http://dkdevelopment.net/"/>
 <updated>2013-04-17T21:33:35-07:00</updated>
 <id>http://dkdevelopment.net/</id>
 <author>
   <name>Damian Karzon</name>
   <email>dkarzon@tboda.com</email>
 </author>

 
 <entry>
   <title>DropNet2 - async/await, WinRT and more!</title>
   <link href="http://dkdevelopment.net/2013/03/28/dropnet2/"/>
   <updated>2013-03-28T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2013/03/28/dropnet2</id>
   <content type="html">&lt;p&gt;DropNet has been in NuGet now for 2 years! (As of March 31st). Which means its getting old and some of the methods and technologies it was built off are out of date.&lt;/p&gt;&lt;p&gt;
	Working on my own Windows Phone Dropbox client BoxShot I started running into some limitations of DropNet then finding that DropNet was actually being held back from by RestSharp.
	No offence to John Sheehan or any of the RestSharp contributers, they have built an excellent library which still use for numerous projects.
	However I wanted something more flexible and I wanted to use new technologies such as async/await and support for WinRT (ARM).
&lt;/p&gt;&lt;p&gt;
	So it was time to rewrite DropNet from the ground up using not RestSharp but the new
	&lt;a href='http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient-for-net-framework-and-windows-phone.aspx'&gt;portable HTTP Client&lt;/a&gt; from Microsoft's Base Class Library which now supports Windows Phone (7.5+).
&lt;/p&gt;&lt;p&gt;
	And here it is: &lt;a href='https://github.com/dkarzon/DropNet2'&gt;DropNet2&lt;/a&gt; (I'm not very good at naming things).
	Source is available on Github including a basic Windows Phone 8 sample project (login and folder contents functionality).
&lt;/p&gt;&lt;a href='https://github.com/dkarzon/DropNet2' class='gitforked-button gitforked-forks gitforked-watchers'&gt;Fork&lt;/a&gt;&lt;p&gt;
	&lt;strong&gt;What different about it you say?&lt;/strong&gt; Lets have a look at the code. I kept the API pretty similar to the original.
&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='p'&gt;{&lt;/span&gt;
	&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;client&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;DropNetClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;APIKEY&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;APPSECRET&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
	&lt;span class='n'&gt;client&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;SetUserToken&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;TOKEN&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;SECRET&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

	&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;rootMetaData&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;await&lt;/span&gt; &lt;span class='n'&gt;client&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GetMetaData&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
	&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;myFile&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;await&lt;/span&gt; &lt;span class='n'&gt;client&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GetFile&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/MyFile.txt&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;supported API functions&lt;/h3&gt;&lt;ul&gt;
	&lt;li&gt;oauth/request_token&lt;/li&gt;
	&lt;li&gt;oauth/access_token&lt;/li&gt;
	&lt;li&gt;account/info&lt;/li&gt;
	&lt;li&gt;metadata&lt;/li&gt;
	&lt;li&gt;shares&lt;/li&gt;
	&lt;li&gt;search&lt;/li&gt;
	&lt;li&gt;media&lt;/li&gt;
	&lt;li&gt;files (GetFile and Upload)&lt;/li&gt;
	&lt;li&gt;fileops/delete&lt;/li&gt;
	&lt;li&gt;fileops/copy&lt;/li&gt;
	&lt;li&gt;fileops/move&lt;/li&gt;
	&lt;li&gt;fileops/create_folder&lt;/li&gt;
	&lt;li&gt;thumbnails&lt;/li&gt;
	&lt;li&gt;delta&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;platform support&lt;/h3&gt;&lt;ul&gt;
	&lt;li&gt;.NET 4.5&lt;/li&gt;
	&lt;li&gt;.NET for Windows Store apps (WinRT)&lt;/li&gt;
	&lt;li&gt;Windows Phone 7.5 and higher&lt;/li&gt;
	&lt;li&gt;Silverlight 4 and higher&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;future plans&lt;/h3&gt;&lt;ul&gt;
	&lt;li&gt;Implement remaining API functions&lt;/li&gt;
	&lt;li&gt;Progress feedback on upload and download functions&lt;/li&gt;
	&lt;li&gt;Better error handling&lt;/li&gt;
	&lt;li&gt;Support for Mono&lt;/li&gt;
	&lt;li&gt;Unit Tests&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
	
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>TFS Builds for Octopus Deploys</title>
   <link href="http://dkdevelopment.net/2012/07/15/tfs-builds-for-octopus-deploys/"/>
   <updated>2012-07-15T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2012/07/15/tfs-builds-for-octopus-deploys</id>
   <content type="html">&lt;p&gt;I have been playing around with &lt;a href='http://octopusdeploy.com/'&gt;Octopus Deploy&lt;/a&gt; lately and I have setup our TFS build server to automatically create releases and deploy to a Dev environment.&lt;/p&gt;&lt;p&gt;Here is how you can setup a TFS build server to create NuGet packages ready for deployment through Octopus.
Building off my previous post &lt;a href='/2011/08/19/from-tfs-to-private-nuget/'&gt;TFS to private NuGet.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Lets start with the build script:&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;Project&lt;/span&gt; &lt;span class='na'&gt;ToolsVersion=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;4.0&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;DefaultTargets=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Build&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;xmlns=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;Import&lt;/span&gt; &lt;span class='na'&gt;Project=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class='nt'&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;VersionMajor&amp;gt;&lt;/span&gt;0&lt;span class='nt'&gt;&amp;lt;/VersionMajor&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;VersionMinor&amp;gt;&lt;/span&gt;8&lt;span class='nt'&gt;&amp;lt;/VersionMinor&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;VersionPatch&amp;gt;&lt;/span&gt;1&lt;span class='nt'&gt;&amp;lt;/VersionPatch&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;BuildOutputDirectory&amp;gt;&lt;/span&gt;C:\Builds\Temp\SiriuswareUtil&lt;span class='nt'&gt;&amp;lt;/BuildOutputDirectory&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;

    &lt;span class='nt'&gt;&amp;lt;Target&lt;/span&gt; &lt;span class='na'&gt;Name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Build&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;MSBuild&lt;/span&gt; &lt;span class='na'&gt;Projects=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;SiriuswareUtil/SiriuswareUtil.csproj&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;Targets=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Build&amp;quot;&lt;/span&gt;
			      &lt;span class='na'&gt;Properties=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Configuration=Release;WebProjectOutputDir=$(BuildOutputDirectory);&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;TfsVersion&lt;/span&gt; &lt;span class='na'&gt;TfsLibraryLocation=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0&amp;quot;&lt;/span&gt;
		    &lt;span class='na'&gt;LocalPath=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(MSBuildProjectDirectory)..\&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
			&lt;span class='nt'&gt;&amp;lt;Output&lt;/span&gt; &lt;span class='na'&gt;TaskParameter=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Changeset&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;PropertyName=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;ChangesetNumber&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;/TfsVersion&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;Copy&lt;/span&gt; &lt;span class='na'&gt;SourceFiles=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(BuildOutputDirectory)\SiriuswareUtil.nuspec&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;DestinationFolder=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(BuildOutputDirectory)&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;Exec&lt;/span&gt; &lt;span class='na'&gt;Command=&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;&amp;quot;C:\NuGet\NuGet.exe&amp;quot; pack &amp;quot;$(BuildOutputDirectory)\SiriuswareUtil.nuspec&amp;quot; -OutputDirectory &amp;quot;\\grp-dev02\f$\Websites\Ardent.NuGet\Packages&amp;quot;  -basePath &amp;quot;$(BuildOutputDirectory)&amp;quot; -Version &amp;quot;$(VersionMajor).$(VersionMinor).$(VersionPatch)$(ChangesetNumber)&amp;quot; -NoPackageAnalysis&amp;#39;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;Exec&lt;/span&gt; &lt;span class='na'&gt;Command=&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;&amp;quot;C:\Octopus\Octo.exe&amp;quot; create-release --server=http://octopus.ardentleisure.com/api --project=SiriuswareUtil --deployto=Dev --apikey=YOUR_KEY_HERE&amp;#39;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;/Target&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now lets have a look at what each part does:&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;VersionMajor&amp;gt;&lt;/span&gt;0&lt;span class='nt'&gt;&amp;lt;/VersionMajor&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;VersionMinor&amp;gt;&lt;/span&gt;8&lt;span class='nt'&gt;&amp;lt;/VersionMinor&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;VersionPatch&amp;gt;&lt;/span&gt;1&lt;span class='nt'&gt;&amp;lt;/VersionPatch&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;BuildOutputDirectory&amp;gt;&lt;/span&gt;C:\Builds\Temp\SiriuswareUtil&lt;span class='nt'&gt;&amp;lt;/BuildOutputDirectory&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The PropertyGroup element defines a few variables for later use.
Starting at the top there are 3 properties for the version number, these let us set the version of the package (later on we also append the TFS changeset).
The BuildOutputDirectory is a temporary path to build the project to so we can generate the NuGet package from the output.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;MSBuild&lt;/span&gt; &lt;span class='na'&gt;Projects=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;SiriuswareUtil/SiriuswareUtil.csproj&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;Targets=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Build&amp;quot;&lt;/span&gt;
	&lt;span class='na'&gt;Properties=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Configuration=Release;WebProjectOutputDir=$(BuildOutputDirectory);&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next we need to build the project, this part is pretty straight forward, set the path to the project file and the output directory.
This project is a web project so I'm using the WebProjectOutputDir property on the build which publishs the project to the set path.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;TfsVersion&lt;/span&gt; &lt;span class='na'&gt;TfsLibraryLocation=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0&amp;quot;&lt;/span&gt;
	&lt;span class='na'&gt;LocalPath=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(MSBuildProjectDirectory)..\&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
	&lt;span class='nt'&gt;&amp;lt;Output&lt;/span&gt; &lt;span class='na'&gt;TaskParameter=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Changeset&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;PropertyName=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;ChangesetNumber&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/TfsVersion&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we want to check what the TFS changeset is so we can append it to the package version.
For this we need the &lt;a href='https://github.com/loresoft/msbuildtasks'&gt;MSBuild Community Tasks&lt;/a&gt; with the import at the top of the build script.
This function takes a few parameters such as the TFS binary location and outputs to a set variable (in this instance its &quot;ChangesetNumber&quot;).&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;Copy&lt;/span&gt; &lt;span class='na'&gt;SourceFiles=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(BuildOutputDirectory)\SiriuswareUtil.nuspec&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;DestinationFolder=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(BuildOutputDirectory)&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The next element ensures the nuspec file is copied to the output directory, instead of having to include it as content and it getting deployed to our servers.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;Exec&lt;/span&gt; &lt;span class='na'&gt;Command=&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;&amp;quot;C:\NuGet\NuGet.exe&amp;quot; pack &amp;quot;$(BuildOutputDirectory)\SiriuswareUtil.nuspec&amp;quot; -OutputDirectory &amp;quot;\\grp-dev02\f$\Websites\Ardent.NuGet\Packages&amp;quot;  -basePath &amp;quot;$(BuildOutputDirectory)&amp;quot; -Version &amp;quot;$(VersionMajor).$(VersionMinor).$(VersionPatch)$(ChangesetNumber)&amp;quot; -NoPackageAnalysis&amp;#39;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we call the NuGet command line to create the package, pointing it at our nuspec file and setting to the output to where ever out nuget server is.
This is where we also set the version of the package using our set properties and the tfs changeset number (&lt;span style='background-color: whiteSmoke; padding: 3px 5px;'&gt;-Version &quot;$(VersionMajor).$(VersionMinor).$(VersionPatch)$(ChangesetNumber)&quot;&lt;/span&gt;).&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;Exec&lt;/span&gt; &lt;span class='na'&gt;Command=&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;&amp;quot;C:\Octopus\Octo.exe&amp;quot; create-release --server=http://octopus.ardentleisure.com/api --project=SiriuswareUtil --deployto=Dev --apikey=YOUR_KEY_HERE&amp;#39;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lastly we want to use &lt;a href='https://github.com/dkarzon/Octopus-Tools'&gt;Octopus-Tools&lt;/a&gt; octo.exe to create a release in Octopus and schedule a deploy for our Dev environment.
Octo.exe is a command line interface for the octopus server api, we just need to set a few variables for it to use such as the server address, project we want to create the release for and an API key that can be obtained through the web interface.&lt;/p&gt;&lt;p&gt;So the process for code changes is now:&lt;/p&gt;&lt;ul&gt;
	&lt;li&gt;Developer checks in code to TFS&lt;/li&gt;
	&lt;li&gt;CI Build server picks up code change fires off a build of the custom script&lt;/li&gt;
	&lt;li&gt;NuGet package is created in repo&lt;/li&gt;
	&lt;li&gt;New release is created and deployed to Dev environment via Octopus&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;And now I know exactly what code is running on all my servers and can easily deploy new versions.&lt;/p&gt;&lt;img src='/img/posts/OctopusDash.png' alt='Octopus Dash' /&gt;</content>
 </entry>
 
 <entry>
   <title>YeahToast -  WinJS Toast Library</title>
   <link href="http://dkdevelopment.net/2012/07/11/yeahtoast-winjs-toast-library/"/>
   <updated>2012-07-11T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2012/07/11/yeahtoast-winjs-toast-library</id>
   <content type="html">&lt;p&gt;Windows 8 Toast notifications with WinJS isnt the easiest thing to do.
First you have to figure out what template you want, then get the XML from the template manager, then modifying the XML with the image url, title and description.
Then finally creating a toast notifier to parse the XML into a toast notification.&lt;/p&gt;&lt;p&gt;I wanted an easier solution to add Toasts to WinJS apps, something closer to the javascript alert function: &lt;span style='background-color: whiteSmoke; padding: 3px 5px;'&gt;alert(&quot;Message does here!&quot;);&lt;/span&gt;
So we started the YeahToast library, a WinJS library for easily adding toast notifications to Windows 8 applications.&lt;/p&gt;&lt;p&gt;YeahToast can automatically determine the template to use if you dont specifically set one, it does this based on the other options you give it.
If there is an image set it will use a template with an image. If you set both text contents it will use a template with a 2 content lines.
If you just set the title it will use the template with just the title.&lt;/p&gt;&lt;h3&gt;Basic usage:&lt;/h3&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;YeahToast&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;show&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='n'&gt;title&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;YEAHTOAST!&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='n'&gt;YeahToast&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;show&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='n'&gt;title&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;YEAHTOAST!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;textContent&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;message does here&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='n'&gt;YeahToast&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;show&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='n'&gt;title&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;YEAHTOAST!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;textContent&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;message does here&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;textContent2&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;message line 2&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='n'&gt;YeahToast&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;show&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='n'&gt;imgsrc&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;images/placeholder.png&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;title&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;This one has an image!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;textContent&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;something something&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Options:&lt;/h3&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='p'&gt;{&lt;/span&gt;
	&lt;span class='n'&gt;template&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;//Windows.UI.Notifications.ToastTemplateType to define the toast template if not set YeahToast will guess based on other parameters&lt;/span&gt;
	&lt;span class='n'&gt;imgsrc&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;//Image url to appear on toast&lt;/span&gt;
	&lt;span class='n'&gt;title&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;//The toasts header text&lt;/span&gt;
	&lt;span class='n'&gt;textContent&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;//Toast description line 1&lt;/span&gt;
	&lt;span class='n'&gt;textContent2&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;//Toast description line 2&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Where to get it&lt;/h3&gt;&lt;div class='nuget-badge'&gt;
    &lt;p&gt;
		&lt;code&gt;PM&amp;gt; Install-Package YeahToast&lt;/code&gt;
	&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Or download the js file directly from Github (&lt;a href='https://github.com/Tboda/YeahToast/blob/master/lib/YeahToast.js'&gt;https://github.com/Tboda/YeahToast/blob/master/lib/YeahToast.js&lt;/a&gt;)&lt;/p&gt;&lt;h3&gt;What they look like:&lt;/h3&gt;&lt;img src='/img/yeahtoast1.png' /&gt;&lt;img src='/img/yeahtoast2.png' /&gt;&lt;p&gt;The source for YeahToast is available on github to add the your project. There is also an example project to show basic usage.&lt;/p&gt;&lt;a href='https://github.com/Tboda/YeahToast' class='gitforked-button gitforked-forks gitforked-watchers'&gt;Fork&lt;/a&gt;</content>
 </entry>
 
 <entry>
   <title>Post JSON data to web services in Windows 8</title>
   <link href="http://dkdevelopment.net/2012/04/27/post-json-data-to-web-services-in-windows-8/"/>
   <updated>2012-04-27T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2012/04/27/post-json-data-to-web-services-in-windows-8</id>
   <content type="html">&lt;p&gt;I have started working on a few metro style apps on Windows 8 using WinJS so I thought I might show some of my findings.&lt;/p&gt;&lt;p&gt;Using the WinJS.xhr function. (&lt;a href='http://msdn.microsoft.com/en-us/library/windows/apps/br229787.aspx'&gt;MSDN on WinJS.xhr&lt;/a&gt;)&lt;/p&gt;&lt;h4&gt;Lets have a look at a basic basic example: (GET)&lt;/h4&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='nx'&gt;WinJS&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;xhr&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='nx'&gt;url&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;http://example.com/api/test&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function takes an options object as a parameter. The url property is the only required option for this function, this sets the url for the request.&lt;/p&gt;&lt;h4&gt;A more advanced example: (POST)&lt;/h4&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='nx'&gt;WinJS&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;xhr&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
            &lt;span class='nx'&gt;type&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;post&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='nx'&gt;url&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;http://example.com/api/test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='nx'&gt;headers&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Content-type&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;},&lt;/span&gt;
            &lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='nx'&gt;JSON&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;stringify&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='nx'&gt;someProperty&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;DK&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;})&lt;/span&gt;
        &lt;span class='p'&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5&gt;Looking at the example above we have set a few other options here:&lt;/h5&gt;&lt;ul style='font-size: 16px;'&gt;
    &lt;li&gt;&lt;strong&gt;type&lt;/strong&gt; - this is the HTTP method used for the request (get, post, head, etc.)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;data&lt;/strong&gt; - this is the actual data I want to send through with the request&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;headers&lt;/strong&gt; - this lets us set specific headers on the http request (&lt;u&gt;NOTE: If your sending JSON make sure you set the content-type here!&lt;/u&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Now if we wanted to add handlers for success and error we can do this using the Promise.done method (&lt;a href='http://msdn.microsoft.com/en-us/library/windows/apps/hh701079.aspx'&gt;MSDN on Promise.done&lt;/a&gt;)&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='nx'&gt;WinJS&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;xhr&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
            &lt;span class='nx'&gt;type&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;post&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='nx'&gt;url&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;http://example.com/api/test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='nx'&gt;headers&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Content-type&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;},&lt;/span&gt;
            &lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='nx'&gt;JSON&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;stringify&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='nx'&gt;someProperty&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;DK&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;})&lt;/span&gt;
        &lt;span class='p'&gt;}).&lt;/span&gt;&lt;span class='nx'&gt;done&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;onSuccess&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;onError&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;onProgress&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5&gt;There you go, thats using WinJS to post JSON data to web services.&lt;/h5&gt;</content>
 </entry>
 
 <entry>
   <title>Installing ASP.NET MVC3 after VS11 Beta (error)</title>
   <link href="http://dkdevelopment.net/2012/04/16/installing-mvc3-after-vs11beta/"/>
   <updated>2012-04-16T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2012/04/16/installing-mvc3-after-vs11beta</id>
   <content type="html">&lt;p&gt;
	I have been playing around with Windows 8 lately, Installed it on my desktop got pretty excited about metro apps so I installed the Visual Studio 11 Beta as well.
	Then I had to do some work from home so I installed Visual Studio 2010, fired up the our solution only to find out I need MVC3 installed.
&lt;/p&gt;&lt;p&gt;
	OK, run the installer - &lt;strong&gt;Error.&lt;/strong&gt;&lt;br /&gt;
	I tried both install types, Web and Full download and again - &lt;strong&gt;Error.&lt;/strong&gt;&lt;br /&gt;
	Checked the logs and found this: 
&lt;/p&gt;&lt;img src='/img/posts/mvc3insalllog.png' /&gt;&lt;p&gt;
	&lt;strong style='background-color:rgb(255, 208, 208)'&gt;
		Returning IDOK. INSTALLMESSAGE_ERROR [A later version of NuGet is already installed. Setup will now exit.]&lt;br /&gt;
		PerformOperation returned 1603 (translates to HRESULT = 0x80070643)
	&lt;/strong&gt;
&lt;/p&gt;&lt;p&gt;
	Turns out the MVC3 installer is trying to install a version of NuGet that is older than the version that VS11 Beta installs so it fails causing the entire install to fail.
&lt;/p&gt;&lt;h2&gt;Work around&lt;/h2&gt;&lt;p&gt;
	This is what I did to fix it. (&lt;em&gt;Note: this might not work for everyone&lt;/em&gt;)
&lt;/p&gt;&lt;ol style='font-size: 18px;'&gt;
	&lt;li&gt;Run the install (even though it fails) but leave it open on the screen at the end that says &quot;Installation Did Not Succeed&quot; (This is very important!)&lt;/li&gt;
	&lt;li&gt;Now you need to track down the temp files for the installer it should be in a folder D:/Temp/ext27692 (I think this goes onto whatever drive has the most free space)&lt;/li&gt;
	&lt;li&gt;Make a copy of this entire folder because finishing the installer will delete it.&lt;/li&gt;
	&lt;li&gt;Now that you have all the install files you just need to run the installers for the different components (to double check what they were you can open the log from the installer and see which msi's it ran)&lt;/li&gt;
	&lt;li&gt;So install AspNetWebPagesVS2010Tools.msi then AspNetMVC3VS2010Tools.msi&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;
	&lt;strong style='font-size: 18px;'&gt;And thats it, ASP.NET MVC3 tools are now installed!&lt;/strong&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Potential employee Y U NO GITHUB</title>
   <link href="http://dkdevelopment.net/2012/03/12/potential-employee-y-u-no-github/"/>
   <updated>2012-03-12T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2012/03/12/potential-employee-y-u-no-github</id>
   <content type="html">&lt;p&gt;In the last few years I have started to become more and more public with my side projects, some of them have even become quite popular.&lt;/p&gt;&lt;p&gt;I'd like to think I have a decent online presence for a .NET Developer, my Github Account has 5 original public repos, I have this blog that gets over 100 hits per day, I even have a few apps in the Windows Phone Marketplace to my name.&lt;/p&gt;&lt;p&gt;So the past month or so we have been on the hunt for a new Software Developer at Ardent Leisure to expand our small team. We put an ad out on seek and got about 40 applications.
40 Seems pretty good and a lot of the resumes showed a lot of potential for the job with work experience and education.
Thats all well and good on paper but we wanted to see proof that they do infact have the skills they claim to. So, to Google!&lt;/p&gt;&lt;p&gt;I guess I may have just had high expectations after looking at the online presence of some of my developer friends who I have worked with.&lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;Tim Holman: &lt;a href='http://tholman.com/'&gt;Blog&lt;/a&gt; &amp;#45; &lt;a href='https://github.com/tholman'&gt;Github&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Luke Lowrey: &lt;a href='http://lukencode.com/'&gt;Blog&lt;/a&gt; &amp;#45; &lt;a href='https://github.com/lukencode'&gt;Github&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Benjii Cull: &lt;a href='http://benjii.me/'&gt;Blog&lt;/a&gt; &amp;#45; &lt;a href='https://github.com/bjcull'&gt;Github&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Anthony Zigenbine: &lt;a href='http://anthonyvscode.com/'&gt;Blog&lt;/a&gt; &amp;#45; &lt;a href='https://github.com/anthonyvscode'&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Lets get back to our 40 applications, I did a fair bit of research on these before compiling a 'short-list' and this is what I found:&lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;LinkedIn - 14&lt;/li&gt;
    &lt;li&gt;Twitter - 2&lt;/li&gt;
    &lt;li&gt;Github - 0&lt;/li&gt;
    &lt;li&gt;Website of some sort - 1&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Now I know just having a Github account doesn't make you an excellent developer.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;However it does help to get you noticed by potential employers if you have more to show off that is publicly accessible. This also includes anything you have previously worked on in the past.
For example I have a portfolio section on my CV which includes among other things this blog and &lt;a href='http://gigpig.fm'&gt;gigpig.fm&lt;/a&gt; which even though they aren't hugely popular they are still a good example of some of the work I have previously done.&lt;/p&gt;&lt;p&gt;To me I see my resume itself as a formality rather than something to actually gauge my skillset off.&lt;/p&gt;&lt;p&gt;So how do you show off your skills when applying for a job? Do you rely on an impressive resume? Do you have an online presence ready for employers? Do you try for both?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DroppedBoxx is now Open Source!</title>
   <link href="http://dkdevelopment.net/2012/02/21/droppedboxx-is-now-open-source/"/>
   <updated>2012-02-21T00:00:00-08:00</updated>
   <id>http://dkdevelopment.net/2012/02/21/droppedboxx-is-now-open-source</id>
   <content type="html">&lt;p&gt;Back in 2010 I started a project for uni called DroppedBoxx, it was a dropbox client for Windows Mobile 6.5. &lt;/p&gt;&lt;p&gt;This app got me starting to develop mobile apps and sparked my interest for working with web APIs (especially Dropbox as it spawned the DropNet library). It began as a free download during its beta period to get feedback for it while I was developing it for uni and later was sold for about $1 on various stores but it is no longer available and since I no longer have a Windows Mobile 6.5 device I lost interest.&lt;/p&gt;&lt;p&gt;No updates for almost a year :(&lt;/p&gt;&lt;p&gt;So I have now decided to open source it!&lt;/p&gt;&lt;img src='/img/posts/droppedboxxrepo.png' style='float: left; margin-right: 12px;' /&gt;&lt;p&gt;I have put the source up on Github for anyone to fork, as well as the latest .cab installer. &lt;a href='https://github.com/dkarzon/DroppedBoxx'&gt;https://github.com/dkarzon/DroppedBoxx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The source code is actually made up of a few different components. &lt;/p&gt;&lt;p&gt;I must give credit to &lt;a href='http://fluid.codeplex.com/'&gt;Fluid .NET controls&lt;/a&gt;, DroppedBoxx has a slightly customised version of the library in it.&lt;/p&gt;&lt;p&gt;I should also give credit to &lt;a href='http://restsharp.org/'&gt;RestSharp&lt;/a&gt; for which a lot of the http request handling was based off (modified to work with .NET Compact Framework)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href='https://github.com/dkarzon/DroppedBoxx' class='gitforked-button gitforked-forks gitforked-watchers'&gt;Fork&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>JabbrPhone: It's like JabbR on your Phone</title>
   <link href="http://dkdevelopment.net/2012/01/23/jabbrphone-its-like-jabbr-on-your-phone/"/>
   <updated>2012-01-23T00:00:00-08:00</updated>
   <id>http://dkdevelopment.net/2012/01/23/jabbrphone-its-like-jabbr-on-your-phone</id>
   <content type="html">&lt;p&gt;I like development, working with new technologies and Windows Phone and over the
  past few weeks I have been working on a project that combines all of these. I call it
  JabbrPhone, its a Windows Phone client for Jabbr (the signalR based developer chat
  site).&lt;/p&gt;&lt;p&gt;So why did I want to make a phone app for JabbR? Well simply, for fun and to try
  something new that I haven't done before (in this instance its signalR).&lt;/p&gt;&lt;p&gt;For those who don't know what signalR is:&lt;/p&gt;&lt;blockquote&gt;
    &lt;p&gt;&lt;em&gt;Async signaling library for .NET to help build real-time, multi-user
    interactive web applications.&lt;/em&gt;&lt;/p&gt;
  &lt;/blockquote&gt;&lt;p&gt;It really is an awesome library. The JabbR project is also based on this and open
  sourced on Github which was great for me to get started.&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2012/01/image.png'&gt;&lt;img title='image' src='http://dkdevelopment.net/wp-content/uploads/2012/01/image_thumb.png' border='0' height='500' alt='image' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='263' /&gt;&lt;/a&gt; &lt;a href='http://dkdevelopment.net/wp-content/uploads/2012/01/image1.png'&gt;&lt;img title='image' src='http://dkdevelopment.net/wp-content/uploads/2012/01/image_thumb1.png' border='0' height='500' alt='image' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='262' /&gt;&lt;/a&gt; &lt;a href='http://dkdevelopment.net/wp-content/uploads/2012/01/image2.png'&gt;&lt;img title='image' src='http://dkdevelopment.net/wp-content/uploads/2012/01/image_thumb2.png' border='0' height='500' alt='image' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='262' /&gt;&lt;/a&gt; &lt;a href='http://dkdevelopment.net/wp-content/uploads/2012/01/image3.png'&gt;&lt;img title='image' src='http://dkdevelopment.net/wp-content/uploads/2012/01/image_thumb3.png' border='0' height='500' alt='image' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='262' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The app isn't too far off at the moment, still a bit to do before its officially
  released. Current functionality:&lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;Login/Create user (/nick)&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;List rooms&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;Join a room&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;send messages to a room (and get responses)&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;List users in a room&lt;/font&gt;&lt;/li&gt;
  &lt;/ul&gt;&lt;p&gt;Things left to do:&lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;Lobby functions&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;User Actions&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;Handle links in messages better&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font color='#333333'&gt;support for private rooms&lt;/font&gt;&lt;/li&gt;
  &lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The source is available on github: &lt;a href='https://github.com/dkarzon/JabbrPhone'&gt;https://github.com/dkarzon/JabbrPhone&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or download the xap from here: &lt;a href='http://bit.ly/zTsCpu' title='http://bit.ly/zTsCpu '&gt;http://bit.ly/zTsCpu&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>abSee 'ay be see' - A/B Test library</title>
   <link href="http://dkdevelopment.net/2011/12/13/absee-ay-be-see-ab-test-library/"/>
   <updated>2011-12-13T00:00:00-08:00</updated>
   <id>http://dkdevelopment.net/2011/12/13/absee-ay-be-see-ab-test-library</id>
   <content type="html">&lt;p&gt;I have often wondered “What if” when it comes design aspects of a website.&lt;/p&gt;&lt;ul&gt;
	&lt;li&gt;What if this button was green instead of blue? &lt;/li&gt;
	&lt;li&gt;What if I call it an upgrade instead of a purchase? &lt;/li&gt;
	&lt;li&gt;What if the background wasn’t as dark? &lt;/li&gt;
	&lt;li&gt;What if I make that notification flashing red instead of dark yellow? &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You get the point…&lt;/p&gt;&lt;p&gt;Its usage is simple enough also:&lt;/p&gt;&lt;p&gt;Firstly fire up an instance of the Tester, do so by calling the Start function. Or you could filter out certain users here to only show tests for them. (non-Admins etc.)&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;Application_BeginRequest&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;ABTester&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Start&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From there we can fire off tests to the User where ever we like by calling the Test function. Now to make a test we need to give it a name, this will be used to identify what we are testing in this specific instance. Then you give the function the different options and it will randomly select 1 for you as the output and save the result.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;output&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;ABTester&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Test&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;MyTest1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;B&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After running the test we then need to let the Tester know if it was successful or not so we can track conversions of the different options. We do this by calling the Convert function with the test name from the test we ran before. abSee will then store that result for us as converted.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;ABTester&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Convert&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;MyTest1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So now we are running tests, how do I see the results?&lt;/p&gt;&lt;p&gt;You can get results for a given test using the GetResults function, this function returns a list of ABSeeResult which contains a few details about the test instance as well as the option that was selected and if it was converted or not.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;results&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;abSee&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ABTester&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GetResults&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;MyTest1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;More detailed documentation is coming soon with details on implementing custom storage and user identification.&lt;/p&gt;&lt;p&gt;Feel free to leave me some feedback about abSee or even fork it on &lt;a href='https://github.com/Tboda/abSee'&gt;Github&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>BoxShot v2.0: Mango, Logo, Pictures hub and more</title>
   <link href="http://dkdevelopment.net/2011/11/23/boxshot-v2-0-mango-logo-pictures-hub-and-more/"/>
   <updated>2011-11-23T00:00:00-08:00</updated>
   <id>http://dkdevelopment.net/2011/11/23/boxshot-v2-0-mango-logo-pictures-hub-and-more</id>
   <content type="html">&lt;p&gt;So I got a fair bit of feedback from the old BoxShot logo and how most of my users
disliked it (some even called it offensive). Now that I&amp;acirc;&amp;euro;&amp;trade;ve had my
fun I decided to put together a serious update for the app, here is what this new
update (that I am calling v2.0) includes:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/11/Icon173.png'&gt;&lt;img title='Icon173' src='http://dkdevelopment.net/wp-content/uploads/2011/11/Icon173_thumb.png' border='0' align='left' height='177' alt='Icon173' style='background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='177' /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;NEW LOGO!&lt;/h3&gt;&lt;p&gt;As mentioned before I have changed the logo, this gives the app a more professional
look and fits in much better with the Metro UI of Windows Phone. Hope you all like
it.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;Its now Mango...&lt;/h3&gt;&lt;p&gt;This version is build for Mango so it takes advantage of fast app switching and
general Mango goodness.&lt;/p&gt;&lt;h3&gt;Picture Hub Integration&lt;/h3&gt;&lt;p&gt;BoxShot now integrates into the Pictures Hub, so you can share your photos through
BoxShot to your dropbox folder.&lt;/p&gt;&lt;h3&gt;New Dropbox API&lt;/h3&gt;&lt;p&gt;Dropbox have recently updated their API to be more secure. For a user this pretty
much means the login process has changed, so now instead of giving the app the Email
and Password you login to the dropbox mobile site and give permission to
BoxShot.&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/11/Tile-Copy.png'&gt;&lt;img title='Tile - Copy' src='http://dkdevelopment.net/wp-content/uploads/2011/11/Tile-Copy_thumb.png' border='0' align='right' height='177' alt='Tile - Copy' style='background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='177' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Background Live Tile&lt;/h3&gt;&lt;p&gt;The Live Tiles are now generated on the phone itself with a background agent, this
makes them much more stable.&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/11/EmulatorContentsWhite.png'&gt;&lt;img title='EmulatorContentsWhite' src='http://dkdevelopment.net/wp-content/uploads/2011/11/EmulatorContentsWhite_thumb.png' border='0' align='left' height='390' alt='EmulatorContentsWhite' style='background-image: none; border-right-width: 0px; margin: 0px 15px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='215' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Referrals&lt;/h3&gt;&lt;p&gt;BoxShot now lets you send out referral links to email or social networks so you can
get that extra free space!&lt;/p&gt;&lt;h3&gt;Others?&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Some UI fixes (better following the metro style guide)&lt;/li&gt;

&lt;li&gt;Few bug fixes (to do with ads and the tile colour picker)&lt;/li&gt;

&lt;li&gt;Picture view now rotates and can pinch to zoom&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Download it now from the Windows Phone Marketplace!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ad-Free Version:&lt;/p&gt;&lt;p&gt;&lt;a href='http://www.windowsphone.com/en-AU/apps/1abb6e8c-d1ca-4209-a7b8-c2d657ffc9b4'&gt;&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/02/wp7_English_480x80_blue_thumb.png' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Free&lt;/strong&gt; Version:&lt;/p&gt;&lt;p&gt;&lt;a href='http://windowsphone.com/s?appid=0be109c4-08be-4ac3-a96b-70ef2b0580e3'&gt;&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/02/wp7_English_480x80_blue_thumb.png' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style='clear: both' /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Future Versions&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I'm always open to feedback about what new features users would
like to see but heres a list of whats on the roadmap.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Pin Folders to start screen (maybe files as well)&lt;/li&gt;

&lt;li&gt;Thumbnails for pictures&lt;/li&gt;

&lt;li&gt;Fix bug when uploading files with international characters&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;&lt;font color='#FF0000'&gt;Update:&lt;/font&gt;&lt;/h3&gt;&lt;p&gt;All of the above features have now been implemented in v2.2 (Thumbnails and
international characters fixed in v2.1)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>PurpleSmoke: Ecommerce for SkyPoint</title>
   <link href="http://dkdevelopment.net/2011/09/15/purplesmoke-ecommerce-for-skypoint/"/>
   <updated>2011-09-15T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/09/15/purplesmoke-ecommerce-for-skypoint</id>
   <content type="html">&lt;p&gt;So in my day job I work for a company called Ardent Leisure, and lately I have been
working on a massive project to build an integrated ecommerce engine for SkyPoint,
Dreamworld and WhiteWater World. I thought I might take some time to talk about the
technologies used here, being a .NET developer I kept pretty close to the Microsoft
Stack, with a few open source libraries in the mix.&lt;/p&gt;&lt;table cellspacing='0' border='0' cellpadding='2'&gt;
&lt;tbody&gt;
    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;framework&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://en.wikipedia.org/wiki/ASP.NET' target='_blank'&gt;Microsoft ASP.NET&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;language&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://en.wikipedia.org/wiki/C_Sharp_(programming_language)' target='_blank'&gt;C#&lt;/a&gt; (&lt;a href='http://www.microsoft.com/net/' target='_blank'&gt;.NET
    v4.0&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;development environment&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://msdn.microsoft.com/en-us/vstudio/default.aspx' target='_blank'&gt;Visual
    Studio 2010&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;web frameworks&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://www.asp.net/mvc' target='_blank'&gt;ASP.NET MVC3&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;client side framework&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://jquery.com/' target='_blank'&gt;JQuery&lt;/a&gt; (+ &lt;a href='http://jqueryui.com/' target='_blank'&gt;UI&lt;/a&gt; and
    &lt;a href='http://api.jquery.com/tmpl/' target='_blank'&gt;tmpl&lt;/a&gt;)&lt;br /&gt;
    &lt;a href='http://knockoutjs.com/' target='_blank'&gt;Knockout&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;web service layer&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://msdn.microsoft.com/en-us/netframework/aa663324' target='_blank'&gt;Windows
    Communication Framework&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;database&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://msdn.microsoft.com/en-us/sqlserver/default.aspx' target='_blank'&gt;SQL
    Server 2008 R2&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;data access layer&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://msdn.microsoft.com/en-us/library/bb425822.aspx' target='_blank'&gt;LINQ to
    SQL&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
    &lt;td valign='top' width='200'&gt;source control&lt;/td&gt;

    &lt;td valign='top' width='200'&gt;&lt;a href='http://msdn.microsoft.com/en-us/vstudio/ff637362' target='_blank'&gt;Team
    Foundation Server 2010&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;3rd Party Tools:&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href='http://restsharp.org/' target='_blank'&gt;RestSharp&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://james.newtonking.com/pages/json-net.aspx' target='_blank'&gt;Newtonsoft JSON.NET&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://code.google.com/p/mvc-mini-profiler/' target='_blank'&gt;MvcMiniProfiler&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://code.google.com/p/dapper-dot-net/' target='_blank'&gt;Dapper.Net&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/jetheredge/SquishIt' target='_blank'&gt;SquishIt&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/lukencode/FluentEmail' target='_blank'&gt;FluentEmail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;Winning Combinations:&lt;/h3&gt;&lt;p&gt;For me their are a few winning combinations here:&lt;/p&gt;&lt;h4&gt;1. RestSharp + Newtonsoft JSON.NET + WCF.&lt;/h4&gt;&lt;p&gt;Now my love for RestSharp has been &lt;a href='http://dkdevelopment.net/tag/restsharp/' target='_blank'&gt;widely documented&lt;/a&gt; but I cant say it enough, this is an awesome
library and using it with a WCF web service was great. However this combination is not
without its flaws, mianly DateTimes in WCF. But I was able to get around this
&amp;acirc;&amp;euro;&amp;oelig;Feature&amp;acirc;&amp;euro; by creating my own &lt;a href='https://gist.github.com/1052894' target='_blank'&gt;WCFDate&lt;/a&gt; Class which serialises to
and from a formatted string. This was quite a hack but its working pretty well for us
at the moment.&lt;/p&gt;&lt;h4&gt;2. Knockout + Jquery + tmpl.&lt;/h4&gt;&lt;p&gt;This was the first project that I have actually used Knockout for and it did take
some time to get up to speed on how it all works together but now I couldn't imagine
doing this project without it. It gave us the flexibility we needed to display the data
we needed where ever we wanted.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;You can find PurpleSmoke lurking among the CMS Pages at &lt;a href='http://www.skypoint.com.au'&gt;www.skypoint.com.au&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>From TFS to Private NuGet</title>
   <link href="http://dkdevelopment.net/2011/08/19/from-tfs-to-private-nuget/"/>
   <updated>2011-08-19T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/08/19/from-tfs-to-private-nuget</id>
   <content type="html">&lt;p&gt;Let me start by saying this: I love NuGet, its straight up awesome!&lt;/p&gt;&lt;p&gt;This post is about how I created a TFS CI Build to create NuGet packages and push them to a private NuGet server hosted on site.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;VersionMajor&amp;gt;&lt;/span&gt;0&lt;span class='nt'&gt;&amp;lt;/VersionMajor&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;VersionMinor&amp;gt;&lt;/span&gt;1&lt;span class='nt'&gt;&amp;lt;/VersionMinor&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I then wanted to include the TFS Changeset number as the 3rd part of the version. So I kicked off a TfsVersion task which outputs the changeset number of a specific path (Set this to the project root to get all changes).&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;TfsVersion&lt;/span&gt;
  &lt;span class='na'&gt;TfsLibraryLocation=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0&amp;quot;&lt;/span&gt;
  &lt;span class='na'&gt;LocalPath=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(MSBuildProjectDirectory)&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
  &lt;span class='nt'&gt;&amp;lt;Output&lt;/span&gt; &lt;span class='na'&gt;TaskParameter=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Changeset&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;PropertyName=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;ChangesetNumber&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/TfsVersion&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From there I build the Project, normally the TFS build outputs the dlls to a binaries folder in the build output folder, but I decided to skip the nuspec file step but pointing NuGet at the project file directly. However you could create a nuspec file and point that to the built dlls, your choice. I also set the version number here for the build.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;MSBuild&lt;/span&gt; &lt;span class='na'&gt;Projects=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;$(MSBuildProjectDirectory)\Ardent.Common\Ardent.Common.csproj&amp;quot;&lt;/span&gt;
    &lt;span class='na'&gt;Targets=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Build&amp;quot;&lt;/span&gt;
    &lt;span class='na'&gt;Properties=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Configuration=Debug;&lt;/span&gt;
&lt;span class='s'&gt;      OutDir=$(MSBuildProjectDirectory)\Ardent.Common\Bin\Debug\;&lt;/span&gt;
&lt;span class='s'&gt;    ApplicationVersion=$(VersionMajor).$(VersionMinor).$(ChangesetNumber)&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So now we have built our project and we have the version we want so lets create the package. Using the Exec function I then run the NuGet.exe pack command on my project file using the –Version flag to set the version of the package. I also cheated a bit here by setting the –OutputDirectory flag and pointing that to the packages folder on the NuGet server I created. This will populate the feed now with the new package.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='nt'&gt;&amp;lt;Exec&lt;/span&gt; &lt;span class='na'&gt;Command=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;C:\NuGet\NuGet.exe pack $(MSBuildProjectDirectory)\Ardent.Common\Ardent.Common.csproj -Version $(VersionMajor).$(VersionMinor).$(ChangesetNumber) -OutputDirectory \\grp-dev02\f$\Websites\Ardent.NuGet\Packages&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&amp;lt;/Exec&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The only thing left to do is create a TFS build definition under that points to my Ardent.CommonBuild.proj file in source control set the definition to CI mode. Done!&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/08/image1.png'&gt;&lt;img title='image' src='http://dkdevelopment.net/wp-content/uploads/2011/08/image_thumb1.png' border='0' height='308' alt='image' style='background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px' width='673' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Now for every check-in to that project in TFS I get a new package created with the updated code then NuGet handles the updates in all of my other projects.&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/08/image2.png'&gt;&lt;img title='image' src='http://dkdevelopment.net/wp-content/uploads/2011/08/image_thumb2.png' border='0' height='438' alt='image' style='background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px' width='776' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Life is good…&lt;/strong&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>BoxShot gets a live tile!</title>
   <link href="http://dkdevelopment.net/2011/08/15/boxshot-gets-a-live-tile/"/>
   <updated>2011-08-15T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/08/15/boxshot-gets-a-live-tile</id>
   <content type="html">&lt;p&gt;Following the recent release of my Windows Phone 7 app &lt;a href='http://dkdevelopment.net/2011/07/23/boxshot-its-like-dropbox-on-your-phone/'&gt;BoxShot&lt;/a&gt;,
I have implemented a live tile displaying your &lt;a href='http://dropbox.com'&gt;dropbox.com&lt;/a&gt; quota info.&lt;/p&gt;&lt;table cellspacing='0' border='0' cellpadding='2' width='400'&gt;
&lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;strong&gt;Boring old tile&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;&lt;strong&gt;Fancy new tile&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;&lt;strong&gt;Another fancy new tile&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
        &lt;td&gt;
			&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/08/Default.png'&gt;
				&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/08/Default_thumb.png' alt='Default' /&gt;
			&lt;/a&gt;
		&lt;/td&gt;
        &lt;td&gt;
			&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/08/Blue.png'&gt;
				&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/08/Blue_thumb.png' alt='Default' /&gt;
			&lt;/a&gt;
		&lt;/td&gt;
        &lt;td&gt;
			&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/08/Pink.png'&gt;
				&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/08/Pink_thumb.png' alt='Default' /&gt;
			&lt;/a&gt;
		&lt;/td&gt;
    &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/08/Screen3.png'&gt;&lt;img title='Screen3' src='http://dkdevelopment.net/wp-content/uploads/2011/08/Screen3_thumb.png' border='0' align='left' height='412' alt='Screen3' style='background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px' width='249' /&gt;&lt;/a&gt;Also, you can customise the colour of the tile from the settings
screen.&lt;/p&gt;&lt;p&gt;Thats pretty much it for now, be sure to leave feedback for any new features you
want!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>BoxShot – Its like Dropbox on your phone…</title>
   <link href="http://dkdevelopment.net/2011/07/23/boxshot-its-like-dropbox-on-your-phone/"/>
   <updated>2011-07-23T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/07/23/boxshot-its-like-dropbox-on-your-phone</id>
   <content type="html">&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/07/BoxShotPanoramaPhone1.png'&gt;&lt;img title='BoxShotPanoramaPhone' src='http://dkdevelopment.net/wp-content/uploads/2011/07/BoxShotPanoramaPhone_thumb1.png' border='0' height='432' alt='BoxShotPanoramaPhone' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='700' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;BoxShot is a dropbox app for Windows Phone 7.&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/07/Screen1.png'&gt;&lt;img title='Screen1' src='http://dkdevelopment.net/wp-content/uploads/2011/07/Screen1_thumb.png' border='0' align='left' height='444' alt='Screen1' style='background-image: none; border-right-width: 0px; margin: 0px 15px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='268' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
	&lt;li&gt;Open files from your Dropbox using their default apps (Office files, PDFs, etc.)&lt;/li&gt;
	&lt;li&gt;View/Edit text files within BoxShot with the built in editor&lt;/li&gt;
	&lt;li&gt;View Image files within BoxShot and save them to your library&lt;/li&gt;
	&lt;li&gt;Copy/Move files or folders within your dropbox folder&lt;/li&gt;
	&lt;li&gt;Delete files or folder from your Dropbox folder&lt;/li&gt;
	&lt;li&gt;Rename files or folders in your Dropbox folder&lt;/li&gt;
	&lt;li&gt;Email a public file link&lt;/li&gt;
	&lt;li&gt;View Account usage information&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/07/Screen2.png'&gt;&lt;img title='Screen2' src='http://dkdevelopment.net/wp-content/uploads/2011/07/Screen2_thumb.png' border='0' align='left' height='444' alt='Screen2' style='background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='268' /&gt;&lt;/a&gt;BoxShot also lets you add your frequently used folder to a
favourites list which are displayed on the main Panorama.&lt;/p&gt;&lt;p&gt;Premium Version:&lt;/p&gt;&lt;p&gt;&lt;a href='http://windowsphone.com/s?appid=0be109c4-08be-4ac3-a96b-70ef2b0580e3'&gt;&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/02/wp7_English_480x80_blue_thumb.png' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Free Version:&lt;/p&gt;&lt;p&gt;&lt;a href='http://windowsphone.com/s?appid=0be109c4-08be-4ac3-a96b-70ef2b0580e3'&gt;&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/02/wp7_English_480x80_blue_thumb.png' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style='clear: both' /&gt;</content>
 </entry>
 
 <entry>
   <title>DateTime + WCF: How I tamed the beast</title>
   <link href="http://dkdevelopment.net/2011/06/29/datetime-wcf-how-i-tamed-the-beast/"/>
   <updated>2011-06-29T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/06/29/datetime-wcf-how-i-tamed-the-beast</id>
   <content type="html">&lt;p&gt;I have been working a bit with WCF lately and like &lt;a href='http://www.google.com.au/search?sourceid=chrome&amp;ie=UTF-8&amp;q=WCF+DateTime+format' target='_blank'&gt;everyone else use Json with WCF&lt;/a&gt; I ran into some issues with DateTime formats. I kept trying to find a valid solution to this where it outputted a readable value.&lt;/p&gt;&lt;p&gt;Eventually I started outputting the DateTime as a formatted string and this worked, but it meant I have to create new string variables in all of my classes instead of the DateTimes that I already had and was using, but then I still needed the variable in its DateTime form.&lt;/p&gt;&lt;p&gt;So I came up with the WCFDate class, at its heart this class outputs a string in a set format, this allows it to be easily read by what ever needs to. I could then replace all of my DateTimes with WCFDate and all was good in the world.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='nn'&gt;System&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='nn'&gt;System.Collections.Generic&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='nn'&gt;System.Linq&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='nn'&gt;System.Text&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='nn'&gt;System.Globalization&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;/// Class to help get around the craziness of WCF DateTime formats (Use this class instead of DateTime for WebService Models)&lt;/span&gt;
&lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;WCFDate&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;DateTimeFormat&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;yyyy-MM-dd hh:mm:ss zz&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// The Date as a formatted string &lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Data&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// Basic constructor (with no value)&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nf'&gt;WCFDate&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// String constructor setting a Formatted string for the DateTime&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;param name=&amp;quot;data&amp;quot;&amp;amp;gt;&amp;amp;lt;/param&amp;amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nf'&gt;WCFDate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;data&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;Data&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;data&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// DateTime constructor, sets the Data to the formatted String from the DateTime&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;param name=&amp;quot;date&amp;quot;&amp;amp;gt;&amp;amp;lt;/param&amp;amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nf'&gt;WCFDate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;DateTime&lt;/span&gt; &lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;Data&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToString&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;DateTimeFormat&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// DateTime constructor, sets the Data to the formatted String from the DateTime&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;param name=&amp;quot;date&amp;quot;&amp;amp;gt;&amp;amp;lt;/param&amp;amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nf'&gt;WCFDate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;DateTime&lt;/span&gt;&lt;span class='p'&gt;?&lt;/span&gt; &lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;HasValue&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;Data&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Value&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToString&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;DateTimeFormat&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// Check if the class is holding a Date or not&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='n'&gt;HasDate&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;get&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;!&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='c1'&gt;/// &amp;amp;lt;summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// Gets the DateTime the class represents&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;/summary&amp;amp;gt;&lt;/span&gt;
    &lt;span class='c1'&gt;/// &amp;amp;lt;returns&amp;amp;gt;&amp;amp;lt;/returns&amp;amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;DateTime&lt;/span&gt; &lt;span class='nf'&gt;GetDate&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;try&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;DateTime&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ParseExact&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;DateTimeFormat&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;CultureInfo&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;CurrentCulture&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;catch&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nf'&gt;DateTime&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href='https://gist.github.com/1052894' target='_blank'&gt;Follow the Gist&lt;/a&gt; of this class or feel free to add to it.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>AppEvents - Do stuff when things happen (WP7)</title>
   <link href="http://dkdevelopment.net/2011/04/29/appevents-do-stuff-when-things-happen-wp7/"/>
   <updated>2011-04-29T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/04/29/appevents-do-stuff-when-things-happen-wp7</id>
   <content type="html">&lt;p&gt;Ever wanted an easy way for apps to track certain events then run code based off what events the user has triggered? Well now you can with AppEvents!&lt;/p&gt;&lt;p&gt;So AppEvents is a Windows Phone 7 library to manage events for a user across multiple sessions. In this example I will use it with CodeTrack to prompt the user to rate the app after they have added 3 repos.&lt;/p&gt;&lt;p&gt;Lets get started, App.xaml.cs (this code can be put anywhere in the app but I felt this was better to be done at the start of the app)&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nf'&gt;App&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='p'&gt;...&lt;/span&gt;
    &lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;New&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
        &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;RuleSet&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;When&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;rate-app&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='n'&gt;el&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;el&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Any&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;e&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;addrepo&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;amp&lt;/span&gt;&lt;span class='p'&gt;;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;amp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Occurrrences&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Count&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Do&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;AskToRate&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt;
        &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now lets break that down, first we have the New() function being called, this creates the instance (and sets the Current singleton in the EventClient class). It also uses the default JsonEventStorageProvider to store the EventStore data, this can be overwritten with a type parameter on the new function:&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;New&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;MyCustomEventStoreage&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now this is where the RuleSets are added to the client using RuleSet.When() The first parameter of this function is a name of the rule. This is mainly to keep track of the rule and make sure we don’t run it twice. The second parameter is a Func&amp;lt;UserEventList, bool&amp;gt; which means we can create lamba expressions to be run against the UserEventList object, this expression tells the RuleSet when it should fire its Do Action.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;    &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;RuleSet&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;When&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;rate-app&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='n'&gt;el&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;el&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Any&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;e&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;addrepo&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;amp&lt;/span&gt;&lt;span class='p'&gt;;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;amp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Occurrrences&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Count&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
        &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Do&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;AskToRate&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt;
    &lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So where do I get it?&lt;/p&gt;&lt;p&gt;The last part to this is firing off the events this part is very simple.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;    &lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Current&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Fire&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;addrepo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And thats pretty much it, the library then does the rest&lt;/p&gt;&lt;p&gt;The library also allows for manual checking of events if for instance you fire an event on a page but want the RuleSet to be executed on a different page. To do this we simply add a false optional parameter to the Fire method to stop it running the RuleSets with the event. We can also manually run rules, either singly by the RuleSet name or all the rules in the list. We can also set the EventClient to not save the EventStore using the provider each time (and just have it saved later for performance).&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Current&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Fire&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;addrepo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Current&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Fire&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;addrepo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Current&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;RunRule&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;rate-app&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Current&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;RunRules&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='n'&gt;EventClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Current&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;SaveEventStore&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;So where do I get it?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The project if on GitHub for your forking, issues and discussions.&lt;a href='https://github.com/dkarzon/AppEvents' target='_blank'&gt;AppEvents on Github.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Windows Mobile 6: Legacy&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I have also made a Windows Mobile 6 version of this library but haven't actively tested it too much, if you feel like giving it a go be sure to let me know how you go.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dropbox on Windows Phone 7 with DropNet</title>
   <link href="http://dkdevelopment.net/2011/04/01/dropbox-on-windows-phone-7-with-dropnet/"/>
   <updated>2011-04-01T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/04/01/dropbox-on-windows-phone-7-with-dropnet</id>
   <content type="html">&lt;p&gt;So I have been working on an open source Dropbox client library for a while now called DropNet. I have recently put this project into NuGet so its super easy to add Dropbox support to your Windows Phone 7 apps.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The source for this sample project is available here: &lt;a href='https://github.com/dkarzon/DropNet/tree/master/DropNet.Samples/DropNet.Samples.WP7'&gt;https://github.com/dkarzon/DropNet/tree/master/DropNet.Samples/DropNet.Samples.WP7&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’ll start with a File -&amp;gt; New Project, creating a sample Windows Phone Application.&lt;/p&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/04/FileNew2.png'&gt;&lt;img title='FileNew2' src='http://dkdevelopment.net/wp-content/uploads/2011/04/FileNew2_thumb.png' border='0' height='503' alt='FileNew2' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='725' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;First thing to do is install the DropNet package, NuGet will automatically detect the type of project you are using and add the DropNet reference for that project type (eg. DropNet.WindowsPhone for Windows Phone 7 projects.)&lt;/p&gt;&lt;p&gt;Ok, now we can start with the App, for starters I created a global variable for my DropNetClient instance.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;GlobalClient&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;DropNetClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;API KEY&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;API SECRET&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now from that we will need to let the user login so my main page has a basic login form, 2 textboxes for Email and Password and a button to make it work.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;Login_Click&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;object&lt;/span&gt; &lt;span class='n'&gt;sender&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;RoutedEventArgs&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//try login&lt;/span&gt;
    &lt;span class='n'&gt;App&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GlobalClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;LoginAsync&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Email&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Password&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt; &lt;span class='p'&gt;!=&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='c1'&gt;//DropNet automatically sets the result token inside the client&lt;/span&gt;
                &lt;span class='n'&gt;NavigationService&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Navigate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;Uri&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/FilesPage.xaml&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;UriKind&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Relative&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
            &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DropNets Login function automatically saves the user Token and Secret to its client instance so we dont have to set it. Then I just navigate to a new page where we will attempt to browse our Dropbox Folder.&lt;/p&gt;&lt;p&gt;This page has a basic view model with 1 property for the folders content.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='n'&gt;ObservableCollection&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;MetaData&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;_contents&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;ObservableCollection&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;MetaData&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;Contents&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;get&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;_contents&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;set&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;_contents&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;value&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='n'&gt;NotifyPropertyChanged&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Contents&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pretty easy, the page itself simply binds this collection to a listbox displaying the Name and an icon if its a folder.&lt;/p&gt;&lt;p&gt;Ok, now to actually get the data from Dropbox… We do this by calling our DropNetClient’s GetMetaDataAsync method. This method takes a path parameter so we can tell it which folder to get the metadata for.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;App&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GlobalClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GetMetaDataAsync&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;foreach&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Contents&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;OrderBy&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='n'&gt;OrderByDescending&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Is_Dir&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;_model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Contents&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/04/Browse1.png'&gt;&lt;img src='http://dkdevelopment.net/wp-content/uploads/2011/04/Browse1_thumb.png' border='0' height='459' alt='Browse1' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px' width='254' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;After getting the MetaData I then order it, folders first then alphabetically.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;font size='3'&gt;Wait, really? Thats it?&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Yep!&lt;/strong&gt; Thats my Dropbox folder.&lt;/p&gt;&lt;p&gt;Now to make it even better we can handle the listbox’s selection change event and if the selected item was a folder we can show its contents.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;ListBox_SelectionChanged&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;object&lt;/span&gt; &lt;span class='n'&gt;sender&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;System&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Windows&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Controls&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;SelectionChangedEventArgs&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddedItems&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Count&lt;/span&gt; &lt;span class='p'&gt;&amp;gt;&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;selected&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddedItems&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='k'&gt;as&lt;/span&gt; &lt;span class='n'&gt;MetaData&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

        &lt;span class='c1'&gt;//if its a folder browse to it&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;selected&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Is_Dir&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;_model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Contents&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;ObservableCollection&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;MetaData&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;();&lt;/span&gt;
            &lt;span class='n'&gt;App&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GlobalClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GetMetaDataAsync&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;selected&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Path&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='k'&gt;foreach&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Contents&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;OrderBy&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='n'&gt;OrderByDescending&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Is_Dir&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                &lt;span class='p'&gt;{&lt;/span&gt;
                    &lt;span class='n'&gt;_model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Contents&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
                &lt;span class='p'&gt;}&lt;/span&gt;
            &lt;span class='p'&gt;});&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p /&gt;&lt;p&gt;There we go, thats the basis for a Dropbox app using DropNet, lets see what we can come up with!&lt;/p&gt;&lt;p&gt;DropNet Implements most of the API’s functions, including :&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Uploading files &lt;/li&gt;
  &lt;li&gt;Downloading files &lt;/li&gt;
  &lt;li&gt;Creating folders &lt;/li&gt;
  &lt;li&gt;Creating an account &lt;/li&gt;
  &lt;li&gt;Getting account info &lt;/li&gt;
  &lt;li&gt;Deleting files/folders &lt;/li&gt;
  &lt;li&gt;Data usage counter &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I’m always updating the project over at GitHub, drop by and let me know what you think or if you have any feature requests/bugs. &lt;a href='https://github.com/dkarzon/DropNet' target='_blank'&gt;GitHub Project.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or check out the &lt;a href='http://nuget.org/List/Packages/DropNet' target='_blank'&gt;NuGet Package here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;
	&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/04/Browse3.png'&gt;&lt;img title='Browse3' src='http://dkdevelopment.net/wp-content/uploads/2011/04/Browse3_thumb.png' border='0' align='left' height='459' alt='Browse3' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px' width='254' /&gt;&lt;/a&gt;
	&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/04/Browse2.png'&gt;&lt;img title='Browse2' src='http://dkdevelopment.net/wp-content/uploads/2011/04/Browse2_thumb.png' border='0' align='right' height='459' alt='Browse2' style='background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px; padding-top: 0px' width='254' /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;div style='clear: both' /&gt;</content>
 </entry>
 
 <entry>
   <title>BitBucket API from Windows Phone 7 and C#</title>
   <link href="http://dkdevelopment.net/2011/03/26/bitbucket-api-from-windows-phone-7-and-c/"/>
   <updated>2011-03-26T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2011/03/26/bitbucket-api-from-windows-phone-7-and-c</id>
   <content type="html">&lt;p&gt;With my latest update of &lt;a href='http://social.zune.net/redirect?type=phoneApp&amp;id=745803a2-7907-e011-9264-00237de2db9e' target='_blank'&gt;CodeTrack&lt;/a&gt; (1.2) I implemented BitBucket as a provider, so you can watch repositories from there now as well. On the app itself there are a few search functions using the BitBucket API, this post will provide some insight and example code for doing this.&lt;/p&gt;&lt;p&gt;So basically I wanted to go from having nothing at all (no BitBucket user, no username, no repo slug/id) to being able to search for repositories by either their name or their owners username.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The BitBucket API has recently changed to allow you to do this by giving the repository responses the Onwer property.&lt;/p&gt;&lt;p&gt;As always, &lt;a href='http://restsharp.org/' target='_blank'&gt;RestSharp&lt;/a&gt; was used in the making of this code sample.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;BitBucketRepoList&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;List&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;BitBucketRepo&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;Repositories&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;BitBucketRepo&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Website&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Slug&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Name&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Owner&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;FollowersCount&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Description&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Searching by Repo Name&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This request is pretty straight forward, RestClient with the base url for the API, RestRequest with the Resource “repositories” then add a get parameter of &quot;name” with the search term. (&lt;a href='http://confluence.atlassian.com/display/BBDEV/Repositories#Repositories-Searching' target='_blank'&gt;API Doco&lt;/a&gt;)&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;_client&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;https://api.bitbucket.org/1.0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestRequest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;repositories/&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;searchTerm&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='n'&gt;_client&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ExecuteAsync&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;BitBucketRepoList&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//Do stuff here with response&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Searching by Repo Owner&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Now for this request, BitBucket API doesnt actually support searching on usernames so these must be exact matches on the username.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;_client&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;https://api.bitbucket.org/1.0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestRequest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;users/{username}&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;username&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlSegment&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='n'&gt;_client&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ExecuteAsync&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;BitBucketRepoList&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;//Do stuff here with response&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p /&gt;&lt;p&gt;And there you have it, BitBucket API from Windows Phone 7. (The above code will also work in Silverlight/WPF as well as Win forms or ASP.NET depending on the version of RestSharp used.)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>CodeTrack–Source control monitor for Windows Phone 7</title>
   <link href="http://dkdevelopment.net/2011/02/08/codetracksource-control-monitor-for-windows-phone-7/"/>
   <updated>2011-02-08T00:00:00-08:00</updated>
   <id>http://dkdevelopment.net/2011/02/08/codetracksource-control-monitor-for-windows-phone-7</id>
   <content type="html">&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2011/02/Home.png'&gt;&lt;img title='Home' src='http://dkdevelopment.net/wp-content/uploads/2011/02/Home_thumb.png' border='0' align='right' height='333' alt='Home' style='background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px' width='200' /&gt;&lt;/a&gt;CodeTrack is a Windows Phone 7 app for monitoring source control
repositories.&lt;/p&gt;&lt;p&gt;Recently I have become more and more active in the open source community, with many
different projects on the go, be it for work or a side project im working on or
something else entirely. So I wanted an application where I could keep up with progress
on these projects as well as others, and this is how the idea of CodeTrack came
about.&lt;/p&gt;&lt;p&gt;CodeTrack has been designed to be as simple as possible. Users add repos, they
appear in their list, commits show up in their feed and they get push notifications
when commits happen.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Current Features:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
	&lt;li&gt;Ability to add Repositories from Github (public only) by searching&lt;/li&gt;
	&lt;li&gt;SVN Repository support&lt;/li&gt;
	&lt;li&gt;View commit feed of all &quot;watched&quot; repositories&lt;/li&gt;
	&lt;li&gt;Push Notifications for when new commits arrive&lt;/li&gt;
	&lt;li&gt;Shake to refresh&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Planned Future Features:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
	&lt;li&gt;Push Notifications per repository (allowing the user to set which repos they want to be notified of new commits for)&lt;/li&gt;
	&lt;li&gt;Live Tile showing the number of unread commits from CodeTrack&lt;/li&gt;
	&lt;li&gt;Commit view screen showing the list of updated files&lt;/li&gt;
	&lt;li&gt;Ability to add private Github Repos&lt;/li&gt;
	&lt;li&gt;More source control providers (TFS, BitBucket, CodePlex)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Watch CodeTrack in action on &lt;a href='http://www.youtube.com/watch?v=_BvQOTnzp-U' target='_blank'&gt;YouTube&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So where can you get it? Easy, its available from the &lt;a href='http://social.zune.net/redirect?type=phoneApp&amp;id=745803a2-7907-e011-9264-00237de2db9e' target='_blank'&gt;Windows Phone 7 Marketplace&lt;/a&gt; for USD$0.99 (AUD$1.30)&lt;/p&gt;&lt;p&gt;&lt;a href='http://social.zune.net/redirect?type=phoneApp&amp;id=745803a2-7907-e011-9264-00237de2db9e'&gt;
&lt;img title='wp7_English_480x80_blue' src='http://dkdevelopment.net/wp-content/uploads/2011/02/wp7_English_480x80_blue_thumb.png' height='43' alt='wp7_English_480x80_blue' style='margin: 0px 0px 0px 32px; display: inline' width='240' /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Easy Email Templates in .NET with FluentEmail</title>
   <link href="http://dkdevelopment.net/2010/09/03/easy-email-templates-in-net-with-fluentemail/"/>
   <updated>2010-09-03T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/09/03/easy-email-templates-in-net-with-fluentemail</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The “Replace” method of templating in Fluent Email has itself been replaced by a Razor Engine Template. See &lt;a href='http://lukencode.com/2011/04/30/fluent-email-now-supporting-razor-syntax-for-templates/' target='_blank'&gt;Luke’s Post here&lt;/a&gt; about it.&lt;/p&gt;&lt;p&gt;I always seem to forget how to send emails in .NET which to me seems like such a simple task. Lately I’ve been working on updating an older application of mine that’s soul purpose was to read a database and send emails depending on certain events. I had a look at the current code and saw something like this:&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;sb&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Append&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;A Transaction has been made...&amp;lt;br /&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;sb&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Append&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Reservation Number&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Customer Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Email&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Sale Date&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Amount&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;sb&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AppendFormat&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;{0}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{1}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{2}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{3}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{4}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Reservation&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;FullName&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Email&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;SaleDate&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Amount&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToString&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;C2&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
&lt;span class='n'&gt;sb&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AppendFormat&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Invoice&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Confirmation&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;{0}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{1}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Invoice&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Confirmation&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color='#800000'&gt;Terrible!&lt;/font&gt;&lt;/strong&gt; So I figured while I was updating it I'd work out a better way build up the HTML of the emails. I started with the &lt;a href='http://github.com/lukencode/FluentEmail'&gt;FluentEmail&lt;/a&gt; Project (&lt;a href='http://lukencode.com/2010/04/11/fluent-email-in-net'&gt;Luke’s Post about it&lt;/a&gt;). From there I added some basic templating features, such as loading a HTML file with placeholders for content and the rest is history…&lt;/p&gt;&lt;p /&gt;&lt;p&gt;With my recent updated to FluentEmail I was about to turn something that looked like the above code to this: (as always C# is the code of choice)&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='c1'&gt;//Send Email!&lt;/span&gt;
&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;email&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Email&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;From&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_fromEmail&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;To&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;toAddresses&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Subject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Siriusware Emailer Confirmation #{0}&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Confirmation&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UsingTemplate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;@&amp;quot;C:\Emailer\TransactionTemplate.htm&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;%Reservation%&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Reservation&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;%FullName%&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;FullName&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;%SaleDate%&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;SaleDate&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToShortDateString&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;%Amount%&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Amount&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToString&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;C2&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;%Invoice%&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Invoice&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;lt;%Confirmation%&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;transaction&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Confirmation&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UsingClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;SmtpClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_mailhost&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
&lt;span class='n'&gt;email&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Send&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p /&gt;&lt;p&gt;The HTML inside TransactionTemplate.htm has the below code. This is a basic example but demonstrates the usage of the templates.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;html&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;head&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;title&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;title&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;head&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;body&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='n'&gt;A&lt;/span&gt; &lt;span class='n'&gt;Transaction&lt;/span&gt; &lt;span class='n'&gt;has&lt;/span&gt; &lt;span class='n'&gt;been&lt;/span&gt; &lt;span class='n'&gt;made&lt;/span&gt;&lt;span class='p'&gt;...&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;br&lt;/span&gt; &lt;span class='p'&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;table&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;Reservation&lt;/span&gt; &lt;span class='n'&gt;Number&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;Customer&lt;/span&gt; &lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;Email&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;Sale&lt;/span&gt; &lt;span class='n'&gt;Date&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;Amount&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;%&lt;/span&gt;&lt;span class='n'&gt;Reservation&lt;/span&gt;&lt;span class='p'&gt;%&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;%&lt;/span&gt;&lt;span class='n'&gt;FullName&lt;/span&gt;&lt;span class='p'&gt;%&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;%&lt;/span&gt;&lt;span class='n'&gt;Email&lt;/span&gt;&lt;span class='p'&gt;%&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;%&lt;/span&gt;&lt;span class='n'&gt;SaleDate&lt;/span&gt;&lt;span class='p'&gt;%&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;%&lt;/span&gt;&lt;span class='n'&gt;Amount&lt;/span&gt;&lt;span class='p'&gt;%&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;Invoice&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;Confirmation&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;th&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;%&lt;/span&gt;&lt;span class='n'&gt;Invoice&lt;/span&gt;&lt;span class='p'&gt;%&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
            &lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&amp;lt;%&lt;/span&gt;&lt;span class='n'&gt;Confirmation&lt;/span&gt;&lt;span class='p'&gt;%&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;td&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;tr&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;table&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;body&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='p'&gt;&amp;lt;/&lt;/span&gt;&lt;span class='n'&gt;html&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pretty damn easy if you ask me.&lt;/p&gt;&lt;p&gt;This also give me the flexibility to edit the HTML file in a proper editor instead of concatenating all those strings together. The main idea was inspired by the MailDefinition class built into .NET but I didnt like the face that: 1 it was part of the System.Web.UI.WebControls namespace when its not a Web Control and wouldnt be used as one. And 2, It attempted to use another Control as a worker for it. So I just extended MailMessage to add the functionality.&lt;/p&gt;&lt;p&gt;All you need to do is download &lt;a href='http://github.com/lukencode/FluentEmail'&gt;&lt;u&gt;FluentEmail&lt;/u&gt;&lt;/a&gt; from Github&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DroppedBoxx v1.1 – Dropbox for Windows Mobile</title>
   <link href="http://dkdevelopment.net/2010/06/03/droppedboxx-dropbox-for-windows-mobile/"/>
   <updated>2010-06-03T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/06/03/droppedboxx-dropbox-for-windows-mobile</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt; I have now released DroppedBoxx as Open Source, the source and a downloadable cab are now available over at Github (&lt;a href='https://github.com/dkarzon/DroppedBoxx'&gt;https://github.com/dkarzon/DroppedBoxx&lt;/a&gt;)&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;I have been developing a Dropbox Client for Windows Mobile called DroppedBoxx and
I thought I'd take some time to talk about how it works, my plans
for its future and talk about some of the new features of the latest version v1.1 which
has now been released to the &lt;a href='https://marketplace.windowsphone.com/details.aspx?appId=18925f53-bef8-43c4-adb9-f31658b133fa'&gt;
Windows Phone Marketplace&lt;/a&gt; and &lt;a href='http://www.handango.com/catalog/ProductDetails.jsp?storeId=2218&amp;deviceId=2031&amp;platformId=30&amp;productId=270588&amp;sectionId=0&amp;merch=L1_New_All'&gt;
Handango&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Firstly, the new features in v1.1 include: (&lt;a href='http://forum.xda-developers.com/showthread.php?t=687534'&gt;Full Changelog&lt;/a&gt;)&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Two-way Syncing of selected folders&lt;/li&gt;

&lt;li&gt;Updated UI (Labeled buttons, Background Uploading, Sync Folders screen is updated
so you know when its syncing)&lt;/li&gt;

&lt;li&gt;Bug fixes for the Attach to Email and errors caused by loss of connection&lt;/li&gt;

&lt;li&gt;Added settings for camera resolution&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Login:&lt;a href='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot2.png'&gt;&lt;img title='ScreenShot2' src='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot2_thumb.png' border='0' align='right' height='244' alt='ScreenShot2' style='border-right-width: 0px; margin: 0px 0px 0px 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px' width='184' /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This screen is where the User Logs in user their dropbox account. Login button trys
to login, keyboard button shows the Windows Mobile SIP keyboard. Exit button exits the
app. Remember me saves your login details so next time you run the app your
automatically logged in.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Sync Folders/Home Screen:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is pretty much the Home screen for the application. From here you can add
folders for Syncing by clicking New and browsing the phones file system and selecting a
Folder to add. The Logout button on the top right obviously logs you out returning to
the login screen.&lt;/p&gt;&lt;p&gt;The 5 Buttons down the bottom:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;The Sync button starts the &amp;acirc;&amp;euro;&amp;oelig;Sync&amp;acirc;&amp;euro; process syncing
the folders in the list to your dropbox account into a folder called
&amp;acirc;&amp;euro;&amp;oelig;Droppedboxx&amp;acirc;&amp;euro; (Note: this feature is unavailable in
the Beta versions, more on that later)&lt;/li&gt;

&lt;li&gt;The Dropbox Button opens up the root folder of dropbox for you to browse.&lt;/li&gt;

&lt;li&gt;The settings button opens the settings screen where you can change app settings
(such as Clearing saved login, max file sizes and camera resolution.&lt;/li&gt;

&lt;li&gt;The Info button is to show the dropbox User info, including quota and usage but
also DroppedBoxx version information and data used by this DroppedBoxx session.&lt;/li&gt;

&lt;li&gt;The Exit button closes the app.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot3.png'&gt;&lt;img title='ScreenShot3' src='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot3_thumb.png' border='0' align='right' height='244' alt='ScreenShot3' style='border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px' width='184' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Browse Dropbox:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is where most of the functionality is, from this screen we can upload,
download, delete, etc. files from Dropbox. Starting at the top, the Back Button takes
you &amp;acirc;&amp;euro;&amp;oelig;up&amp;acirc;&amp;euro; a directory in the Dropbox file system or, if
your in the dropbox root, takes you back to the Home Screen. The Upload button lets you
browse the phones file system and select a file to upload.&lt;/p&gt;&lt;p&gt;Here you have a list of Files and folders that are in the current folder on Dropbox
selecting a folder opens up that folder.&lt;/p&gt;&lt;p&gt;&lt;u&gt;The bottom button panel&lt;/u&gt;:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;The Camera button opens up the Windows Mobile camera application and when you
take a photo it uploads it to the folder you are currently in in the Dropbox
browser.&lt;/li&gt;

&lt;li&gt;The new folder button simply creates a new folder in the current folder, opening
up a dialog to enter the Name.&lt;/li&gt;

&lt;li&gt;The Delete folder button Deletes the current folder your in (asking for
confirmation first)&lt;/li&gt;

&lt;li&gt;The Paste button is for moving/copying files, if you have a file in the
&amp;acirc;&amp;euro;&amp;oelig;clipboard&amp;acirc;&amp;euro; pressing this button will ask if you want
to copy or move the file to this folder. (More info in file menu)&lt;/li&gt;

&lt;li&gt;The Back Button goes back to the sync folders screen (The Back button on the top
left goes up a directory or back to sync folders if your in the dropbox root)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;u&gt;&lt;a href='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot41.png'&gt;&lt;img title='ScreenShot4' src='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot4_thumb1.png' border='0' align='left' height='244' alt='ScreenShot4' style='border-right-width: 0px; margin: 5px 15px 5px 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px' width='184' /&gt;&lt;/a&gt; The File Menu&lt;/u&gt;:&lt;/p&gt;&lt;p&gt;This is the menu that comes up after selecting a dropbox file.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Save Button Downloads the selected file (opening a file system browser to set the
download folder)&lt;/li&gt;

&lt;li&gt;Email button, downloads the file to a temp folder and attaches it to a New email
message in Pocket Outlook (assuming this is set up it firsts asks you to select the
account)&lt;/li&gt;

&lt;li&gt;The Copy button puts the selected file in the
&amp;acirc;&amp;euro;&amp;oelig;clipboard&amp;acirc;&amp;euro; so you can paste it somewhere else in the
dropbox file system (giving you options to Copy or Move the file)&lt;/li&gt;

&lt;li&gt;The bin button deletes the selected file (asking for confirmation first)&lt;/li&gt;

&lt;li&gt;The &amp;acirc;&amp;euro;&amp;ldquo;Menu button simply closes the file menu (to allow access
to the Folder menu again)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Settings:&lt;a href='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot10.png'&gt;&lt;img title='ScreenShot10' src='http://dkdevelopment.net/wp-content/uploads/2010/06/ScreenShot10_thumb.png' border='0' align='right' height='244' alt='ScreenShot10' style='border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px' width='184' /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Here you can change the Settings of the application such as clearing saved login
details, setting a max filesize for sycning and setting the camera resolution for
camera uploads.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Information:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This screen displays application and user info. It shows the DroppedBoxx version
number and data sent and received by the application for this session. As well as the
users dropbox quota information.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;DroppedBoxx can be downloaded from the &lt;a href='https://marketplace.windowsphone.com/details.aspx?appId=18925f53-bef8-43c4-adb9-f31658b133fa'&gt;
Windows Phone Marketplace&lt;/a&gt; or &lt;a href='http://www.handango.com/catalog/ProductDetails.jsp?storeId=2218&amp;deviceId=2031&amp;platformId=30&amp;productId=270588&amp;sectionId=0&amp;merch=L1_New_All'&gt;
Handango&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Also you can follow the discussion about this app by going to the &lt;a href='http://bit.ly/9gqkuQ'&gt;thread on XDA.&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dropbox API, RestSharp and C# Part 2: The Revenge!</title>
   <link href="http://dkdevelopment.net/2010/05/25/dropbox-api-restsharp-and-c-part-2-the-revenge/"/>
   <updated>2010-05-25T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/05/25/dropbox-api-restsharp-and-c-part-2-the-revenge</id>
   <content type="html">&lt;p&gt;Following on from my previous post where I showed you how to Login and get the Account Info for a Dropbox account. Today we dive into the Box full of files. Uploading, Downloading and Deleting!&lt;/p&gt;&lt;p /&gt;&lt;p&gt;A lot has changed since my last post in the way of RestSharp with OAuth. OAuth is now available Out-of-the-box (this can be downloaded from &lt;a href='http://github.com/dkarzon/RestSharp'&gt;Github&lt;/a&gt;). Ok, Time for some code…&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Download File:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Fixed a bug in the code that only allowed for text based files to be downloaded. Using restClient.DownloadData now instead of Execute to get the response’s raw Data.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;byte&lt;/span&gt;&lt;span class='p'&gt;[]&lt;/span&gt; &lt;span class='nf'&gt;DownloadFile&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;http://api-content.dropbox.com&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='c1'&gt;//load the JsonDeserializer for all types&lt;/span&gt;
    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ClearHandlers&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddHandler&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;JsonDeserializer&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(!&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;StartsWith&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Authenticator&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;OAuthAuthenticator&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;BaseUrl&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_apiKey&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_appsecret&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Token&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Secret&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestRequest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Method&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GET&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Resource&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;{version}/files/dropbox{path}&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_version&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlSegment&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlSegment&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;responseData&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;DownloadData&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;responseData&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;u&gt;Note:&lt;/u&gt; This is assuming the user has already logged in and we have the token/secret (_userLogin).&lt;/p&gt;&lt;p&gt;Starting from the top, we create a new Instance of the RestSharp Client with the baseUrl then set the Json Deserializer for all requests. We then set the RestClient’s Authenticator to the OAuthAuthenticator and give it our baseUrl, all our secrets and that is all we need to do for OAuth (the rest is build into RestSharp, awesome?!). Now we create the Request up, its a GET method, set the version and path of the file to download call Execute and you have just downloaded your first Dropbox API file! I then converted this to a stream so save back to a local file.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Delete File:&lt;/strong&gt;&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='nf'&gt;DeleteFile&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;http://api.dropbox.com&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='c1'&gt;//load the JsonDeserializer for all types&lt;/span&gt;
    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ClearHandlers&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddHandler&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;JsonDeserializer&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;

    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(!&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;StartsWith&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Authenticator&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;OAuthAuthenticator&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;BaseUrl&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_apiKey&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_appsecret&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Token&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Secret&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestRequest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Method&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GET&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Resource&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;{version}/fileops/delete&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_version&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlSegment&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;root&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;dropbox&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Execute&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;StatusCode&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='n'&gt;System&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Net&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;HttpStatusCode&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;OK&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Delete is pretty similar to Download, only differences is the Url, the response and this time the path is sent as a parameter instead of part of the Url. The “root” parameter is for applications that only have sandbox access (they would set this to sandbox) who only get access to a “sandbox” folder on the users dropbox account.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Upload File:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Now this is where I had the most difficulties, many “Forbidden” messages later I finally came up with the solution!&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='nf'&gt;UploadFile&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;FileInfo&lt;/span&gt; &lt;span class='n'&gt;localFile&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;http://api-content.dropbox.com&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='c1'&gt;//load the JsonDeserializer for all types&lt;/span&gt;
    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ClearHandlers&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddHandler&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;JsonDeserializer&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;

    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(!&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;StartsWith&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='c1'&gt;//Get the file stream&lt;/span&gt;
    &lt;span class='kt'&gt;byte&lt;/span&gt;&lt;span class='p'&gt;[]&lt;/span&gt; &lt;span class='n'&gt;bytes&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;FileStream&lt;/span&gt; &lt;span class='n'&gt;fs&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;FileStream&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;localFile&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;FullName&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;FileMode&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Open&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;FileAccess&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Read&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;BinaryReader&lt;/span&gt; &lt;span class='n'&gt;br&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;BinaryReader&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;fs&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='kt'&gt;long&lt;/span&gt; &lt;span class='n'&gt;numBytes&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;localFile&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Length&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;bytes&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;br&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ReadBytes&lt;/span&gt;&lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='n'&gt;numBytes&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Authenticator&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;OAuthAuthenticator&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;BaseUrl&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_apiKey&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_appsecret&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Token&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Secret&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestRequest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Method&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;POST&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Resource&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;{version}/files/dropbox{path}&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_version&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlSegment&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlSegment&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='c1'&gt;//Need to add the &amp;quot;file&amp;quot; parameter with the file name&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;file&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;localFile&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddFile&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;FileParameter&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='n'&gt;Data&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;bytes&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;FileName&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;localFile&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterName&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;file&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Execute&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;StatusCode&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='n'&gt;System&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Net&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;HttpStatusCode&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;OK&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ok to start with the “path” variable/parameter is the folder path (not the file).&lt;/p&gt;&lt;p&gt;Starts off the same with the RestClient, JsonDeserializer and the OAuthAuthenticator. We also need to read the file as a byte array. Now this request is a POST so we set that in the RestRequest object then add the version and path Url parameters. We also need to add the Filename as a “file” parameter for this request as well as adding the actual file to the Request. Execute that and: {\&quot;result\&quot;: \&quot;winner!\&quot;} we just uploaded a file to dropbox!&lt;/p&gt;&lt;p /&gt;&lt;p&gt;This code was taken from my Dropbox open source .NET project called &lt;a href='http://github.com/dkarzon/DropNet'&gt;DropNet.&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dropbox API and RestSharp for a C# developer</title>
   <link href="http://dkdevelopment.net/2010/05/18/dropbox-api-and-restsharp-for-a-c-developer/"/>
   <updated>2010-05-18T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/05/18/dropbox-api-and-restsharp-for-a-c-developer</id>
   <content type="html">&lt;p&gt;The Dropbox API has foiled my development of “Droppedboxx” for some time now. Mainly because the on site documentation is average for anyone not planning on developing for the iphone (dropbox, you used to be cool). Being a C# developer this was bad news for me but I decided to give it a go anyway and after a few weeks of failed attempts and a few emails to support about my issues I realised the API documentation on the dropbox website is slightly wrong.&lt;/p&gt;&lt;ul&gt;
	&lt;li&gt;&lt;a href='http://restsharp.org/'&gt;RestSharp&lt;/a&gt; (What would i do without you…) &lt;/li&gt;
	&lt;li&gt;&lt;a href='http://code.google.com/p/oauth/'&gt;Oauth Library for C#&lt;/a&gt; (this one seems the easiest to use with RestSharp) &lt;/li&gt;
	&lt;li&gt;Access to the Dropbox API and an APIKey/Secret for your app &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I guess I should start with the Setup of it, I started this as a Windows Mobile application but I switched to a .NET library so I could test it easier and also use RestSharp (might open source the library if I get around to it).&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Login, this is possibly the easiest method if you have the right URL (the API documentation give you the wrong URL). We should be using “https://api.getdropbox.com/0/token” Code you say?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Got some helpful advice about using the request.Resource property with parameters instead of a string.format.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;UserLogin&lt;/span&gt; &lt;span class='nf'&gt;Login&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;email&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;password&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;https://api.getdropbox.com&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestRequest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Method&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GET&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Resource&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;{version}/token&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_version&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ParameterType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlSegment&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_consumer_key&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_apiKey&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;email&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;email&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;password&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Execute&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;UserLogin&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;_userLogin&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seems pretty easy right? Most of thats RestSharp (with the JSONDeserializer), I then have the UserLogin class which is returned by this function.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;UserLogin&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Token&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Secret&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And now your user is logged in, you will then want to store the Users Token and Secret (storing UserLogin object would probably be better) as its used for the rest of the requests. I’ll just show you how to get the User Info as the other requests differ from the login (that is where we’ll need the Oauth stuff).&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Account/Info, I’ll start with the Response classes this time…&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;AccountInfo&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Country&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Display_Name&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;QuotaInfo&lt;/span&gt; &lt;span class='n'&gt;Quota_Info&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Uid&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;QuotaInfo&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Shared&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Quota&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;Normal&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These are the classes for RestSharp to Deserialize the JSON to. Pretty simple, this is straight off the API Documentation site. Now for the actual request…&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;AccountInfo&lt;/span&gt; &lt;span class='nf'&gt;Account_Info&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;http://api.dropbox.com&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;OAuthBase&lt;/span&gt; &lt;span class='n'&gt;oAuth&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;OAuthBase&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;nonce&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;oAuth&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GenerateNonce&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;timeStamp&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;oAuth&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GenerateTimeStamp&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;normalizedUrl&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;normalizedRequestParameters&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='kt'&gt;string&lt;/span&gt; &lt;span class='n'&gt;sig&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;oAuth&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GenerateSignature&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;Uri&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;string&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;{0}/{1}/account/info&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;BaseUrl&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_version&lt;/span&gt;&lt;span class='p'&gt;)),&lt;/span&gt;
        &lt;span class='n'&gt;_apiKey&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_appsecret&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Token&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Secret&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;timeStamp&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;nonce&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;out&lt;/span&gt; &lt;span class='n'&gt;normalizedUrl&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;out&lt;/span&gt; &lt;span class='n'&gt;normalizedRequestParameters&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;sig&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;HttpUtility&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UrlEncode&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sig&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;request&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;RestRequest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Method&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GET&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Resource&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;{0}/account/info&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_version&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_consumer_key&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_apiKey&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_token&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;_userLogin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Token&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_nonce&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;nonce&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_timestamp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;timeStamp&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_signature_method&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;HMAC-SHA1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_version&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AddParameter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;oauth_signature&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;sig&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;restClient&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Execute&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;AccountInfo&lt;/span&gt;&lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;(&lt;/span&gt;&lt;span class='n'&gt;request&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, this request has a different Base Url to the Login function and this uses OAuth. So firstly we create an instance of the RestSharp client and the OAutheBase classes. The OAuthBase class then handles all of the oauth parameters that we need to make the Request (nonce, timestamp, etc.). GenerateSignature is the main 1 that rolls up the request path and the tokens/secrets into a hash for extra security. As for the dropbox part of this, we dont need any extra parameters as we are just getting the logged in users Account Info. Then its just a matter of adding these parameters to the RestRequest object, notice the oauth_token is actually the UserLogin.Token that we got from our Login method?&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Stay tuned for more, Tales of interest!&lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I have added a &lt;a href='http://dkdevelopment.net/2010/05/25/dropbox-api-restsharp-and-c-part-2-the-revenge/'&gt;Part 2&lt;/a&gt; to this post.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>MVC2 Cascading Dropdown Lists with JSON</title>
   <link href="http://dkdevelopment.net/2010/05/04/mvc2-cascading-dropdown-lists-with-json/"/>
   <updated>2010-05-04T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/05/04/mvc2-cascading-dropdown-lists-with-json</id>
   <content type="html">&lt;p&gt;Today I’m going to show you how to go about creating cascading dropdown lists using JSON in MVC2. Hold onto your hats, its time to begin!&lt;/p&gt;&lt;p&gt;Learning ASP.NET MVC2 I thought I'd start with a relatively simple web application, this application is for keeping track of service usage across the company's physical sites (ie. Electricity, Gas, Waste, etc.).&lt;/p&gt;&lt;p&gt;Now first things first, I setup the Database and LinqToSql classes for my app. The table structure is MeterTypes &gt; MeterCollections &gt; MeterUsages. Where a MeterType is the top level (ie. Electricity, Gas, Waste, etc.) the MeterCollections are the next level down (a MeterType may contain many of these, for Electricity I have Peak and Off-Peak) and MeterUsage is the actual usage on a meter for that MeterCollection.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;OK, lets get coding… We will be looking at the Create Page for the MeterUsage object, I started with the create template MVC2 gave me for this object (half of the fields are just textboxes anyway)&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;ActionResult&lt;/span&gt; &lt;span class='nf'&gt;Create&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;meterTypesRepo&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;Models&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Repo&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;Models&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;MeterType&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;meterTypes&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;from&lt;/span&gt; &lt;span class='n'&gt;mt&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='n'&gt;meterTypesRepo&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Many&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                     &lt;span class='k'&gt;select&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;SelectListItem&lt;/span&gt;
                     &lt;span class='p'&gt;{&lt;/span&gt;
                         &lt;span class='n'&gt;Value&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;mt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;MeterTypeID&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToString&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt;
                         &lt;span class='n'&gt;Text&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;mt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;
                     &lt;span class='p'&gt;};&lt;/span&gt;
    &lt;span class='n'&gt;ViewData&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;meterTypes&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;meterTypes&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nf'&gt;View&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Create&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Inside the Controller is where the request is handled, Now we need the data for the first list so we may as well get this here. This simply gets all the MeterTypes in the Database and converts them to SelectListItems (this is to make it easier on the page)&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;editor-label&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;label&lt;/span&gt; &lt;span class='na'&gt;for=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;meterTypes&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;Meter Type&lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;editor-field&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='err'&gt;&amp;lt;&lt;/span&gt;%= Html.DropDownList(&amp;quot;meterTypes&amp;quot;, &amp;quot;-- Select --&amp;quot;)%&amp;gt;
&lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;editor-label&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;label&lt;/span&gt; &lt;span class='na'&gt;for=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;MeterCollectionID&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;Meter Collection&lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;editor-field&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='err'&gt;&amp;lt;&lt;/span&gt;%= Html.DropDownListFor(model =&amp;gt; model.MeterCollectionID, new SelectList(new List&lt;span class='nt'&gt;&amp;lt;UsageInputs&lt;/span&gt;&lt;span class='err'&gt;.&lt;/span&gt;&lt;span class='na'&gt;Models&lt;/span&gt;&lt;span class='err'&gt;.&lt;/span&gt;&lt;span class='na'&gt;MeterCollection&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;()))%&amp;gt;
    &lt;span class='err'&gt;&amp;lt;&lt;/span&gt;%= Html.ValidationMessageFor(model =&amp;gt; model.MeterCollectionID) %&amp;gt;
&lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Markup, Basic use of the Html.DropDownList() function for MeterTypes (this is where using SelectListItems comes in handy. Also added a default option “—Select –”. Then the MeterCollection Dropdown is a little different as this one actually maps to a property on my MeterUsage object so I used the Html.DropDownListFor() function and gave it an empty list so it would create the dropdown list but not have any items (they will be populated with Ajax.&lt;/p&gt;&lt;p&gt;Next is the Javascript, this simply calls my MeterCollections/GetList function with the ID of the MeterType from the selected item in the DropDown list.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;#meterTypes&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;change&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;ajaxSetup&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt; &lt;span class='nx'&gt;cache&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt; &lt;span class='p'&gt;});&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;selectedItem&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;val&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;selectedItem&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='nx'&gt;selectedItem&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='c1'&gt;//Do nothing or hide...?&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;getJSON&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;&amp;lt;%= ResolveUrl(&amp;quot;~/MeterCollections/GetList/&amp;quot;)%&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;#meterTypes &amp;gt; option:selected&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nx'&gt;meterCollections&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;items&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;             &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;each&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;meterCollection&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='nx'&gt;items&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;lt;option value=&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;meterCollection&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Value&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;meterCollection&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Text&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;lt;/option&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;});&lt;/span&gt;
            &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;#MeterCollectionID&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;html&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;items&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;});&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It also builds up the html for inside the dropdown list using a JQuery for each loop.&lt;/p&gt;&lt;p&gt;Now the last part is our GetList function to return JSON, so back to the controllers.&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='na'&gt;[HttpGet]&lt;/span&gt;
&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;ActionResult&lt;/span&gt; &lt;span class='nf'&gt;GetList&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;id&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;meterCollsRepo&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;Models&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Repo&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;Models&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;MeterCollection&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;meterCollections&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;from&lt;/span&gt; &lt;span class='n'&gt;mc&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='n'&gt;meterCollsRepo&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Many&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                           &lt;span class='k'&gt;where&lt;/span&gt; &lt;span class='n'&gt;mc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;MeterTypeID&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='n'&gt;id&lt;/span&gt;
                           &lt;span class='k'&gt;select&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;SelectListItem&lt;/span&gt;
                           &lt;span class='p'&gt;{&lt;/span&gt;
                               &lt;span class='n'&gt;Text&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='kt'&gt;string&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;{0} ({1})&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;mc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;mc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Mesurement&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
                               &lt;span class='n'&gt;Value&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;mc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;MeterCollectionID&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToString&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                           &lt;span class='p'&gt;};&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nf'&gt;Json&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;meterCollections&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;JsonRequestBehavior&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;AllowGet&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function then gets all the MeterCollections that have that MeterTypeID. Here I also use the SelectListItem object as its much easier to work with in the Javascript and less work for the Serializer.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;And just like that you have a Cascading DropDown List in MVC2 using Ajax.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Smack my BitSharp!</title>
   <link href="http://dkdevelopment.net/2010/04/29/smack-my-bitsharp/"/>
   <updated>2010-04-29T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/04/29/smack-my-bitsharp</id>
   <content type="html">&lt;p&gt;Its an open source .NET client for the &lt;a href='http://www.bandsintown.com/home'&gt;BandsInTown&lt;/a&gt; API.&lt;/p&gt;&lt;p&gt;&lt;a href='http://tboda.com.au'&gt;TBODA&lt;/a&gt; currently have a number of web projects that focus on Live music, such as &lt;a href='http://promote.fm'&gt;Promote.fm&lt;/a&gt;, and through these projects I have worked very closely with a lot of gig guide APIs. So i thought I'd make some of my code reusable but not just by me, thus &lt;a href='http://github.com/dkarzon/BitSharp'&gt;BitSharp&lt;/a&gt; was born. &lt;/p&gt;&lt;p&gt;Now I'm a big fan of &lt;a href='http://restsharp.org/'&gt;RestSharp&lt;/a&gt; (The .NET Rest Client) so BitSharp uses it for all the API requests and Responses. BitSharp is still in early development but most of the event and artist functions are working.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Now for the code to us it:&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;client&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;BitClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;API_KEY_HERE&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='n'&gt;Artist&lt;/span&gt; &lt;span class='n'&gt;artist&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;try&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;artist&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;client&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Artists_Get&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;de11b037-d880-40e0-8901-0397c768c457&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='k'&gt;catch&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;BitException&lt;/span&gt; &lt;span class='n'&gt;ex&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;Console&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;WriteLine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;BandsInTown Error:&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='n'&gt;ex&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Message&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='n'&gt;Console&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;WriteLine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;artist&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;Console&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;WriteLine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;artist&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;MusicBrainzID&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;Console&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;WriteLine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Bytes received: &amp;quot;&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='n'&gt;client&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;DataCount&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p /&gt;&lt;p&gt;Starting by creating an instance of the BitClient with the APIKey this object is then what we use to make all the requests to the API so its a good idea to keep this at the global level that way you only need 1 instance.&lt;/p&gt;&lt;p&gt;Then inside the Try/Catch is where we call the Artists_Get function (this function simply gets artist info given the &lt;a href='http://musicbrainz.org/'&gt;MusicBrainz&lt;/a&gt; ID). All the API Functions throw a BitException if an error is returned from the API so this exception is then caught.&lt;/p&gt;&lt;p&gt;Now that we have called the Artists_Get function we get an Artist object returned and its as easy as that.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;The other BitSharp functions currently implemented include: (&lt;strong&gt;Updated&lt;/strong&gt;)&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Events_Search (Search for events either by artist(s), location or date) &lt;/li&gt;
  &lt;li&gt;Events_Daily (Returns a list of events that have been created updated or deleted in the last day) &lt;/li&gt;
  &lt;li&gt;Events_Recommended (Gets recommended events either by artist(s), location or date) &lt;/li&gt;
  &lt;li&gt;Artists_Events (Returns an artists upcoming events) &lt;/li&gt;
  &lt;li&gt;Artists_Get (Gets information on a single Artist)&lt;/li&gt;
  &lt;li&gt;Venues_Search (Search for venues by name and/or location)&lt;/li&gt;
  &lt;li&gt;Venues_Events (Returns a venues upcoming events)&lt;/li&gt;
&lt;/ul&gt;&lt;p /&gt;&lt;p&gt;You can find the source for &lt;a href='http://github.com/dkarzon/BitSharp'&gt;BitSharp @ Github&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Parallel vs. Async Email performance</title>
   <link href="http://dkdevelopment.net/2010/04/23/parallel-vs-async-email-performance/"/>
   <updated>2010-04-23T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/04/23/parallel-vs-async-email-performance</id>
   <content type="html">&lt;p&gt;Lately i have been doing some work with sending emails and I have chosen to use some of .NET4.0’s Parallel processing and the &lt;a href='http://github.com/lukencode/FluentEmail'&gt;FluentEmail&lt;/a&gt; library. &lt;/p&gt;&lt;p&gt;I then got thinking about the Performance differences between using Parallel against Asynchronous so I decided to run some tests. Based of the &lt;a href='http://lukencode.com/2010/03/28/c-micro-performance-testing-class/'&gt;C# Micro Performance Testing Class&lt;/a&gt; blog post I have written a simple app for testing this.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Firstly I created my base class for the performance tests, this will later be inherited by by different testers.&lt;/p&gt;&lt;p&gt;Pretty basic, methods to start and finish that set the stopwatch and the finished bool…&lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;abstract&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;PerformanceTester&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;TimeSpan&lt;/span&gt; &lt;span class='n'&gt;TotalTime&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;TimeSpan&lt;/span&gt; &lt;span class='n'&gt;AverageTime&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='n'&gt;Stopwatch&lt;/span&gt; &lt;span class='n'&gt;_stopwatch&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;Iterations&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='n'&gt;Finished&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;get&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='k'&gt;set&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nf'&gt;PerformanceTester&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;Finished&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;virtual&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;Run&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;Iterations&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='n'&gt;_stopwatch&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Stopwatch&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;StartNew&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;Finish&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;_stopwatch&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Stop&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='n'&gt;AverageTime&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;TimeSpan&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_stopwatch&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Elapsed&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Ticks&lt;/span&gt; &lt;span class='p'&gt;/&lt;/span&gt; &lt;span class='n'&gt;Iterations&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;TotalTime&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;_stopwatch&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Elapsed&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='n'&gt;Finished&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;true&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now that we have the stone to build off we can create the classes for the tests we went to perform, in this case 1 for Async and 1 for Parallel (below) these 2 classes then just override the Run method and call Finish when its done. However the async class differs slightly as it has to wait for the async callback.&lt;/p&gt;&lt;p /&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;ParallelEmails&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;PerformanceTester&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;override&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;Run&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;base&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Run&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='c1'&gt;//do stuff here&lt;/span&gt;
        &lt;span class='n'&gt;Parallel&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;For&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='p'&gt;=&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;gt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='c1'&gt;//send emails&lt;/span&gt;
                &lt;span class='n'&gt;Email&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;From&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;FromAddress&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                    &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;To&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToAddress&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                    &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Subject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Subject&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;P&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                    &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Body&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Body&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                    &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UsingClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;SmtpClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;HostAddress&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                    &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Send&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
            &lt;span class='p'&gt;});&lt;/span&gt;
        &lt;span class='c1'&gt;//all done&lt;/span&gt;
        &lt;span class='k'&gt;base&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Finish&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;AsyncEmails&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;PerformanceTester&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;_currentIteration&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;override&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;Run&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;base&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Run&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='c1'&gt;//do stuff here&lt;/span&gt;
        &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;iterations&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;++)&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;Email&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;From&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;FromAddress&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                        &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;To&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ToAddress&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                        &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Subject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Subject&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;A&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                        &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Body&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Body&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                        &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;UsingClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;SmtpClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Settings&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;HostAddress&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
                        &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;SendAsync&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;emailCallback&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;emailCallback&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;object&lt;/span&gt; &lt;span class='n'&gt;sender&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;EventArgs&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;_currentIteration&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;_currentIteration&lt;/span&gt; &lt;span class='p'&gt;+&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_currentIteration&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='n'&gt;Iterations&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='n'&gt;Finish&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;Now for some results, now I know the performance will differ depending on PC hardware so I'm testing this on 2 different PCs the first has a Core 2 Duo E6400 @ 2.13GHz and the 2nd has a Core 2 Quad Q6600 @ 2.4GHz.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Table represents my results of the tests (in milliseconds)&lt;/p&gt;&lt;table cellspacing='0' border='1' cellpadding='2' width='456'&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign='top' width='90'&gt;&lt;strong&gt;Emails Sent&lt;/strong&gt;&lt;/td&gt;
      &lt;td valign='top' width='90'&gt;&lt;strong&gt;Parallel (Dual Core)&lt;/strong&gt;&lt;/td&gt;
      &lt;td valign='top' width='90'&gt;&lt;strong&gt;Parallel (Quad Core)&lt;/strong&gt;&lt;/td&gt;
      &lt;td valign='top' width='90'&gt;&lt;strong&gt;Async 
          &lt;br /&gt;(Dual Core)&lt;/strong&gt;&lt;/td&gt;
      &lt;td valign='top' width='94'&gt;&lt;strong&gt;Async
          &lt;br /&gt;(Quad Core)&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign='top'&gt;1&lt;/td&gt;
      &lt;td valign='top'&gt;6019&lt;/td&gt;
      &lt;td valign='top'&gt;5716&lt;/td&gt;
      &lt;td valign='top' width='83'&gt;6107&lt;/td&gt;
      &lt;td valign='top' width='94'&gt;7039&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign='top'&gt;8&lt;/td&gt;
      &lt;td valign='top'&gt;26642&lt;/td&gt;
      &lt;td valign='top'&gt;39571&lt;/td&gt;
      &lt;td valign='top' width='83'&gt;34291&lt;/td&gt;
      &lt;td valign='top' width='94'&gt;25638&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign='top'&gt;15&lt;/td&gt;
      &lt;td valign='top'&gt;59282&lt;/td&gt;
      &lt;td valign='top'&gt;46897&lt;/td&gt;
      &lt;td valign='top' width='83'&gt;58849&lt;/td&gt;
      &lt;td valign='top' width='94'&gt;47730&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign='top'&gt;20&lt;/td&gt;
      &lt;td valign='top'&gt;70977&lt;/td&gt;
      &lt;td valign='top'&gt;67488&lt;/td&gt;
      &lt;td valign='top' width='83'&gt;62120&lt;/td&gt;
      &lt;td valign='top' width='94'&gt;79164&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Just a note, these tests were run from the 2 PCs on the same network with the same internet connection connecting to gmails smtp server. Of course there are other factors that would affect performance of these 2 methods but this is just to get an idea of the differences.&lt;/p&gt;&lt;p&gt;Read into that as much as you want but the main thing i got from it is parallel processing is better when you have more cores (which isn't really anything new at all). Good to see the difference in results though.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;DK out…&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Fluid.NET controls for Windows Mobile 6</title>
   <link href="http://dkdevelopment.net/2010/04/20/fluid-net-controls-for-windows-mobile-6/"/>
   <updated>2010-04-20T00:00:00-07:00</updated>
   <id>http://dkdevelopment.net/2010/04/20/fluid-net-controls-for-windows-mobile-6</id>
   <content type="html">&lt;p&gt;Lately I have been making an application for Windows mobile but I am pretty bad with design so I was looking for a control toolkit and came across the &lt;a href='http://fluid.codeplex.com/'&gt;Fluid.NET controls&lt;/a&gt;, which is an open source control toolkit for Windows Mobile. Now there wasn't too much documentation on the site and it hadn't been updated for a while but they had a pretty decent looking example application which they offered the source for.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;a href='/wp-content/uploads/2010/04/Screenshot19.jpg'&gt;&lt;img title='Screenshot1' src='/wp-content/uploads/2010/04/Screenshot12.jpg' border='0' align='right' height='244' alt='Screenshot1' style='border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px' width='201' /&gt;&lt;/a&gt;I based my project off their example, took me a while to figure out how to use some of their controls but now i have a bit more of an idea and i thought I'd share it. &lt;/p&gt;&lt;p&gt;Basically I'm trying to use the Fluid.NET listbox control to display the file system (so i can select a folder).&lt;/p&gt;&lt;p&gt;Then I created a new Fluid Template this is the class used by the ListBox to populate the items in the list. Item layout goes in the InitControl() method then the actual content of the Item (In my case its based off a DirectoryInfo object) goes in the OnBindValue() method. &lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;AddFolderTemplate&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;FluidTemplate&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='n'&gt;FluidLabel&lt;/span&gt; &lt;span class='n'&gt;nameLabel&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='n'&gt;FluidLabel&lt;/span&gt; &lt;span class='n'&gt;secondaryLabel&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='k'&gt;override&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;InitControl&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;base&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;InitControl&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Bounds&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;Rectangle&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;240&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;64&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;nameLabel&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;FluidLabel&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;228&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;64&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;Controls&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;l&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;secondaryLabel&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;FluidLabel&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;8&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;62&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='m'&gt;12&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;224&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;12&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;Controls&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;l&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='k'&gt;override&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;OnBindValue&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;object&lt;/span&gt; &lt;span class='k'&gt;value&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='kt'&gt;var&lt;/span&gt; &lt;span class='n'&gt;folder&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;value&lt;/span&gt; &lt;span class='k'&gt;as&lt;/span&gt; &lt;span class='n'&gt;DirectoryInfo&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;folder&lt;/span&gt; &lt;span class='p'&gt;!=&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;nameLabel&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Text&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;folder&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;secondaryLabel&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Text&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;folder&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;FullName&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt;&lt;p&gt;After I had the Template done I then created my listbox class (inheriting from the ListBoxBase) This class didnt need to do too much as most of the work is done in its base and the panel it goes in. &lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;AddFolderListBox&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;ListBoxBase&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;private&lt;/span&gt; &lt;span class='n'&gt;NotifyList&lt;/span&gt; &lt;span class='n'&gt;folders&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;event&lt;/span&gt; &lt;span class='n'&gt;EventHandler&lt;/span&gt; &lt;span class='n'&gt;FolderSelected&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='k'&gt;override&lt;/span&gt; &lt;span class='k'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;InitControl&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;base&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;InitControl&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='n'&gt;ItemHeight&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='m'&gt;32&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

        &lt;span class='n'&gt;ItemTemplate&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;AddFolderTemplate&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='n'&gt;NotifyList&lt;/span&gt; &lt;span class='n'&gt;Folders&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;get&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;folders&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;set&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;folders&lt;/span&gt; &lt;span class='p'&gt;!=&lt;/span&gt; &lt;span class='k'&gt;value&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='n'&gt;folders&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;value&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
                &lt;span class='n'&gt;DataSource&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;value&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;...&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now that we’ve got the classes done, time to put them to use. I have created a panel for browsing through the file system. All we need to do here is create an instance of our Listbox control and add a list of folders to the Folders Property. &lt;/p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='n'&gt;Controls&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;lsbFolders&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;CurrentDir&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;DirectoryInfo&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='n'&gt;lsbFolders&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Folders&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;MakeDirList&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;CurrentDir&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;GetDirectories&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This then loads all the folders in the devices root into the listbox. I have also added to the OnItemClick event to go deeper into the file system and a back button to go back to the parent directory. &lt;/p&gt;</content>
 </entry>
 
 
</feed>