Permalink
Browse files

WP7 Sockets Tutorial part II

  • Loading branch information...
mikoskinen committed Oct 21, 2011
1 parent 693f954 commit cdab262dff4a4b748f84183e25294c94d1c7e586
Showing with 592 additions and 0 deletions.
  1. +22 −0 wp7-sockets-part-ii/wp7-sockets-part-ii.sln
  2. +19 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/App.xaml
  3. +132 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/App.xaml.cs
  4. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/ApplicationIcon.png
  5. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/Background.png
  6. +5 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/Bin/Debug/AppManifest.xaml
  7. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/Bin/Debug/ApplicationIcon.png
  8. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/Bin/Debug/Background.png
  9. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/Bin/Debug/wp7-sockets-part-ii.dll
  10. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/Bin/Debug/wp7-sockets-part-ii.pdb
  11. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/Bin/Debug/wp7_sockets_part_ii.xap
  12. +14 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/Infrastructure/CreateConnectionAsyncArgs.cs
  13. +114 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/Infrastructure/IrcClient.cs
  14. +14 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/Infrastructure/IrcMessageReceivedFromServer.cs
  15. +40 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/MainPage.xaml
  16. +50 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/MainPage.xaml.cs
  17. +6 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/Properties/AppManifest.xml
  18. +37 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/Properties/AssemblyInfo.cs
  19. +34 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/Properties/WMAppManifest.xml
  20. BIN wp7-sockets-part-ii/wp7-sockets-part-ii/SplashScreenImage.jpg
  21. +105 −0 wp7-sockets-part-ii/wp7-sockets-part-ii/wp7-sockets-part-ii.csproj
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "wp7-sockets-part-ii", "wp7-sockets-part-ii\wp7-sockets-part-ii.csproj", "{DD68866A-7D49-464F-B300-F3E3B6E53620}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {DD68866A-7D49-464F-B300-F3E3B6E53620}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DD68866A-7D49-464F-B300-F3E3B6E53620}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DD68866A-7D49-464F-B300-F3E3B6E53620}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {DD68866A-7D49-464F-B300-F3E3B6E53620}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DD68866A-7D49-464F-B300-F3E3B6E53620}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DD68866A-7D49-464F-B300-F3E3B6E53620}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
@@ -0,0 +1,19 @@
+<Application
+ x:Class="wp7_sockets_part_ii.App"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
+ xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">
+
+ <!--Application Resources-->
+ <Application.Resources>
+ </Application.Resources>
+
+ <Application.ApplicationLifetimeObjects>
+ <!--Required object that handles lifetime events for the application-->
+ <shell:PhoneApplicationService
+ Launching="Application_Launching" Closing="Application_Closing"
+ Activated="Application_Activated" Deactivated="Application_Deactivated"/>
+ </Application.ApplicationLifetimeObjects>
+
+</Application>
@@ -0,0 +1,132 @@
+using System.Windows;
+using System.Windows.Navigation;
+using Microsoft.Phone.Controls;
+using Microsoft.Phone.Shell;
+
+namespace wp7_sockets_part_ii
+{
+ public partial class App : Application
+ {
+ /// <summary>
+ /// Provides easy access to the root frame of the Phone Application.
+ /// </summary>
+ /// <returns>The root frame of the Phone Application.</returns>
+ public PhoneApplicationFrame RootFrame { get; private set; }
+
+ /// <summary>
+ /// Constructor for the Application object.
+ /// </summary>
+ public App()
+ {
+ // Global handler for uncaught exceptions.
+ UnhandledException += Application_UnhandledException;
+
+ // Standard Silverlight initialization
+ InitializeComponent();
+
+ // Phone-specific initialization
+ InitializePhoneApplication();
+
+ // Show graphics profiling information while debugging.
+ if (System.Diagnostics.Debugger.IsAttached)
+ {
+ // Display the current frame rate counters.
+ Application.Current.Host.Settings.EnableFrameRateCounter = true;
+
+ // Show the areas of the app that are being redrawn in each frame.
+ //Application.Current.Host.Settings.EnableRedrawRegions = true;
+
+ // Enable non-production analysis visualization mode,
+ // which shows areas of a page that are handed off to GPU with a colored overlay.
+ //Application.Current.Host.Settings.EnableCacheVisualization = true;
+
+ // Disable the application idle detection by setting the UserIdleDetectionMode property of the
+ // application's PhoneApplicationService object to Disabled.
+ // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
+ // and consume battery power when the user is not using the phone.
+ PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
+ }
+
+ }
+
+ // Code to execute when the application is launching (eg, from Start)
+ // This code will not execute when the application is reactivated
+ private void Application_Launching(object sender, LaunchingEventArgs e)
+ {
+ }
+
+ // Code to execute when the application is activated (brought to foreground)
+ // This code will not execute when the application is first launched
+ private void Application_Activated(object sender, ActivatedEventArgs e)
+ {
+ }
+
+ // Code to execute when the application is deactivated (sent to background)
+ // This code will not execute when the application is closing
+ private void Application_Deactivated(object sender, DeactivatedEventArgs e)
+ {
+ }
+
+ // Code to execute when the application is closing (eg, user hit Back)
+ // This code will not execute when the application is deactivated
+ private void Application_Closing(object sender, ClosingEventArgs e)
+ {
+ }
+
+ // Code to execute if a navigation fails
+ private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
+ {
+ if (System.Diagnostics.Debugger.IsAttached)
+ {
+ // A navigation has failed; break into the debugger
+ System.Diagnostics.Debugger.Break();
+ }
+ }
+
+ // Code to execute on Unhandled Exceptions
+ private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
+ {
+ if (System.Diagnostics.Debugger.IsAttached)
+ {
+ // An unhandled exception has occurred; break into the debugger
+ System.Diagnostics.Debugger.Break();
+ }
+ }
+
+ #region Phone application initialization
+
+ // Avoid double-initialization
+ private bool phoneApplicationInitialized = false;
+
+ // Do not add any additional code to this method
+ private void InitializePhoneApplication()
+ {
+ if (phoneApplicationInitialized)
+ return;
+
+ // Create the frame but don't set it as RootVisual yet; this allows the splash
+ // screen to remain active until the application is ready to render.
+ RootFrame = new PhoneApplicationFrame();
+ RootFrame.Navigated += CompleteInitializePhoneApplication;
+
+ // Handle navigation failures
+ RootFrame.NavigationFailed += RootFrame_NavigationFailed;
+
+ // Ensure we don't initialize again
+ phoneApplicationInitialized = true;
+ }
+
+ // Do not add any additional code to this method
+ private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
+ {
+ // Set the root visual to allow the application to render
+ if (RootVisual != RootFrame)
+ RootVisual = RootFrame;
+
+ // Remove this handler since it is no longer needed
+ RootFrame.Navigated -= CompleteInitializePhoneApplication;
+ }
+
+ #endregion
+ }
+}
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,5 @@
+<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="wp7-sockets-part-ii" EntryPointType="wp7_sockets_part_ii.App" RuntimeVersion="4.7.50308.0">
+ <Deployment.Parts>
+ <AssemblyPart x:Name="wp7-sockets-part-ii" Source="wp7-sockets-part-ii.dll" />
+ </Deployment.Parts>
+</Deployment>
@@ -0,0 +1,14 @@
+using System;
+
+namespace wp7_sockets_part_ii
+{
+ public class CreateConnectionAsyncArgs : EventArgs
+ {
+ public bool ConnectionOk { get; private set; }
+
+ public CreateConnectionAsyncArgs(bool connectionOk)
+ {
+ ConnectionOk = connectionOk;
+ }
+ }
+}
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+
+namespace wp7_sockets_part_ii
+{
+ public class IrcClient
+ {
+ private Socket connection;
+ private string server;
+ private int serverPort;
+ private const int bufferSize = 2048;
+
+ public event EventHandler<CreateConnectionAsyncArgs> CreateConnectionCompleted;
+ public event EventHandler<IrcMessageReceivedFromServer> IrcMessageReceivedFromServer;
+
+ public void CreateConnection(string serverAddress, int port)
+ {
+ this.connection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ this.server = serverAddress;
+ this.serverPort = port;
+
+ var connectionOperation = new SocketAsyncEventArgs { RemoteEndPoint = new DnsEndPoint(this.server, this.serverPort) };
+ connectionOperation.Completed += OnConnectionToServerCompleted;
+
+ this.connection.ConnectAsync(connectionOperation);
+ }
+
+ private void OnConnectionToServerCompleted(object sender, SocketAsyncEventArgs e)
+ {
+ if (e.SocketError != SocketError.Success)
+ {
+ if (CreateConnectionCompleted != null)
+ CreateConnectionCompleted(this, new CreateConnectionAsyncArgs(false));
+
+ return;
+ }
+
+ if (CreateConnectionCompleted != null)
+ CreateConnectionCompleted(this, new CreateConnectionAsyncArgs(true));
+
+ ReceiveMessage();
+ }
+
+ private void ReceiveMessage()
+ {
+ var responseListener = new SocketAsyncEventArgs();
+ responseListener.Completed += OnMessageReceivedFromServer;
+
+ var responseBuffer = new byte[bufferSize];
+ responseListener.SetBuffer(responseBuffer, 0, bufferSize);
+
+ connection.ReceiveAsync(responseListener);
+ }
+
+ private string trailingMessage;
+ private void OnMessageReceivedFromServer(object sender, SocketAsyncEventArgs e)
+ {
+ // Convert the received message into a string
+ var message = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);
+
+ var bufferWasPreviouslyFull = !string.IsNullOrWhiteSpace(trailingMessage);
+ if (bufferWasPreviouslyFull)
+ {
+ message = trailingMessage + message;
+ trailingMessage = null;
+ }
+
+ var isConnectionLost = string.IsNullOrWhiteSpace(message);
+ if (isConnectionLost)
+ {
+ // We lost the connection for some reason
+ // Handle the situation
+ return;
+ }
+
+ // Convert the received string into a string array
+ var lines = new List<string>(message.Split("\n\r".ToCharArray(), StringSplitOptions.None));
+
+ var lastLine = lines.LastOrDefault();
+ var isBufferFull = !string.IsNullOrWhiteSpace(lastLine);
+ if (isBufferFull)
+ {
+ trailingMessage = lastLine;
+ lines.Remove(lastLine);
+ }
+
+ foreach (var line in lines)
+ {
+ if (string.IsNullOrWhiteSpace(line))
+ continue;
+
+ ProcessIncomingMessage(line);
+ }
+
+ // Start listening for the next message
+ ReceiveMessage();
+ }
+
+ private void ProcessIncomingMessage(string ircMessage)
+ {
+ Debug.WriteLine(ircMessage);
+
+ // Future hook for handling the message in somewhere else.
+ // It's most probably wise to put the parsing logic in some other class.
+ if (IrcMessageReceivedFromServer != null)
+ IrcMessageReceivedFromServer(this, new IrcMessageReceivedFromServer(ircMessage));
+ }
+ }
+}
@@ -0,0 +1,14 @@
+using System;
+
+namespace wp7_sockets_part_ii
+{
+ public class IrcMessageReceivedFromServer : EventArgs
+ {
+ public string Message { get; private set; }
+
+ public IrcMessageReceivedFromServer(string message)
+ {
+ Message = message;
+ }
+ }
+}
@@ -0,0 +1,40 @@
+<phone:PhoneApplicationPage
+ x:Class="wp7_sockets_part_ii.MainPage"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
+ xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
+ FontFamily="{StaticResource PhoneFontFamilyNormal}"
+ FontSize="{StaticResource PhoneFontSizeNormal}"
+ Foreground="{StaticResource PhoneForegroundBrush}"
+ SupportedOrientations="Portrait" Orientation="Portrait"
+ shell:SystemTray.IsVisible="True">
+
+ <!--LayoutRoot is the root grid where all page content is placed-->
+ <Grid x:Name="LayoutRoot" Background="Transparent">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto"/>
+ <RowDefinition Height="*"/>
+ </Grid.RowDefinitions>
+
+ <!--TitlePanel contains the name of the application and page title-->
+ <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
+ <TextBlock x:Name="ApplicationTitle" Text="WP7 Sockets" Style="{StaticResource PhoneTextNormalStyle}"/>
+ <TextBlock x:Name="PageTitle" Text="receiving" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
+ </StackPanel>
+
+ <!--ContentPanel - place additional content here-->
+ <StackPanel Grid.Row="1">
+ <TextBlock Text="Server:" Style="{StaticResource PhoneTextNormalStyle}"/>
+ <TextBox x:Name="Server" Text="fi.quakenet.org"/>
+ <TextBlock Text="Port:" Style="{StaticResource PhoneTextNormalStyle}"/>
+ <TextBox x:Name="Port" Text="6667" />
+ <Button x:Name="CreateConnection" Content="Create connection" Click="HandleCreateConnectionClick"/>
+ <TextBlock Name="ConnectionStatus" Style="{StaticResource PhoneTextTitle2Style}"/>
+ </StackPanel>
+ </Grid>
+
+</phone:PhoneApplicationPage>
Oops, something went wrong.

0 comments on commit cdab262

Please sign in to comment.