protected override void Run() { Log.Debug("Started sender"); var persistence = new PersistenceManager(); while (true) { if (Token.IsCancellationRequested) { Log.Debug("Received request to stop"); return; } if (IncomingMessages.Count == 0) { continue; } using (var file = File.Open(Path.Combine(FileInfo.LocalPath, FileInfo.FileName), FileMode.Open)) using (var stream = new BinaryReader(file)) { while (IncomingMessages.Count > 0) { Message mesg; if (IncomingMessages.TryDequeue(out mesg)) { if (mesg.MessageId == MessageType.CHUNK_REQUEST) { var chunkReq = (ChunkRequest)mesg; stream.BaseStream.Seek(chunkReq.Size * chunkReq.Index, SeekOrigin.Begin); var bytes = stream.ReadBytes(chunkReq.Size); var provider = new RSACryptoServiceProvider(); provider.ImportCspBlob(persistence.ReadContent().KeyInfo); Log.DebugFormat("Building ChunkReply message for index {0}", chunkReq.Index); var outMessage = new ChunkReply(Guid.NewGuid(), chunkReq.ConversationId, chunkReq.MessageCount + 1, bytes, chunkReq.Index, MessageVerifier.CreateSignature(bytes, provider.ExportParameters(true))); RaiseSendMessageEvent(outMessage); } else if (mesg.MessageId == MessageType.ACKNOWLEDGE) { Log.Info("Client acknowledged that it has received all the data"); CancelSource.Cancel(); RaiseEndConversationEvent(); } } } } } }
public NetworkMessage <T> GetLatestMessage() { NetworkMessage <T> msg; bool success = IncomingMessages.TryDequeue(out msg); if (success) { return(msg); } throw new Exception("No Message Queued! Used HaveIncomingMessage() to check!"); }
protected override void Run() { Log.Debug("Started receiver"); var persistence = new PersistenceManager(); for (var i = 0; i < 3; i++) { if (Token.IsCancellationRequested) { Log.Debug("Received request to stop"); break; } while (IncomingMessages.Count > 0) { Message mesg; if (IncomingMessages.TryDequeue(out mesg)) { if (mesg.MessageId == MessageType.REGISTER_CONTENT_REQUEST) { var req = (RegisterContentRequest)mesg; Log.Info(string.Format("Registering {0} with host {1} and port {2}", req.Name, req.Host, req.Port)); var content = new Content() { ContentHash = req.Hash, ByteSize = req.FileSize, FileName = req.Name, Description = req.Description, Host = req.Host, Port = req.Port, LocalPath = ".", PublicKeyInfo = req.PublicKeyInfo }; persistence.WriteContent(content, PersistenceManager.StorageType.Local); var ack = new Acknowledge(Guid.NewGuid(), ConversationId, req.MessageCount + 1, "Accepted register content request"); CancelSource.Cancel(); RaiseSendMessageEvent(ack); break; } } } } RaiseEndConversationEvent(); }
protected override void Run() { Log.Debug("Started sender"); var persistence = new PersistenceManager(); // Only try three times for (var i = 0; i < 3; i++) { if (Token.IsCancellationRequested) { Log.Debug("Received request to stop"); break; } var req = new ContentListRequest(Guid.NewGuid(), ConversationId, 0, Query); RaiseSendMessageEvent(req); Thread.Sleep(500); while (IncomingMessages.Count > 0) { Message mesg; if (IncomingMessages.TryDequeue(out mesg)) { if (mesg.MessageId == MessageType.CONTENT_LIST_REPLY) { var reply = (ContentListReply)mesg; foreach (var content in reply.ContentList) { // TODO This is read the file on every call persistence.WriteContent(content, PersistenceManager.StorageType.Remote); } OnSearchResults?.Invoke(reply.ContentList); CancelSource.Cancel(); break; } } } } RaiseEndConversationEvent(); }
protected override void Run() { Log.Debug("Started sender"); var persistence = new PersistenceManager(); while (true) { if (Token.IsCancellationRequested) { Log.Debug("Received request to stop"); return; } // Slow down busy loop Thread.Sleep(100); while (IncomingMessages.Count > 0) { Message mesg; if (IncomingMessages.TryDequeue(out mesg)) { if (mesg.MessageId == MessageType.CONTENT_LIST_REQUEST) { var req = (ContentListRequest)mesg; var availableContent = persistence.ReadContent(); var reply = new ContentListReply(Guid.NewGuid(), ConversationId, req.MessageCount + 1, availableContent.LocalContent); if (req.ContentQuery != "") { // String match the filenames and descriptions for searching content reply.ContentList = availableContent.LocalContent.Where(content => content.Description.ToLower().Contains(req.ContentQuery) || content.FileName.ToLower().Contains(req.ContentQuery)).ToList(); } Log.Info(string.Format("Sending list of {0} content items", reply.ContentList.Count())); RaiseSendMessageEvent(reply); RaiseEndConversationEvent(); break; } } } } }
protected override void Run() { Log.Debug("Started sender"); // Only try three times for (var i = 0; i < 3; i++) { if (Token.IsCancellationRequested) { Log.Debug("Received request to stop"); break; } RaiseSendMessageEvent(Request); MessageCount++; for (int times = 0; times < 10; times++) { if (IncomingMessages.Count < 1) { Thread.Sleep(250); } } while (IncomingMessages.Count > 0) { Message mesg; if (IncomingMessages.TryDequeue(out mesg)) { if (mesg.MessageId == MessageType.ACKNOWLEDGE) { var ack = (Acknowledge)mesg; Log.Info(string.Format("Recevied acknowledge with status: {0}", ack.StatusInformation)); CancelSource.Cancel(); break; } } } } RaiseEndConversationEvent(); }
protected override void Run() { Log.Debug("Started receiver"); // Only request all packets five times while (true) { if (Token.IsCancellationRequested) { Log.Debug("Received request to stop"); break; } foreach (var data in NeededData) { var chunkReq = new ChunkRequest(Guid.NewGuid(), ConversationId, MessageCount, data, FileInfo.ContentHash, ChunkSize); RaiseSendMessageEvent(chunkReq); MessageCount++; } Thread.Sleep(250); while (IncomingMessages.Count > 0) { Message mesg; if (IncomingMessages.TryDequeue(out mesg)) { if (mesg.MessageId == MessageType.CHUNK_REPLY) { var chunkReply = (ChunkReply)mesg; if (NeededData.Contains(chunkReply.Index)) { var provider = new RSACryptoServiceProvider(); provider.ImportCspBlob(FileInfo.PublicKeyInfo); if (MessageVerifier.CheckSignature(chunkReply.ChunkData, chunkReply.Signature, provider.ExportParameters(false))) { DataStore[chunkReply.Index] = chunkReply.ChunkData; NeededData.Remove(chunkReply.Index); ReceivedData.Add(chunkReply.Index); if (NeededData.Count == 0) { Log.Info(string.Format("Conversation complete; Downloaded {0} packets", DataStore.Count)); var ack = new Acknowledge(Guid.NewGuid(), ConversationId, mesg.MessageCount + 1, "Download complete"); CancelSource.Cancel(); RaiseSendMessageEvent(ack); break; } } else { Log.Warn("Message signature is NOT verfied"); } } } } } Thread.Sleep(250); } RaiseEndConversationEvent(); }