<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3" -->
<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/"
	>

<channel>
	<title>The FluorineFx Weblog</title>
	<link>http://blog.fluorinefx.com</link>
	<description>Adventures In Coding &#38; Serious Computing</description>
	<pubDate>Sat, 22 Nov 2008 15:44:04 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3</generator>
	<language>en</language>
			<item>
		<title>Silverlight and Flash/Flex RPC with the FluorineFx Silverlight library</title>
		<link>http://blog.fluorinefx.com/?p=17</link>
		<comments>http://blog.fluorinefx.com/?p=17#comments</comments>
		<pubDate>Wed, 24 Sep 2008 12:56:56 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[FluorineFx]]></category>

		<category><![CDATA[Silverlight]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Remoting]]></category>

		<category><![CDATA[rpc]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=17</guid>
		<description><![CDATA[The last post of the Silverlight series that should have been the first one…
Network Security Access Restrictions in Silverlight 2
If the case of RPC over HTTP the Silverlight 2 runtime will try to download a security policy file using the HTTP protocol. The runtime tries to download a Silverlight policy file with a name of [...]]]></description>
			<content:encoded><![CDATA[<p>The last post of the Silverlight series that should have been the first one…</p>
<p><strong>Network Security Access Restrictions in Silverlight 2</strong><br />
If the case of RPC over HTTP the Silverlight 2 runtime will try to download a security policy file using the HTTP protocol. The runtime tries to download a Silverlight policy file with a name of &#8220;clientaccesspolicy.xml&#8221; at the root of the requested target domain using the HTTP protocol (it also accepts &#8220;crossdomain.xml&#8221; at the root of the requested target domain)<br />
In our sample I’ve put the following clientaccesspolicy.xml file in the web site root:</p>
<pre class="code0">
<span class="code1">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;</span>
<span class="code2">&lt;access-policy&gt;</span>
    <span class="code2">&lt;cross-domain-access&gt;</span>
        <span class="code2">&lt;policy&gt;</span>
            <span class="code2">&lt;allow-from </span><span class="code3">http-request-headers</span><span class="code1">=&#8221;*&#8221;</span><span class="code2">&gt;</span>
                <span class="code2">&lt;domain </span><span class="code3">uri</span><span class="code1">=&#8221;*&#8221;</span><span class="code2">/&gt;</span>
            <span class="code2">&lt;/allow-from&gt;</span>
            <span class="code2">&lt;grant-to&gt;</span>
                <span class="code2">&lt;resource </span><span class="code3">path</span><span class="code1">=&#8221;/&#8221; </span><span class="code3">include-subpaths</span><span class="code1">=&#8221;true&#8221;</span><span class="code2">/&gt;</span>
            <span class="code2">&lt;/grant-to&gt;</span>
        <span class="code2">&lt;/policy&gt;</span>
    <span class="code2">&lt;/cross-domain-access&gt;</span>
<span class="code2">&lt;/access-policy&gt;</span></pre>
<p><strong>The ASP.NET application</strong></p>
<p>The web application is taken form the FluorineFx samples [FluorineFx InstallDir]\Samples\Flex\Remoting\DataAccess and exposes a service returning a DataTable as strongly typed CustomerVO objects:</p>
<pre class="code0">
<span class="code1">[</span><span class="code2">DataTableType</span><span class="code1">(</span><span class="code3">&#8220;Flex.CustomerVO&#8221;</span><span class="code1">)]</span>
<span class="code1">[</span><span class="code2">Description</span><span class="code1">(</span><span class="code3">&#8220;Filter customer by phone area code&#8221;</span><span class="code1">)]</span>
<span class="code4">public </span><span class="code5">DataTable </span><span class="code2">GetCustomers</span><span class="code1">(</span><span class="code6">string </span><span class="code5">areaCode</span><span class="code1">)</span>
<span class="code1">{</span>
<span class="code7">using </span><span class="code1">(</span><span class="code5">OleDbConnection connection </span><span class="code1">= </span><span class="code8">new </span><span class="code2">OleDbConnection</span><span class="code1">(</span><span class="code2">GetConnectionString</span><span class="code1">()))</span>
      <span class="code1">{</span>
      	<span class="code5">OleDbCommand command </span><span class="code1">= </span><span class="code8">new </span><span class="code2">OleDbCommand</span><span class="code1">(</span><span class="code3">&#8220;SELECT firstname, lastname, phone FROM [customer] WHERE phone LIKE &#8216;&#8221; </span><span class="code1">+ </span><span class="code5">areaCode </span><span class="code1">+ </span><span class="code3">&#8220;%&#8217;&#8221;</span><span class="code1">, </span><span class="code5">connection</span><span class="code1">);</span>
            <span class="code5">connection</span><span class="code1">.</span><span class="code2">Open</span><span class="code1">();</span>
            <span class="code5">OleDbDataAdapter adapter </span><span class="code1">= </span><span class="code8">new </span><span class="code2">OleDbDataAdapter</span><span class="code1">(</span><span class="code5">command</span><span class="code1">);</span>
            <span class="code5">DataTable result </span><span class="code1">= </span><span class="code8">new </span><span class="code2">DataTable</span><span class="code1">();</span>
            <span class="code5">adapter</span><span class="code1">.</span><span class="code2">Fill</span><span class="code1">(</span><span class="code5">result</span><span class="code1">);</span>
            <span class="code9">return </span><span class="code5">result</span><span class="code1">;</span>
       <span class="code1">}</span>
<span class="code1">}</span></pre>
<p>The code snippet above retrieves a DataTable and instructs the gateway to return the result as a collection (ArrayCollection) of “Flex.CustomerVO” objects (the properties of the object will be the column names).</p>
<p><strong>Creating the Silverlight project</strong></p>
<p>Start Visual Studio 2008, create a new Silverlight Application (I’ve named it SilverlightApplication) a new web application to host the Silverlight client (the web application can be the same as the one exposing the remoting services).</p>
<p>Put the following XAML markup in the Page.xaml file:</p>
<pre class="code0">
<span class="code1">&lt;UserControl </span><span class="code2">xmlns:my</span><span class="code3">=&#8221;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data&#8221;  </span><span class="code2">x:Class</span><span class="code3">=&#8221;SilverlightApplication.Page&#8221;</span>
    <span class="code2">xmlns</span><span class="code3">=&#8221;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221; </span>
    <span class="code2">xmlns:x</span><span class="code3">=&#8221;http://schemas.microsoft.com/winfx/2006/xaml&#8221; </span>
    <span class="code2">Width</span><span class="code3">=&#8221;400&#8243; </span><span class="code2">Height</span><span class="code3">=&#8221;300&#8243;</span><span class="code1">&gt;</span>
    <span class="code1">&lt;Grid </span><span class="code2">x:Name</span><span class="code3">=&#8221;LayoutRoot&#8221;</span><span class="code1">&gt;</span>
        <span class="code1">&lt;Grid.RowDefinitions&gt;</span>
            <span class="code1">&lt;RowDefinition </span><span class="code2">Height</span><span class="code3">=&#8221;40&#8243; </span><span class="code1">/&gt;</span>
            <span class="code1">&lt;RowDefinition /&gt;</span>
            <span class="code1">&lt;RowDefinition </span><span class="code2">Height</span><span class="code3">=&#8221;80&#8243; </span><span class="code1">/&gt;</span>
        <span class="code1">&lt;/Grid.RowDefinitions&gt;</span>
        <span class="code1">&lt;StackPanel </span><span class="code2">Orientation</span><span class="code3">=&#8221;Horizontal&#8221;</span>
                <span class="code2">HorizontalAlignment</span><span class="code3">=&#8221;Left&#8221;</span>
                <span class="code2">Grid.Row</span><span class="code3">=&#8221;0&#8243;</span><span class="code1">&gt;</span>
            <span class="code1">&lt;Grid&gt;</span>
                <span class="code1">&lt;Grid.ColumnDefinitions&gt;</span>
                    <span class="code1">&lt;ColumnDefinition </span><span class="code2">Width</span><span class="code3">=&#8221;300&#8243;</span><span class="code1">/&gt;</span>
                    <span class="code1">&lt;ColumnDefinition </span><span class="code2">Width</span><span class="code3">=&#8221;100&#8243;</span><span class="code1">/&gt;</span>
                <span class="code1">&lt;/Grid.ColumnDefinitions&gt;</span>
                <span class="code1">&lt;TextBox </span><span class="code2">x:Name</span><span class="code3">=&#8221;txtSearch&#8221; </span><span class="code2">Grid.Column</span><span class="code3">=&#8221;0&#8243; </span><span class="code2">FontSize</span><span class="code3">=&#8221;12&#8243; </span><span class="code2">Padding</span><span class="code3">=&#8221;5&#8243; </span><span class="code2">Height</span><span class="code3">=&#8221;26&#8243; </span><span class="code2">Margin</span><span class="code3">=&#8221;0,0,5,0&#8243;</span><span class="code1">/&gt;</span>
                <span class="code1">&lt;Button </span><span class="code2">Content</span><span class="code3">=&#8221;Get Customers&#8221;</span>
                  <span class="code2">Padding</span><span class="code3">=&#8221;5&#8243;</span>
                  <span class="code2">Margin</span><span class="code3">=&#8221;0,0,0,0&#8243;</span>
                  <span class="code2">Height</span><span class="code3">=&#8221;26&#8243;</span>
                  <span class="code2">Grid.Column</span><span class="code3">=&#8221;1&#8243;</span>
                  <span class="code2">x:Name</span><span class="code3">=&#8221;btnPopulate&#8221;</span>
                  <span class="code2">Click</span><span class="code3">=&#8221;Button_Click&#8221; </span><span class="code1">/&gt;</span>
            <span class="code1">&lt;/Grid&gt;</span>
        <span class="code1">&lt;/StackPanel&gt;</span>
        <span class="code1">&lt;my:DataGrid </span><span class="code2">x:Name</span><span class="code3">=&#8221;customersDataGrid&#8221; </span><span class="code2">IsReadOnly</span><span class="code3">=&#8221;True&#8221;</span>
                 <span class="code2">Grid.Row</span><span class="code3">=&#8221;1&#8243; </span><span class="code2">RowHeight</span><span class="code3">=&#8221;30&#8243;</span>
                 <span class="code2">AutoGenerateColumns</span><span class="code3">=&#8221;True&#8221;</span><span class="code1">&gt;</span>
        <span class="code1">&lt;/my:DataGrid&gt;</span>
        <span class="code1">&lt;TextBox </span><span class="code2">x:Name</span><span class="code3">=&#8221;TxtLog&#8221; </span><span class="code2">Width</span><span class="code3">=&#8221;400&#8243; </span><span class="code2">VerticalScrollBarVisibility</span><span class="code3">=&#8221;Visible&#8221; </span><span class="code2">HorizontalScrollBarVisibility</span><span class="code3">=&#8221;Visible&#8221;  </span><span class="code2">Grid.Row</span><span class="code3">=&#8221;2&#8243; </span><span class="code1">/&gt;</span>
    <span class="code1">&lt;/Grid&gt;</span>
<span class="code1">&lt;/UserControl&gt;</span></pre>
<p>In the Solution Explorer add a reference to FluorineFx.dll (note: we are adding the FluorineFx Silverlight client library to the Silverlight application and not the remoting gateway!). The assembly should be located in the “Bin\net\Silverlight2.0” folder.</p>
<p>Add the following code to the Page.xaml.cs code file:</p>
<pre class="code0">
<span class="code1">using </span><span class="code2">System</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Collections</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Collections</span><span class="code3">.</span><span class="code2">Generic</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Linq</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Xml</span><span class="code3">.</span><span class="code2">Linq</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Net</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Controls</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Documents</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Input</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Media</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Media</span><span class="code3">.</span><span class="code2">Animation</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Shapes</span><span class="code3">;</span>   

<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Net</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">.</span><span class="code2">Service</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">AMF3</span><span class="code3">;</span>   

<span class="code1">namespace </span><span class="code2">SilverlightApplication</span>
<span class="code3">{</span>
    <span class="code4">public </span><span class="code5">partial </span><span class="code6">class </span><span class="code2">Page : UserControl</span>
    <span class="code3">{</span>
        <span class="code2">NetConnection _netConnection</span><span class="code3">;</span>   

        <span class="code4">public </span><span class="code7">Page</span><span class="code3">()</span>
        <span class="code3">{</span>
            <span class="code7">InitializeComponent</span><span class="code3">();</span>   

            <span class="code8">// Create NetConnection client</span>
            <span class="code2">_netConnection </span><span class="code3">= </span><span class="code9">new </span><span class="code7">NetConnection</span><span class="code3">();</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">ObjectEncoding </span><span class="code3">= </span><span class="code2">ObjectEncoding</span><span class="code3">.</span><span class="code2">AMF3</span><span class="code3">;</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">NetStatus </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">NetStatusHandler</span><span class="code3">(</span><span class="code2">_netConnection_NetStatus</span><span class="code3">);</span>
            <span class="code8">// Put your gateway url here</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code7">Connect</span><span class="code3">(</span><span class="code10">&#8220;http://localhost:1781/SilverlightApplicationWeb/Gateway.aspx&#8221;</span><span class="code3">);</span>   

        <span class="code3">}</span>   

        <span class="code6">void </span><span class="code7">_netConnection_NetStatus</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">NetStatusEventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code6">string </span><span class="code2">level </span><span class="code3">= </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code10">&#8220;level&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">;</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">level </span><span class="code3">== </span><span class="code10">&#8220;error&#8221;</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code8">//received an error</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code10">&#8220;Error: &#8221; </span><span class="code3">+ </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code10">&#8220;code&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">);</span>
            <span class="code3">}</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">level </span><span class="code3">== </span><span class="code10">&#8220;status&#8221;</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code10">&#8220;Status: &#8221; </span><span class="code3">+ </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code10">&#8220;code&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">);</span>
            <span class="code3">}</span>
        <span class="code3">}</span>   

        <span class="code4">private </span><span class="code6">void </span><span class="code7">Button_Click</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">RoutedEventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code7">Call</span><span class="code3">(</span><span class="code10">&#8220;ServiceLibrary.MyDataService.GetCustomers&#8221;</span><span class="code3">, </span><span class="code9">new </span><span class="code7">GetCustomersHandler</span><span class="code3">(</span><span class="code11">this</span><span class="code3">), </span><span class="code9">new </span><span class="code6">object</span><span class="code3">[] { </span><span class="code2">txtSearch</span><span class="code3">.</span><span class="code2">Text </span><span class="code3">});</span>
        <span class="code3">}</span>   

        <span class="code4">public </span><span class="code6">void </span><span class="code7">Log</span><span class="code3">(</span><span class="code6">string </span><span class="code2">msg</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">Dispatcher</span><span class="code3">.</span><span class="code7">BeginInvoke</span><span class="code3">(</span><span class="code6">delegate</span><span class="code3">()</span>
            <span class="code3">{</span>
                <span class="code2">TxtLog</span><span class="code3">.</span><span class="code2">Text </span><span class="code3">+= </span><span class="code2">msg </span><span class="code3">+ </span><span class="code10">&#8220;\r\n&#8221;</span><span class="code3">;</span>
            <span class="code3">});</span>
        <span class="code3">}</span>   

        <span class="code4">public </span><span class="code6">void </span><span class="code7">Bind</span><span class="code3">(</span><span class="code2">IList list</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">Dispatcher</span><span class="code3">.</span><span class="code7">BeginInvoke</span><span class="code3">(</span><span class="code6">delegate</span><span class="code3">()</span>
            <span class="code3">{</span>
                <span class="code2">customersDataGrid</span><span class="code3">.</span><span class="code2">ItemsSource </span><span class="code3">= </span><span class="code2">list</span><span class="code3">;</span>
            <span class="code3">});</span>
        <span class="code3">}</span>   

    <span class="code3">}</span>   

    <span class="code4">public </span><span class="code6">class </span><span class="code2">GetCustomersHandler : IPendingServiceCallback</span>
    <span class="code3">{</span>
        <span class="code2">Page _page</span><span class="code3">;</span>   

        <span class="code4">public </span><span class="code7">GetCustomersHandler</span><span class="code3">(</span><span class="code2">Page page</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">_page </span><span class="code3">= </span><span class="code2">page</span><span class="code3">;</span>
        <span class="code3">}</span>   

        <span class="code4">public </span><span class="code6">void </span><span class="code7">ResultReceived</span><span class="code3">(</span><span class="code2">IPendingServiceCall call</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code6">object </span><span class="code2">result </span><span class="code3">= </span><span class="code2">call</span><span class="code3">.</span><span class="code2">Result</span><span class="code3">;</span>   

            <span class="code8">//DataAccess sample sends back an ArrayCollection (AMF3)</span>
            <span class="code2">ArrayCollection items </span><span class="code3">= </span><span class="code2">result </span><span class="code9">as </span><span class="code2">ArrayCollection</span><span class="code3">;</span>
            <span class="code4">foreach </span><span class="code3">(</span><span class="code6">object </span><span class="code2">item </span><span class="code4">in </span><span class="code2">items</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code2">Flex</span><span class="code3">.</span><span class="code2">CustomerVO customer </span><span class="code3">= </span><span class="code2">item </span><span class="code9">as </span><span class="code2">Flex</span><span class="code3">.</span><span class="code2">CustomerVO</span><span class="code3">;</span>
                <span class="code2">_page</span><span class="code3">.</span><span class="code7">Log</span><span class="code3">(</span><span class="code2">customer</span><span class="code3">.</span><span class="code7">ToString</span><span class="code3">());</span>
            <span class="code3">}</span>
            <span class="code2">_page</span><span class="code3">.</span><span class="code7">Bind</span><span class="code3">(</span><span class="code2">items</span><span class="code3">);</span>
        <span class="code3">}</span>
    <span class="code3">}</span>
<span class="code3">}</span></pre>
<p>Then add a CustomerVO class to the Silverlight application (note the namespace is called Flex so class mapping will work automatically)</p>
<pre class="code0">
<span class="code1">using </span><span class="code2">System</span><span class="code3">;</span>   

<span class="code1">namespace </span><span class="code2">Flex</span>
<span class="code3">{</span>
    <span class="code4">public </span><span class="code5">class </span><span class="code2">CustomerVO</span>
    <span class="code3">{</span>
        <span class="code5">string </span><span class="code2">_firstname</span><span class="code3">;</span>   

        <span class="code4">public </span><span class="code5">string </span><span class="code2">firstname</span>
        <span class="code3">{</span>
            <span class="code6">get </span><span class="code3">{ </span><span class="code7">return </span><span class="code2">_firstname</span><span class="code3">; }</span>
            <span class="code6">set </span><span class="code3">{ </span><span class="code2">_firstname </span><span class="code3">= </span><span class="code8">value</span><span class="code3">; }</span>
        <span class="code3">}</span>   

        <span class="code5">string </span><span class="code2">_lastname</span><span class="code3">;</span>   

        <span class="code4">public </span><span class="code5">string </span><span class="code2">lastname</span>
        <span class="code3">{</span>
            <span class="code6">get </span><span class="code3">{ </span><span class="code7">return </span><span class="code2">_lastname</span><span class="code3">; }</span>
            <span class="code6">set </span><span class="code3">{ </span><span class="code2">_lastname </span><span class="code3">= </span><span class="code8">value</span><span class="code3">; }</span>
        <span class="code3">}</span>   

        <span class="code5">string </span><span class="code2">_phone</span><span class="code3">;</span>   

        <span class="code4">public </span><span class="code5">string </span><span class="code2">phone</span>
        <span class="code3">{</span>
            <span class="code6">get </span><span class="code3">{ </span><span class="code7">return </span><span class="code2">_phone</span><span class="code3">; }</span>
            <span class="code6">set </span><span class="code3">{ </span><span class="code2">_phone </span><span class="code3">= </span><span class="code8">value</span><span class="code3">; }</span>
        <span class="code3">}</span>
    <span class="code3">}</span>
<span class="code3">}</span></pre>
<p>Run the application.</p>
<p>Here is a screenshot of the running application</p>
<p><a href="http://blog.fluorinefx.com/wp-content/uploads/2008/09/silverlight_remoting.PNG"><img src="http://blog.fluorinefx.com/wp-content/uploads/2008/09/silverlight_remoting.PNG" /></a></p>
<p>Update: the Silverlight library is available for <a href="http://www.fluorinefx.com/download.html">download</a> in the latest FluorineFx version</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=17</wfw:commentRss>
		</item>
		<item>
		<title>Silverlight and FluorineFx integration with the FluorineFx Silverlight library</title>
		<link>http://blog.fluorinefx.com/?p=15</link>
		<comments>http://blog.fluorinefx.com/?p=15#comments</comments>
		<pubDate>Tue, 16 Sep 2008 22:48:02 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[FluorineFx]]></category>

		<category><![CDATA[Silverlight]]></category>

		<category><![CDATA[RTMP]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=15</guid>
		<description><![CDATA[In the previous entry I was showing how to connect a Silverlight client to the Flash Media Server. This guide shows how to connect Silverlight to a FluorineFx powered ASP.NET web site.
Network Security Access Restrictions in Silverlight 2
In order to have the client able to connect you must have a policy server running and to [...]]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://blog.fluorinefx.com/?p=13">previous entry</a> I was showing how to connect a Silverlight client to the Flash Media Server. This guide shows how to connect Silverlight to a FluorineFx powered ASP.NET web site.</p>
<p><strong>Network Security Access Restrictions in Silverlight 2</strong><br />
In order to have the client able to connect you must have a policy server running and to configure FluorineFx’s RTMP server to listen in the 4502-4534 port range.</p>
<p>You can use the FluorineFx Silverlight Policy Server provided OR to configure the gateway to start internally the policy server. This requires the following settings in the web.config file:</p>
<pre class="code0">
  <span class="code1">&lt;fluorinefx&gt;</span>
    <span class="code1">&lt;settings&gt;</span>
	<span class="code2">…</span>
      <span class="code1">&lt;silverlight&gt;</span>
        <span class="code1">&lt;policyServer </span><span class="code3">enable</span><span class="code4">=&#8221;true&#8221; </span><span class="code3">policyFile</span><span class="code4">=&#8221;~clientaccesspolicy.xml&#8221;</span><span class="code1">/&gt;</span>
      <span class="code1">&lt;/silverlight&gt;</span>
	<span class="code2">…</span>
    <span class="code1">&lt;/settings&gt;</span>
  <span class="code1">&lt;/fluorinefx&gt;</span></pre>
<p>The clientaccesspolicy.xml file must be located in the web site root.</p>
<p>Define a RTMP channel in the service configuration file with the endpoint url set as uri=&#8221;rtmp://{server.name}:4502&#8243;</p>
<p><strong>The RTM application</strong></p>
<p>Add the “apps” folder to the web application and create a new app.config file</p>
<pre class="code0">
<span class="code1">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;</span>
<span class="code2">&lt;configuration&gt;</span>
  <span class="code2">&lt;application-handler </span><span class="code3">type</span><span class="code1">=&#8221;ServiceLibrary.SOTestApplication&#8221;</span><span class="code2">/&gt;</span>
<span class="code2">&lt;/configuration&gt;</span></pre>
<p>In the service library (or in the web site project if medium trust is not enforced) define the application handler class:</p>
<pre class="code0">
<span class="code1">using </span><span class="code2">System</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Adapter</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">.</span><span class="code2">SO</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">.</span><span class="code2">Service</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">.</span><span class="code2">Stream</span><span class="code3">;</span> 

<span class="code1">namespace </span><span class="code2">ServiceLibrary</span>
<span class="code3">{</span>
    <span class="code4">public </span><span class="code5">class </span><span class="code2">SOTestApplication : ApplicationAdapter</span>
    <span class="code3">{</span>
        <span class="code6">int </span><span class="code2">_usersID</span><span class="code3">;</span>
        <span class="code5">string </span><span class="code2">_history</span><span class="code3">;</span> 

        <span class="code4">public </span><span class="code7">SOTestApplication</span><span class="code3">()</span>
	  <span class="code3">{</span>
	  <span class="code3">}</span> 

        <span class="code4">public </span><span class="code8">override </span><span class="code6">bool </span><span class="code7">AppStart</span><span class="code3">(</span><span class="code2">IScope application</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">_usersID </span><span class="code3">= </span><span class="code9">1</span><span class="code3">;</span>
            <span class="code2">_history </span><span class="code3">= </span><span class="code5">string</span><span class="code3">.</span><span class="code2">Empty</span><span class="code3">;</span>
            <span class="code10">this</span><span class="code3">.</span><span class="code7">CreateSharedObject</span><span class="code3">(</span><span class="code10">this</span><span class="code3">.</span><span class="code2">Scope</span><span class="code3">, </span><span class="code11">&#8220;users&#8221;</span><span class="code3">, </span><span class="code12">false</span><span class="code3">);</span>
            <span class="code13">return </span><span class="code10">base</span><span class="code3">.</span><span class="code7">AppStart</span><span class="code3">(</span><span class="code2">application</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code8">override </span><span class="code6">bool </span><span class="code7">AppConnect</span><span class="code3">(</span><span class="code2">IConnection connection</span><span class="code3">, </span><span class="code5">object</span><span class="code3">[] </span><span class="code2">parameters</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code14">lock </span><span class="code3">(</span><span class="code12">typeof</span><span class="code3">(</span><span class="code2">SOTestApplication</span><span class="code3">))</span>
            <span class="code3">{</span>
                <span class="code2">connection</span><span class="code3">.</span><span class="code7">SetAttribute</span><span class="code3">(</span><span class="code11">&#8220;uniqueUserID&#8221;</span><span class="code3">, </span><span class="code2">_usersID</span><span class="code3">);</span>
                <span class="code15">//set the shared object</span>
                <span class="code2">ISharedObject usersSO </span><span class="code3">= </span><span class="code7">GetSharedObject</span><span class="code3">(</span><span class="code10">this</span><span class="code3">.</span><span class="code2">Scope</span><span class="code3">, </span><span class="code11">&#8220;users&#8221;</span><span class="code3">);</span>
                <span class="code2">ASObject aso </span><span class="code3">= </span><span class="code12">new </span><span class="code7">ASObject</span><span class="code3">();</span>
                <span class="code2">aso</span><span class="code3">.</span><span class="code7">Add</span><span class="code3">(</span><span class="code11">&#8220;uniqueUserID&#8221;</span><span class="code3">, </span><span class="code2">_usersID</span><span class="code3">);</span>
                <span class="code2">aso</span><span class="code3">.</span><span class="code7">Add</span><span class="code3">(</span><span class="code11">&#8220;connectStartTime&#8221;</span><span class="code3">, </span><span class="code2">DateTime</span><span class="code3">.</span><span class="code2">Now</span><span class="code3">);</span>
                <span class="code2">usersSO</span><span class="code3">.</span><span class="code7">SetAttribute</span><span class="code3">(</span><span class="code11">&#8220;user&#8221; </span><span class="code3">+ </span><span class="code2">_usersID</span><span class="code3">, </span><span class="code2">aso</span><span class="code3">);</span>
                <span class="code2">_usersID</span><span class="code3">++;</span> 

                <span class="code15">// Call the client function &#8217;setHistory,&#8217; and pass </span>
                <span class="code15">// the initial history</span>
                <span class="code4">if</span><span class="code3">( </span><span class="code2">connection </span><span class="code12">is </span><span class="code2">IServiceCapableConnection </span><span class="code3">)</span>
                    <span class="code3">(</span><span class="code2">connection </span><span class="code12">as </span><span class="code2">IServiceCapableConnection</span><span class="code3">).</span><span class="code7">Invoke</span><span class="code3">(</span><span class="code11">&#8220;setHistory&#8221;</span><span class="code3">, </span><span class="code12">new </span><span class="code5">object</span><span class="code3">[]{</span><span class="code2">_history</span><span class="code3">}, </span><span class="code10">null</span><span class="code3">);</span>
            <span class="code3">}</span>
            <span class="code13">return </span><span class="code10">base</span><span class="code3">.</span><span class="code7">AppConnect</span><span class="code3">(</span><span class="code2">connection</span><span class="code3">, </span><span class="code2">parameters</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code8">override </span><span class="code5">void </span><span class="code7">AppDisconnect</span><span class="code3">(</span><span class="code2">IConnection connection</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code6">int </span><span class="code2">uniqueUserID </span><span class="code3">= (</span><span class="code6">int</span><span class="code3">)</span><span class="code2">connection</span><span class="code3">.</span><span class="code7">GetAttribute</span><span class="code3">(</span><span class="code11">&#8220;uniqueUserID&#8221;</span><span class="code3">);</span>
            <span class="code2">ISharedObject usersSO </span><span class="code3">= </span><span class="code7">GetSharedObject</span><span class="code3">(</span><span class="code10">this</span><span class="code3">.</span><span class="code2">Scope</span><span class="code3">, </span><span class="code11">&#8220;users&#8221;</span><span class="code3">);</span>
            <span class="code4">if</span><span class="code3">( </span><span class="code2">usersSO </span><span class="code3">!= </span><span class="code10">null </span><span class="code3">)</span>
                <span class="code2">usersSO</span><span class="code3">.</span><span class="code7">SetAttribute</span><span class="code3">(</span><span class="code11">&#8220;user&#8221; </span><span class="code3">+ </span><span class="code2">uniqueUserID</span><span class="code3">, </span><span class="code10">null</span><span class="code3">);</span>
            <span class="code10">base</span><span class="code3">.</span><span class="code7">AppDisconnect</span><span class="code3">(</span><span class="code2">connection</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code5">void </span><span class="code7">msgFromClient</span><span class="code3">(</span><span class="code2">IConnection connection</span><span class="code3">, </span><span class="code5">string </span><span class="code2">msg</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code14">lock </span><span class="code3">(</span><span class="code12">typeof</span><span class="code3">(</span><span class="code2">SOTestApplication</span><span class="code3">))</span>
            <span class="code3">{</span>
                <span class="code6">int </span><span class="code2">uniqueUserID </span><span class="code3">= (</span><span class="code6">int</span><span class="code3">)</span><span class="code2">connection</span><span class="code3">.</span><span class="code7">GetAttribute</span><span class="code3">(</span><span class="code11">&#8220;uniqueUserID&#8221;</span><span class="code3">);</span>
                <span class="code2">msg </span><span class="code3">= </span><span class="code11">&#8220;user&#8221; </span><span class="code3">+ </span><span class="code2">uniqueUserID </span><span class="code3">+ </span><span class="code11">&#8220;: &#8221; </span><span class="code3">+ </span><span class="code2">msg </span><span class="code3">+ </span><span class="code11">&#8220;\n&#8221;</span><span class="code3">;</span>
                <span class="code2">_history </span><span class="code3">+= </span><span class="code2">msg</span><span class="code3">;</span>
                <span class="code2">ISharedObject usersSO </span><span class="code3">= </span><span class="code7">GetSharedObject</span><span class="code3">(</span><span class="code10">this</span><span class="code3">.</span><span class="code2">Scope</span><span class="code3">, </span><span class="code11">&#8220;users&#8221;</span><span class="code3">);</span>
                <span class="code2">usersSO</span><span class="code3">.</span><span class="code7">SendMessage</span><span class="code3">(</span><span class="code11">&#8220;msgFromSrvr&#8221;</span><span class="code3">, </span><span class="code12">new </span><span class="code5">object</span><span class="code3">[]{</span><span class="code2">msg</span><span class="code3">});</span>
            <span class="code3">}</span>
        <span class="code3">}</span>
    <span class="code3">}</span>
<span class="code3">}</span></pre>
<p>Create the Silverlight Application project and select the existing web site to host the client. Follow the steps described in the Creating Silverlight project section of the <a href="http://blog.fluorinefx.com/?p=13">previous post</a>.</p>
<p>Run the web application</p>
<p>Here is a screenshot of the running application</p>
<p><a href="http://blog.fluorinefx.com/wp-content/uploads/2008/09/silverlight_fms_chat1.png"><img src="http://blog.fluorinefx.com/wp-content/uploads/2008/09/silverlight_fms_chat1.png" /></a></p>
<p>Get the latest FluorineFx code and binaries from the <a href="http://code.google.com/p/fluorinefx/">SVN repository</a></p>
<p>Update: the Silverlight library is available for <a href="http://www.fluorinefx.com/download.html">download</a> in the latest FluorineFx version</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=15</wfw:commentRss>
		</item>
		<item>
		<title>Silverlight and Flash Media Server integration with the FluorineFx Silverlight library</title>
		<link>http://blog.fluorinefx.com/?p=13</link>
		<comments>http://blog.fluorinefx.com/?p=13#comments</comments>
		<pubDate>Tue, 16 Sep 2008 22:32:54 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[FMS]]></category>

		<category><![CDATA[FluorineFx]]></category>

		<category><![CDATA[Silverlight]]></category>

		<category><![CDATA[Flash Media Server]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=13</guid>
		<description><![CDATA[This sample provides an overview of creating a Silverlight project and connecting it with Flash Media Server using the FluorineFx Silverlight library (Visual Studio 2008 with Silverlight extensions is required).
The sample starts with the following FMS web chat application (sotest.asc):

application.onAppStart = function()
{
	this.usersID = 1;
	this.usersSO = SharedObject.get(&#8220;users&#8221;, false); 

	// Initialize the history of the text share
	application.history [...]]]></description>
			<content:encoded><![CDATA[<p>This sample provides an overview of creating a Silverlight project and connecting it with Flash Media Server using the FluorineFx Silverlight library (Visual Studio 2008 with Silverlight extensions is required).</p>
<p>The sample starts with the following FMS web chat application (sotest.asc):</p>
<pre class="code0">
<span class="code1">application.onAppStart = function()</span>
<span class="code1">{</span>
	<span class="code2">this</span><span class="code1">.usersID = </span><span class="code3">1</span><span class="code1">;</span>
	<span class="code2">this</span><span class="code1">.usersSO = SharedObject.get(</span><span class="code4">&#8220;users&#8221;</span><span class="code1">, false);</span> 

	<span class="code5">// Initialize the history of the text share</span>
	<span class="code1">application.history = </span><span class="code4">&#8220;&#8221;</span><span class="code1">;</span>
<span class="code1">}</span> 

<span class="code1">application.onConnect = function(clientObj)</span>
<span class="code1">{</span>
	<span class="code1">clientObj.uniqueUserID = </span><span class="code2">this</span><span class="code1">.usersID;</span>
	<span class="code1">clientObj.connectStartTime = </span><span class="code2">new </span><span class="code1">Date();</span>
	<span class="code5">//set the shared object</span>
	<span class="code2">this</span><span class="code1">.usersSO.setProperty(</span><span class="code4">&#8220;user&#8221;</span><span class="code1">+ </span><span class="code2">this</span><span class="code1">.usersID, clientObj);</span>
	<span class="code2">this</span><span class="code1">.usersID++;</span>
	<span class="code5">// Accept the connection.</span>
	<span class="code1">application.acceptConnection( clientObj );</span> 

	<span class="code5">// Call the client function &#8217;setHistory,&#8217; and pass </span>
	<span class="code5">// the initial history</span>
 	<span class="code1">clientObj.call(</span><span class="code4">&#8220;setHistory&#8221;</span><span class="code1">, </span><span class="code2">null</span><span class="code1">, application.history);</span> 

	<span class="code5">// The client will call this function to get the server</span>
	<span class="code5">// to accept the message, add the user&#8217;s name to it, and</span>
	<span class="code5">// send it back out to all connected clients.</span>
	<span class="code1">clientObj.msgFromClient = function(msg) {</span>
		<span class="code1">msg = </span><span class="code4">&#8220;user&#8221;</span><span class="code1">+ </span><span class="code2">this</span><span class="code1">.uniqueUserID + </span><span class="code4">&#8220;: &#8221; </span><span class="code1">+ msg + </span><span class="code4">&#8220;\n&#8221;</span><span class="code1">;</span>
		<span class="code1">application.history += msg;</span>
		<span class="code1">application.usersSO.send(</span><span class="code4">&#8220;msgFromSrvr&#8221;</span><span class="code1">, msg);</span>
	<span class="code1">} 	</span>
<span class="code1">}</span> 

<span class="code1">application.onDisconnect = function(clientObj)</span>
<span class="code1">{</span>
	<span class="code2">this</span><span class="code1">.usersSO.setProperty(</span><span class="code4">&#8220;user&#8221;</span><span class="code1">+ clientObj.uniqueUserID, null);</span>
<span class="code1">}</span></pre>
<p>When the application is started a shared object is created on the server side. Every user connecting to the application will get a unique identity. Clients will call the “msgFromClient” function to send messages to the other connected clients.</p>
<p>Copy the above code to the FMS\applications\sotest directory.</p>
<p><strong>Network Security Access Restrictions</strong><br />
Before going forward to the Silverlight client one must be aware of the Network Security Access Restrictions in Silverlight 2:<br />
1) When a socket request is made to the site (cross-domain or site of origin), the Silverlight 2 runtime opens a connection using TCP to a well-known port (port 943) on the target site. Then the runtime sends a special string &lt;policy-file-request/&gt; to the server to request a Silverlight policy file. The Silverlight 2 runtime then waits to receive a reply from the target site that contains a Silverlight policy file.<br />
The policy file retrieved will have to grant permission to have a connection to the target host opened.</p>
<p>2) Port range that a Silverlight 2 network application is allowed to connect to must be within the range of 4502-4534</p>
<p>For (1) you can use the FluorineFx Silverlight Policy Server provided. The application comes with a clientaccesspolicy.xml file you can change accordingly:</p>
<div class="codesnip-container" >…<br />
&lt;socket-resource port=&#8221;4502-4534&#8243; protocol=&#8221;tcp&#8221;/&gt;<br />
…</div>
<p>Our sample uses only the port 4502 so it is recommended to change the range.</p>
<p>For (2) we must configure the Flash Media Server to listen on the port we can access from our Silverlight application. Open the fms.ini file and change the entry<br />
ADAPTOR.HOSTPORT = :1935 (if previously used 1935)<br />
to<br />
ADAPTOR.HOSTPORT = :4502</p>
<p><strong>Creating the Silverlight project</strong></p>
<p>Start Visual Studio 2008, create a new Silverlight Application (I’ve named it SilverlightChatApplication) and the web application to host the Silverlight client (I’ve named it SilverlightApplicationWeb).</p>
<p>Put the following XAML markup in the Page.xaml file:</p>
<div class="codesnip-container" ><span class="code11">&lt;UserControl </span><span class="code21">x:Class</span><span class="code31">=&#8221;SilverlightChatApplication.Page&#8221;</span><br />
<span class="code21">xmlns</span><span class="code31">=&#8221;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221; </span><br />
<span class="code21">xmlns:x</span><span class="code31">=&#8221;http://schemas.microsoft.com/winfx/2006/xaml&#8221; </span><br />
<span class="code21">Width</span><span class="code31">=&#8221;800&#8243; </span><span class="code21">Height</span><span class="code31">=&#8221;500&#8243; </span><span class="code21">xmlns:d</span><span class="code31">=&#8221;http://schemas.microsoft.com/expression/blend/2008&#8243;</span><br />
<span class="code31"></span><span class="code21">xmlns:mc</span><span class="code31">=&#8221;http://schemas.openxmlformats.org/markup-compatibility/2006&#8243; </span><span class="code21">mc:Ignorable</span><span class="code31">=&#8221;d&#8221;</span><span class="code1">&gt;</span><br />
<span class="code11">&lt;Grid </span><span class="code21">x:Name</span><span class="code31">=&#8221;LayoutRoot&#8221; </span><span class="code21">Width</span><span class="code3">=&#8221;800&#8243; </span><span class="code2">Height</span><span class="code3">=&#8221;500&#8243; </span><span class="code2">Background</span><span class="code3">=&#8221;Black&#8221;</span><span class="code1">&gt;</span><br />
<span class="code11">&lt;ScrollViewer </span><span class="code21">x:Name</span><span class="code31">=&#8221;ScrollBar&#8221; </span><span class="code21">Background</span><span class="code31">=&#8221;White&#8221; </span><span class="code21">HorizontalScrollBarVisibility</span><span class="code31">=&#8221;Auto&#8221; </span><span class="code21">Canvas.Top</span><span class="code31">=&#8221;60&#8243; </span><span class="code21">Canvas.Left</span><span class="code31">=&#8221;340&#8243; </span><span class="code21">Margin</span><span class="code31">=&#8221;8,8,8,50&#8243;</span><span class="code11">&gt;</span><br />
<span class="code11">&lt;TextBlock </span><span class="code21">x:Name</span><span class="code31">=&#8221;ChatConsole&#8221; </span><span class="code21">HorizontalAlignment</span><span class="code31">=&#8221;Stretch&#8221; </span><span class="code21">Margin</span><span class="code31">=&#8221;8,8,8,47.4630012512207&#8243; </span><span class="code21">VerticalAlignment</span><span class="code31">=&#8221;Stretch&#8221; </span><span class="code21">Text</span><span class="code31">=&#8221;" </span><span class="code21">TextWrapping</span><span class="code31">=&#8221;Wrap&#8221;</span><span class="code11">/&gt;</span><br />
<span class="code11">&lt;/ScrollViewer&gt;</span><br />
<span class="code11">&lt;TextBox </span><span class="code21">x:Name</span><span class="code31">=&#8221;InputTextBox&#8221; </span><span class="code21">HorizontalAlignment</span><span class="code31">=&#8221;Stretch&#8221; </span><span class="code21">Margin</span><span class="code31">=&#8221;8,0,59.6339988708496,8&#8243; </span><span class="code21">VerticalAlignment</span><span class="code31">=&#8221;Bottom&#8221; </span><span class="code21">Text</span><span class="code31">=&#8221;Sample Text&#8221;</span><span class="code11">/&gt;</span><br />
<span class="code11">&lt;Button </span><span class="code21">Height</span><span class="code31">=&#8221;35.463&#8243; </span><span class="code21">HorizontalAlignment</span><span class="code31">=&#8221;Right&#8221; </span><span class="code21">Margin</span><span class="code31">=&#8221;0,0,8,8&#8243; </span><span class="code21">VerticalAlignment</span><span class="code31">=&#8221;Bottom&#8221; </span><span class="code21">Width</span><span class="code31">=&#8221;47.634&#8243; </span><span class="code21">Content</span><span class="code31">=&#8221;Send&#8221; </span><span class="code21">d:LayoutOverrides</span><span class="code31">=&#8221;Width, Height&#8221; </span><span class="code2">Click</span><span class="code31">=&#8221;Button_Click&#8221;</span><span class="code11">/&gt;</span><br />
<span class="code11">&lt;/Grid&gt;</span><br />
<span class="code11">&lt;/UserControl&gt;</span></div>
<p>In the Solution Explorer add a reference to FluorineFx.dll (note: we are adding the FluorineFx Silverlight client library to the Silverlight application and not the remoting gateway!). The assembly should be located in the “Bin\net\Silverlight2.0” folder.</p>
<p>Add the following code to the Page.xaml.cs code file:</p>
<pre class="code0">
<span class="code1">using </span><span class="code2">System</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Collections</span><span class="code3">.</span><span class="code2">Generic</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Linq</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Net</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Controls</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Documents</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Input</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Media</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Media</span><span class="code3">.</span><span class="code2">Animation</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">System</span><span class="code3">.</span><span class="code2">Windows</span><span class="code3">.</span><span class="code2">Shapes</span><span class="code3">;</span> 

<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Net</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Messaging</span><span class="code3">.</span><span class="code2">Api</span><span class="code3">.</span><span class="code2">Service</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">AMF3</span><span class="code3">;</span> 

<span class="code1">namespace </span><span class="code2">SilverlightChatApplication</span>
<span class="code3">{</span>
    <span class="code4">public </span><span class="code5">partial </span><span class="code6">class </span><span class="code2">Page : UserControl</span>
    <span class="code3">{</span>
        <span class="code2">NetConnection _netConnection</span><span class="code3">;</span>
        <span class="code2">RemoteSharedObject _sharedObject</span><span class="code3">;</span> 

        <span class="code4">public </span><span class="code7">Page</span><span class="code3">()</span>
        <span class="code3">{</span>
            <span class="code7">InitializeComponent</span><span class="code3">();</span> 

            <span class="code8">// Create NetConnection client</span>
            <span class="code2">_netConnection </span><span class="code3">= </span><span class="code9">new </span><span class="code7">NetConnection</span><span class="code3">();</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">ObjectEncoding </span><span class="code3">= </span><span class="code2">ObjectEncoding</span><span class="code3">.</span><span class="code2">AMF0</span><span class="code3">;</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">OnConnect </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">ConnectHandler</span><span class="code3">(</span><span class="code2">_netConnection_OnConnect</span><span class="code3">);</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">OnDisconnect </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">DisconnectHandler</span><span class="code3">(</span><span class="code2">_netConnection_OnDisconnect</span><span class="code3">);</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">NetStatus </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">NetStatusHandler</span><span class="code3">(</span><span class="code2">_netConnection_NetStatus</span><span class="code3">);</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">Client </span><span class="code3">= </span><span class="code10">this</span><span class="code3">;</span>
            <span class="code8">//FMS test</span>
            <span class="code2">_netConnection</span><span class="code3">.</span><span class="code7">Connect</span><span class="code3">(</span><span class="code11">&#8220;rtmp://localhost:4502/sotest&#8221;</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code6">void </span><span class="code7">_netConnection_NetStatus</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">NetStatusEventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code6">string </span><span class="code2">level </span><span class="code3">= </span><span class="code10">null</span><span class="code3">;</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">.</span><span class="code7">ContainsKey</span><span class="code3">(</span><span class="code11">&#8220;level&#8221;</span><span class="code3">))</span>
                <span class="code2">level </span><span class="code3">= </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code11">&#8220;level&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">;</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">level </span><span class="code3">== </span><span class="code11">&#8220;error&#8221;</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code8">//received an error</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Error: &#8221; </span><span class="code3">+ </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code11">&#8220;code&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">);</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Client not connected.&#8221;</span><span class="code3">);</span>
            <span class="code3">}</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">level </span><span class="code3">== </span><span class="code11">&#8220;status&#8221;</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Status: &#8221; </span><span class="code3">+ </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code11">&#8220;code&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">);</span>
            <span class="code3">}</span> 

        <span class="code3">}</span> 

        <span class="code6">void </span><span class="code7">_netConnection_OnDisconnect</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">EventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Connection disconnected.&#8221;</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code6">void </span><span class="code7">_netConnection_OnConnect</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">EventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Connected to server. Connecting to RSO&#8230;&#8221;</span><span class="code3">);</span>
            <span class="code2">_sharedObject </span><span class="code3">= </span><span class="code2">RemoteSharedObject</span><span class="code3">.</span><span class="code7">GetRemote</span><span class="code3">(</span><span class="code9">typeof</span><span class="code3">(</span><span class="code2">UsersRSO</span><span class="code3">), </span><span class="code11">&#8220;users&#8221;</span><span class="code3">, </span><span class="code2">_netConnection</span><span class="code3">.</span><span class="code2">Uri</span><span class="code3">.</span><span class="code7">ToString</span><span class="code3">(), </span><span class="code9">false</span><span class="code3">);</span>
            <span class="code3">(</span><span class="code2">_sharedObject </span><span class="code9">as </span><span class="code2">UsersRSO</span><span class="code3">).</span><span class="code2">Page </span><span class="code3">= </span><span class="code10">this</span><span class="code3">;</span> 

            <span class="code2">_sharedObject</span><span class="code3">.</span><span class="code2">OnConnect </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">ConnectHandler</span><span class="code3">(</span><span class="code2">_sharedObject_OnConnect</span><span class="code3">);</span>
            <span class="code2">_sharedObject</span><span class="code3">.</span><span class="code2">OnDisconnect </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">DisconnectHandler</span><span class="code3">(</span><span class="code2">_sharedObject_OnDisconnect</span><span class="code3">);</span>
            <span class="code2">_sharedObject</span><span class="code3">.</span><span class="code2">NetStatus </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">NetStatusHandler</span><span class="code3">(</span><span class="code2">_sharedObject_NetStatus</span><span class="code3">);</span>
            <span class="code2">_sharedObject</span><span class="code3">.</span><span class="code2">Sync </span><span class="code3">+= </span><span class="code9">new </span><span class="code7">SyncHandler</span><span class="code3">(</span><span class="code2">_sharedObject_Sync</span><span class="code3">);</span>
            <span class="code2">_sharedObject</span><span class="code3">.</span><span class="code7">Connect</span><span class="code3">(</span><span class="code2">_netConnection</span><span class="code3">);            </span>
        <span class="code3">}</span> 

        <span class="code6">void </span><span class="code7">_sharedObject_Sync</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">SyncEventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">ASObject</span><span class="code3">[] </span><span class="code2">changeList </span><span class="code3">= </span><span class="code2">e</span><span class="code3">.</span><span class="code2">ChangeList</span><span class="code3">;</span>
            <span class="code4">for </span><span class="code3">(</span><span class="code12">int </span><span class="code2">i </span><span class="code3">= </span><span class="code13">0</span><span class="code3">; </span><span class="code2">i </span><span class="code3">&lt; </span><span class="code2">changeList</span><span class="code3">.</span><span class="code2">Length</span><span class="code3">; </span><span class="code2">i</span><span class="code3">++)</span>
            <span class="code3">{</span>
                <span class="code2">ASObject info </span><span class="code3">= </span><span class="code2">changeList</span><span class="code3">[</span><span class="code2">i</span><span class="code3">];</span>
                <span class="code4">if </span><span class="code3">(</span><span class="code2">info</span><span class="code3">.</span><span class="code7">ContainsKey</span><span class="code3">(</span><span class="code11">&#8220;name&#8221;</span><span class="code3">) &amp;&amp; </span><span class="code2">info</span><span class="code3">[</span><span class="code11">&#8220;name&#8221;</span><span class="code3">] != </span><span class="code10">null</span><span class="code3">)</span>
                    <span class="code7">Log</span><span class="code3">(</span><span class="code2">info</span><span class="code3">[</span><span class="code11">&#8220;name&#8221;</span><span class="code3">].</span><span class="code7">ToString</span><span class="code3">() + </span><span class="code11">&#8221; - &#8221; </span><span class="code3">+ </span><span class="code2">info</span><span class="code3">[</span><span class="code11">&#8220;code&#8221;</span><span class="code3">].</span><span class="code7">ToString</span><span class="code3">());</span>
                <span class="code4">else</span>
                    <span class="code7">Log</span><span class="code3">(</span><span class="code2">info</span><span class="code3">[</span><span class="code11">&#8220;code&#8221;</span><span class="code3">].</span><span class="code7">ToString</span><span class="code3">());</span>
            <span class="code3">}</span>
        <span class="code3">}</span> 

        <span class="code6">void </span><span class="code7">_sharedObject_NetStatus</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">NetStatusEventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code6">string </span><span class="code2">level </span><span class="code3">= </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code11">&#8220;level&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">;</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">level </span><span class="code3">== </span><span class="code11">&#8220;error&#8221;</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code8">//received an error</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Error: &#8221; </span><span class="code3">+ </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code11">&#8220;code&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">);</span>
            <span class="code3">}</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">level </span><span class="code3">== </span><span class="code11">&#8220;status&#8221;</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Status: &#8221; </span><span class="code3">+ </span><span class="code2">e</span><span class="code3">.</span><span class="code2">Info</span><span class="code3">[</span><span class="code11">&#8220;code&#8221;</span><span class="code3">] </span><span class="code9">as </span><span class="code6">string</span><span class="code3">);</span>
            <span class="code3">}</span>
        <span class="code3">}</span> 

        <span class="code6">void </span><span class="code7">_sharedObject_OnDisconnect</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">EventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Disconnected RSO.&#8221;</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code6">void </span><span class="code7">_sharedObject_OnConnect</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">EventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Connected to RSO.&#8221;</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code6">void </span><span class="code7">setHistory</span><span class="code3">(</span><span class="code6">string </span><span class="code2">history</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code7">Log</span><span class="code3">(</span><span class="code2">history</span><span class="code3">);</span>
        <span class="code3">}</span> 

        <span class="code14">/// &lt;</span><span class="code15">summary</span><span class="code14">&gt;</span>
        <span class="code14">/// </span><span class="code8">Submit text to the server</span>
        <span class="code14">/// &lt;</span><span class="code15">/summary</span><span class="code14">&gt;</span>
        <span class="code14">/// &lt;</span><span class="code15">param name=</span><span class="code16">&#8220;sender&#8221;</span><span class="code14">&gt;&lt;</span><span class="code15">/param</span><span class="code14">&gt;</span>
        <span class="code14">/// &lt;</span><span class="code15">param name=</span><span class="code16">&#8220;e&#8221;</span><span class="code14">&gt;&lt;</span><span class="code15">/param</span><span class="code14">&gt;</span>
        <span class="code4">private </span><span class="code6">void </span><span class="code7">Button_Click</span><span class="code3">(</span><span class="code6">object </span><span class="code2">sender</span><span class="code3">, </span><span class="code2">RoutedEventArgs e</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code4">if </span><span class="code3">(</span><span class="code2">_sharedObject </span><span class="code3">!= </span><span class="code10">null </span><span class="code3">&amp;&amp; </span><span class="code2">_sharedObject</span><span class="code3">.</span><span class="code2">Connected</span><span class="code3">)</span>
            <span class="code3">{</span>
                <span class="code2">_netConnection</span><span class="code3">.</span><span class="code7">Call</span><span class="code3">(</span><span class="code11">&#8220;msgFromClient&#8221;</span><span class="code3">, </span><span class="code10">null</span><span class="code3">, </span><span class="code2">InputTextBox</span><span class="code3">.</span><span class="code2">Text</span><span class="code3">);</span>
            <span class="code3">}</span>
            <span class="code4">else</span>
            <span class="code3">{</span>
                <span class="code7">Log</span><span class="code3">(</span><span class="code11">&#8220;Not connected to the server, reload page and try again.&#8221;</span><span class="code3">);</span>
            <span class="code3">}</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code6">void </span><span class="code7">Log</span><span class="code3">(</span><span class="code6">string </span><span class="code2">msg</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">Dispatcher</span><span class="code3">.</span><span class="code7">BeginInvoke</span><span class="code3">(</span><span class="code6">delegate</span><span class="code3">()</span>
            <span class="code3">{</span>
                <span class="code2">ChatConsole</span><span class="code3">.</span><span class="code2">Text </span><span class="code3">+= </span><span class="code2">msg </span><span class="code3">+ </span><span class="code11">&#8220;\n&#8221;</span><span class="code3">;</span>
                <span class="code2">ScrollBar</span><span class="code3">.</span><span class="code7">ScrollToVerticalOffset</span><span class="code3">(</span><span class="code2">ScrollBar</span><span class="code3">.</span><span class="code2">ScrollableHeight</span><span class="code3">);</span>
            <span class="code3">});</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code6">void </span><span class="code7">LogMessage</span><span class="code3">(</span><span class="code6">string </span><span class="code2">msg</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">Dispatcher</span><span class="code3">.</span><span class="code7">BeginInvoke</span><span class="code3">(</span><span class="code6">delegate</span><span class="code3">()</span>
            <span class="code3">{</span>
                <span class="code2">ChatConsole</span><span class="code3">.</span><span class="code2">Text </span><span class="code3">+= </span><span class="code2">msg</span><span class="code3">;</span>
                <span class="code2">ScrollBar</span><span class="code3">.</span><span class="code7">ScrollToVerticalOffset</span><span class="code3">(</span><span class="code2">ScrollBar</span><span class="code3">.</span><span class="code2">ScrollableHeight</span><span class="code3">);</span>
            <span class="code3">});</span>
        <span class="code3">}</span>
    <span class="code3">}</span>
<span class="code3">}</span></pre>
<p>Additionally add a new UsersRSO class to the Silverlight application</p>
<pre class="code0">
<span class="code1">using </span><span class="code2">System</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">;</span>
<span class="code1">using </span><span class="code2">FluorineFx</span><span class="code3">.</span><span class="code2">Net</span><span class="code3">;</span> 

<span class="code1">namespace </span><span class="code2">SilverlightChatApplication</span>
<span class="code3">{</span>
    <span class="code4">public </span><span class="code5">class </span><span class="code2">UsersRSO : RemoteSharedObject</span>
    <span class="code3">{</span>
        <span class="code2">Page _page</span><span class="code3">;</span> 

        <span class="code6">//This class must have parameterless constructor!</span>
        <span class="code4">public </span><span class="code7">UsersRSO</span><span class="code3">()</span>
        <span class="code3">{</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code2">Page Page</span>
        <span class="code3">{</span>
            <span class="code8">get </span><span class="code3">{ </span><span class="code9">return </span><span class="code2">_page</span><span class="code3">; }</span>
            <span class="code8">set </span><span class="code3">{ </span><span class="code2">_page </span><span class="code3">= </span><span class="code10">value</span><span class="code3">; }</span>
        <span class="code3">}</span> 

        <span class="code4">public </span><span class="code5">void </span><span class="code7">msgFromSrvr</span><span class="code3">(</span><span class="code5">string </span><span class="code2">msg</span><span class="code3">)</span>
        <span class="code3">{</span>
            <span class="code2">_page</span><span class="code3">.</span><span class="code7">LogMessage</span><span class="code3">(</span><span class="code2">msg</span><span class="code3">);</span>
        <span class="code3">}</span>
    <span class="code3">}</span>
<span class="code3">}</span></pre>
<p>This class is our custom RemoteSharedObject class and it is required as FMS will notify us by calling the “msgFromSrvr” method on RSO.</p>
<p>Run FMS<br />
Run the FluorineFx Silverlight Policy Server<br />
Run the Silverlight client application (by running the host web application)</p>
<p>Here is a screenshot of the running application</p>
<p><a href="http://blog.fluorinefx.com/wp-content/uploads/2008/09/silverlight_fms_chat.png"><img src="http://blog.fluorinefx.com/wp-content/uploads/2008/09/silverlight_fms_chat.png" /></a></p>
<p>Get the latest FluorineFx code and binaries from the <a href="http://code.google.com/p/fluorinefx/">SVN repository</a></p>
<p>Update: the Silverlight library is available for <a href="http://www.fluorinefx.com/download.html">download</a> in the latest FluorineFx version</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=13</wfw:commentRss>
		</item>
		<item>
		<title>Video: Towards FluorineFx version 1.1</title>
		<link>http://blog.fluorinefx.com/?p=11</link>
		<comments>http://blog.fluorinefx.com/?p=11#comments</comments>
		<pubDate>Sat, 12 Jul 2008 15:07:22 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[FluorineFx]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[Visual Studio integration]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=11</guid>
		<description><![CDATA[The video showcases some of the planned features for FluorineFx 1.1 (and Visual Studio integration)
Note: in the video, the top project in the solution browser is a Flex Builder project wrapper for Visual Studio.

]]></description>
			<content:encoded><![CDATA[<p>The video showcases some of the planned features for FluorineFx 1.1 (and Visual Studio integration)<br />
Note: in the video, the top project in the solution browser is a Flex Builder project wrapper for Visual Studio.</p>
<p><a target="_blank" href="http://www.screencast.com/t/haywHKyXs5" title="Video"><img src="http://blog.fluorinefx.com/wp-content/uploads/2008/07/visualstudio2005_fluorinefx_1_1_demo.png" alt="Video" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=11</wfw:commentRss>
		</item>
		<item>
		<title>Quick Start Video: FluorineFx + Attach to Visual Studio&#8217;s Development Web Server</title>
		<link>http://blog.fluorinefx.com/?p=9</link>
		<comments>http://blog.fluorinefx.com/?p=9#comments</comments>
		<pubDate>Sat, 12 Jul 2008 15:07:08 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[FluorineFx]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[debug]]></category>

		<category><![CDATA[Remoting]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=9</guid>
		<description><![CDATA[Video shows how to attach to Visual Studio&#8217;s Development Web Server (to a running web application) for debugging purposes.
That is when you don&#8217;t start your web application in debug mode and you need to attach the debugger.
If you are using IIS then attach to the aspnet_wp.exe executable.

]]></description>
			<content:encoded><![CDATA[<p>Video shows how to attach to Visual Studio&#8217;s Development Web Server (to a running web application) for debugging purposes.<br />
That is when you don&#8217;t start your web application in debug mode and you need to attach the debugger.</p>
<p>If you are using IIS then attach to the <em>aspnet_wp.exe</em> executable.</p>
<p><a target="_blank" href="http://www.screencast.com/t/mW0D7LL4VP" title="Video"><img src="http://blog.fluorinefx.com/wp-content/uploads/2008/07/visualstudio2005_fluorinefx_1_0.thumbnail.png" alt="Video" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=9</wfw:commentRss>
		</item>
		<item>
		<title>Quick Start Video: FluorineFx + Visual Studio 2005</title>
		<link>http://blog.fluorinefx.com/?p=7</link>
		<comments>http://blog.fluorinefx.com/?p=7#comments</comments>
		<pubDate>Sat, 12 Jul 2008 15:06:30 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[FluorineFx]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[Remoting]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=7</guid>
		<description><![CDATA[Video showing how to start with FluorineFx and Microsoft Visual Studio 2005

]]></description>
			<content:encoded><![CDATA[<p>Video showing how to start with FluorineFx and Microsoft Visual Studio 2005</p>
<p><a target="_blank" href="http://www.screencast.com/t/hsFWInv8" title="Video"><img src="http://blog.fluorinefx.com/wp-content/uploads/2008/07/visualstudio2005_fluorinefx_1_0.thumbnail.png" alt="Video" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=7</wfw:commentRss>
		</item>
		<item>
		<title>AIR Pollution - Part II</title>
		<link>http://blog.fluorinefx.com/?p=5</link>
		<comments>http://blog.fluorinefx.com/?p=5#comments</comments>
		<pubDate>Mon, 05 May 2008 23:29:25 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[Adobe AIR]]></category>

		<category><![CDATA[adobe]]></category>

		<category><![CDATA[native]]></category>

		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=5</guid>
		<description><![CDATA[Disclaimer again: No swfs, libraries, Air runtime, tools were harmed during the making of this application.
Aperture employs a Win32 user level hooking technique called export forwarding. In the current version the msi.dll component is used that contains functions exported for Microsoft Installer packages.
The proxy dll creates function stubs that do nothing but jump to the [...]]]></description>
			<content:encoded><![CDATA[<p><em>Disclaimer again: No swfs, libraries, Air runtime, tools were harmed during the making of this application.</em></p>
<p>Aperture employs a Win32 user level hooking technique called export forwarding. In the current version the msi.dll component is used that contains functions exported for Microsoft Installer packages.<br />
The proxy dll creates function stubs that do nothing but jump to the exported addresses in the original dll, so all calls are delegated to the original msi.dll.</p>
<p>When the AIR application starts the NT DLL Loader sets up the dll initialization list from the static imports found in the PE header. If the proxy msi.dll exists in the application&#8217;s folder it will be loaded from this location. The proxy dll then will load the original dll (from the Windows system folder) and forward all calls to the original component.</p>
<p>Once a specific call is intercepted the proxy dll starts the Aperture system, preparing the LocalConnection communication with the current AIR application. And when your AIR ActionScript code starts running Aperture is already listening for commands.</p>
<p>To put it simply: the above stuff means that if the proxy dll is in the AIR application folder and you are on Windows then you have access to the Aperture system. The AIR application will work just fine on any other OS but without native library access.</p>
<p><strong>COM, IDispatch anywhere</strong></p>
<p>The Aperture system dispatches messages from AIR to objects that support OLE Automation (IDispatch). This is how COM &#8220;reflection&#8221; works. Please note that the provided libraries (apsystem, apimaging, apoutlook) are also ATL COM libraries but Aperture has the ability to work with them without registering their type library.<br />
This is to avoid the necessity of a special installation to register the COM components so an AIR application using the framework will not need any special installation step.</p>
<p>All the libraries provided are statically linked and there are no external dependencies that must be satisfied.</p>
<p><strong>And what about .NET?</strong></p>
<p>Calling .NET assemblies is also possible via COM Interop but currently there is no way to distribute these assemblies without proper registration (you have to go through registration with the RegAsm tool).</p>
<p><strong>FluorineFx Aperture Framework</strong><br />
You can find the framework <a href="http://aperture.fluorinefx.com/">here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=5</wfw:commentRss>
		</item>
		<item>
		<title>AIR Pollution</title>
		<link>http://blog.fluorinefx.com/?p=4</link>
		<comments>http://blog.fluorinefx.com/?p=4#comments</comments>
		<pubDate>Fri, 18 Apr 2008 02:04:25 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
		
		<category><![CDATA[Adobe AIR]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[fluorine]]></category>

		<category><![CDATA[native]]></category>

		<guid isPermaLink="false">http://blog.fluorinefx.com/?p=4</guid>
		<description><![CDATA[Disclaimer: No swfs, libraries, Air runtime, tools were harmed during the making of this application.
You all know by now the popular request to launch native executables from an AIR application.
Note, this demo is an experiment/hack that shows how AIR can be extended with native Windows libraries. It does not require having the .NET framework installed [...]]]></description>
			<content:encoded><![CDATA[<p><em>Disclaimer: No swfs, libraries, Air runtime, tools were harmed during the making of this application.</em></p>
<p>You all know by now the popular request to launch native executables from an AIR application.</p>
<p>Note, this demo is an experiment/hack that shows how AIR can be extended with native Windows libraries. It does not require having the .NET framework installed and works only on Windows (of course the application will run on other operating systems too where AIR is supported but without native library access).</p>
<p>After installing the application you can test 2 things: querying the operating system info (will use the GetVersionEx kernel32 function) and performing file operations with the ShellExecuteEx Windows API.</p>
<p>Give it a try.</p>

<object	type="application/x-shockwave-flash"
			data="http://www.fluorinefx.com/download/aperture/AIRInstallBadge.swf?appname="Aperture"appurl="http://www.fluorinefx.com/download/aperture/Aperture.air"airversion="1.0"imageurl="http://www.fluorinefx.com/download/aperture/badge.jpg""
			width="215"
			height="180">
	<param name="movie" value="http://www.fluorinefx.com/download/aperture/AIRInstallBadge.swf?appname="Aperture"appurl="http://www.fluorinefx.com/download/aperture/Aperture.air"airversion="1.0"imageurl="http://www.fluorinefx.com/download/aperture/badge.jpg"" />
	<param name=scale" value="noscale" />
	<param name=wmode" value="transparent" />
	<param name=allowScriptAccess" value="always" />
</object>
<p>Update: <a href="http://blog.fluorinefx.com/?p=5">Part II</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fluorinefx.com/?feed=rss2&amp;p=4</wfw:commentRss>
		</item>
	</channel>
</rss>
