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

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

o Work on the distributed KeySearcher

File size: 4.0 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            nodeToUpdate.LastUpdate = DateTime.Now;
62
63            var nodeBytes = P2PManager.Retrieve(KeyInDht(nodeToUpdate));
64
65            if (nodeBytes == null)
66            {
67                return;
68            }
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() || nodeToUpdate.LeftChildFinished;
102            nodeToUpdate.RightChildFinished = binaryReader.ReadBoolean() || nodeToUpdate.RightChildFinished;
103        }
104
105        private static void UpdateLeafFromDht(Leaf nodeToUpdate, BinaryReader binaryReader)
106        {
107            var date = DateTime.FromBinary(binaryReader.ReadInt64());
108            if (date > nodeToUpdate.LastReservationDate)
109            {
110                nodeToUpdate.LastReservationDate = date;
111            }
112        }
113
114        internal static string KeyInDht(NodeBase node)
115        {
116            return string.Format("p2pjob_{0}_node_{1}_{2}", node.DistributedJobIdentifier, node.From, node.To);
117        }
118    }
119}
Note: See TracBrowser for help on using the repository browser.