/// <summary> /// Creates this object and sets all its properties /// </summary> /// <param name="stream">The Compound File Storage CompObj <see cref="CFStream" /></param> internal CompObjStream(CFStream stream) { using (var memoryStream = new MemoryStream(stream.GetData())) using (var binaryReader = new BinaryReader(memoryStream)) { // Reserved1 (4 bytes): This can be set to any arbitrary value and MUST be ignored on processing. // Version (4 bytes): This can be set to any arbitrary value and MUST be ignored on processing. // Reserved2 (20 bytes): This can be set to any arbitrary value and MUST be ignored on processing. // Skip the first 28 bytes, this is the CompObjHeader binaryReader.ReadBytes(28); // This MUST be a LengthPrefixedAnsiString structure that contains a display name of the linked // object or embedded object. AnsiUserType = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); // MarkerOrLength (4 bytes): If this is set to 0x00000000, the FormatOrAnsiString field MUST NOT // be present. If this field is set to 0xFFFFFFFF or 0xFFFFFFFE, the FormatOrAnsiString field MUST // be 4 bytes in size and MUST contain a standard clipboard format identifier. // If this set to a value other than 0x00000000, the FormatOrAnsiString field MUST be set to a // null-terminated ANSI string containing the name of a registered clipboard format and the // MarkerOrLength field MUST be set to the number of ANSI characters in the FormatOrAnsiString field, // including the terminating null character. var markerOrLength = binaryReader.ReadUInt32(); switch (markerOrLength) { case 0x00000000: // Skip break; case 0xFFFFFFFF: case 0xFFFFFFFE: ClipboardFormat = (OleClipboardFormat)binaryReader.ReadUInt32(); break; default: binaryReader.BaseStream.Position -= 4; StringFormat = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); break; } // Reserved1 (variable): If present, this MUST be a LengthPrefixedAnsiString structure. If the Length // field of the LengthPrefixedAnsiString contains a value of 0 or a value that is greater than 0x00000028, // the remaining fields of the structure starting with the String field of the LengthPrefixedAnsiString // MUST be ignored on processing. var reserved1Length = binaryReader.ReadUInt32(); if (reserved1Length <= 0x00000028) { binaryReader.BaseStream.Position -= 4; // ReSharper disable once UnusedVariable var reserved1 = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); } // UnicodeMarker (variable): If this field is present and is NOT set to 0x71B239F4, the remaining fields // of the structure MUST be ignored on processing. var unicodeMarker = binaryReader.ReadUInt32(); if (unicodeMarker == 0x71B239F4) { markerOrLength = binaryReader.ReadUInt32(); switch (markerOrLength) { case 0x00000000: // Skip break; case 0xFFFFFFFF: case 0xFFFFFFFE: ClipboardFormat = (OleClipboardFormat)binaryReader.ReadUInt32(); break; default: binaryReader.BaseStream.Position -= 4; StringFormat = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); break; } } } }
/// <summary> /// Creates this object and sets all its properties /// </summary> /// <param name="stream">The Compound File Storage CompObj <see cref="CFStream" /></param> internal CompObjStream(ICFStream stream) { using (var memoryStream = new MemoryStream(stream.GetData())) using (var binaryReader = new BinaryReader(memoryStream)) { // Reserved1 (4 bytes): This can be set to any arbitrary value and MUST be ignored on processing. // Version (4 bytes): This can be set to any arbitrary value and MUST be ignored on processing. // Reserved2 (20 bytes): This can be set to any arbitrary value and MUST be ignored on processing. // Skip the first 28 bytes, this is the CompObjHeader binaryReader.ReadBytes(28); // This MUST be a LengthPrefixedAnsiString structure that contains a display name of the linked // object or embedded object. AnsiUserType = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); // MarkerOrLength (4 bytes): If this is set to 0x00000000, the FormatOrAnsiString field MUST NOT // be present. If this field is set to 0xFFFFFFFF or 0xFFFFFFFE, the FormatOrAnsiString field MUST // be 4 bytes in size and MUST contain a standard clipboard format identifier. // If this set to a value other than 0x00000000, the FormatOrAnsiString field MUST be set to a // null-terminated ANSI string containing the name of a registered clipboard format and the // MarkerOrLength field MUST be set to the number of ANSI characters in the FormatOrAnsiString field, // including the terminating null character. var markerOrLength = binaryReader.ReadUInt32(); switch (markerOrLength) { case 0x00000000: // Skip break; case 0xFFFFFFFF: case 0xFFFFFFFE: ClipboardFormat = (OleClipboardFormat) binaryReader.ReadUInt32(); break; default: binaryReader.BaseStream.Position -= 4; StringFormat = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); break; } // Reserved1 (variable): If present, this MUST be a LengthPrefixedAnsiString structure. If the Length // field of the LengthPrefixedAnsiString contains a value of 0 or a value that is greater than 0x00000028, // the remaining fields of the structure starting with the String field of the LengthPrefixedAnsiString // MUST be ignored on processing. var reserved1Length = binaryReader.ReadUInt32(); if (reserved1Length <= 0x00000028) { binaryReader.BaseStream.Position -= 4; // ReSharper disable once UnusedVariable var reserved1 = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); } // UnicodeMarker (variable): If this field is present and is NOT set to 0x71B239F4, the remaining fields // of the structure MUST be ignored on processing. var unicodeMarker = binaryReader.ReadUInt32(); if (unicodeMarker == 0x71B239F4) { markerOrLength = binaryReader.ReadUInt32(); switch (markerOrLength) { case 0x00000000: // Skip break; case 0xFFFFFFFF: case 0xFFFFFFFE: ClipboardFormat = (OleClipboardFormat) binaryReader.ReadUInt32(); break; default: binaryReader.BaseStream.Position -= 4; StringFormat = Strings.Read4ByteLengthPrefixedAnsiString(binaryReader); break; } } } }