コード例 #1
0
        void ProcessStoreMessage()
        {
            RequestStoreMessage request = RequestStoreMessage.Deserialize(ProtocolParser.ReadBytes(input));
            ReplyStoreMessage   reply   = new ReplyStoreMessage();

            localRepo.StoreMessage(request.Prefix, ChunkHash.FromHashBytes(request.ChunkHash));
            ProtocolParser.WriteBytes(output, ReplyStoreMessage.SerializeToBytes(reply));
        }
コード例 #2
0
        public Chunk(byte[] buffer)
        {
            //Hash data
            this.Data = buffer;

            this.ClearHash = ClearHash.ComputeHash(buffer);
            this.ChunkHash = ChunkHash.FromHashBytes(this.ClearHash.bytes);
        }
コード例 #3
0
        void ProcessReadChunk()
        {
            RequestReadChunk request = RequestReadChunk.Deserialize(ProtocolParser.ReadBytes(input));
            ReplyReadChunk   reply   = new ReplyReadChunk();
            Chunk            c       = localRepo.ReadChunk(ChunkHash.FromHashBytes(request.ChunkHash));

            reply.ChunkData = c.Data;

            ProtocolParser.WriteBytes(output, ReplyReadChunk.SerializeToBytes(reply));
        }
コード例 #4
0
        public override ChunkHash GetCustomHash(CustomID id)
        {
            string idPath = Path.Combine(idRoot, id.ToString() + ".id");

            if (File.Exists(idPath) == false)
            {
                return(null);
            }
            byte[] hash = File.ReadAllBytes(idPath);
            return(ChunkHash.FromHashBytes(hash));
        }
コード例 #5
0
ファイル: Get.cs プロジェクト: hultqvist/Whisper
        public static void Main(string[] args, KeyStorage keyStorage)
        {
            if (args.Length != 4)
            {
                throw new HelpException("Missing arguments");
            }

            //Storage
            Repo repo = Repo.Create(args [1]);

            repo = new EncryptedRepo(repo, keyStorage);

            //Find message
            Chunk chunk = null;

            if (args [2].Length == 64)
            {
                ChunkHash id = ChunkHash.FromHashBytes(Hash.FromString(args [2]).bytes);
                chunk = repo.ReadChunk(id);
            }
            else
            {
                ICollection <ChunkHash> messages = repo.GetMessageList("file");
                foreach (ChunkHash bh in messages)
                {
                    if (bh.ToString().StartsWith(args [2]))
                    {
                        chunk = repo.ReadChunk(bh);
                    }
                }
            }

            Message message = Message.FromChunk(chunk, keyStorage);

            if (message == null)
            {
                Console.Error.WriteLine("Message not found");
                return;
            }
            TreeMessage tm = message as TreeMessage;

            if (tm == null)
            {
                Console.Error.WriteLine("Not a TreeMessage: " + message.GetType().Name);
                return;
            }

            Console.WriteLine("Found TreeMessage " + tm.Name);
            string targetPath = Path.Combine(args [3], tm.Name);

            TreeChunk.Extract(repo, ChunkHash.FromHashBytes(tm.TreeChunkHash), targetPath);
        }
コード例 #6
0
ファイル: PipeRepo.cs プロジェクト: hultqvist/Whisper
        public override List <ChunkHash> GetMessageList(string prefix)
        {
            RequestMessageList msg = new RequestMessageList(prefix);

            SendMessage(msg);

            ReplyMessageList reply = ReplyMessageList.Deserialize(ProtocolParser.ReadBytes(input));
            List <ChunkHash> list  = new List <ChunkHash> ();

            foreach (byte[] hash in reply.ChunkHash)
            {
                list.Add(ChunkHash.FromHashBytes(hash));
            }

            return(list);
        }
コード例 #7
0
ファイル: PipeRepo.cs プロジェクト: hultqvist/Whisper
        public override ChunkHash GetCustomHash(CustomID customID)
        {
            RequestCustomHash msg = new RequestCustomHash();

            msg.CustomID = customID.bytes;
            SendMessage(msg);

            byte[] rbytes = ProtocolParser.ReadBytes(input);

            //Console.WriteLine("Got reply " + rbytes.Length);

            ReplyCustomHash reply = ReplyCustomHash.Deserialize(rbytes);

            //Console.WriteLine("Got reply " + reply);

            return(ChunkHash.FromHashBytes(reply.ChunkHash));
        }
コード例 #8
0
        public static void Extract(Repo store, ChunkHash cid, string targetPath)
        {
            Directory.CreateDirectory(targetPath);

            Chunk     c    = store.ReadChunk(cid);
            TreeChunk tree = TreeChunk.Deserialize(c.Data);

            foreach (TreeFile file in tree.Files)
            {
                StreamChunk.Extract(store, ChunkHash.FromHashBytes(file.TreeChunkHash), Path.Combine(targetPath, file.Name));
            }

            foreach (TreeFile subdir in tree.Directories)
            {
                TreeChunk.Extract(store, ChunkHash.FromHashBytes(subdir.TreeChunkHash), Path.Combine(targetPath, subdir.Name));
            }
        }
        public static void Extract(Repo store, ChunkHash fileHash, string targetPath)
        {
            Chunk       chunk       = store.ReadChunk(fileHash);
            StreamChunk streamChunk = StreamChunk.Deserialize <StreamChunk> (chunk.Data);

            using (FileStream file = File.Open(targetPath, FileMode.Create)) {
                foreach (byte[] hashBytes in streamChunk.Chunks)
                {
                    Chunk fc = store.ReadChunk(ChunkHash.FromHashBytes(hashBytes));
                    file.Write(fc.Data, 0, fc.Data.Length);
                }

                //Verify length
                if (file.Length != (long)streamChunk.Size)
                {
                    throw new InvalidDataException("Invalid file length");
                }
            }
        }