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