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

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

+ CrypP2P: Return types of synchronous methods Store/Retrieve/Remove changed
o Work on the distributed KeySearcher

File size: 4.4 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            //var cacheActive = nodeToUpdate.LastUpdateResult != RequestResultType.KeyNotFound;
58
59            if (!forceUpdate && nodeToUpdate.LastUpdate > DateTime.Now.Subtract(new TimeSpan(0, 0, 5)))
60            {
61                return new RequestResult { Status = RequestResultType.Success };
62            }
63
64            nodeToUpdate.LastUpdate = DateTime.Now;
65
66            var requestResult = P2PManager.Retrieve(KeyInDht(nodeToUpdate));
67            var nodeBytes = requestResult.Data;
68            nodeToUpdate.LastUpdateResult = requestResult.Status;
69
70            if (nodeBytes == null)
71            {
72                return requestResult;
73            }
74
75            var binaryReader = new BinaryReader(new MemoryStream(nodeBytes));
76
77            if (nodeToUpdate is Node)
78            {
79                UpdateNodeFromDht((Node) nodeToUpdate, binaryReader);
80            } else
81            {
82                UpdateLeafFromDht((Leaf) nodeToUpdate, binaryReader);
83            }
84
85            // Load results
86            var resultCount = binaryReader.ReadInt32();
87            for (var i = 0; i < resultCount; i++)
88            {
89                var newResult = new KeySearcher.ValueKey
90                                    {
91                                        key = binaryReader.ReadString(),
92                                        value = binaryReader.ReadDouble(),
93                                        decryption = binaryReader.ReadBytes(binaryReader.ReadInt32())
94                                    };
95                nodeToUpdate.Result.AddLast(newResult);
96            }
97
98            if (resultCount > 0)
99            {
100                _keySearcher.IntegrateNewResults(nodeToUpdate.Result);
101            }
102
103            return requestResult;
104        }
105
106        private static void UpdateNodeFromDht(Node nodeToUpdate, BinaryReader binaryReader)
107        {
108            nodeToUpdate.LeftChildFinished = binaryReader.ReadBoolean() || nodeToUpdate.LeftChildFinished;
109            nodeToUpdate.RightChildFinished = binaryReader.ReadBoolean() || nodeToUpdate.RightChildFinished;
110        }
111
112        private static void UpdateLeafFromDht(Leaf nodeToUpdate, BinaryReader binaryReader)
113        {
114            var date = DateTime.FromBinary(binaryReader.ReadInt64());
115            if (date > nodeToUpdate.LastReservationDate)
116            {
117                nodeToUpdate.LastReservationDate = date;
118            }
119        }
120
121        internal static string KeyInDht(NodeBase node)
122        {
123            return string.Format("p2pjob_{0}_node_{1}_{2}", node.DistributedJobIdentifier, node.From, node.To);
124        }
125    }
126}
Note: See TracBrowser for help on using the repository browser.