public static List <GHFileSystem> LoadFromString(string input) { List <GHFileSystem> output = new List <GHFileSystem>(); Queue <char> queue = new Queue <char>(input); while (queue.Count > 0) { StringBuilder sb = new StringBuilder(); while (queue.Peek() != ';') { sb.Append(queue.Dequeue()); } queue.Dequeue(); string publicIp = sb.ToString(); sb.Clear(); while (queue.Peek() != ';') { sb.Append(queue.Dequeue()); } queue.Dequeue(); string localIp = sb.ToString(); sb.Clear(); Queue <char> imageQueue = GHTextConvertor.HexToUtf16(queue); output.Add(LoadFromCompressedString(publicIp, localIp, imageQueue, sb)); queue.Dequeue(); } return(output); }
public static GHFileSystem LoadFromCompressedString(string publicIp, string localIp, Queue <char> imageQueue, StringBuilder sb) { GHFileSystem fileSystem = new GHFileSystem() { PublicIp = publicIp, LocalIp = localIp }; GHFileSystemNode activeNode = null; while (imageQueue.Count > 0) { sb.Clear(); while (imageQueue.Peek() < 32768) { sb.Append(GHTextConvertor.Utf14ToDoubleUtf7(imageQueue.Dequeue())); } if (imageQueue.Peek() == (char)Depth.Up) { activeNode = activeNode.Parent; imageQueue.Dequeue(); continue; } var tmp = new GHFileSystemNode(activeNode, sb.ToString()) { FileSystem = fileSystem }; tmp.FileFlags = (FileFlag)imageQueue.Dequeue() - 32768; if (activeNode != null) { activeNode.AddChild(tmp); if (activeNode.IsHomeFolder && !fileSystem.Users.ContainsKey(tmp.Name)) { fileSystem.Users.Add(tmp.Name, new GHFileSystemUser() { FileSystem = fileSystem, HomeFolder = tmp }); } else if (tmp.IsRootUserFolder) { fileSystem.Users.Add(tmp.Name, new GHFileSystemUser() { FileSystem = fileSystem, HomeFolder = tmp }); } } if (imageQueue.Peek() == (char)Depth.Down) { imageQueue.Dequeue(); activeNode = tmp; } } fileSystem.RootNode = activeNode; return(fileSystem); }