PageRenderTime 55ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/source/samples/ObviousCode.Interlace.BitTunnel/ObviousCode.Interlace.BitTunnel/Connectivity/ClientInstance.cs

https://bitbucket.org/VahidN/interlace
C# | 224 lines | 177 code | 41 blank | 6 comment | 19 complexity | 72bf1da6f176cb3dd069309637e5392e MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using ObviousCode.Interlace.BitTunnelLibrary.File;
  5. using ObviousCode.Interlace.BitTunnelLibrary.Events;
  6. using ObviousCode.Interlace.BitTunnelLibrary;
  7. using ObviousCode.Interlace.BitTunnelLibrary.Exceptions;
  8. using ObviousCode.Interlace.BitTunnelClient;
  9. using ObviousCode.Interlace.BitTunnelLibrary.Interfaces;
  10. using ObviousCode.Interlace.BitTunnelLibrary.Identification;
  11. using ObviousCode.Interlace.BitTunnelLibrary.Services;
  12. using System.IO;
  13. namespace ObviousCode.Interlace.BitTunnel.Connectivity
  14. {
  15. public class ClientInstance : Instance, IClientInstance
  16. {
  17. public event EventHandler<FileRequestEventArgs> FileRequestReceived;
  18. public event EventHandler<FileListModificationEventArgs> FileListUpdateReceived;
  19. public event EventHandler<FileListEventArgs> FullFileListReceived;
  20. public event EventHandler<FileRequestResponseEventArgs> FileRequestResponseReceived;
  21. public event EventHandler<FileTransferEventArgs> FileTransferInitiated;
  22. public event EventHandler<FileTransferEventArgs> FileTransferProgressed;
  23. public event EventHandler<FileDescriptorEventArgs> FileTransferFailed;
  24. public event EventHandler<FileTransferCompletedEventArgs> FileTransferCompleted;
  25. FileDescriptorLookup _networkFiles;
  26. FileDescriptorLookup _localFiles;
  27. public ClientInstance(AppSettings settings)
  28. : this(settings, "")
  29. {
  30. }
  31. public ClientInstance(AppSettings settings, string instanceName)
  32. : base(settings, instanceName, ConnectionType.Client)
  33. {
  34. _networkFiles = new FileDescriptorLookup(true);
  35. _localFiles = new FileDescriptorLookup(false);
  36. ClientService.FullFileListReceived += new EventHandler<FileListEventArgs>(Service_FullFileListReceived);
  37. ClientService.FileListModificationsReceived += new EventHandler<FileListModificationEventArgs>(Service_FileListModificationsReceived);
  38. ClientService.FileRequestReceived += new EventHandler<FileRequestEventArgs>(Service_FileRequestReceived);
  39. ClientService.FileRequestResponseReceived += new EventHandler<FileRequestResponseEventArgs>(Service_FileRequestResponseReceived);
  40. ClientService.FileTransferInitiated += new EventHandler<FileTransferEventArgs>(ClientService_FileTransferInitiated);
  41. ClientService.FileTransferCompleted += new EventHandler<FileTransferCompletedEventArgs>(ClientService_FileTransferCompleted);
  42. ClientService.FileTransferProgressed += new EventHandler<FileTransferEventArgs>(ClientService_FileTransferProgressed);
  43. }
  44. void ClientService_FileTransferProgressed(object sender, FileTransferEventArgs e)
  45. {
  46. if(FileTransferProgressed != null)
  47. {
  48. FileTransferProgressed(sender, e);
  49. }
  50. }
  51. void ClientService_FileTransferCompleted(object sender, FileTransferCompletedEventArgs e)
  52. {
  53. if (FileTransferCompleted != null)
  54. {
  55. FileTransferCompleted(sender, e);
  56. }
  57. }
  58. void ClientService_FileTransferInitiated(object sender, FileTransferEventArgs e)
  59. {
  60. if (FileTransferInitiated != null)
  61. {
  62. FileTransferInitiated(sender, e);
  63. }
  64. }
  65. /// <summary>
  66. /// Will assume file is allowed unless FileRequestReceived event is not handled.
  67. /// </summary>
  68. /// <param name="sender"></param>
  69. /// <param name="e"></param>
  70. void Service_FileRequestReceived(object sender, FileRequestEventArgs e)
  71. {
  72. //Check first whether file actually is available
  73. if (!_localFiles.Contains(e.File))
  74. {
  75. e.Allow = false;
  76. return;
  77. }
  78. if (FileRequestReceived != null)
  79. {
  80. FileRequestReceived(sender, e);
  81. }
  82. }
  83. void Service_FileRequestResponseReceived(object sender, FileRequestResponseEventArgs e)
  84. {
  85. if (FileRequestResponseReceived != null)
  86. {
  87. FileRequestResponseReceived(sender, e);
  88. }
  89. }
  90. void Service_FullFileListReceived(object sender, FileListEventArgs e)
  91. {
  92. _networkFiles = new FileDescriptorLookup(e.FileList, true);
  93. if (FullFileListReceived != null)
  94. {
  95. FullFileListReceived(sender, e);
  96. }
  97. }
  98. void Service_FileListModificationsReceived(object sender, FileListModificationEventArgs e)
  99. {
  100. _networkFiles.UpdateFileList(e.Modifications);
  101. if (FileListUpdateReceived != null)
  102. {
  103. FileListUpdateReceived(sender, e);
  104. }
  105. }
  106. public void RequestFile(FileDescriptor file)
  107. {
  108. if (_localFiles.Contains(file))
  109. {
  110. if (FileTransferCompleted != null)
  111. {
  112. FileTransferCompleted(this, new FileTransferCompletedEventArgs(file.Hash, _localFiles[file.Hash].FileFullName));
  113. }
  114. }
  115. else
  116. {
  117. (Connection.Service as BitTunnelClientService).RequestFile(file);
  118. }
  119. }
  120. public void RequestFullFileList()
  121. {
  122. (Connection.Service as BitTunnelClientService).RequestFullFileList();
  123. }
  124. public ConnectedClient ConnectionDetails
  125. {
  126. get
  127. {
  128. if (!Connection.IsConnected)
  129. {
  130. return null;
  131. }
  132. return ClientService.ConnectionDetails;
  133. }
  134. }
  135. public void AddFiles(IEnumerable<FileDescriptor> files)
  136. {
  137. SendModifiedFiles(files, FileModificationMode.New);
  138. }
  139. public void RemoveFiles(IEnumerable<FileDescriptor> files)
  140. {
  141. SendModifiedFiles(files, FileModificationMode.Remove);
  142. }
  143. public void RenameFiles(IEnumerable<FileDescriptor> files)
  144. {
  145. SendModifiedFiles(files, FileModificationMode.Renamed);
  146. }
  147. private void SendModifiedFiles(IEnumerable<FileDescriptor> files, FileModificationMode fileModificationMode)
  148. {
  149. List<FileModificationDescriptor> modifiedFiles = new List<FileModificationDescriptor>();
  150. foreach (FileDescriptor descriptor in files)
  151. {
  152. descriptor.OriginId = ConnectionDetails.InstanceId;
  153. modifiedFiles.Add(new FileModificationDescriptor(descriptor, fileModificationMode));
  154. }
  155. ClientService.SendFileListModifications(modifiedFiles);
  156. _localFiles.UpdateFileList(modifiedFiles);
  157. }
  158. protected override void OnMessageReceived(IMessage message)
  159. {
  160. }
  161. protected override void OnConnectionLost(Exception e)
  162. {
  163. }
  164. protected override void OnDispose()
  165. {
  166. }
  167. private BitTunnelClientService ClientService
  168. {
  169. get
  170. {
  171. return Connection.Service as BitTunnelClientService;
  172. }
  173. }
  174. public FileDescriptorLookup AvailableFiles
  175. {
  176. get { return _networkFiles; }
  177. }
  178. public FileDescriptorLookup LocalFiles
  179. {
  180. get { return _localFiles; }
  181. }
  182. }
  183. }