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; }
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); }
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); }