diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo b/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo index 8a3408c16f49e05882ec5627d234f077d7bba934..49381ce9e1319cb2b27de46254f73f9d752c394d 100644 Binary files a/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/.suo differ diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide index 4ce1ef7698a3e777fc11cde5fa17ff9d9eab09a4..b7fcf98d79c62e997d036c917bdc54b9e51e78da 100644 Binary files a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide differ diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-shm b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-shm new file mode 100644 index 0000000000000000000000000000000000000000..61970f6c0eb1ce2ded82344b08fd9c60011f2139 Binary files /dev/null and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-shm differ diff --git a/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-wal b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-wal new file mode 100644 index 0000000000000000000000000000000000000000..5438e69a4becb02135ba7d28e29d578e13fc1a4b Binary files /dev/null and b/TDDD49-P2P/.vs/TDDD49-P2P/v16/Server/sqlite3/storage.ide-wal differ diff --git a/TDDD49-P2P/Models/Connection.cs b/TDDD49-P2P/Models/Connection.cs index d96c9db53fb2717e7e5d33453f1cdcbffe12b6c0..4fa8e7c6b2b5daf8a42557b1bb49452ceb836d0f 100644 --- a/TDDD49-P2P/Models/Connection.cs +++ b/TDDD49-P2P/Models/Connection.cs @@ -211,8 +211,9 @@ namespace TDDD49_P2P.Models } - public void StartClient(String server, Int32 port, string name) - { + public void EstablishClientConnection(Int32 port, String server, string name) + { + // Create a TcpClient. // Note, for this client to work you need to have a TcpServer // connected to the same address as specified by the server, port @@ -223,9 +224,12 @@ namespace TDDD49_P2P.Models // Stream stream = client.GetStream(); ServerStream = Client.GetStream(); + + int i; Byte[] bytes = new Byte[6250000]; // Loop to receive all the data sent by the client. + if(ServerStream != null) { while ((i = ServerStream.Read(bytes, 0, bytes.Length)) != 0) @@ -237,22 +241,6 @@ namespace TDDD49_P2P.Models if (RecData.Msg == "STOP" && RecData.Type == "SYS") { CanOnlyRead = false; - if (Server != null) - { - Console.WriteLine("client is closing server"); - Client.Close(); - Client = null; - Server.Stop(); - listenThread.Abort(); - } - else - { - Console.WriteLine("client is closing client"); - Client.Close(); - Server.Stop(); - Client = null; - clientThread.Abort(); - } } else if (RecData.Msg == "CONNECTED" && RecData.Type == "SYS") { Console.WriteLine("Connected!"); @@ -264,9 +252,8 @@ namespace TDDD49_P2P.Models Buzz(); } } - Client.Close(); - ServerStream.Close(); } + } @@ -307,39 +294,18 @@ namespace TDDD49_P2P.Models } } - - private void EstablishClientConnection() - { - throw new NotImplementedException(); - } - - - public void EstablishClientConnection(int port, string paddress, string name) - { - StartClient(paddress, port, name); - } - - public void EstablishServerConnection(int port, string name) - { - try + { + int res; + if (port >= 1000 && int.TryParse(port.ToString(), out res)) { - int res; - if (port >= 1000 && int.TryParse(port.ToString(), out res)) - { - Listener(port, name); - } - else - { - CanOnlyRead = false; - throw (new NoPortEx("Invalid port")); - } + Listener(port, name); } - catch (NoPortEx e) + else { - Console.WriteLine("NoPortEx: {0}", e.Message); - MessageBox.Show("Invalid port", ":)", MessageBoxButton.OK); - } + CanOnlyRead = false; + throw (new NoPortEx("Invalid port")); + } } @@ -371,8 +337,6 @@ namespace TDDD49_P2P.Models public void StartListen(int port, string name) { - Console.Write("RESULT: "); - Console.WriteLine(Result); if (listenThread == null || !listenThread.IsAlive) { CanOnlyRead = true; @@ -457,7 +421,8 @@ namespace TDDD49_P2P.Models } else if(m.Type == "IMAGE") { - Message message = new Message() { Msg = "", Username = m.Username, Type = "IMAGE", Image = BitmapToImageSource(Base64ToImage(m.Msg)) }; + Bitmap bitmap = (Bitmap)Bitmap.FromFile(m.Msg); + Message message = new Message() { Msg = "", Username = m.Username, Type = "IMAGE", Image = BitmapToImageSource(bitmap) }; messages.Add(message); } } @@ -502,12 +467,6 @@ namespace TDDD49_P2P.Models SendToStream(msg); } - public byte[] DecodeImage(string file) - { - byte[] newBytes = Convert.FromBase64String(file); - return newBytes; - } - public void SendMessage(ObservableCollection<Message> Messages, String name, ObservableCollection<Button> Buttons, ICommand OpenChatCommand, History hist, String histPath, List<Message> history) { @@ -520,10 +479,6 @@ namespace TDDD49_P2P.Models hist.AddHistory(message, histPath, Chatter, history); hist.CreateHistoryButton(RecData, Buttons, OpenChatCommand); } - else - { - Console.WriteLine("No connection established, please try again :')"); - } } @@ -536,12 +491,13 @@ namespace TDDD49_P2P.Models if (Client != null && Client.Connected == true && ServerStream.CanWrite == true) { Message message = new Message() { Msg = Convert.ToBase64String(File.ReadAllBytes(dlg.FileName)), Username = name, TimeStamp = DateTime.Now.ToString(), Type = "IMAGE" }; + Message saveMessage = new Message() { Msg = dlg.FileName, Username = name, TimeStamp = DateTime.Now.ToString(), Type = "IMAGE" }; Bitmap bitmap = (Bitmap)Bitmap.FromFile(dlg.FileName); Message messageToDisp = new Message() { Username = name, TimeStamp = DateTime.Now.ToString(), Type = "IMAGE", Image = BitmapToImageSource(bitmap) }; Messages.Add(messageToDisp); String msg = JsonConvert.SerializeObject(message); SendToStream(msg); - hist.AddHistory(message, histPath, Chatter, history); + hist.AddHistory(saveMessage, histPath, Chatter, history); } } } diff --git a/TDDD49-P2P/ViewModels/ChatViewModel.cs b/TDDD49-P2P/ViewModels/ChatViewModel.cs index cc029c5bbff9e56f96f5cbf091a010f59a283bad..40c5ea586e4ce56adf81b1c548173cab06d7658c 100644 --- a/TDDD49-P2P/ViewModels/ChatViewModel.cs +++ b/TDDD49-P2P/ViewModels/ChatViewModel.cs @@ -15,11 +15,14 @@ using Microsoft.Win32; using System.Threading; using System.Net.Sockets; using System.Security; +using static TDDD49_P2P.Models.Connection; +using System.Text; +using System.Drawing.Imaging; namespace TDDD49_P2P.ViewModels { public class ChatViewModel - { + { public ObservableCollection<Message> Messages { get; set; } = new ObservableCollection<Message>(); public ObservableCollection<Message> Images { get; set; } = new ObservableCollection<Message>(); public ObservableCollection<Button> Buttons { get; set; } = new ObservableCollection<Button>(); @@ -29,6 +32,8 @@ namespace TDDD49_P2P.ViewModels private JsonSerializer serializer = new JsonSerializer(); private Window window = Application.Current.MainWindow; private String histPath = System.AppDomain.CurrentDomain.BaseDirectory + @"history\"; + private String imagePath = System.AppDomain.CurrentDomain.BaseDirectory + @"images\"; + Task task2; public ChatViewModel() @@ -39,7 +44,7 @@ namespace TDDD49_P2P.ViewModels InitHist(); ListenAnswer(); RecieveData(); - } + } private User _user; @@ -75,7 +80,7 @@ namespace TDDD49_P2P.ViewModels } } - + public bool CanExecute { get @@ -104,9 +109,9 @@ namespace TDDD49_P2P.ViewModels public ICommand StartClientCommand { get - { - return _startClientCommand ?? (_startClientCommand = new CommandHandler(param => Connection.InitClient(User.Port, User.PAddress, User.Name), () => CanExecute)); - } + { + return _startClientCommand ?? (_startClientCommand = new CommandHandler(param => Connection.InitClient(User.Port, User.PAddress, User.Name), () => CanExecute)); + } } @@ -139,7 +144,7 @@ namespace TDDD49_P2P.ViewModels } } - + private ICommand _stopCommand; public ICommand StopCommand { @@ -154,7 +159,7 @@ namespace TDDD49_P2P.ViewModels public ICommand OpenChatCommand { get - { + { return _openChatCommand ?? (_openChatCommand = new CommandHandler(param => Connection.OpenHistChat(param, Messages), () => CanExecute)); } } @@ -199,7 +204,7 @@ namespace TDDD49_P2P.ViewModels public void StopChat() { try - { + { Connection.StopListen(User.Name); } catch (SocketException e) @@ -218,6 +223,26 @@ namespace TDDD49_P2P.ViewModels { Console.WriteLine("ThreadStateException: {0}", e); } + catch (ArgumentNullException e) + { + Console.WriteLine("ArgumentNullException: {0}", e); + } + catch (EncoderFallbackException e) + { + Console.WriteLine("EncoderFallbackException: {0}", e); + } + catch (ArgumentOutOfRangeException e) + { + Console.WriteLine("ArgumentOutOfRangeException: {0}", e); + } + catch (ObjectDisposedException e) + { + Console.WriteLine("ObjectDisposedException: {0}", e); + } + catch (FormatException e) + { + Console.WriteLine("FormatException: {0}", e); + } MessageBox.Show("Connection Lost", ":(", MessageBoxButton.OK); } @@ -232,9 +257,9 @@ namespace TDDD49_P2P.ViewModels else { task2.Start(); - } + } try - { + { Connection.StartListen(User.Port, User.Name); } catch (IOException e) @@ -242,6 +267,11 @@ namespace TDDD49_P2P.ViewModels Console.WriteLine("IOException: {0}", e); MessageBox.Show("Lost connection", ":)", MessageBoxButton.OK); } + catch (NoPortEx e) + { + Console.WriteLine("NoPortEx: {0}", e.Message); + MessageBox.Show("Invalid port", ":)", MessageBoxButton.OK); + } catch (ArgumentNullException e) { Console.WriteLine("ArgumentNullException: {0}", e); @@ -264,100 +294,159 @@ namespace TDDD49_P2P.ViewModels { Console.WriteLine("SecurityException: {0}", e); } + catch (EncoderFallbackException e) + { + Console.WriteLine("EncoderFallbackException: {0}", e); + } + catch (ArgumentOutOfRangeException e) + { + Console.WriteLine("ArgumentOutOfRangeException: {0}", e); + } + catch (ObjectDisposedException e) + { + Console.WriteLine("ObjectDisposedException: {0}", e); + } + catch (FormatException e) + { + Console.WriteLine("FormatException: {0}", e); + } } public void ListenAnswer() { bool stop = false; - task2 = new Task(() => + try { - while (true) + task2 = new Task(() => { - while (Connection.Client != null && !stop) + + while (true) { - Connection.Result = MessageBox.Show("Would you like to chat? :)", ":)", MessageBoxButton.YesNo); - if (Connection.Result == MessageBoxResult.No) + while (Connection.Client != null && !stop) { - Message msg = new Message() { Msg = "REJECT", Username = User.Name, Type = "SYS" }; - Connection.SendToStream(JsonConvert.SerializeObject(msg)); + Connection.Result = MessageBox.Show("Would you like to chat? :)", ":)", MessageBoxButton.YesNo); + if (Connection.Result == MessageBoxResult.No) + { + Message msg = new Message() { Msg = "REJECT", Username = User.Name, Type = "SYS" }; + Connection.SendToStream(JsonConvert.SerializeObject(msg)); + } + Console.WriteLine(Connection.Result); + stop = true; + } + if (stop) + { + break; } - Console.WriteLine(Connection.Result); - stop = true; - } - if (stop) - { - break; } - } - }); + + + }); + } + catch (ArgumentNullException e) + { + Console.WriteLine("ArgumentNullException: {0}", e); + } + catch (EncoderFallbackException e) + { + Console.WriteLine("EncoderFallbackException: {0}", e); + } + catch (ArgumentOutOfRangeException e) + { + Console.WriteLine("ArgumentOutOfRangeException: {0}", e); + } + catch (IOException e) + { + Console.WriteLine("IOException: {0}", e); + } + catch (ObjectDisposedException e) + { + Console.WriteLine("ObjectDisposedException: {0}", e); + } + catch (FormatException e) + { + Console.WriteLine("FormatException: {0}", e); + } } public void RecieveData() { - Task task = new Task(() => + try { - while (true) + Task task = new Task(() => { - if (Connection.RecData != null) + while (true) { - if (Connection.RecData.Type == "MESSAGE") + if (Connection.RecData != null) { - App.Current.Dispatcher.Invoke((Action)delegate + if (Connection.RecData.Type == "MESSAGE") { - Message message = new Message() { Msg = Connection.RecData.Msg, Username = Connection.RecData.Username, TimeStamp = Connection.RecData.TimeStamp, Type = Connection.RecData.Type }; - Messages.Add(message); + App.Current.Dispatcher.Invoke((Action)delegate + { + Message message = new Message() { Msg = Connection.RecData.Msg, Username = Connection.RecData.Username, TimeStamp = Connection.RecData.TimeStamp, Type = Connection.RecData.Type }; + Messages.Add(message); - histPath = System.AppDomain.CurrentDomain.BaseDirectory + @"history\"; - System.IO.Directory.CreateDirectory(histPath); - histPath += Connection.RecData.Username + ".txt"; + histPath = System.AppDomain.CurrentDomain.BaseDirectory + @"history\"; + System.IO.Directory.CreateDirectory(histPath); + histPath += Connection.RecData.Username + ".txt"; - if (File.Exists(histPath)) - { - using (StreamReader file1 = File.OpenText(histPath)) + if (File.Exists(histPath)) { - _history = (List<Message>)serializer.Deserialize(file1, typeof(List<Message>)); + using (StreamReader file1 = File.OpenText(histPath)) + { + _history = (List<Message>)serializer.Deserialize(file1, typeof(List<Message>)); + } + } + _history.Add(message); + using (StreamWriter file = File.CreateText(histPath)) + { + //serialize object directly into file stream + serializer.Serialize(file, _history); } - } - _history.Add(message); - using (StreamWriter file = File.CreateText(histPath)) - { - //serialize object directly into file stream - serializer.Serialize(file, _history); - } - History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand); - Connection.RecData = null; - }); - } - else if (Connection.RecData.Type == "IMAGE") - { - App.Current.Dispatcher.Invoke((Action)delegate - { - Message message = new Message() { Msg = "", Username = Connection.RecData.Username, Type = "IMAGE", Image = Connection.BitmapToImageSource(Connection.Base64ToImage(Connection.RecData.Msg)) }; - Message histMessage = new Message() { Msg = Connection.RecData.Msg, Username = Connection.RecData.Username, Type = "IMAGE" }; - Messages.Add(message); - History.AddHistory(histMessage, histPath, Connection.Chatter, _history); - - History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand); - Connection.RecData = null; - }); - }else if (Connection.RecData.Type == "SYS") - { - if(Connection.RecData.Msg == "REJECT") + History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand); + Connection.RecData = null; + }); + } + else if (Connection.RecData.Type == "IMAGE") { - MessageBox.Show("They dont want to chat with you", ":(", MessageBoxButton.OK); - Connection.RecData = null; - }else if (Connection.RecData.Msg == "STOP") + App.Current.Dispatcher.Invoke((Action)delegate + { + System.IO.Directory.CreateDirectory(imagePath); + + Message message = new Message() { Msg = "", Username = Connection.RecData.Username, Type = "IMAGE", Image = Connection.BitmapToImageSource(Connection.Base64ToImage(Connection.RecData.Msg)) }; + string imageName = imagePath + message.GetHashCode() + ".png"; + Connection.Base64ToImage(Connection.RecData.Msg).Save(imageName, ImageFormat.Png); + + Message histMessage = new Message() { Msg = imageName, Username = Connection.RecData.Username, Type = "IMAGE" }; + + Messages.Add(message); + History.AddHistory(histMessage, histPath, Connection.Chatter, _history); + + History.CreateHistoryButton(Connection.RecData, Buttons, OpenChatCommand); + Connection.RecData = null; + }); + } else if (Connection.RecData.Type == "SYS") { - MessageBox.Show("Connection Lost", ":(", MessageBoxButton.OK); - Connection.RecData = null; + if (Connection.RecData.Msg == "REJECT") + { + MessageBox.Show("They dont want to chat with you", ":(", MessageBoxButton.OK); + Connection.RecData = null; + } else if (Connection.RecData.Msg == "STOP") + { + MessageBox.Show("Connection Lost", ":(", MessageBoxButton.OK); + Connection.RecData = null; + } } } } - } - }); - task.Start(); + }); + task.Start(); + } + catch(InvalidOperationException e) + { + Console.WriteLine("InvalidOperationException: {0}", e); + } } } } diff --git a/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 7d14f7706a2dbe50a2a7e5aace432c6a0fcdb8f5..afab3b4f9e98bf6d39cddb611ee588c5aef1d6b4 100644 Binary files a/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/TDDD49-P2P/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache b/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache index a64896c2dacca2a68e21c9267bfa168684dc6bf3..b9d6bb37d9e8a91f873ed01b57b0fd14d9dc972e 100644 Binary files a/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache and b/TDDD49-P2P/obj/Debug/TDDD49-P2P.csprojAssemblyReference.cache differ diff --git a/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache b/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache index 460bf39608b464b01d13887331676f26babad515..132e114a0bcf2cee7ba56b6a79cde9b2590ab2ea 100644 --- a/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache +++ b/TDDD49-P2P/obj/Debug/TDDD49-P2P_MarkupCompile.i.cache @@ -12,7 +12,7 @@ DEBUG;TRACE X:\tddd49\TDDD49-P2P\App.xaml 11892971807 -15329401250 +12480718928 15-996201704 Views\MainWindow.xaml;