Esempio n. 1
0
        public Dictionary <string, MegaDirectoryNode> GetMegaNodes()
        {
            if (_megaNodes == null)
            {
                //DateTime start = DateTime.Now;
                //IEnumerable<INode> nodes = _client.GetNodes();
                IEnumerable <INode> nodes = _GetNodes();
                //TimeSpan time = DateTime.Now - start;
                //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : _client.GetNodes() time {time}");

                //start = DateTime.Now;
                // Dictionary : one node by directory, key is mega id
                Dictionary <string, MegaDirectoryNode> megaNodes1 = GetMegaNodes1(nodes);
                //time = DateTime.Now - start;
                //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : GetDictionaryNodes1_v2() time {time}");
                //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : GetDictionaryNodes1_v2() megaNodes.Count {megaNodes1.Count} nodeCount {_nodeCount} _directoryNodeCount {_directoryNodeCount} _fileNodeCount {_fileNodeCount} nodeWithUnknowParent {_dictionaryNodes1_nodeWithUnknowParent} nodeAlreadyCreated {_dictionaryNodes1_nodeAlreadyCreated}");

                //start = DateTime.Now;
                // Dictionary : one node by directory, key is directory path
                _megaNodes = new Dictionary <string, MegaDirectoryNode>();

                MegaDirectoryNode root = new MegaDirectoryNode {
                    Path = "/"
                };
                root.Childs.Add(_root);
                root.Childs.Add(_inbox);
                root.Childs.Add(_trash);
                _megaNodes.Add("/", root);

                // browse tree directory nodes
                //foreach (MegaDirectoryNode_v2 node in BrowseDirectoryNodes(megaNodes1))
                foreach (MegaNode node in BrowseNodes(megaNodes1))
                {
                    string path = null;
                    if (node.Parent != null)
                    {
                        path = node.Parent.Path;
                    }
                    //path += "/" + node.GetName();
                    path     += "/" + node.Name;
                    node.Path = path;
                    if (node.Node.Type != NodeType.File)
                    {
                        _megaNodes.Add(path, (MegaDirectoryNode)node);
                    }
                }
                //time = DateTime.Now - start;
                //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : create _megaNodes_v2 time {time}");
            }
            return(_megaNodes);
        }
Esempio n. 2
0
        // not used
        //private IEnumerable<MegaDirectoryNode_v2> BrowseDirectoryNodes(Dictionary<string, MegaDirectoryNode_v2> megaNodes)
        //{
        //    Stack<IEnumerator<MegaNode_v2>> stack = new Stack<IEnumerator<MegaNode_v2>>();
        //    foreach (MegaDirectoryNode_v2 rootNode in new MegaDirectoryNode_v2[] { _root, _inbox, _trash })
        //    {
        //        yield return rootNode;
        //        IEnumerator<MegaNode_v2> enumerator = rootNode.Childs.GetEnumerator();
        //        stack.Push(enumerator);
        //        while (true)
        //        {
        //            if (enumerator.MoveNext())
        //            {
        //                MegaNode_v2 node = enumerator.Current;
        //                //yield return node;
        //                if (node.Node.Type == NodeType.Directory)
        //                {
        //                    MegaDirectoryNode_v2 directoryNode = (MegaDirectoryNode_v2)node;
        //                    yield return directoryNode;
        //                    enumerator = directoryNode.Childs.GetEnumerator();
        //                    stack.Push(enumerator);
        //                }
        //            }
        //            else
        //            {
        //                stack.Pop();
        //                if (stack.Count == 0)
        //                    break;
        //                enumerator = stack.Peek();
        //            }
        //        }
        //    }
        //}

        private IEnumerable <MegaNode> BrowseNodes(Dictionary <string, MegaDirectoryNode> megaNodes)
        {
            Stack <IEnumerator <MegaNode> > stack = new Stack <IEnumerator <MegaNode> >();

            foreach (MegaDirectoryNode rootNode in new MegaDirectoryNode[] { _root, _inbox, _trash })
            {
                yield return(rootNode);

                IEnumerator <MegaNode> enumerator = rootNode.Childs.GetEnumerator();
                stack.Push(enumerator);
                while (true)
                {
                    if (enumerator.MoveNext())
                    {
                        MegaNode node = enumerator.Current;
                        yield return(node);

                        if (node.Node.Type == NodeType.Directory)
                        {
                            MegaDirectoryNode directoryNode = (MegaDirectoryNode)node;
                            //yield return directoryNode;
                            enumerator = directoryNode.Childs.GetEnumerator();
                            stack.Push(enumerator);
                        }
                    }
                    else
                    {
                        stack.Pop();
                        if (stack.Count == 0)
                        {
                            break;
                        }
                        enumerator = stack.Peek();
                    }
                }
            }
        }
