1+ using NUnit . Framework ;
2+ using NUnit . Framework ;
3+ using TagLib ;
4+ using TagLib . IFD ;
5+ using TagLib . IFD . Tags ;
6+ using TagLib . IFD . Entries ;
7+ using TagLib . Jpeg ;
8+
9+ using System ;
10+ using System . Collections . Generic ;
11+ using System . Linq ;
12+ using System . Text ;
13+ using System . Threading . Tasks ;
14+ using TaglibSharp . Tests . Images . Validators ;
15+ using TagLib . IFD ;
16+ using TagLib . Xmp ;
17+
18+ namespace TaglibSharp . Tests . Images
19+ {
20+ public class BadIptcSectionTest
21+ {
22+ [ Test ]
23+ public void Test ( )
24+ {
25+ ImageTest . Run ( "sample_IPTC_crash.jpg" ,
26+ false ,
27+ new BadIptcSectionTestInvariantValidator ( ) ,
28+ NoModificationValidator . Instance ,
29+ new PropertyModificationValidator < string > ( "Copyright" , null , "Copyright 2024 by Somebody Im Sure" )
30+ ) ;
31+ }
32+ }
33+ public class BadIptcSectionTestInvariantValidator : IMetadataInvariantValidator
34+ {
35+ int calls = 0 ;
36+ public void ValidateMetadataInvariants ( TagLib . Image . File file )
37+ {
38+ // If we get here, the fix works.
39+ ++ calls ;
40+
41+ Assert . IsNotNull ( file ) ;
42+
43+ Assert . IsFalse ( file . PossiblyCorrupt ) ; // The only problem is in the IPTC section, which we ignore.
44+
45+ var tag = file . GetTag ( TagTypes . TiffIFD ) as IFDTag ;
46+ Assert . IsNotNull ( tag , "IFD tag not found" ) ;
47+
48+ var structure = tag . Structure ;
49+
50+ var exif = structure . GetEntry ( 0 , ( ushort ) IFDEntryTag . ExifIFD ) as SubIFDEntry ;
51+ Assert . IsNotNull ( exif , "Exif tag not found" ) ;
52+
53+ var exif_structure = exif . Structure ;
54+ {
55+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . ExifVersion ) ;
56+ Assert . IsNotNull ( entry , "Entry 0x9000 missing in IFD 0" ) ;
57+ Assert . IsNotNull ( entry as UndefinedIFDEntry , "Entry is not an undefined IFD entry!" ) ;
58+ var parsed_bytes = ( entry as UndefinedIFDEntry ) . Data . Data ;
59+ var bytes = new byte [ ] { 48 , 50 , 51 , 49 } ;
60+ Assert . AreEqual ( bytes , parsed_bytes ) ;
61+ }
62+ {
63+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . ColorSpace ) ;
64+ Assert . IsNotNull ( entry , "Entry 0xa001 missing in IFD 0" ) ;
65+ Assert . IsNotNull ( entry as ShortIFDEntry , "Entry is not a short IFD entry!" ) ;
66+ var parsed_value = ( entry as ShortIFDEntry ) . Value ;
67+ Assert . AreEqual ( 65535 , parsed_value ) ;
68+ }
69+ {
70+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . PixelXDimension ) ;
71+ Assert . IsNotNull ( entry , "Entry 0xa001 missing in IFD 0" ) ;
72+ Assert . IsNotNull ( entry as LongIFDEntry , "Entry is not a long IFD entry!" ) ;
73+ var parsed_value = ( entry as LongIFDEntry ) . Value ;
74+ Assert . AreEqual ( 4845 , parsed_value ) ;
75+ }
76+ {
77+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . PixelYDimension ) ;
78+ Assert . IsNotNull ( entry , "Entry 0xa001 missing in IFD 0" ) ;
79+ Assert . IsNotNull ( entry as LongIFDEntry , "Entry is not a long IFD entry!" ) ;
80+ var parsed_value = ( entry as LongIFDEntry ) . Value ;
81+ Assert . AreEqual ( 2834 , parsed_value ) ;
82+ }
83+
84+
85+ var xmp = file . GetTag ( TagTypes . XMP ) as XmpTag ;
86+ Assert . IsNotNull ( xmp , "XMP tag not found" ) ;
87+
88+ Assert . AreEqual ( "Adobe Photoshop 22.1 (Windows)" , xmp . Software ) ;
89+ // ValidateMetadataInvariants is called 3 times for each Validator: once in the
90+ // ParseUnmodifiedFile method, once in the ModifyFile method before changing
91+ // anything, and once in the ParseModifiedFile method.
92+ // The PropertyModificationValidator class verifies the property setting, but
93+ // I'm not sure I totally trust it, so I'm going to check the property value
94+ // here as well.
95+ if ( calls == 1 )
96+ Assert . IsNull ( xmp . Copyright ) ;
97+ if ( xmp . Copyright != null )
98+ Assert . AreEqual ( "Copyright 2024 by Somebody Im Sure" , xmp . Copyright ) ;
99+ Assert . IsNull ( xmp . Creator ) ;
100+ }
101+ }
102+ }
0 commit comments