Exemplo n.º 1
0
        public PackageSystem(List <string> packages)
        {
            _rootNode = new PackageNode()
            {
                Name = "root", Directory = true
            };

            HLLib.hlInitialize();

            foreach (var package in packages)
            {
                if (Directory.Exists(package))
                {
                    FindDirFiles(package, _rootNode);
                    continue;
                }

                HLLib.HLPackageType type = HLLib.hlGetPackageTypeFromName(package);

                uint packagePointer;
                if (!HLLib.hlCreatePackage(type, out packagePointer))
                {
                    throw new Exception("Can't load package: " + HLLib.hlGetString(HLLib.HLOption.HL_ERROR_SHORT_FORMATED));
                }

                HLLib.hlBindPackage(packagePointer);

                if (!HLLib.hlPackageOpenFile(package, (uint)HLLib.HLFileMode.HL_MODE_READ))
                {
                    throw new Exception("Can't load package: " + HLLib.hlGetString(HLLib.HLOption.HL_ERROR_SHORT_FORMATED));
                }

                _rootNode.FileSize = 0;
                var rootItems = HLLib.hlFolderGetCount(HLLib.hlPackageGetRoot());
                for (uint i = 0; i < rootItems; i++)
                {
                    var  item = HLLib.hlFolderGetItem(HLLib.hlPackageGetRoot(), i);
                    uint size;
                    HLLib.hlItemGetSize(item, out size);
                    _rootNode.FileSize += size;
                }
                FindFiles(HLLib.hlPackageGetRoot(), _rootNode, packagePointer);

                //HLLib.hlPackageClose();
            }
        }
Exemplo n.º 2
0
        private void FindFiles(IntPtr dir, PackageNode node, uint package)
        {
            uint count = HLLib.hlFolderGetCount(dir);

            for (uint i = 0; i < count; i++)
            {
                var item     = HLLib.hlFolderGetItem(dir, i);
                var itemNode = new PackageNode();
                itemNode.Name      = HLLib.hlItemGetName(item).ToLower();
                itemNode.Directory = HLLib.hlItemGetType(item) == HLLib.HLDirectoryItemType.HL_ITEM_FOLDER;

                var pathPtr = Marshal.AllocHGlobal(255);
                HLLib.hlItemGetPath(item, pathPtr, 255);
                var pathBuffer = new byte[255];
                Marshal.Copy(pathPtr, pathBuffer, 0, 255);
                itemNode.Path = Encoding.ASCII.GetString(pathBuffer).TrimEnd('\0').ToLower();

                uint filesize;
                HLLib.hlItemGetSize(item, out filesize);
                itemNode.FileSize = filesize;

                if (itemNode.Directory)
                {
                    if (node.Directories.ContainsKey(itemNode.Name))
                    {
                        FindFiles(item, node.Directories[itemNode.Name], package);
                    }
                    else
                    {
                        FindFiles(item, itemNode, package);
                        node.Directories[itemNode.Name] = itemNode;
                    }
                }
                else
                {
                    itemNode.FilePtr          = item;
                    itemNode.FilePackage      = package;
                    node.Files[itemNode.Name] = itemNode;
                }
            }
        }