diff options
author | marcinzelent <zelent.marcin@protonmail.com> | 2017-10-10 11:21:01 +0200 |
---|---|---|
committer | marcinzelent <zelent.marcin@protonmail.com> | 2017-10-10 11:21:01 +0200 |
commit | a7b4fc7be6dac8c4ff9ae7924eb499d7e2ac1453 (patch) | |
tree | a9a560ccfa0fb990ed766d1a1d225115c16ffa55 /Client | |
parent | 9ce162142924b6f3c8c977624ed2b2c1916f9be2 (diff) |
Diffstat (limited to 'Client')
-rw-r--r-- | Client/Client.csproj | 61 | ||||
-rw-r--r-- | Client/MainWindow.cs | 35 | ||||
-rw-r--r-- | Client/Program.cs | 16 | ||||
-rw-r--r-- | Client/Properties/AssemblyInfo.cs | 26 | ||||
-rw-r--r-- | Client/TcpChatClient.cs | 69 | ||||
-rw-r--r-- | Client/gtk-gui/MainWindow.cs | 179 | ||||
-rw-r--r-- | Client/gtk-gui/generated.cs | 30 | ||||
-rw-r--r-- | Client/gtk-gui/gui.stetic | 187 |
8 files changed, 603 insertions, 0 deletions
diff --git a/Client/Client.csproj b/Client/Client.csproj new file mode 100644 index 0000000..f0d2993 --- /dev/null +++ b/Client/Client.csproj @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <ProjectGuid>{73154F68-BBEB-48FC-86C4-BB4909C1C7B4}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <RootNamespace>Client</RootNamespace>
+ <AssemblyName>Client</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <WarningLevel>4</WarningLevel>
+ <PlatformTarget>x86</PlatformTarget>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release</OutputPath>
+ <WarningLevel>4</WarningLevel>
+ <PlatformTarget>x86</PlatformTarget>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="gtk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="gdk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="glib-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="glade-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="pango-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="atk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ </Reference>
+ <Reference Include="Mono.Posix" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="gtk-gui\gui.stetic">
+ <LogicalName>gui.stetic</LogicalName>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="gtk-gui\generated.cs" />
+ <Compile Include="MainWindow.cs" />
+ <Compile Include="gtk-gui\MainWindow.cs" />
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="TcpChatClient.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file diff --git a/Client/MainWindow.cs b/Client/MainWindow.cs new file mode 100644 index 0000000..22564ac --- /dev/null +++ b/Client/MainWindow.cs @@ -0,0 +1,35 @@ +using System; +using Gtk; +using Client; + +public partial class MainWindow : Gtk.Window +{ + TcpChatClient tcpChat; + + public MainWindow() : base(Gtk.WindowType.Toplevel) + { + Build(); + tcpChat = new TcpChatClient(); + tcpChat.PropertyChanged += (sender, args) => + outputTv.Buffer.Text = tcpChat.Log; + } + + protected void OnDeleteEvent(object sender, DeleteEventArgs a) + { + Application.Quit(); + a.RetVal = true; + } + + protected async void Connect(object sender, EventArgs e) + { + await tcpChat.Connect(ipEntry.Text, Int32.Parse(portEntry.Text)); + tcpChat.SendMessage($"{usernameEntry.Text} connected."); + } + + protected void SendMessage(object sender, EventArgs e) + { + string message = $"{usernameEntry.Text}: {messageEntry.Text}"; + tcpChat.SendMessage(message); + messageEntry.Text = ""; + } +} diff --git a/Client/Program.cs b/Client/Program.cs new file mode 100644 index 0000000..22bf2bb --- /dev/null +++ b/Client/Program.cs @@ -0,0 +1,16 @@ +using System; +using Gtk; + +namespace Client +{ + class MainClass + { + public static void Main(string[] args) + { + Application.Init(); + MainWindow win = new MainWindow(); + win.Show(); + Application.Run(); + } + } +} diff --git a/Client/Properties/AssemblyInfo.cs b/Client/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7614f1a --- /dev/null +++ b/Client/Properties/AssemblyInfo.cs @@ -0,0 +1,26 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("Client")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("${AuthorCopyright}")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/Client/TcpChatClient.cs b/Client/TcpChatClient.cs new file mode 100644 index 0000000..e9d4b54 --- /dev/null +++ b/Client/TcpChatClient.cs @@ -0,0 +1,69 @@ +using System; +using System.ComponentModel; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; + +namespace Client +{ + public class TcpChatClient : INotifyPropertyChanged + { + public int Port { get; set; } + + private string log; + public string Log + { + get + { + return log; + } + set + { + log = value; + OnPropertyChanged(); + } + } + public bool Status { get; set; } + private StreamReader sr; + private StreamWriter sw; + + public TcpChatClient() + { + } + + public async Task Connect(string ipAddress, int port) + { + TcpClient clientSocket = new TcpClient(ipAddress, port); + NetworkStream ns = clientSocket.GetStream(); + sr = new StreamReader(ns); + sw = new StreamWriter(ns); + sw.AutoFlush = true; + Status = true; + await ReceiveMessageAsync(); + } + + public void SendMessage(string message) + { + sw.WriteLine(message); + } + + private async Task ReceiveMessageAsync() + { + while (Status) + { + string message = await sr.ReadLineAsync(); + Log += $"{message}\n"; + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } +} diff --git a/Client/gtk-gui/MainWindow.cs b/Client/gtk-gui/MainWindow.cs new file mode 100644 index 0000000..f123796 --- /dev/null +++ b/Client/gtk-gui/MainWindow.cs @@ -0,0 +1,179 @@ + +// This file has been generated by the GUI designer. Do not modify. + +public partial class MainWindow +{ + private global::Gtk.VBox vbox2; + + private global::Gtk.HBox hbox2; + + private global::Gtk.Label usernameLabel; + + private global::Gtk.Entry usernameEntry; + + private global::Gtk.Label ipLabel; + + private global::Gtk.Entry ipEntry; + + private global::Gtk.Label portLabel; + + private global::Gtk.Entry portEntry; + + private global::Gtk.Button connectButton; + + private global::Gtk.ScrolledWindow GtkScrolledWindow; + + private global::Gtk.TextView outputTv; + + private global::Gtk.HBox hbox1; + + private global::Gtk.Entry messageEntry; + + private global::Gtk.Button sendButton; + + protected virtual void Build() + { + global::Stetic.Gui.Initialize(this); + // Widget MainWindow + this.Name = "MainWindow"; + this.Title = global::Mono.Unix.Catalog.GetString("TcpChat Client"); + this.WindowPosition = ((global::Gtk.WindowPosition)(4)); + this.BorderWidth = ((uint)(10)); + // Container child MainWindow.Gtk.Container+ContainerChild + this.vbox2 = new global::Gtk.VBox(); + this.vbox2.Name = "vbox2"; + this.vbox2.Spacing = 6; + // Container child vbox2.Gtk.Box+BoxChild + this.hbox2 = new global::Gtk.HBox(); + this.hbox2.Name = "hbox2"; + this.hbox2.Spacing = 6; + // Container child hbox2.Gtk.Box+BoxChild + this.usernameLabel = new global::Gtk.Label(); + this.usernameLabel.Name = "usernameLabel"; + this.usernameLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Username:"); + this.hbox2.Add(this.usernameLabel); + global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.usernameLabel])); + w1.Position = 0; + w1.Expand = false; + w1.Fill = false; + // Container child hbox2.Gtk.Box+BoxChild + this.usernameEntry = new global::Gtk.Entry(); + this.usernameEntry.CanFocus = true; + this.usernameEntry.Name = "usernameEntry"; + this.usernameEntry.Text = global::Mono.Unix.Catalog.GetString("Marcin"); + this.usernameEntry.IsEditable = true; + this.usernameEntry.InvisibleChar = '•'; + this.hbox2.Add(this.usernameEntry); + global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.usernameEntry])); + w2.Position = 1; + // Container child hbox2.Gtk.Box+BoxChild + this.ipLabel = new global::Gtk.Label(); + this.ipLabel.Name = "ipLabel"; + this.ipLabel.LabelProp = global::Mono.Unix.Catalog.GetString("IP address:"); + this.hbox2.Add(this.ipLabel); + global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.ipLabel])); + w3.Position = 2; + w3.Expand = false; + w3.Fill = false; + // Container child hbox2.Gtk.Box+BoxChild + this.ipEntry = new global::Gtk.Entry(); + this.ipEntry.WidthRequest = 110; + this.ipEntry.CanFocus = true; + this.ipEntry.Name = "ipEntry"; + this.ipEntry.Text = global::Mono.Unix.Catalog.GetString("127.0.0.1"); + this.ipEntry.IsEditable = true; + this.ipEntry.InvisibleChar = '•'; + this.hbox2.Add(this.ipEntry); + global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.ipEntry])); + w4.Position = 3; + // Container child hbox2.Gtk.Box+BoxChild + this.portLabel = new global::Gtk.Label(); + this.portLabel.Name = "portLabel"; + this.portLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Port:"); + this.hbox2.Add(this.portLabel); + global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.portLabel])); + w5.Position = 4; + w5.Expand = false; + w5.Fill = false; + // Container child hbox2.Gtk.Box+BoxChild + this.portEntry = new global::Gtk.Entry(); + this.portEntry.WidthRequest = 50; + this.portEntry.CanFocus = true; + this.portEntry.Name = "portEntry"; + this.portEntry.Text = global::Mono.Unix.Catalog.GetString("6789"); + this.portEntry.IsEditable = true; + this.portEntry.InvisibleChar = '•'; + this.hbox2.Add(this.portEntry); + global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.portEntry])); + w6.Position = 5; + // Container child hbox2.Gtk.Box+BoxChild + this.connectButton = new global::Gtk.Button(); + this.connectButton.CanFocus = true; + this.connectButton.Name = "connectButton"; + this.connectButton.UseUnderline = true; + this.connectButton.Label = global::Mono.Unix.Catalog.GetString("Connect"); + this.hbox2.Add(this.connectButton); + global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.connectButton])); + w7.Position = 6; + w7.Expand = false; + w7.Fill = false; + this.vbox2.Add(this.hbox2); + global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.hbox2])); + w8.Position = 0; + w8.Expand = false; + w8.Fill = false; + // Container child vbox2.Gtk.Box+BoxChild + this.GtkScrolledWindow = new global::Gtk.ScrolledWindow(); + this.GtkScrolledWindow.Name = "GtkScrolledWindow"; + this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1)); + // Container child GtkScrolledWindow.Gtk.Container+ContainerChild + this.outputTv = new global::Gtk.TextView(); + this.outputTv.CanFocus = true; + this.outputTv.Name = "outputTv"; + this.outputTv.Editable = false; + this.GtkScrolledWindow.Add(this.outputTv); + this.vbox2.Add(this.GtkScrolledWindow); + global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.GtkScrolledWindow])); + w10.Position = 1; + // Container child vbox2.Gtk.Box+BoxChild + this.hbox1 = new global::Gtk.HBox(); + this.hbox1.Name = "hbox1"; + this.hbox1.Spacing = 6; + // Container child hbox1.Gtk.Box+BoxChild + this.messageEntry = new global::Gtk.Entry(); + this.messageEntry.CanFocus = true; + this.messageEntry.Name = "messageEntry"; + this.messageEntry.IsEditable = true; + this.messageEntry.InvisibleChar = '•'; + this.hbox1.Add(this.messageEntry); + global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.messageEntry])); + w11.Position = 0; + // Container child hbox1.Gtk.Box+BoxChild + this.sendButton = new global::Gtk.Button(); + this.sendButton.CanFocus = true; + this.sendButton.Name = "sendButton"; + this.sendButton.UseUnderline = true; + this.sendButton.Label = global::Mono.Unix.Catalog.GetString("Send"); + this.hbox1.Add(this.sendButton); + global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.sendButton])); + w12.Position = 1; + w12.Expand = false; + w12.Fill = false; + this.vbox2.Add(this.hbox1); + global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.hbox1])); + w13.Position = 2; + w13.Expand = false; + w13.Fill = false; + this.Add(this.vbox2); + if ((this.Child != null)) + { + this.Child.ShowAll(); + } + this.DefaultWidth = 594; + this.DefaultHeight = 412; + this.Show(); + this.DeleteEvent += new global::Gtk.DeleteEventHandler(this.OnDeleteEvent); + this.connectButton.Clicked += new global::System.EventHandler(this.Connect); + this.sendButton.Clicked += new global::System.EventHandler(this.SendMessage); + } +} diff --git a/Client/gtk-gui/generated.cs b/Client/gtk-gui/generated.cs new file mode 100644 index 0000000..4842e95 --- /dev/null +++ b/Client/gtk-gui/generated.cs @@ -0,0 +1,30 @@ + +// This file has been generated by the GUI designer. Do not modify. +namespace Stetic +{ + internal class Gui + { + private static bool initialized; + + internal static void Initialize(Gtk.Widget iconRenderer) + { + if ((Stetic.Gui.initialized == false)) + { + Stetic.Gui.initialized = true; + } + } + } + + internal class ActionGroups + { + public static Gtk.ActionGroup GetActionGroup(System.Type type) + { + return Stetic.ActionGroups.GetActionGroup(type.FullName); + } + + public static Gtk.ActionGroup GetActionGroup(string name) + { + return null; + } + } +} diff --git a/Client/gtk-gui/gui.stetic b/Client/gtk-gui/gui.stetic new file mode 100644 index 0000000..204b8b1 --- /dev/null +++ b/Client/gtk-gui/gui.stetic @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="utf-8"?> +<stetic-interface> + <configuration> + <images-root-path>..</images-root-path> + </configuration> + <import> + <widget-library name="glade-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" /> + <widget-library name="../bin/Debug/Client.exe" internal="true" /> + </import> + <widget class="Gtk.Window" id="MainWindow" design-size="594 412"> + <property name="MemberName" /> + <property name="Title" translatable="yes">TcpChat Client</property> + <property name="WindowPosition">CenterOnParent</property> + <property name="BorderWidth">10</property> + <signal name="DeleteEvent" handler="OnDeleteEvent" /> + <child> + <widget class="Gtk.VBox" id="vbox2"> + <property name="MemberName" /> + <property name="Spacing">6</property> + <child> + <widget class="Gtk.HBox" id="hbox2"> + <property name="MemberName" /> + <property name="Spacing">6</property> + <child> + <widget class="Gtk.Label" id="usernameLabel"> + <property name="MemberName" /> + <property name="LabelProp" translatable="yes">Username:</property> + </widget> + <packing> + <property name="Position">0</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + <child> + <widget class="Gtk.Entry" id="usernameEntry"> + <property name="MemberName" /> + <property name="CanFocus">True</property> + <property name="Text" translatable="yes">Marcin</property> + <property name="IsEditable">True</property> + <property name="InvisibleChar">•</property> + </widget> + <packing> + <property name="Position">1</property> + <property name="AutoSize">True</property> + </packing> + </child> + <child> + <widget class="Gtk.Label" id="ipLabel"> + <property name="MemberName" /> + <property name="LabelProp" translatable="yes">IP address:</property> + </widget> + <packing> + <property name="Position">2</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + <child> + <widget class="Gtk.Entry" id="ipEntry"> + <property name="MemberName" /> + <property name="WidthRequest">110</property> + <property name="CanFocus">True</property> + <property name="Text" translatable="yes">127.0.0.1</property> + <property name="IsEditable">True</property> + <property name="InvisibleChar">•</property> + </widget> + <packing> + <property name="Position">3</property> + <property name="AutoSize">True</property> + </packing> + </child> + <child> + <widget class="Gtk.Label" id="portLabel"> + <property name="MemberName" /> + <property name="LabelProp" translatable="yes">Port:</property> + </widget> + <packing> + <property name="Position">4</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + <child> + <widget class="Gtk.Entry" id="portEntry"> + <property name="MemberName" /> + <property name="WidthRequest">50</property> + <property name="CanFocus">True</property> + <property name="Text" translatable="yes">6789</property> + <property name="IsEditable">True</property> + <property name="InvisibleChar">•</property> + </widget> + <packing> + <property name="Position">5</property> + <property name="AutoSize">True</property> + </packing> + </child> + <child> + <widget class="Gtk.Button" id="connectButton"> + <property name="MemberName" /> + <property name="CanFocus">True</property> + <property name="Type">TextOnly</property> + <property name="Label" translatable="yes">Connect</property> + <property name="UseUnderline">True</property> + <signal name="Clicked" handler="Connect" /> + </widget> + <packing> + <property name="Position">6</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="Position">0</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + <child> + <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow"> + <property name="MemberName" /> + <property name="ShadowType">In</property> + <child> + <widget class="Gtk.TextView" id="outputTv"> + <property name="MemberName" /> + <property name="CanFocus">True</property> + <property name="ShowScrollbars">True</property> + <property name="Editable">False</property> + <property name="Text" translatable="yes" /> + </widget> + </child> + </widget> + <packing> + <property name="Position">1</property> + <property name="AutoSize">True</property> + </packing> + </child> + <child> + <widget class="Gtk.HBox" id="hbox1"> + <property name="MemberName" /> + <property name="Spacing">6</property> + <child> + <widget class="Gtk.Entry" id="messageEntry"> + <property name="MemberName" /> + <property name="CanFocus">True</property> + <property name="IsEditable">True</property> + <property name="InvisibleChar">•</property> + </widget> + <packing> + <property name="Position">0</property> + <property name="AutoSize">True</property> + </packing> + </child> + <child> + <widget class="Gtk.Button" id="sendButton"> + <property name="MemberName" /> + <property name="CanFocus">True</property> + <property name="Type">TextOnly</property> + <property name="Label" translatable="yes">Send</property> + <property name="UseUnderline">True</property> + <signal name="Clicked" handler="SendMessage" /> + </widget> + <packing> + <property name="Position">1</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="Position">2</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> +</stetic-interface>
\ No newline at end of file |