source: trunk/CrypPlugins/KeySearcher/P2P/Tree/Node.cs @ 1703

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

o P2PEditor: fix for local filename problem
+ KeySearcher: debug log entry for sent/received bytes

File size: 4.2 KB
Line 
1using System;
2using System.Numerics;
3using KeySearcher.Helper;
4using KeySearcher.P2P.Exceptions;
5using KeySearcher.P2P.Storage;
6
7namespace KeySearcher.P2P.Tree
8{
9    class Node : NodeBase
10    {
11        internal bool LeftChildFinished;
12        internal bool RightChildFinished;
13
14        private NodeBase leftChild;
15        private NodeBase rightChild;
16        private bool leftChildReserved;
17        private bool rightChildReserved;
18
19        public Node(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
20            : base(storageHelper, keyQualityHelper, parentNode, @from, to, distributedJobIdentifier)
21        {
22        }
23
24        private void LoadOrUpdateChildNodes()
25        {
26            var middle = (From + To)/2;
27
28            if (!LeftChildFinished)
29            {
30                if (leftChild == null)
31                {
32                    leftChild = NodeFactory.CreateNode(StorageHelper, KeyQualityHelper, this, From, middle,
33                                                        DistributedJobIdentifier);
34                }
35                else
36                {
37                    StorageHelper.UpdateFromDht(leftChild);
38                }
39            }
40
41            // Only load right node, if the left one is finished or reserved
42            if ((LeftChildFinished || leftChild.IsReserverd()) && !RightChildFinished)
43            {
44                if (rightChild == null)
45                {
46                    rightChild = NodeFactory.CreateNode(StorageHelper, KeyQualityHelper, this, middle + 1, To,
47                                                         DistributedJobIdentifier);
48                }
49                else
50                {
51                    StorageHelper.UpdateFromDht(rightChild);
52                }
53            }
54        }
55
56        public override bool IsCalculated()
57        {
58            return LeftChildFinished && RightChildFinished;
59        }
60
61        public override void Reset()
62        {
63            leftChild = null;
64            rightChild = null;
65        }
66
67        public override void UpdateCache()
68        {
69            LoadOrUpdateChildNodes();
70
71            leftChildReserved = LeftChildFinished || leftChild.IsReserverd();
72            rightChildReserved = RightChildFinished || (rightChild != null && rightChild.IsReserverd());
73        }
74
75        public override Leaf CalculatableLeaf(bool useReservedNodes)
76        {
77            // Left child not finished and not reserved (or reserved leafs are allowed)
78            if (!LeftChildFinished && (!leftChildReserved || useReservedNodes))
79            {
80                return leftChild.CalculatableLeaf(useReservedNodes);
81            }
82
83            if (rightChild == null)
84            {
85                throw new AlreadyCalculatedException();
86            }
87
88            return rightChild.CalculatableLeaf(useReservedNodes);
89        }
90
91        public void ChildFinished(NodeBase childNode)
92        {
93            if (childNode == leftChild)
94            {
95                LeftChildFinished = true;
96                leftChild = null;
97                UpdateCache();
98                return;
99            }
100
101            if (childNode == rightChild)
102            {
103                RightChildFinished = true;
104                rightChild = null;
105                UpdateCache();
106                return;
107            }
108        }
109
110        public override bool IsReserverd()
111        {
112            if (LeftChildFinished && !RightChildFinished)
113            {
114                return rightChildReserved;
115            }
116
117            if (!LeftChildFinished && RightChildFinished)
118            {
119                return leftChildReserved;
120            }
121
122            if (!LeftChildFinished && !RightChildFinished && rightChildReserved)
123            {
124                return leftChildReserved;
125            }
126
127            return rightChildReserved;
128        }
129
130        public override string ToString()
131        {
132            return base.ToString() + ", LeftChildFinished " + LeftChildFinished + ",  RightChildFinished " +
133                   RightChildFinished;
134        }
135    }
136}
Note: See TracBrowser for help on using the repository browser.