Esempio n. 3
0
        private Dictionary <string, MegaDirectoryNode> GetMegaNodes1(IEnumerable <INode> nodes)
        {
            // Dictionary : one node by directory, key is mega id
            Dictionary <string, MegaDirectoryNode> megaNodes = new Dictionary <string, MegaDirectoryNode>();

            _dictionaryNodes1_nodeWithUnknowParent = 0;
            _dictionaryNodes1_nodeAlreadyCreated   = 0;
            _nodeCount          = 0;
            _fileNodeCount      = 0;
            _directoryNodeCount = 0;
            foreach (INode node in nodes)
            {
                _nodeCount++;

                //if (type == NodeType.Root)
                //    _root = node;
                //else if (type == NodeType.Inbox)
                //    _inbox = node;
                //else if (type == NodeType.Trash)
                //    _trash = node;

                // MegaNode_v2 : Id, Node, Path, Childs

                MegaDirectoryNode parentMegaNode = null;
                string            parentId       = node.ParentId;
                if (parentId != null && parentId != "")
                {
                    if (!megaNodes.TryGetValue(parentId, out parentMegaNode))
                    {
                        _dictionaryNodes1_nodeWithUnknowParent++;
                        parentMegaNode = new MegaDirectoryNode {
                            Id = parentId
                        };
                        megaNodes.Add(parentId, parentMegaNode);
                        //Trace.WriteLine($"nodeWithUnknowParent : Id {node.Id} Name {node.Name}");
                    }
                }

                MegaNode megaNode;
                NodeType type = node.Type;
                if (type != NodeType.File)
                {
                    string            id = node.Id;
                    MegaDirectoryNode megaDirectoryNode;
                    if (!megaNodes.TryGetValue(id, out megaDirectoryNode))
                    {
                        megaDirectoryNode = new MegaDirectoryNode {
                            Id = id, Node = node, Name = GetName(node)
                        };
                        megaNodes.Add(id, megaDirectoryNode);
                    }
                    else
                    {
                        _dictionaryNodes1_nodeAlreadyCreated++;
                        if (megaDirectoryNode.Node != null)
                        {
                            throw new PBException($"node should be null");
                        }
                        megaDirectoryNode.Node = node;
                        megaDirectoryNode.Name = GetName(node);
                        //Trace.WriteLine($"nodeAlreadyCreated : Id {node.Id} Name {node.Name}");
                    }

                    if (type == NodeType.Root)
                    {
                        _root = megaDirectoryNode;
                    }
                    else if (type == NodeType.Inbox)
                    {
                        _inbox = megaDirectoryNode;
                    }
                    else if (type == NodeType.Trash)
                    {
                        _trash = megaDirectoryNode;
                    }

                    megaNode = megaDirectoryNode;
                    if (type == NodeType.Directory)
                    {
                        _directoryNodeCount++;
                    }
                }
                else
                {
                    megaNode = new MegaNode {
                        Id = node.Id, Node = node, Name = GetName(node)
                    };
                    _fileNodeCount++;
                }

                if (parentMegaNode != null)
                {
                    megaNode.Parent = parentMegaNode;
                    parentMegaNode.Childs.Add(megaNode);
                }
            }
            return(megaNodes);
        }