コード例 #1
0
ファイル: ChunkSender.cs プロジェクト: arun21/pay-bit-forward
        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();
                                }
                            }
                        }
                    }
            }
        }
コード例 #2
0
        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!");
        }
コード例 #3
0
        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();
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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;
                        }
                    }
                }
            }
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        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();
        }