PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/source/samples/ObviousCode.Interlace.BitTunnel/BitTunnelServerExample/Controls/AvailableFilesControl.cs

https://bitbucket.org/VahidN/interlace
C# | 200 lines | 162 code | 38 blank | 0 comment | 17 complexity | 809bd5b818bf42f2720e68df3b5dd672 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using ObviousCode.Interlace.BitTunnel.Connectivity;
  10. using ObviousCode.Interlace.BitTunnelLibrary.Events;
  11. using ObviousCode.Interlace.BitTunnelLibrary.Identification;
  12. using ObviousCode.Interlace.BitTunnelServer;
  13. using ObviousCode.Interlace.BitTunnelLibrary.File;
  14. using ExampleLibrary;
  15. namespace BitTunnelServerExample.Controls
  16. {
  17. public partial class AvailableFilesControl : UserControl, IServerControl
  18. {
  19. ServerInstance _server;
  20. ListViewHelper _helper;
  21. Dictionary<string, ConnectedClient> _clientDetails;
  22. public AvailableFilesControl()
  23. {
  24. InitializeComponent();
  25. _helper = new ListViewHelper(_availableFilesView, ListViewHelper.ComparisonKey.Hash);
  26. _clientDetails = new Dictionary<string, ConnectedClient>();
  27. }
  28. public AvailableFilesControl(ServerInstance server) : this()
  29. {
  30. Server = server;
  31. }
  32. public ServerInstance Server
  33. {
  34. set
  35. {
  36. if (value == null) return;
  37. _server = value;
  38. _server.ClientDisconnected += new EventHandler(_server_ClientDisconnected);
  39. _server.ClientIdentified +=new EventHandler<IdentificationEventArgs>(_server_ClientIdentified);
  40. _server.AvailableFilesUpdated += new EventHandler<FileListModificationEventArgs>(_server_AvailableFilesUpdated);
  41. }
  42. get
  43. {
  44. return _server;
  45. }
  46. }
  47. void _server_AvailableFilesUpdated(object sender, FileListModificationEventArgs e)
  48. {
  49. BitTunnelServerProtocol server = sender as BitTunnelServerProtocol;
  50. foreach (FileModificationDescriptor modification in e.Modifications)
  51. {
  52. if (modification.Mode == FileModificationMode.New)
  53. {
  54. AddModification(server, modification);
  55. }
  56. else
  57. {
  58. RemoveModification(server, modification);
  59. }
  60. }
  61. }
  62. private void AddModification(BitTunnelServerProtocol protocol, FileModificationDescriptor modification)
  63. {
  64. if (InvokeRequired)
  65. {
  66. Invoke((MethodInvoker)delegate
  67. {
  68. AddModification(protocol, modification);
  69. });
  70. }
  71. else
  72. {
  73. FileDescriptor descriptor = modification.ToFileDescriptor();
  74. ListViewItem item = GetListViewItem(descriptor.Hash);
  75. string client = "";
  76. if (item == null)
  77. {
  78. item = new ListViewItem(new string[]{
  79. descriptor.FileName,
  80. "",
  81. string.Format("{0} kb", Math.Round((double)descriptor.Size / 1024, 2)),
  82. modification.Hash
  83. });
  84. item.Tag = new List<FileDescriptor>();
  85. _availableFilesView.Items.Add(item);
  86. client = protocol.ClientDetails.PublicName;
  87. item.ImageIndex = 0;
  88. }
  89. (item.Tag as List<FileDescriptor>).Add(descriptor);
  90. SetClientText(item);
  91. }
  92. }
  93. private void SetClientText(ListViewItem item)
  94. {
  95. List<FileDescriptor> files = item.Tag as List<FileDescriptor>;
  96. if (files == null) throw new InvalidOperationException("Tag on available server file not List of File Descriptors");
  97. StringBuilder clients = new StringBuilder();
  98. foreach (FileDescriptor file in files)
  99. {
  100. clients.AppendFormat("{0}{1}", clients.Length == 0 ? "" : ", ", _clientDetails[file.OriginId].PublicName);
  101. }
  102. item.SubItems[1].Text = clients.ToString();
  103. }
  104. private void RemoveModification(BitTunnelServerProtocol protocol, FileModificationDescriptor modification)
  105. {
  106. if (InvokeRequired)
  107. {
  108. Invoke((MethodInvoker)delegate
  109. {
  110. RemoveModification(protocol, modification);
  111. });
  112. }
  113. else
  114. {
  115. FileDescriptor file = modification.ToFileDescriptor();
  116. ListViewItem item = GetListViewItem(file.Hash);
  117. List<FileDescriptor> files = item.Tag as List<FileDescriptor>;
  118. if (files == null) throw new InvalidOperationException("Tag on available server file not List of File Descriptors");
  119. files.Remove(file);
  120. if (files.Count == 0)
  121. {
  122. _availableFilesView.Items.Remove(item);
  123. }
  124. else
  125. {
  126. item.Tag = files;
  127. SetClientText(item);
  128. }
  129. }
  130. }
  131. private ListViewItem GetListViewItem(string hash)
  132. {
  133. foreach (ListViewItem item in _availableFilesView.Items)
  134. {
  135. if ((item.Tag as List<FileDescriptor>)[0].Hash == hash)
  136. {
  137. return item;
  138. }
  139. }
  140. return null;
  141. }
  142. void _server_ClientDisconnected(object sender, EventArgs e)
  143. {
  144. BitTunnelServerProtocol disconnectingProtocol = sender as BitTunnelServerProtocol;
  145. _clientDetails.Remove(disconnectingProtocol.ClientDetails.InstanceId);
  146. }
  147. void _server_ClientIdentified(object sender, ObviousCode.Interlace.BitTunnelLibrary.Events.IdentificationEventArgs e)
  148. {
  149. _clientDetails[e.Client.InstanceId] = e.Client;
  150. }
  151. #region IServerControl Members
  152. public Image MenuIcon
  153. {
  154. get { return null; }
  155. }
  156. public string MenuText
  157. {
  158. get { return "Available Files"; }
  159. }
  160. #endregion
  161. }
  162. }