Esempio n. 1
0
        internal void UpdateFromInfo(SharedDirectoryInfo info)
        {
            var newDirectories = new RemoteDirectory[info.Directories.Length];

            for (var x = 0; x < info.Directories.Length; x++)
            {
                var dir = (RemoteDirectory)GetSubdirectory(info.Directories[x]);
                if (dir == null)
                {
                    dir = new RemoteDirectory(core, PathUtil.Join(m_FullPath, info.Directories[x]));
                }
                newDirectories[x] = dir;
            }

            var newFiles = new RemoteFile[info.Files.Length];

            for (var x = 0; x < info.Files.Length; x++)
            {
                var file = (RemoteFile)GetFile(info.Files[x].Name);
                if (file == null)
                {
                    file = new RemoteFile(this, info.Files[x]);
                }
                else
                {
                    file.UpdateFromInfo(info.Files[x]);
                }
                newFiles[x] = file;
            }

            m_SubDirectories = newDirectories;
            m_Files          = newFiles;

            m_State = RemoteDirectoryState.ContentsReceived;
        }
Esempio n. 2
0
        public Message CreateRespondDirListingMessage(Node messageTo, LocalDirectory directory)
        {
            SharedDirectoryInfo info = new SharedDirectoryInfo(directory);

            info.Files       = directory.Files.Select(f => new SharedFileListing((LocalFile)f, false)).ToArray();
            info.Directories = directory.Directories.Select(d => d.Name).ToArray();

            Message message = new Message(network, MessageType.RespondDirListing);

            message.To      = messageTo.NodeID;
            message.Content = info;
            return(message);
        }
Esempio n. 3
0
        internal void ProcessRespondDirListingMessage(Network network, Node messageFrom, SharedDirectoryInfo info)
        {
            var fullPath = PathUtil.Join(messageFrom.Directory.FullPath, info.FullPath);

            var node = PathUtil.GetNode(core, fullPath);

            if (node != messageFrom)
            {
                throw new Exception("Directory was for a different node");
            }

            var remoteDirectory = GetOrCreateRemoteDirectory(fullPath);

            remoteDirectory.UpdateFromInfo(info);

            lock (remoteDirectoryCallbacks) {
                if (remoteDirectoryCallbacks.ContainsKey(fullPath))
                {
                    foreach (var callback in remoteDirectoryCallbacks[fullPath])
                    {
                        callback(remoteDirectory);
                    }
                    remoteDirectoryCallbacks.Remove(fullPath);
                }
            }

            network.RaiseReceivedDirListing(messageFrom, remoteDirectory);
        }