//--------------------------------------------------------------------------- void File_Pdf::Object_Root() { Element_Info1("Document Catalog"); //Parsing string Key; Ztring Value; while (Element_Offset<Element_Size) { if (Get_Next(Key, Value)) { for (;;) { Get_Next(Key, Value); if (Key.empty()) break; else if (Key=="Metadata") { int32u ObjectNumber=Value.To_int32u(); Objects[ObjectNumber].Type=Type_Metadata; Objects[ObjectNumber].TopObject=Objects_Current->first; Objects[Objects_Current->first].Bottoms.push_back(ObjectNumber); Param_Info1(__T("Metadata is at offset 0x"+Ztring().From_Number(Objects[ObjectNumber].Offset))); } } continue; } if (Key.empty()) break; } }
//--------------------------------------------------------------------------- void File_Tar::Read_Buffer_Continue() { if (File_Size<257) { Reject(); return; } if (Buffer_Size<257) return; //Wait for more data //Parsing Ztring ChecksumO; Skip_Local(100, "File name"); Skip_Local( 8, "File mode"); Skip_Local( 8, "Owner's numeric user ID"); Skip_Local( 12, "Group's numeric user ID"); Skip_Local( 12, "File size in bytes"); Skip_Local( 8, "Last modification time in numeric Unix time format"); Get_Local ( 8, ChecksumO, "Checksum for header block"); Skip_B1( "Link indicator (file type)"); Skip_Local(100, "Name of linked file"); Skip_XX(File_Size-257, "Data"); FILLING_BEGIN(); //Handling Checksum int32u Checksum=ChecksumO.To_int32u(8); int32u ChecksumU=0; int32u ChecksumS=0; for (size_t Pos=0; Pos<257; Pos++) { if (Pos==148) { ChecksumU+=32*8; //8 spaces ChecksumS+=32*8; //8 spaces Pos+=7; //Skiping Checksum } ChecksumU+=(int8u)Buffer[Pos]; ChecksumS+=(int8s)Buffer[Pos]; } if (ChecksumU!=Checksum && ChecksumS!=Checksum) { Reject("Tar"); return; } //Filling Accept("Tar"); Fill(Stream_General, 0, General_Format, "Tar"); Reject("Tar"); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Pdf::Object_Metadata() { Element_Info1("Metadata"); //Parsing string Key; Ztring Value; int32u Length=0; while (Element_Offset<Element_Size) { if (Get_Next(Key, Value)) { for (;;) { Get_Next(Key, Value); if (Key.empty()) break; else if (Key=="Length") { Length=Value.To_int32u(); } } continue; } if (Key.empty()) break; else if (Key=="stream") { //Removig end of lines if (Element_Offset<Element_Size && Buffer[Buffer_Offset+(size_t)Element_Offset]=='\r') Element_Offset++; if (Element_Offset<Element_Size && Buffer[Buffer_Offset+(size_t)Element_Offset]=='\n') Element_Offset++; #ifndef MEDIAINFO_TINYXML2_NO File_Xmp MI; Open_Buffer_Init(&MI, Length); Open_Buffer_Continue(&MI, Buffer+Buffer_Offset+(size_t)Element_Offset, Length); Skip_XX(Length, "Stream, Data"); Open_Buffer_Finalize(&MI); Merge(MI, Stream_General, 0, 0); #endif //MEDIAINFO_TINYXML2_NO } } }
//--------------------------------------------------------------------------- void File_Pdf::trailer() { Element_Begin1("Trailer"); //Parsing int32u Prev=(int32u)-1; string Key; Ztring Value; Skip_String(SizeOfLine(), "Object name"); while (Element_Offset<Element_Size) { if (Get_Next(Key, Value)) { for (;;) { Get_Next(Key, Value); if (Key.empty()) break; else if (Key=="Root") { int32u ObjectNumber=Value.To_int32u(); Objects[ObjectNumber].Type=Type_Root; Objects[ObjectNumber].TopObject=(int32u)-1; Objects[(int32u)-1].Bottoms.push_back(ObjectNumber); Param_Info1(__T("Document Catalog is at offset 0x"+Ztring().From_Number(Objects[ObjectNumber].Offset, 16))); } else if (Key=="Info") { int32u ObjectNumber=Value.To_int32u(); Objects[ObjectNumber].Type=Type_Info; Objects[ObjectNumber].TopObject=(int32u)-1; Objects[(int32u)-1].Bottoms.push_back(ObjectNumber); Param_Info1(__T("Info is at offset 0x"+Ztring().From_Number(Objects[ObjectNumber].Offset, 16))); } else if (Key=="Prev") { Prev=Value.To_int32u(); Param_Info1(__T("Previous Cross-Reference Table is at offset 0x"+Ztring().From_Number(Prev, 16))); } } continue; } if (Key.empty()) break; } Element_End0(); //Previous Cross-Reference Table if (Prev!=(int32u)-1) { GoTo(Prev); return; } objects::iterator Object_Top=Objects.find((int32u)-1); if (Offsets.empty() || Object_Top==Objects.end()) { Finish(); return; } sort(Offsets.begin(), Offsets.end()); //Offsets_Current=Offsets.end(); //No more used for the moment Objects[(int32u)-1].BottomPos=0; Objects_Current=Objects.find(Object_Top->second.Bottoms[0]); GoTo(Objects_Current->second.Offset); State=State_Parsing_object; }