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

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

o Work on the distributed KeySearcher

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