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

Last change on this file since 2152 was 2152, checked in by nolte, 11 years ago

Versionnumbers final version.
Use of the versionnumber starts this evening (7-8 PM).

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