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

<channel>
	<title>AGYNAMIX &#187; IT</title>
	<atom:link href="http://www.agynamix.de/blog/category/it/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agynamix.de</link>
	<description>Passionate Software</description>
	<lastBuildDate>Wed, 01 Sep 2010 11:56:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Simidude 1.5.1 Release Notes</title>
		<link>http://www.agynamix.de/blog/simidude-151-release-notes/</link>
		<comments>http://www.agynamix.de/blog/simidude-151-release-notes/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 11:17:47 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Newsletter]]></category>
		<category><![CDATA[Release Notes]]></category>
		<category><![CDATA[Simidude]]></category>

		<guid isPermaLink="false">http://www.agynamix.de/?p=728</guid>
		<description><![CDATA[Hi everybody!

I finally released version 1.5.1 of Simidude. This is mainly a bug fix version that improves upon version 1.5.0:

Bug Fix: I tried to improve the way Simidude finds its own IP address.
Bug Fix: Some people experienced creashes on older versions of Ubuntu
Bug Fix: Some people experienced crashes when a hard coded network address was [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Hi everybody!</p>
<p><a href="http://www.agynamix.de/wp-content/uploads/2010/08/Sequoia_Bear.jpg"><img class="alignnone size-full wp-image-729" title="Sequoia Bear" src="http://www.agynamix.de/wp-content/uploads/2010/08/Sequoia_Bear.jpg" alt="Sequoia Bear" width="472" height="332" /></a></p>
<p>I finally released version 1.5.1 of Simidude. This is mainly a bug fix version that improves upon version 1.5.0:</p>
<ul>
<li><strong>Bug Fix:</strong> I tried to improve the way Simidude finds its own IP address.</li>
<li><strong>Bug Fix:</strong> Some people experienced creashes on older versions of Ubuntu</li>
<li><strong>Bug Fix:</strong> Some people experienced crashes when a hard coded network address was not available in the current network.</li>
<li><strong>Feature:</strong> I updated the used UI libraries to their respective latest versions. This might bring some improvements especially on Mac and Linux platforms.</li>
</ul>
<p>This version is recommended for all users.</p>
<p>As always if you have any feature requests please let me know- loud  and clear.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/simidude-151-release-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synchronize your media library with iTunes</title>
		<link>http://www.agynamix.de/blog/synchronize-your-media-library-with-itunes/</link>
		<comments>http://www.agynamix.de/blog/synchronize-your-media-library-with-itunes/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 18:12:28 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[media]]></category>

		<guid isPermaLink="false">http://www.agynamix.de/?p=717</guid>
		<description><![CDATA[This article will show you how you can synchronize your media library (movies, tv shows and iTunes shows at the moment) with iTunes.
Background:
To understand my solution I&#8217;d like to share with you how my media setup works:
I use eyeTV (great program btw) to record movies and tv shows. I then use Toast to cut out [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>This article will show you how you can synchronize your media library (movies, tv shows and iTunes shows at the moment) with iTunes.</p>
<h3>Background:</h3>
<p>To understand my solution I&#8217;d like to share with you how my media setup works:</p>
<p>I use eyeTV (great program btw) to record movies and tv shows. I then use Toast to cut out commercials and convert the file into Apple TV format. I then copy the media files unto a NAS (Drobo in my case) into a predefined directory structure (see below).</p>
<p>To watch shows through Apple TV I first have to import them into my Mac Mini (the same that records the shows). I then have the Mac Mini connected to the Apple TV and let it stream media into the living room. So for that purpose the Apple TV is just an overly expensive iTunes connector that just works&#8230;</p>
<h3>How does it work:</h3>
<p>In order to have an automated process (synchronize your current media library with the iTunes library) I have written a small piece of software that does just that. iTunesMediaImport is a Java based cross platform software that is freely available at <a href="http://code.google.com/p/itunesmediaimport/">http://code.google.com/p/itunesmediaimport/</a></p>
<p>When it runs it parses a defined directory structure, dissects the file and directory name and creates a proper iTunes entry. iTunesMediaImport is started from a command line terminal.</p>
<h3>Directory Structure:</h3>
<p>The important thing is that the media archive directory structure is what iTunesMediaImport expects. It knows 3 different kind of media types: iTunes shows, movies you recorded yourself and self recorded TV shows.</p>
<h4>iTunes Shows:</h4>
<p>For iTunes shows you point the variable &#8220;itunesShowsPath.x&#8221; (x is a unique number) straight to the &#8220;TV shows&#8221; folder. The content of that folder should be the folders of your iTunes shows.</p>
<h4>Movies:</h4>
<p>For movies point &#8220;moviePath.x&#8221; to a folder that contains genre folders. Each genre folder contains the movie files that you file under that genre.</p>
<p>So in my case I point the variable (from etc/mediaimport.properties) to: &#8220;/Volumes/Drobo/Mediathek/Movies&#8221;. This folder contains genre folders like &#8220;Adventure&#8221;, &#8220;Action&#8221;, &#8220;Comedy&#8221;. You can have as many and name them as you see fit. When the movie is imported into iTunes it will be filed under a genre category with that name. Then the genre folder contains your movie files. The file name of the movie will be used as it&#8217;s name in iTunes.</p>
<h4>TV Shows:</h4>
<p>TV shows are handled much like movies except there is another directory layer, the season folder.</p>
<p>In mediaimport.properties you find a key &#8220;tvSeriesPath.x&#8221; that points to a directory that forms the root of my tv shows archive, &#8220;/Volumes/Drobo/Mediathek/TV Series&#8221; in my case.</p>
<p>Then this folder contains the names of my tv shows, like &#8220;Bones&#8221;, &#8220;Stargate&#8221; or whatever your poison is. Now under that folder you need to define another folder named &#8220;S&lt;season number&gt;&#8221;, so &#8220;Stargate/S3/&#8221; would be the 3rd season of Stargate.</p>
<p>Under the season folder  you file the tv shows that belong to that season, for instance: &#8220;Stargate 11 &#8211; Tokra.m4v&#8221;. iTunesMediaImport will parse the file name backwards and stop at the first dash (&#8216;-&#8217;) it finds. If it finds a number after the dash (looking towards the beginning of the filename) that number will become the show number in iTunes. The part after the dash until the end of the file name (except the .m4v extension) will become the name of the show.</p>
<p>&#8212;</p>
<p>iTunesMediaImport will keep a log of media files it has added into iTunes in order to avoid processing them over and over again. It will also delete shows from iTunes that have been deleted or renamed in your archive.</p>
<p>I invite you to give it a try, if you want you are welcome to contribute to it on Google Code. There&#8217;s also a forum for it <a href="http://helpdesk.agynamix.de/index.php?pg=forums.topics&amp;id=6">here</a>.</p>
<p>Have fun!</p>
<h4>References:</h4>
<ul>
<li>iTunesMediaImport on Google Code: <a href="http://code.google.com/p/itunesmediaimport/">http://code.google.com/p/itunesmediaimport/</a></li>
<li>iTunesMediaImport forum: <a href="http://helpdesk.agynamix.de/index.php?pg=forums.topics&amp;id=6">http://helpdesk.agynamix.de/index.php?pg=forums.topics&amp;id=6</a></li>
<li>My website: <a href="http://www.agynamix.de">http://www.agynamix.de</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/synchronize-your-media-library-with-itunes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Use ASP.NET Forms Authentication with local Windows Users</title>
		<link>http://www.agynamix.de/blog/use-asp-net-forms-authentication-with-local-windows-users/</link>
		<comments>http://www.agynamix.de/blog/use-asp-net-forms-authentication-with-local-windows-users/#comments</comments>
		<pubDate>Sat, 08 May 2010 11:46:04 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.agynamix.de/?p=703</guid>
		<description><![CDATA[This article shows you how to build your own MembershipProvider to authenticate users of your ASP.NET 2.0 web application against Windows user accounts using Forms authentication and the Win32 API method LogonUser.]]></description>
			<content:encoded><![CDATA[<p></p><h2>Summary</h2>
<p>This article shows you how to build your own MembershipProvider to authenticate users of your ASP.NET 2.0 web application against Windows user accounts using Forms authentication and the Win32 API method LogonUser.</p>
<p><span id="more-703"></span></p>
<p>A few years back I developed a small ASP.NET 2.0 application for my customer. The requirement at that time was to authenticate users against ActiveDirectory. We did this using Forms authentication and the ADMembershipProvider that comes with the .NET framework. You would use the Web.config configuration file to define the access string and other parameters for ActiveDirectory access&#8230;</p>
<p>But that&#8217;s not the topic of this post&#8230; Anyway a few weeks ago that same customer asked me to change the authentication in order to validate against Windows user accounts.<br />
At first I had a hard time finding a way to use forms authentication in combination with Windows accounts. But eventually I found a few websites (for instance: here) that gave me the right clue:<br />
There is a Win32 function called LogonUser that can be used to validate the users credentials.</p>
<p>I used that API method in a self made MembershipProvider (WinNTMembershipProvider) to implement an exchangeable authentication mechanism. Then, in Web.config I referenced that new MembershipProvider. That way I didn&#8217;t have to change anything within the existing application, just a configuration change.</p>
<p>Here&#8217;s the essential part of the MembershipProvider that uses the LogonUser API method:</p>
<p>You first need to announce the use of the LogonUser method:</p>
<pre>
<div class="codesnip-container" >
<div class="csharp codesnip" style="font-family:monospace;"><span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;ADVAPI32.dll&quot;</span>, EntryPoint <span class="sy0">=</span> <span class="st0">&quot;LogonUserW&quot;</span>, SetLastError <span class="sy0">=</span> <span class="kw1">true</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CharSet <span class="sy0">=</span> CharSet.<span class="kw1">Auto</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">extern</span> <span class="kw4">bool</span> LogonUser<span class="br0">&#40;</span><span class="kw4">string</span> lpszUsername, <span class="kw4">string</span> lpszDomain,
<span class="kw4">string</span> lpszPassword, <span class="kw4">int</span> dwLogonType, <span class="kw4">int</span> dwLogonProvider, <span class="kw1">ref</span> IntPtr phToken<span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
</pre>
<p>Then, within the ValidateUser method you try to log that user into the system:</p>
<pre>
<div class="codesnip-container" >
<div class="csharp codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ValidateUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strPassword<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw4">bool</span> bSuccessfulLogin <span class="sy0">=</span> false<span class="sy0">;</span>
IntPtr token <span class="sy0">=</span> IntPtr.<span class="me1">Zero</span><span class="sy0">;</span>

<span class="co1">//userName, domainName and Password parameters are very obvious.</span>
<span class="coMULTI">/* dwLogonType (3rd parameter): I used LOGON32_LOGON_INTERACTIVE, This logon type is
intended for users who will be interactively using the computer, such as a user being
logged on by a terminal server, remote shell, or similar process. This logon type has
the additional expense of caching logon information for disconnected operations. For
more details about this parameter please see http://msdn.microsoft.com/en-
us/library/aa378184(VS.85).aspx */</span>

<span class="coMULTI">/* dwLogonProvider (4th parameter) : I used LOGON32_PROVIDER_DEFAUL, This provider
uses the standard logon provider for the system. The default security provider is
negotiate, unless you pass NULL for the domain name and the user name is not in UPN
format. In this case, the default provider is NTLM. For more details about this
parameter please see http://msdn.microsoft.com/en-us/library/aa378184(VS.85).aspx */</span>
<span class="coMULTI">/* phToken (5th parameter): A pointer to a handle variable that receives a handle to
a token that represents the specified user. We can use this handler for impersonation
purpose. */</span>

bSuccessfulLogin <span class="sy0">=</span> LogonUser<span class="br0">&#40;</span>strName, _userDomain, strPassword, _logonType, 0, <span class="kw1">ref</span> token<span class="br0">&#41;</span><span class="sy0">;</span>

<span class="kw1">return</span> bSuccessfulLogin<span class="sy0">;</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>The next thing is to reference the MembershipProvider in Web.config:</p>
<pre>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc-1">&lt;!-- userDomain: Domain in which the user is looked up</span>
<span class="sc-1"> &nbsp; &nbsp; logonType: 2 - Interactive, 3 - Network &nbsp;--&gt;</span>
<span class="sc3"><span class="re1">&lt;membership</span> <span class="re0">defaultProvider</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;providers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;add</span> <span class="re0">name</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">type</span>=<span class="st0">&quot;my_package.WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">applicationName</span>=<span class="st0">&quot;Sessiondatenserver&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">description</span>=<span class="st0">&quot;Checks Username and Password against valid Windows users of a given domain&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">userDomain</span>=<span class="st0">&quot;USER_DOMAIN&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">logonType</span>=<span class="st0">&quot;3&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp;<span class="re2">/&gt;</span></span>
&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;/providers<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/membership<span class="re2">&gt;</span></span></span></div>
</div>
</pre>
<p>Here&#8217;s the complete source code for WinNTMembershipProvider:</p>
<p>Please note that most of the boilerplate here is not needed for our example, it&#8217;s just needed to fullfill the MembershipProvider contract.</p>
<pre>
<div class="codesnip-container" >
<div class="csharp codesnip" style="font-family:monospace;"><span class="kw1">using</span> <span class="co3">System</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Collections.Generic</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Text</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Web</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Web.Security</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Runtime.InteropServices</span><span class="sy0">;</span>

<span class="kw1">namespace</span> my_package
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">class</span> WinNTMembershipProvider <span class="sy0">:</span> MembershipProvider
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>DllImport<span class="br0">&#40;</span><span class="st0">&quot;ADVAPI32.dll&quot;</span>, EntryPoint <span class="sy0">=</span> <span class="st0">&quot;LogonUserW&quot;</span>, SetLastError <span class="sy0">=</span> <span class="kw1">true</span>,
&nbsp; &nbsp; &nbsp; &nbsp; CharSet <span class="sy0">=</span> CharSet.<span class="kw1">Auto</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">extern</span> <span class="kw4">bool</span> LogonUser<span class="br0">&#40;</span><span class="kw4">string</span> lpszUsername, <span class="kw4">string</span> lpszDomain,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">string</span> lpszPassword, <span class="kw4">int</span> dwLogonType, <span class="kw4">int</span> dwLogonProvider, <span class="kw1">ref</span> IntPtr phToken<span class="br0">&#41;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">String</span> _strName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">String</span> _strApplicationName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">String</span> _userDomain<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _logonType<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolEnablePasswordReset<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolEnablePasswordRetrieval<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _intMaxInvalidPasswordAttempts<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _intMinRequiredAlphanumericCharacters<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> _intMinRequiredPasswordLength<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> MembershipPasswordFormat _oPasswordFormat<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">string</span> _strPasswordStrengthRegularExpression<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolRequiresQuestionAndAnswer<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> Boolean _boolRequiresUniqueEMail<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> WinNTMembershipProvider<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strName <span class="sy0">=</span> <span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strApplicationName <span class="sy0">=</span> <span class="st0">&quot;DefaultApp&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _userDomain <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _logonType <span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">;</span> <span class="co1">// Interactive by default</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolEnablePasswordReset <span class="sy0">=</span> false<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolEnablePasswordRetrieval <span class="sy0">=</span> false<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolRequiresQuestionAndAnswer <span class="sy0">=</span> false<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _boolRequiresUniqueEMail <span class="sy0">=</span> false<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _intMaxInvalidPasswordAttempts <span class="sy0">=</span> <span class="nu0">3</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _intMinRequiredAlphanumericCharacters <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _intMinRequiredPasswordLength <span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strPasswordStrengthRegularExpression <span class="sy0">=</span> <span class="st_h">@&quot;[\w| !§$%&amp;amp;/()=\-?\*]*&quot;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _oPasswordFormat <span class="sy0">=</span> MembershipPasswordFormat.<span class="me1">Clear</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//DFB: reads entries from web.config and initializes this class from those values</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &nbsp;Once the provider is loaded, the</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &nbsp;runtime calls Initialize and passes the settings as name-value</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &nbsp;pairs in an instance of the NameValueCollection class.</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw1">void</span> Initialize<span class="br0">&#40;</span><span class="kw4">string</span> name, <span class="kw5">System.<span class="me1">Collections</span></span>.<span class="me1">Specialized</span>.<span class="me1">NameValueCollection</span> config<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>config <span class="sy0">==</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> ArgumentNullException<span class="br0">&#40;</span><span class="st0">&quot;config&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">IsNullOrEmpty</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name <span class="sy0">=</span> <span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">IsNullOrEmpty</span><span class="br0">&#40;</span>config<span class="br0">&#91;</span><span class="st0">&quot;description&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; config.<span class="me1">Remove</span><span class="br0">&#40;</span><span class="st0">&quot;description&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; config.<span class="me1">Add</span><span class="br0">&#40;</span><span class="st0">&quot;description&quot;</span>, <span class="st0">&quot;WinNT Membership Provider&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">base</span>.<span class="me1">Initialize</span><span class="br0">&#40;</span>name, config<span class="br0">&#41;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> key <span class="kw1">in</span> config.<span class="me1">Keys</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>key.<span class="me1">ToLower</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;name&quot;</span><span class="sy0">:</span> _strName <span class="sy0">=</span> config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;applicationname&quot;</span><span class="sy0">:</span> _strApplicationName <span class="sy0">=</span> config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;userdomain&quot;</span><span class="sy0">:</span> _userDomain <span class="sy0">=</span> config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&quot;logontype&quot;</span><span class="sy0">:</span> _logonType <span class="sy0">=</span> <span class="kw4">int</span>.<span class="me1">Parse</span><span class="br0">&#40;</span>config<span class="br0">&#91;</span>key<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span> break<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ValidateUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strPassword<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> bSuccessfulLogin <span class="sy0">=</span> false<span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IntPtr token <span class="sy0">=</span> IntPtr.<span class="me1">Zero</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//userName, domainName and Password parameters are very obvious.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* dwLogonType (3rd parameter): I used LOGON32_LOGON_INTERACTIVE, This logon type is
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intended for users who will be interactively using the computer, such as a user being
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logged on by a terminal server, remote shell, or similar process. This logon type has
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the additional expense of caching logon information for disconnected operations. For
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; more details about this parameter please see http://msdn.microsoft.com/en-
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; us/library/aa378184(VS.85).aspx */</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* dwLogonProvider (4th parameter) : I used LOGON32_PROVIDER_DEFAUL, This provider
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uses the standard logon provider for the system. The default security provider is
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; negotiate, unless you pass NULL for the domain name and the user name is not in UPN
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; format. In this case, the default provider is NTLM. For more details about this
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parameter please see http://msdn.microsoft.com/en-us/library/aa378184(VS.85).aspx */</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* phToken (5th parameter): A pointer to a handle variable that receives a handle to
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a token that represents the specified user. We can use this handler for impersonation
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; purpose. */</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bSuccessfulLogin <span class="sy0">=</span> LogonUser<span class="br0">&#40;</span>strName, _userDomain, strPassword, _logonType, 0, <span class="kw1">ref</span> token<span class="br0">&#41;</span><span class="sy0">;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> bSuccessfulLogin<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Properties
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ApplicationName
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _strApplicationName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _strApplicationName <span class="sy0">=</span> value<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> Name
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _strName<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> EnablePasswordReset
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolEnablePasswordReset<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> EnablePasswordRetrieval
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolEnablePasswordRetrieval<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> MaxInvalidPasswordAttempts
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _intMaxInvalidPasswordAttempts<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> MinRequiredNonAlphanumericCharacters
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _intMinRequiredAlphanumericCharacters<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> MinRequiredPasswordLength
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _intMinRequiredPasswordLength<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> PasswordAttemptWindow
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipPasswordFormat PasswordFormat
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _oPasswordFormat<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> PasswordStrengthRegularExpression
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _strPasswordStrengthRegularExpression<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> RequiresQuestionAndAnswer
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolRequiresQuestionAndAnswer<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> RequiresUniqueEmail
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _boolRequiresUniqueEMail<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* API Functions
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> GetPassword<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strAnswer<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUser CreateUser<span class="br0">&#40;</span><span class="kw4">string</span> username, <span class="kw4">string</span> password, <span class="kw4">string</span> email, <span class="kw4">string</span> passwordQuestion,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> passwordAnswer, <span class="kw4">bool</span> isApproved, <span class="kw4">object</span> userId, <span class="kw1">out</span> MembershipCreateStatus status<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> GetUserNameByEmail<span class="br0">&#40;</span><span class="kw4">string</span> strEmail<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ResetPassword<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strAnswer<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ChangePassword<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strOldPwd, <span class="kw4">string</span> strNewPwd<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">int</span> GetNumberOfUsersOnline<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> ChangePasswordQuestionAndAnswer<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">string</span> strPassword, <span class="kw4">string</span> strNewPwdQuestion, <span class="kw4">string</span> strNewPwdAnswer<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUser GetUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">bool</span> boolUserIsOnline<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> DeleteUser<span class="br0">&#40;</span><span class="kw4">string</span> strName, <span class="kw4">bool</span> boolDeleteAllRelatedData<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUserCollection FindUsersByEmail<span class="br0">&#40;</span><span class="kw4">string</span> strEmailToMatch, <span class="kw4">int</span> iPageIndex, <span class="kw4">int</span> iPageSize, <span class="kw1">out</span> <span class="kw4">int</span> iTotalRecords<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUserCollection FindUsersByName<span class="br0">&#40;</span><span class="kw4">string</span> strUsernameToMatch, <span class="kw4">int</span> iPageIndex, <span class="kw4">int</span> iPageSize, <span class="kw1">out</span> <span class="kw4">int</span> iTotalRecords<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUserCollection GetAllUsers<span class="br0">&#40;</span><span class="kw4">int</span> iPageIndex, <span class="kw4">int</span> iPageSize, <span class="kw1">out</span> <span class="kw4">int</span> iTotalRecords<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw1">void</span> UpdateUser<span class="br0">&#40;</span>MembershipUser user<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">bool</span> UnlockUser<span class="br0">&#40;</span><span class="kw4">string</span> strUserName<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> MembershipUser GetUser<span class="br0">&#40;</span><span class="kw4">object</span> providerUserKey, <span class="kw4">bool</span> userIsOnline<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> NotImplementedException<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>And the Web.config:</p>
<pre>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span>
<span class="sc3"><span class="re1">&lt;configuration<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>

&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authentication</span> <span class="re0">mode</span>=<span class="st0">&quot;Forms&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;forms</span> <span class="re0">loginUrl</span>=<span class="st0">&quot;Login.aspx&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">timeout</span>=<span class="st0">&quot;30&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">name</span>=<span class="st0">&quot;.AUTHNAME&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">requireSSL</span>=<span class="st0">&quot;true&quot;</span> &nbsp;</span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">slidingExpiration</span>=<span class="st0">&quot;true&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">defaultUrl</span>=<span class="st0">&quot;default.aspx&quot;</span> <span class="re2">/&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authentication<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;deny</span> <span class="re0">users</span>=<span class="st0">&quot;?&quot;</span> <span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span> <span class="re2">/&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>

&nbsp; &nbsp; <span class="sc-1">&lt;!-- userDomain: Domain in which the user is looked up</span>
<span class="sc-1"> &nbsp; &nbsp; &nbsp; &nbsp; logonType: 2 - Interactive, 3 - Network &nbsp;--&gt;</span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;membership</span> <span class="re0">defaultProvider</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;providers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;add</span> <span class="re0">name</span>=<span class="st0">&quot;WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">type</span>=<span class="st0">&quot;my_package.WinNTMembershipProvider&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">applicationName</span>=<span class="st0">&quot;Sessiondatenserver&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">description</span>=<span class="st0">&quot;Checks Username and Password against valid Windows users of a given domain&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">userDomain</span>=<span class="st0">&quot;USER_DOMAIN&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">logonType</span>=<span class="st0">&quot;3&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/providers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/membership<span class="re2">&gt;</span></span></span>

&nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>

&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the themes and images --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;css&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;image&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the NonSSL directory --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;NonSSL&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the help --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;help.aspx&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc-1">&lt;!-- Allow anonymous access (non-Forms login) to the imprint --&gt;</span>
&nbsp; <span class="sc3"><span class="re1">&lt;location</span> <span class="re0">path</span>=<span class="st0">&quot;Imprint.aspx&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;system.web<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;allow</span> <span class="re0">users</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/authorization<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/system.web<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;/configuration<span class="re2">&gt;</span></span></span></div>
</div>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/use-asp-net-forms-authentication-with-local-windows-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simidude 1.4.0 released</title>
		<link>http://www.agynamix.de/blog/simidude-140-released/</link>
		<comments>http://www.agynamix.de/blog/simidude-140-released/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 16:02:30 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Newsletter]]></category>
		<category><![CDATA[Simidude]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=380</guid>
		<description><![CDATA[Just now I released version 1.4.0 of Simidude, the cross platform network clipboard and drag &#38; drop utility.
I have added quite some features to it, for a complete list of new niceness please look here.
The problems with the Windows 7 update installer are gone as well.
Grab the latest release from our download site and tell me [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Just now I released version 1.4.0 of Simidude, the cross platform network clipboard and drag &amp; drop utility.</p>
<p>I have added quite some features to it, for a complete list of new niceness please look <a href="../blog/2009/simidude-140-release-notes/">here</a>.</p>
<p>The problems with the Windows 7 update installer are gone as well.</p>
<p>Grab the latest release from our <a href="http://www.simidude.com/download/">download site</a> and <a href="http://helpdesk.agynamix.de/index.php?pg=request">tell</a> me what you think!</p>
<p>Have a great day,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/simidude-140-released/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Run 32 bit SWT apps from Eclipse in Snow Leopard</title>
		<link>http://www.agynamix.de/blog/run-32bit-swt-apps-from-eclipse-in-snow-leopard/</link>
		<comments>http://www.agynamix.de/blog/run-32bit-swt-apps-from-eclipse-in-snow-leopard/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 14:43:44 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=373</guid>
		<description><![CDATA[After I received an update for my UMTS modem driver to finally work with Snow Leopard I again decided to update my MacBook Pro to Snowy.
After getting that system up to speed again I continued working on Simidude- I&#8217;m about to integrate global hotkey support- at least on Windows and Linux for now.
Firing up Eclipse, [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>After I received an update for my UMTS modem driver to finally work with Snow Leopard I again decided to update my MacBook Pro to Snowy.</p>
<p>After getting that system up to speed again I continued working on Simidude- I&#8217;m about to integrate global hotkey support- at least on Windows and Linux for now.</p>
<p>Firing up Eclipse, editing a bit and launching Simidude brought me this error:</p>
<pre>java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:182)
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:159)</pre>
<p>Turns out that Snow Leopard tries to start Java applications by default with the 64 bit virtual machine which does not work with Simidude because I bundle it with the 32 bit libraries.</p>
<p>Interesting enough when Simidude is launched from the Finder everything works fine&#8230;</p>
<p>Now, drum roll please, the solution to this problem is pretty simple:</p>
<p>Open up the Java JRE definition in Eclipse-&gt;Settings-&gt;Java-&gt;Installed JRE edit your standard Java VM and add the following to the &#8220;Default VM Arguments&#8221;: <em>-d32</em></p>
<p style="text-align: center;"><a href="http://www.agynamix.de/wp-content/uploads/2009/09/edit_jre_32bit.jpg"><img class="size-full wp-image-374 aligncenter" title="Set the VM to 32 bit" src="http://v2.agynamix.de/wp-content/uploads/2009/09/edit_jre_32bit.jpg" alt="" width="500" height="494" /></a></p>
<p style="text-align: left;">Happy Snow Leopard-ing&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/run-32bit-swt-apps-from-eclipse-in-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Simidude User Manual Published</title>
		<link>http://www.agynamix.de/blog/new-simidude-user-manual-published/</link>
		<comments>http://www.agynamix.de/blog/new-simidude-user-manual-published/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 15:21:28 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Newsletter]]></category>
		<category><![CDATA[Simidude]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=365</guid>
		<description><![CDATA[I admit, the Simidude user manual was very sparse and lacking much information.
I have worked for the last few days to write up a new user manual that will hopefully be more informative for your and will answer more of your questions.
Special thanks to very helpful user P. Jansen who provided me with a great [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I admit, the Simidude user manual was very sparse and lacking much information.</p>
<p>I have worked for the last few days to write up a new user manual that will hopefully be more informative for your and will answer more of your questions.</p>
<p>Special thanks to very helpful user P. Jansen who provided me with a great starting point for this documentation.</p>
<p>The manual is available as PDF from <a href="http://helpdesk.agynamix.de/index.php?pg=kb.page&amp;id=6" target="_blank">here</a>. I will also include it in future releases of Simidude.</p>
<p>Please let me know any things that I have missed in the manual, also if you&#8217;d like to see the documentation in any other format than PDF.</p>
<p>Download the manual <a href="http://helpdesk.agynamix.de/index.php?pg=kb.page&amp;id=6">here</a>.</p>
<p>Have a great day,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/new-simidude-user-manual-published/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simidude 1.3.3 released</title>
		<link>http://www.agynamix.de/blog/simidude-133-released/</link>
		<comments>http://www.agynamix.de/blog/simidude-133-released/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 18:01:40 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Newsletter]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=363</guid>
		<description><![CDATA[A few days ago I release version 1.3.3 of Simidude, the cross platform network clipboard and drag &#38; drop utility.
And now, after I&#8217;m sure its working this time I can even write about it  
This one is a maintenance release that doesn&#8217;t add great new features but it fixes some bugs, renews used libraries [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>A few days ago I release version 1.3.3 of Simidude, the cross platform network clipboard and drag &amp; drop utility.</p>
<p>And now, after I&#8217;m sure its <a href="http://www.simidude.com/blog/2009/simidude-132-withdrawn-again/">working this time</a> I can even write about it <img src='http://www.agynamix.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>This one is a maintenance release that doesn&#8217;t add great new features but it fixes some bugs, renews used libraries and makes it all together more stable. A list of new features and bug fixes is available <a href="http://www.simidude.com/blog/2009/simidude-13-release-notes/">here</a>.</p>
<p>However I did realize that the update installer for Windows 7 is not working. So when the update checker of Simidude notifies you of an update you can download it but the update installer will then fail (only Windows 7). You can then quit Simidude and start the downloaded installer by hand. I&#8217;m sure we&#8217;ll figure that one out as well&#8230;</p>
<p>Anyway, go grab the latest release from our <a href="http://www.simidude.com/download/">download site</a> and have fun!</p>
<p>Have a great day,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/simidude-133-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simidude 1.3.2 withdrawn &#8211; again</title>
		<link>http://www.agynamix.de/blog/simidude-132-withdrawn-again/</link>
		<comments>http://www.agynamix.de/blog/simidude-132-withdrawn-again/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 14:35:44 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=358</guid>
		<description><![CDATA[I&#8217;m very very sorry for this trouble but today I had to withdraw my Simidude 1.3.2 release again.
There is a major installer problem on the Mac side. I have reports from users that the Windows version works great, so no problem here.
However I added a step to the installer to remove files from previous installations. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I&#8217;m very very sorry for this trouble but today I had to withdraw my Simidude 1.3.2 release again.</p>
<p>There is a major installer problem on the Mac side. I have reports from users that the Windows version works great, so no problem here.</p>
<p>However I added a step to the installer to remove files from previous installations. I told the installer to delete the contents of the installation dir. On Windows this would be &#8220;C:\Program Files\Simidude&#8221; for instance. On Mac however this is &#8220;/Applications&#8221; because an application directory is treated as some kind of special file. Alas my installer tried to remove everything from &#8220;/Applications&#8221; which I only recognized today when I tried to read my mail and my Mail.app program was gone.</p>
<p>Now thanks to Time Machine all the files get rolled back in place, but I sincerely hope no one of you guys was installing 1.3.2 on a Mac!</p>
<p>After properly testing the installer changes on Mac Linux and Windows I&#8217;m gonna release a new version- again.</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/simidude-132-withdrawn-again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Helpdesk works again</title>
		<link>http://www.agynamix.de/blog/helpdesk-works-again-2/</link>
		<comments>http://www.agynamix.de/blog/helpdesk-works-again-2/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 16:42:25 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=340</guid>
		<description><![CDATA[After a day of bug hunting and help from the great guys and gals at Userscape we were able to track down the problem to a wrong &#8216;include_path&#8217; setting in the PHP preferences.
I have absolutely no clue why this setting was changed during a PHP security update or if it has been there all along. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>After a day of bug hunting and help from the great guys and gals at <a href="http://www.userscape.com">Userscape</a> we were able to track down the problem to a wrong &#8216;include_path&#8217; setting in the PHP preferences.</p>
<p>I have absolutely no clue why this setting was changed during a PHP security update or if it has been there all along. Fact is the problem occured only after the update, and only in this one application. The value of &#8216;include_path&#8217; was set to &#8216;.&#8217; in a global confixx file &#8216;confixx_mhost.conf&#8217;. After commenting out the property the whole thing suddenly worked again.</p>
<p>So go ahead and use the <a href="http://helpdesk.agynamix.de">helpdesk</a>.</p>
<p>Have a great day,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/helpdesk-works-again-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>System Update killed my Helpdesk</title>
		<link>http://www.agynamix.de/blog/system-update-killed-my-helpdesk-2/</link>
		<comments>http://www.agynamix.de/blog/system-update-killed-my-helpdesk-2/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 19:23:13 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=338</guid>
		<description><![CDATA[Yesterday I updated the Ubuntu 6 Linux that runs my internet server that mostly serves my web sites.
Having done this repeatedly in the past I didn&#8217;t foresee any problems- which then came around the corner blazingly fast. Today I noticed that my helpdesk at http://helpdesk.agynamix.de isn&#8217;t working while all other sites are. I&#8217;m not sure [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Yesterday I updated the Ubuntu 6 Linux that runs my internet server that mostly serves my web sites.</p>
<p>Having done this repeatedly in the past I didn&#8217;t foresee any problems- which then came around the corner blazingly fast. Today I noticed that my helpdesk at <a href="http://helpdesk.agynamix.de">http://helpdesk.agynamix.de</a> isn&#8217;t working while all other sites are. I&#8217;m not sure what caused the problem but rest assured that I am working on it.</p>
<p>Meanwhile if you have any questions please email me directly at <a href="mailto:T.Uhlmann@agynamix.de">T.Uhlmann@agynamix.de</a>.</p>
<p>Thanks,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/system-update-killed-my-helpdesk-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Version 1.3.0 of AGYNAMIX Simidude, the cross platform network clipboard is available</title>
		<link>http://www.agynamix.de/blog/simidude-130-available/</link>
		<comments>http://www.agynamix.de/blog/simidude-130-available/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 20:09:36 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Newsletter]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=335</guid>
		<description><![CDATA[Finally!
After a short beta period I have now released version 1.3.0 of AGYNAMIX Simidude, my cross platform network clipboard and file copy tool.
I did not get around to create new and shiny screenshots yet- I&#8217;ll post them as soon as possible!
This one is a pretty big release with huge improvements in usability and features. Here [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Finally!</p>
<p>After a short beta period I have now released version 1.3.0 of AGYNAMIX Simidude, my cross platform network clipboard and file copy tool.</p>
<p>I did not get around to create new and shiny screenshots yet- I&#8217;ll post them as soon as possible!</p>
<p>This one is a pretty big release with huge improvements in usability and features. Here is a list of new features that were added since version 1.2.0:</p>
<ul>
<li><strong>An embedded HTTP server</strong>. The embedded HTTP server allows you to access Simidude entries from any machines that has a browser installed. This is useful if you want to access Simidude but have no permission to install your own software, maybe because you’re setting up your client’s machine and want to use Simidude to transfer data back and forth. Here is a more <a href="../blog/2009/version-13-beta-of-the-network-clipboard-agynamix-simidude-is-coming/">in depth article</a> about this new exiting feature.</li>
<li><strong>Save compressed…</strong> Simidude now offers a way to quickly save any text, image, file or directory in ZIP compressed format. To do this simply right click on an entry and choose “Save compressed…”. That is actually the most efficient way to get some text stuffed into a compressed file: copy the text passage to clipboard, after it occurs in Simidude click “Save compressed…”, change the file name if you want and hit that big “Save” button. That’s it you’re done.</li>
<li><strong>Restore the Clipboard after a reboot.</strong> There is now an option in the preferences, if set the current content of the clipboard will be saved to disk. After a restart Simidude  checks if the clipboard is still empty. If that is the case the saved entry will be restored. It was a bit hard to test because I didn’t find a way to really empty the clipboard (on Mac) other then rebooting the machine…</li>
<li><strong>Some minor GUI improvements.</strong> There is no Exit-Button in the toolbar any more that might have caused trouble.</li>
<li>Finally there are 64bit releases for Windows and Linux. I have tested them on Windows 64bit and Ubuntu 64. If you have a 64 bit machine please make sure to try them out and report back any misbehavior.</li>
<li><strong>A list of IP addresses or network names to connect after launch.</strong> In the preferences you can now add IP addresses or network names of machines you wish to always connect to. This option is intended to be used to connect to machines in different subnets or in those rare cases when your network configuration prohibits the sending of broadcast messages which Simidude uses to find other clients.</li>
<li><strong>The modifier key can be changed.</strong> Available options are: &#8220;Ctrl&#8221; on Windows or &#8220;Apple&#8221; on Mac, &#8220;Shift&#8221; and &#8220;Alt&#8221;.<br />
The modifier key for instance alternates the behavior of a double click on a Simidude entry. Without holding the modifier key the entry will be opened in the chosen application (see below), holding the modifier key activates that clicked entry (puts it into the clipboard)</li>
<li><strong>Select an application for opening Simidude entries.</strong> In the preferences you can now set an application for each entry type (Text, Image or File/Folder). When double clicking of a Simidude entry that data will then be opened within the specified application.</li>
</ul>
<p>This new and exciting version can be found on our <a href="http://www.simidude.com/download">download page</a>.</p>
<p>If you have suggestions or questions please use our <a href="http://helpdesk.agynamix.de/index.php?pg=request">helpdesk</a> or <a href="mailto:contact@agynamix.de">email address</a> to contact us. We are excited to hear from you!</p>
<p>Have a great day!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/simidude-130-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beta 1 of AGYNAMIX Simidude, the cross platform network clipboard is available</title>
		<link>http://www.agynamix.de/blog/simidude-130b1-available/</link>
		<comments>http://www.agynamix.de/blog/simidude-130b1-available/#comments</comments>
		<pubDate>Tue, 26 May 2009 17:58:54 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Newsletter]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=306</guid>
		<description><![CDATA[Hi everybody, thanks for waiting so long!
Today I release the first beta of Simidude 1.3.0 to the public. I&#8217;m using this version internally but still, it&#8217;s not as widely tested as 1.2.0.
These are some of the new features of Simidude 1.3.0:

An embedded HTTP server. The embedded HTTP server allows you to access Simidude entries from [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Hi everybody, thanks for waiting so long!</p>
<p>Today I release the first beta of Simidude 1.3.0 to the public. I&#8217;m using this version internally but still, it&#8217;s not as widely tested as 1.2.0.</p>
<p>These are some of the new features of Simidude 1.3.0:</p>
<ul>
<li><strong>An embedded HTTP server</strong>. The embedded HTTP server allows you to access Simidude entries from any machines that has a browser installed. This is useful if you want to access Simidude but have no permission to install your own software, maybe because you&#8217;re setting up your client&#8217;s machine and want to use Simidude to transfer data back and forth. Here is a more <a href="http://www.simidude.com/blog/2009/version-13-beta-of-the-network-clipboard-agynamix-simidude-is-coming/">in depth article</a> about this new exiting feature.</li>
<li><strong>Save compressed&#8230;</strong> Simidude now offers a way to quickly save any text, image, file or directory in ZIP compressed format. To do this simply right click on an entry and choose &#8220;Save compressed&#8230;&#8221;. That is actually the most efficient way to get some text stuffed into a compressed file: copy the text passage to clipboard, after it occurs in Simidude click &#8220;Save compressed&#8230;&#8221;, change the file name if you want and hit that big &#8220;Save&#8221; button. That&#8217;s it you&#8217;re done.</li>
<li><strong>Restore the Clipboard after a reboot.</strong> There is now an option in the preferences, if set the current content of the clipboard will be saved to disk. After a restart Simidude  checks if the clipboard is still empty. If that is the case the saved entry will be restored. It was a bit hard to test because I didn&#8217;t find a way to really empty the clipboard (on Mac) other then rebooting the machine&#8230;</li>
<li><strong>Some minor GUI improvements.</strong> There is no Exit-Button in the toolbar any more that might have caused trouble.</li>
<li>Of course there where some bugs left for the purpose of being cleaned up later.</li>
<li>Finally there are 64bit releases for Windows and Linux. I have tested them on Windows 64bit and Ubuntu 64. If you have a 64 bit machine please make sure to try them out and report back any misbehavior.</li>
</ul>
<p>So here we go. I do not yet add the beta release to the update notifier. If you want to try it out please download the beta from here.</p>
<ul>
<li><a href="http://v2.agynamix.de/wp-content/uploads/2009/05/simidude-win32-1_3_0b1.exe">Simidude 1.3.0b1 for Windows 32bit</a></li>
<li><a href="http://v2.agynamix.de/wp-content/uploads/2009/05/simidude-win64-1_3_0b11.exe">Simidude 1.3.0b1 for Windows 64bit</a></li>
<li><a href="http://www.simidude.com/wp-content/uploads/2009/05/simidude-osx-1_3_0b1.dmg">Simidude 1.3.0b1 for Mac OS X</a></li>
<li><a href="http://www.simidude.com/wp-content/uploads/2009/05/simidude-linux_x86-1_3_0b1.sh">Simidude 1.3.0b1 for Linux 32bit</a></li>
<li><a href="http://www.simidude.com/wp-content/uploads/2009/05/simidude-linux_x86_64-1_3_0b1.sh">Simidude 1.3.0b1 for Linux 64bit</a></li>
</ul>
<p>Please send your suggestions or bug reports to <a href="mailto:contact@agynamix.de">contact@agynamix.de</a> or better yet use the <a href="http://helpdesk.agynamix.de/index.php?pg=request">web form</a>- thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/simidude-130b1-available/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Version 1.3 Beta of the Network Clipboard AGYNAMIX Simidude is coming</title>
		<link>http://www.agynamix.de/blog/version-13-beta-of-the-network-clipboard-agynamix-simidude-is-coming/</link>
		<comments>http://www.agynamix.de/blog/version-13-beta-of-the-network-clipboard-agynamix-simidude-is-coming/#comments</comments>
		<pubDate>Thu, 21 May 2009 08:54:24 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Newsletter]]></category>
		<category><![CDATA[Simidude]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=303</guid>
		<description><![CDATA[It has been quiet around here for a while, I know. I had been way too busy with that boring stuff that pays my bills.
Yet I managed to scratch of time to work on Simidude. I got a lot of feedback from my customers and with the next version 1.3 and the following one I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>It has been quiet around here for a while, I know. I had been way too busy with that boring stuff that pays my bills.</p>
<p>Yet I managed to scratch of time to work on Simidude. I got a lot of feedback from my customers and with the next version 1.3 and the following one I&#8217;m trying to incorporate those requests.</p>
<p>So here&#8217;s a first sneak peak of a major new feature in version 1.3:</p>
<p><a href="http://v2.agynamix.de/wp-content/uploads/2009/05/simidude-remote-access.jpg"><br />
<img class="aligncenter size-full wp-image-304" title="Simidude Remote Access" src="http://v2.agynamix.de/wp-content/uploads/2009/05/simidude-remote-access.jpg" alt="" width="500" height="390" /></a></p>
<p>Version 1.3 will come along with an embedded HTTP server. I have implemented that thing myself and didn&#8217;t take some out of the box servlet container to make sure the memory footprint doesn&#8217;t jump into the skies.</p>
<p>The HTTP server is very simplistic- in this version it will allow you to browse all entries, select a specific one for preview and then download that entry as is or as a ZIP file.</p>
<p>This feature was requested by people who use Simidude to install new machines where they&#8217;re not allowed to install their own software. Since a browser should be present on any machine with some kind of windowing system they can drag their setup files unto Simidude on one machine and then access that list of files via a browser from the machine they wish to setup. They just need to make sure the browser is installed before trying to use it <img src='http://www.agynamix.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>As another new feature I have added compression of entries. You can now save an entry as a compressed ZIP file which might come in handy for instance if you quickly want to convert clipboard text into a compressed file. This is a new option which I will add to the main Simidude gui before releasing 1.3.</p>
<p>Please note that when downloading directories via the browser view they will always be compressed and then served as one big file.</p>
<p>Some users have requested an option to save the latest clipboard contents before Simidude stops and then reload that contents later. Using this feature Simidude could restore the clipboard contents after a reboot for instance. This is a small and handy feature which I&#8217;m also trying to put into 1.3.</p>
<p>After the 1.3 release which I want to send out beginning of June if no show stopping bugs are found I will do some gui cleanup and improvements that make the application easier and more fun to use.</p>
<p>If you have feature requests for Simidude for an upcoming release please let me know!</p>
<p>I&#8217;m working hard on this release over the coming weekend. If someone would like to volunteer as a beta tester please give me a note! The communication protocol did not change so you do not need to update all your Simidude installations, just one. The new version will talk to the older ones just fine.</p>
<p>This update will be free to all existing customers.</p>
<p>Have a great day,</p>
<p>Torsten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/version-13-beta-of-the-network-clipboard-agynamix-simidude-is-coming/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Macify a SWT application in a cross platform way</title>
		<link>http://www.agynamix.de/blog/macify-a-swt-application-in-a-cross-platform-way/</link>
		<comments>http://www.agynamix.de/blog/macify-a-swt-application-in-a-cross-platform-way/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 11:06:19 +0000</pubDate>
		<dc:creator>tuhlmann</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://www.simidude.com/?p=189</guid>
		<description><![CDATA[For the next release of Simidude I wanted a deeper integration into the supported platforms, specifically Mac OS X.
There are some sites on the web that point out an integration of Swing into OS X but rather few for the SWT toolkit which I use. On such very helpful site is this on. It leads [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>For the next release of Simidude I wanted a deeper integration into the supported platforms, specifically Mac OS X.</p>
<p>There are some sites on the web that point out an integration of Swing into OS X but rather few for the SWT toolkit which I use. On such very helpful site is <a href="http://www.cafeaulait.org/slides/eclipseworld2005/macifying/Macifying_SWT.html">this on</a>. It leads to an implementation of CarbonUIEnhancer as described in <a href="http://www.azureuswiki.com/index.php/PreferencesAndAbout">the Azureus wiki</a> that uses internal API to access the Macintosh application menu and plant &#8220;About&#8221; and &#8220;Preferences&#8221; menu entries. However the drawback with this solution is that it is hard coded against carbon internals. That means it either only is compilable with the carbon jar in your class path or you need to have some stub implementation of the carbon api and swap both depending on the platform you&#8217;ll be running on.</p>
<p><span id="more-408"></span></p>
<p><a class="thickbox" title="A Preview of Simidude 1.1.0" href="http://v2.agynamix.de/wp-content/uploads/2008/12/simidude_110.jpg"><img src="http://v2.agynamix.de/wp-content/uploads/2008/12/simidude_110_100px.jpg" alt="" width="100" height="67" /></a><br />
In addition there is the &#8220;Quit&#8221; menu entry in the OS X application menu that should work accordingly. In the following article I&#8217;d like to explain my approach to macifying Simidude.</p>
<p>First thing you would need to do is to conditionally exclude the 3 (&#8220;Quit&#8221;, &#8220;About&#8221;, &#8220;Preferences&#8221;) menu entries. I use a method PlatformUtil.isMacOS() to determine if the application run on OS X. The method basically the two system properties &#8220;os.name&#8221; and &#8220;os.arch&#8221; to find out the platform it runs on. For Mac it checks against &#8220;os.name==&#8217;Mac OS X&#8217;&#8221; and &#8220;os.arch==&#8217;i386&#8242;&#8221;. So when you build your menu you would have to program something like this for all three menu entries:</p>
<p>[sourcecode language='java']<br />
if (!PlatformUtils.isMacOs())<br />
{<br />
  filemenu.add(new Separator());<br />
  filemenu.add(exitAction);<br />
}<br />
[/sourcecode]</p>
<p>To hook your application into the &#8220;Quit&#8221; menu entry you have to add an SWT listener like so:</p>
<p>[sourcecode language='java']<br />
display.addListener(SWT.Close, new Listener() {<br />
  public void handleEvent(Event event)<br />
  {<br />
    shutdownApplication();<br />
    // could veto<br />
    // event.doit = false;<br />
  }<br />
});<br />
[/sourcecode]</p>
<p>Now to the CarbonUIEnhancer. I started with the code from the Azureus wiki and transformed it the way it only uses reflection to access the carbon api. So it still does the same thing but without compile time dependencies upon carbon.</p>
<p>Somewhere in your code you have to instantiate it like so:</p>
<p>[sourcecode language='java']<br />
if (PlatformUtils.isMacOs())<br />
{<br />
  try<br />
  {<br />
    CarbonUIEnhancer carbonUI = new CarbonUIEnhancer(&#8220;About &#8220;+ApplicationInfo.getApplicationName());<br />
    carbonUI.hookApplicationMenu(getShell().getDisplay(), new Listener() {<br />
      public void handleEvent(Event event)<br />
      {<br />
        shutdownApplicationGui();<br />
        // could veto<br />
        // event.doit = false;<br />
      }<br />
    }, aboutAction, preferencesAction);<br />
  } catch (Exception e)<br />
  {<br />
    // handle exception<br />
  }<br />
}<br />
[/sourcecode]</p>
<p>I have changed the &#8220;hookApplicationMenu&#8221; method call. It now takes IAction&#8217;s as parameters as well as the SWT listener that will listen to the Close event.</p>
<p>I have uploaded the source code here:</p>
<p><a href="http://v2.agynamix.de/wp-content/uploads/2008/12/carbonuienhancer.zip">CarbonUIEnhancer.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agynamix.de/blog/macify-a-swt-application-in-a-cross-platform-way/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
