Beispiel #1
0
        public void WriteStorageFileInfo(IAfpVolume volume, IStorageFile file, AfpFileDirectoryBitmap bitmap, bool writeFileByte = true)
        {
            if (writeFileByte)
            {
                this.WriteUInt8(0);
            }

            while ((this.Stream.Length % 2) != 0)
            {
                this.WriteUInt8(0);
            }

            this.BeginMarking();

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPAttributeBit:
                    AfpFileDirectoryAttributes attrs = 0;

                    if ((file.Attributes & StorageItemAttributes.Hidden) != 0)
                    {
                        attrs |= AfpFileDirectoryAttributes.kFPInvisibleBit;
                    }

                    this.WriteEnum <AfpFileDirectoryAttributes>(attrs);
                    break;

                case AfpFileDirectoryBitmap.kFPParentDirIDBit:
                    if (file.Parent == null)
                    {
                        this.WriteUInt32(1);
                    }
                    else if (file.Parent is IStorageProvider)
                    {
                        this.WriteUInt32(2);
                    }
                    else
                    {
                        this.WriteUInt32(volume.GetNode(file.Parent));
                    }
                    break;

                case AfpFileDirectoryBitmap.kFPCreateDateBit:
                    this.WriteMacintoshDate(file.DateCreated);
                    break;

                case AfpFileDirectoryBitmap.kFPModDateBit:
                    this.WriteMacintoshDate(file.DateModified);
                    break;

                case AfpFileDirectoryBitmap.kFPBackupDateBit:
                    this.WriteUInt32(0x80000000);
                    break;

                case AfpFileDirectoryBitmap.kFPFinderInfoBit:
                    this.WriteBytes(new byte[32]);
                    break;

                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.WriteMark("LongName");

                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.WriteMark("ShortName");
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.WriteMark("UTF8Name");
                    this.WriteBytes(new byte[4]);
                    break;

                case AfpFileDirectoryBitmap.kFPNodeIDBit:
                    this.WriteUInt32(volume.GetNode(file));
                    break;

                case AfpFileDirectoryBitmap.kFPAccessRightsBit:
                    this.WriteEnum <AfpAccessRightsBitmap>(AfpAccessRightsBitmap.All);
                    break;

                case AfpFileDirectoryBitmap.kFPExtDataForkLenBit:
                    this.WriteUInt64((ulong)file.Length);
                    break;

                case AfpFileDirectoryBitmap.kFPDataForkLenBit:
                    this.WriteUInt32((uint)file.Length);
                    break;

                case AfpFileDirectoryBitmap.kFPRsrcForkLenBit:
                    this.WriteUInt32(0);
                    break;

                case AfpFileDirectoryBitmap.kFPExtRsrcForkLenBit:
                    this.WriteUInt64(0);
                    break;

                default:
                    Console.WriteLine("Unrecog file flag: {0}", flag);
                    break;
                }
            }

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.BeginMark("LongName");
                    this.WritePascalString(file.Name, 32);
                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.BeginMark("ShortName");
                    this.WritePascalString(file.Name, 12);
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.BeginMark("UTF8Name");
                    this.WriteUTF8StringWithHint(file.Name);
                    break;
                }
            }

            this.EndMarking();
        }
Beispiel #2
0
        public void WriteStorageContainerInfo(IAfpVolume volume, IStorageContainer container, AfpFileDirectoryBitmap bitmap)
        {
            this.WriteUInt8(1 << 7);

            while ((this.Stream.Length % 2) != 0)
            {
                this.WriteUInt8(0);
            }

            this.BeginMarking();

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPAttributeBit:
                    AfpFileDirectoryAttributes attrs = 0;

                    if ((container.Attributes & StorageItemAttributes.Hidden) != 0)
                    {
                        attrs |= AfpFileDirectoryAttributes.kFPInvisibleBit;
                    }

                    this.WriteEnum <AfpFileDirectoryAttributes>(attrs);
                    break;

                case AfpFileDirectoryBitmap.kFPParentDirIDBit:
                    if (container.Parent == null)
                    {
                        this.WriteUInt32(1);
                    }
                    else if (container.Parent is IStorageProvider)
                    {
                        this.WriteUInt32(2);
                    }
                    else
                    {
                        this.WriteUInt32(volume.GetNode(container.Parent));
                    }
                    break;

                case AfpFileDirectoryBitmap.kFPOffspringCountBit:
                    this.WriteUInt16((ushort)container.Contents().Count());
                    break;

                case AfpFileDirectoryBitmap.kFPCreateDateBit:
                    this.WriteMacintoshDate(container.DateCreated);
                    break;

                case AfpFileDirectoryBitmap.kFPModDateBit:
                    this.WriteMacintoshDate(container.DateModified);
                    break;

                case AfpFileDirectoryBitmap.kFPBackupDateBit:
                    this.WriteUInt32(0x80000000);
                    break;

                case AfpFileDirectoryBitmap.kFPFinderInfoBit:
                    this.WriteBytes(new byte[32]);
                    break;

                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.WriteMark("LongName");
                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.WriteMark("ShortName");
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.WriteMark("UTF8Name");
                    this.WriteBytes(new byte[4]);
                    break;

                case AfpFileDirectoryBitmap.kFPNodeIDBit:
                    if (container is IStorageProvider)
                    {
                        this.WriteUInt32(2);
                    }
                    else
                    {
                        this.WriteUInt32(volume.GetNode(container));
                    }
                    break;

                case AfpFileDirectoryBitmap.kFPOwnerIDBit:
                    this.WriteUInt32(0);
                    break;

                case AfpFileDirectoryBitmap.kFPGroupIDBit:
                    this.WriteUInt32(0);
                    break;

                case AfpFileDirectoryBitmap.kFPAccessRightsBit:
                    this.WriteEnum <AfpAccessRightsBitmap>(AfpAccessRightsBitmap.All);
                    break;

                default:
                    Console.WriteLine("Unrecog flag: {0}", flag);
                    break;
                }
            }

            //this.WriteUInt32(0); // Pad

            foreach (AfpFileDirectoryBitmap flag in bitmap.EnumerateFlags())
            {
                switch (flag)
                {
                case AfpFileDirectoryBitmap.kFPLongNameBit:
                    this.BeginMark("LongName");
                    this.WritePascalString(container.Name, 32);
                    break;

                case AfpFileDirectoryBitmap.kFPShortNameBit:
                    this.BeginMark("ShortName");
                    this.WritePascalString(container.Name, 12);
                    break;

                case AfpFileDirectoryBitmap.kFPUTF8NameBit:
                    this.BeginMark("UTF8Name");
                    this.WriteUTF8StringWithHint(container.Name);
                    break;
                }
            }

            this.EndMarking();
        }