Blame view

sources/3rdparty/getid3/module.archive.szip.php 3.82 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  <?php
  /////////////////////////////////////////////////////////////////
  /// getID3() by James Heinrich <info@getid3.org>               //
  //  available at http://getid3.sourceforge.net                 //
  //            or http://www.getid3.org                         //
  /////////////////////////////////////////////////////////////////
  // See readme.txt for more details                             //
  /////////////////////////////////////////////////////////////////
  //                                                             //
  // module.archive.szip.php                                     //
  // module for analyzing SZIP compressed files                  //
  // dependencies: NONE                                          //
  //                                                            ///
  /////////////////////////////////////////////////////////////////
  
  
  class getid3_szip extends getid3_handler
  {
31b7f2792   Kload   Upgrade to ownclo...
19
  	public function Analyze() {
03e52840d   Kload   Init
20
  		$info = &$this->getid3->info;
31b7f2792   Kload   Upgrade to ownclo...
21
22
  		$this->fseek($info['avdataoffset']);
  		$SZIPHeader = $this->fread(6);
03e52840d   Kload   Init
23
24
25
26
27
28
29
  		if (substr($SZIPHeader, 0, 4) != "SZ\x0A\x04") {
  			$info['error'][] = 'Expecting "53 5A 0A 04" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes(substr($SZIPHeader, 0, 4)).'"';
  			return false;
  		}
  		$info['fileformat']            = 'szip';
  		$info['szip']['major_version'] = getid3_lib::BigEndian2Int(substr($SZIPHeader, 4, 1));
  		$info['szip']['minor_version'] = getid3_lib::BigEndian2Int(substr($SZIPHeader, 5, 1));
31b7f2792   Kload   Upgrade to ownclo...
30
31
  $info['error'][] = 'SZIP parsing not enabled in this version of getID3() ['.$this->getid3->version().']';
  return false;
03e52840d   Kload   Init
32

31b7f2792   Kload   Upgrade to ownclo...
33
34
  		while (!$this->feof()) {
  			$NextBlockID = $this->fread(2);
03e52840d   Kload   Init
35
36
37
38
39
  			switch ($NextBlockID) {
  				case 'SZ':
  					// Note that szip files can be concatenated, this has the same effect as
  					// concatenating the files. this also means that global header blocks
  					// might be present between directory/data blocks.
31b7f2792   Kload   Upgrade to ownclo...
40
  					$this->fseek(4, SEEK_CUR);
03e52840d   Kload   Init
41
42
43
  					break;
  
  				case 'BH':
31b7f2792   Kload   Upgrade to ownclo...
44
45
  					$BHheaderbytes  = getid3_lib::BigEndian2Int($this->fread(3));
  					$BHheaderdata   = $this->fread($BHheaderbytes);
03e52840d   Kload   Init
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  					$BHheaderoffset = 0;
  					while (strpos($BHheaderdata, "\x00", $BHheaderoffset) > 0) {
  						//filename as \0 terminated string  (empty string indicates end)
  						//owner as \0 terminated string (empty is same as last file)
  						//group as \0 terminated string (empty is same as last file)
  						//3 byte filelength in this block
  						//2 byte access flags
  						//4 byte creation time (like in unix)
  						//4 byte modification time (like in unix)
  						//4 byte access time (like in unix)
  
  						$BHdataArray['filename'] = substr($BHheaderdata, $BHheaderoffset, strcspn($BHheaderdata, "\x00"));
  						$BHheaderoffset += (strlen($BHdataArray['filename']) + 1);
  
  						$BHdataArray['owner'] = substr($BHheaderdata, $BHheaderoffset, strcspn($BHheaderdata, "\x00"));
  						$BHheaderoffset += (strlen($BHdataArray['owner']) + 1);
  
  						$BHdataArray['group'] = substr($BHheaderdata, $BHheaderoffset, strcspn($BHheaderdata, "\x00"));
  						$BHheaderoffset += (strlen($BHdataArray['group']) + 1);
  
  						$BHdataArray['filelength'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 3));
  						$BHheaderoffset += 3;
  
  						$BHdataArray['access_flags'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 2));
  						$BHheaderoffset += 2;
  
  						$BHdataArray['creation_time'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 4));
  						$BHheaderoffset += 4;
  
  						$BHdataArray['modification_time'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 4));
  						$BHheaderoffset += 4;
  
  						$BHdataArray['access_time'] = getid3_lib::BigEndian2Int(substr($BHheaderdata, $BHheaderoffset, 4));
  						$BHheaderoffset += 4;
  
  						$info['szip']['BH'][] = $BHdataArray;
  					}
  					break;
  
  				default:
  					break 2;
  			}
  		}
  
  		return true;
  
  	}
  
  }