source: trunk/CrypPlugins/KeySearcher/P2P/Nodes/P2PHelper.cs @ 1634

Last change on this file since 1634 was 1634, checked in by Paul Lelgemann, 12 years ago

o Fixed KeySearcher progress display
+ Work on the distributed KeySearcher part

File size: 3.9 KB
Line 
1using System;
2using System.IO;
3using Cryptool.P2P;
4
5namespace KeySearcher.P2P.Nodes
6{
7    class P2PHelper
8    {
9        private KeySearcher _keySearcher;
10
11        public P2PHelper(KeySearcher keySearcher)
12        {
13            _keySearcher = keySearcher;
14        }
15
16        internal static bool UpdateInDht(NodeBase nodeToUpdate)
17        {
18            var memoryStream = new MemoryStream();
19            var binaryWriter = new BinaryWriter(memoryStream);
20
21            if (nodeToUpdate is Node)
22            {
23                UpdateNodeInDht((Node) nodeToUpdate, binaryWriter);
24            } else
25            {
26                UpdateLeafInDht((Leaf) nodeToUpdate, binaryWriter);
27            }
28
29            // Append results
30            binaryWriter.Write(nodeToUpdate.Result.Count);
31            foreach (var valueKey in nodeToUpdate.Result)
32            {
33                binaryWriter.Write(valueKey.key);
34                binaryWriter.Write(valueKey.value);
35                binaryWriter.Write(valueKey.decryption.Length);
36                binaryWriter.Write(valueKey.decryption);
37            }
38
39            return P2PManager.Store(KeyInDht(nodeToUpdate), memoryStream.ToArray());
40        }
41
42        private static void UpdateNodeInDht(Node nodeToUpdate, BinaryWriter binaryWriter)
43        {
44            binaryWriter.Write(nodeToUpdate.LeftChildFinished);
45            binaryWriter.Write(nodeToUpdate.RightChildFinished);
46        }
47
48        private static void UpdateLeafInDht(Leaf nodeToUpdate, BinaryWriter binaryWriter)
49        {
50            var buffer = nodeToUpdate.LastReservationDate.ToBinary();
51            binaryWriter.Write(buffer);
52        }
53
54        internal void UpdateFromDht(NodeBase nodeToUpdate)
55        {
56            if (nodeToUpdate.LastUpdate > DateTime.Now.Subtract(new TimeSpan(0, 0, 5)))
57            {
58                return;
59            }
60
61            var nodeBytes = P2PManager.Retrieve(KeyInDht(nodeToUpdate));
62
63            if (nodeBytes == null)
64            {
65                return;
66            }
67
68            nodeToUpdate.LastUpdate = DateTime.Now;
69
70            var binaryReader = new BinaryReader(new MemoryStream(nodeBytes));
71
72            if (nodeToUpdate is Node)
73            {
74                UpdateNodeFromDht((Node) nodeToUpdate, binaryReader);
75            } else
76            {
77                UpdateLeafFromDht((Leaf) nodeToUpdate, binaryReader);
78            }
79
80            // Load results
81            var resultCount = binaryReader.ReadInt32();
82            for (var i = 0; i < resultCount; i++)
83            {
84                var newResult = new KeySearcher.ValueKey
85                                    {
86                                        key = binaryReader.ReadString(),
87                                        value = binaryReader.ReadDouble(),
88                                        decryption = binaryReader.ReadBytes(binaryReader.ReadInt32())
89                                    };
90                nodeToUpdate.Result.AddLast(newResult);
91            }
92
93            if (resultCount > 0)
94            {
95                _keySearcher.IntegrateNewResults(nodeToUpdate.Result);
96            }
97        }
98
99        private static void UpdateNodeFromDht(Node nodeToUpdate, BinaryReader binaryReader)
100        {
101            nodeToUpdate.LeftChildFinished = binaryReader.ReadBoolean();
102            nodeToUpdate.RightChildFinished = binaryReader.ReadBoolean();
103        }
104
105        private static void UpdateLeafFromDht(Leaf nodeToUpdate, BinaryReader binaryReader)
106        {
107            long readInt64 = binaryReader.ReadInt64();
108            var date = DateTime.FromBinary(readInt64);
109            nodeToUpdate.LastReservationDate = date;
110        }
111
112        internal static string KeyInDht(NodeBase node)
113        {
114            return string.Format("p2pjob_{0}_node_{1}_{2}", node.DistributedJobIdentifier, node.From, node.To);
115        }
116    }
117}
Note: See TracBrowser for help on using the repository browser.