PageRenderTime 41ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/source/samples/ObviousCode.Interlace.BitTunnel/BitTunnelClientExample/Controls/SharedFilesControl.cs

https://bitbucket.org/VahidN/interlace
C# | 302 lines | 244 code | 58 blank | 0 comment | 29 complexity | 325d96b0f408be0e7ac13b8b761f8e2b 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.File;
  12. using System.IO;
  13. using ExampleLibrary;
  14. using BitTunnelExampleLibrary.File;
  15. namespace BitTunnelClientExample.Controls
  16. {
  17. public partial class SharedFilesControl : UserControl, IClientTabControl
  18. {
  19. ClientInstance _client;
  20. ListViewHelper _helper;
  21. List<FileSystemWatcher> _watchers;
  22. public SharedFilesControl(ClientInstance client)
  23. {
  24. InitializeComponent();
  25. Client = client;
  26. _helper = new ListViewHelper(_sharedFilesView, ListViewHelper.ComparisonKey.Hash);
  27. _watchers = new List<FileSystemWatcher>();
  28. }
  29. #region IClientTabControl Members
  30. public string TabText
  31. {
  32. get
  33. {
  34. return "Locally Shared Files";
  35. }
  36. }
  37. public ObviousCode.Interlace.BitTunnel.Connectivity.ClientInstance Client
  38. {
  39. get
  40. {
  41. return _client;
  42. }
  43. set
  44. {
  45. _client = value;
  46. _client.FileListUpdateReceived +=new EventHandler<FileListModificationEventArgs>(_client_FileListUpdateReceived);
  47. _client.FullFileListReceived += new EventHandler<FileListEventArgs>(_client_FullFileListReceived);
  48. _client.ConnectionTerminated += new EventHandler(_client_ConnectionTerminated);
  49. _client.LostConnection += new EventHandler<ExceptionEventArgs>(_client_LostConnection);
  50. }
  51. }
  52. void _client_LostConnection(object sender, ExceptionEventArgs e)
  53. {
  54. EnableToolbar(false);
  55. }
  56. void _client_ConnectionTerminated(object sender, EventArgs e)
  57. {
  58. EnableToolbar(false);
  59. }
  60. void _client_FullFileListReceived(object sender, FileListEventArgs e)
  61. {
  62. EnableToolbar(true);
  63. }
  64. private void EnableToolbar(bool enable)
  65. {
  66. if (InvokeRequired)
  67. {
  68. Invoke((MethodInvoker)delegate
  69. {
  70. EnableToolbar(enable);
  71. });
  72. }
  73. else
  74. {
  75. _tools.Enabled = true;
  76. }
  77. }
  78. void _client_FileListUpdateReceived(object sender, ObviousCode.Interlace.BitTunnelLibrary.Events.FileListModificationEventArgs e)
  79. {
  80. foreach (FileModificationDescriptor file in e.Modifications)
  81. {
  82. if (file.OriginId != _client.ConnectionDetails.InstanceId) continue;
  83. if (file.Mode == FileModificationMode.New)
  84. {
  85. if (file.OriginId != _client.ConnectionDetails.InstanceId) continue;
  86. SetFileAsAvailable(file.Hash);
  87. }
  88. else if (file.Mode == FileModificationMode.Renamed)
  89. {
  90. RenameFile(file.ToFileDescriptor());
  91. }
  92. }
  93. }
  94. private void RenameFile(FileDescriptor file)
  95. {
  96. if (InvokeRequired)
  97. {
  98. Invoke((MethodInvoker)
  99. delegate{RenameFile(file);}
  100. );
  101. }
  102. else
  103. {
  104. ListViewItem item = _helper.GetListViewItem(file.Hash);
  105. item.Text = file.FileName;
  106. item.Tag = CreateSharedFile(file);
  107. }
  108. }
  109. private void SetFileAsAvailable(string hash)
  110. {
  111. if (InvokeRequired)
  112. {
  113. Invoke((MethodInvoker)delegate
  114. {
  115. SetFileAsAvailable(hash);
  116. });
  117. }
  118. else
  119. {
  120. ListViewItem item = _helper.GetListViewItem(hash);
  121. if (item == null)
  122. {
  123. MessageBox.Show(string.Format("Warning, locally available file (hash: {0}) not in list", hash));
  124. }
  125. (item.Tag as SharedFile).SetFileAvailable();
  126. }
  127. }
  128. private void AddFileToList(FileDescriptor file)
  129. {
  130. Invoke((MethodInvoker)delegate
  131. {
  132. if (_helper.GetListViewItem(file.FileFullName, ListViewHelper.ComparisonKey.FileFullName) != null) return;
  133. _helper.AddFileToList(CreateSharedFile(file),
  134. file.FileName,
  135. file.FileFullName,
  136. string.Format("{0} kb", Math.Round((double)(file.Size / 1024), 2)),
  137. ""
  138. );
  139. });
  140. }
  141. private SharedFile CreateSharedFile(FileDescriptor fileDescriptor)
  142. {
  143. SharedFile shared = new SharedFile(fileDescriptor);
  144. shared.PropertyChanged += new PropertyChangedEventHandler(shared_PropertyChanged);
  145. return shared;
  146. }
  147. void shared_PropertyChanged(object sender, PropertyChangedEventArgs e)
  148. {
  149. if (e.PropertyName == "State")
  150. {
  151. SetViewState(sender as SharedFile);
  152. }
  153. }
  154. private void SetViewState(SharedFile sharedFile)
  155. {
  156. if (InvokeRequired)
  157. {
  158. Invoke((MethodInvoker)delegate { SetViewState(sharedFile); });
  159. }
  160. else
  161. {
  162. ListViewItem item = _helper.GetListViewItem(sharedFile.File.Hash);
  163. if (item == null) return;
  164. item.SubItems[3] = new ListViewItem.ListViewSubItem(item, sharedFile.State.ToString());
  165. }
  166. }
  167. #endregion
  168. private void _addFilesToolStripButton_Click(object sender, EventArgs e)
  169. {
  170. if (_fileDialog.ShowDialog() == DialogResult.OK)
  171. {
  172. List<FileDescriptor> files = new List<FileDescriptor>();
  173. foreach (string file in _fileDialog.FileNames)
  174. {
  175. if (_helper.GetListViewItem(file, ListViewHelper.ComparisonKey.FileFullName) != null) continue;
  176. ShareFile(file);
  177. }
  178. }
  179. }
  180. private void ShareFile(string file)
  181. {
  182. FileDescriptor descriptor = FileDescriptor.Create(file, false);
  183. AddFileToList(descriptor);
  184. descriptor.HashGenerationCompleted += new EventHandler(descriptor_HashGenerationCompleted);
  185. descriptor.GenerateHash();
  186. }
  187. void descriptor_HashGenerationCompleted(object sender, EventArgs e)
  188. {
  189. FileDescriptor descriptor = sender as FileDescriptor;
  190. _client.AddFiles(new FileDescriptor[] { descriptor });
  191. }
  192. private void _sharedFilesView_SelectedIndexChanged(object sender, EventArgs e)
  193. {
  194. _removeSelectedFiles.Enabled = _sharedFilesView.SelectedItems.Count > 0;
  195. _removeSelectedFiles.Text = string.Format("Remove File{0}", _sharedFilesView.SelectedItems.Count > 1 ? "s" : "");
  196. }
  197. private void _removeSelectedFiles_Click(object sender, EventArgs e)
  198. {
  199. foreach(ListViewItem item in _sharedFilesView.SelectedItems)
  200. {
  201. RemoveFile(item.Tag as SharedFile);
  202. }
  203. }
  204. private void RemoveFile(SharedFile sharedFile)
  205. {
  206. try
  207. {
  208. sharedFile.SetFileAsRemoving();
  209. _client.RemoveFiles(new FileDescriptor[] { sharedFile.File });
  210. Invoke((MethodInvoker)delegate { _helper.RemoveFileFromListView(sharedFile.File.Hash); });
  211. }
  212. catch(NotImplementedException e)
  213. {
  214. MessageBox.Show(e.Message);
  215. }
  216. }
  217. private void _addFolderToolstripButton_Click(object sender, EventArgs e)
  218. {
  219. FolderBrowserDialog fbd = new FolderBrowserDialog();
  220. if (fbd.ShowDialog() == DialogResult.OK)
  221. {
  222. foreach (FileInfo file in new DirectoryInfo(fbd.SelectedPath).GetFiles())
  223. {
  224. if (((int)file.Attributes & (int)FileAttributes.System) != 0) continue;
  225. ShareFile(file.FullName);
  226. }
  227. _watchers.Add(GetFileSystemWatcher(fbd.SelectedPath));
  228. }
  229. }
  230. private FileSystemWatcher GetFileSystemWatcher(string path)
  231. {
  232. FileSystemWatcher watcher = new FileSystemWatcher(path);
  233. watcher.Created += new FileSystemEventHandler(watcher_Created);
  234. watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
  235. return watcher;
  236. }
  237. void watcher_Deleted(object sender, FileSystemEventArgs e)
  238. {
  239. }
  240. void watcher_Created(object sender, FileSystemEventArgs e)
  241. {
  242. }
  243. }
  244. }