|
1 <?php |
|
2 |
|
3 /** |
|
4 * @file |
|
5 * Archiver implementations provided by the system module. |
|
6 */ |
|
7 |
|
8 /** |
|
9 * Archiver for .tar files. |
|
10 */ |
|
11 class ArchiverTar implements ArchiverInterface { |
|
12 |
|
13 /** |
|
14 * The underlying Archive_Tar instance that does the heavy lifting. |
|
15 * |
|
16 * @var Archive_Tar |
|
17 */ |
|
18 protected $tar; |
|
19 |
|
20 public function __construct($file_path) { |
|
21 $this->tar = new Archive_Tar($file_path); |
|
22 } |
|
23 |
|
24 public function add($file_path) { |
|
25 $this->tar->add($file_path); |
|
26 |
|
27 return $this; |
|
28 } |
|
29 |
|
30 public function remove($file_path) { |
|
31 // @todo Archive_Tar doesn't have a remove operation |
|
32 // so we'll have to simulate it somehow, probably by |
|
33 // creating a new archive with everything but the removed |
|
34 // file. |
|
35 |
|
36 return $this; |
|
37 } |
|
38 |
|
39 public function extract($path, Array $files = array()) { |
|
40 if ($files) { |
|
41 $this->tar->extractList($files, $path); |
|
42 } |
|
43 else { |
|
44 $this->tar->extract($path); |
|
45 } |
|
46 |
|
47 return $this; |
|
48 } |
|
49 |
|
50 public function listContents() { |
|
51 $files = array(); |
|
52 foreach ($this->tar->listContent() as $file_data) { |
|
53 $files[] = $file_data['filename']; |
|
54 } |
|
55 return $files; |
|
56 } |
|
57 |
|
58 /** |
|
59 * Retrieve the tar engine itself. |
|
60 * |
|
61 * In some cases it may be necessary to directly access the underlying |
|
62 * Archive_Tar object for implementation-specific logic. This is for advanced |
|
63 * use only as it is not shared by other implementations of ArchiveInterface. |
|
64 * |
|
65 * @return |
|
66 * The Archive_Tar object used by this object. |
|
67 */ |
|
68 public function getArchive() { |
|
69 return $this->tar; |
|
70 } |
|
71 } |
|
72 |
|
73 /** |
|
74 * Archiver for .zip files. |
|
75 * |
|
76 * @link http://php.net/zip |
|
77 */ |
|
78 class ArchiverZip implements ArchiverInterface { |
|
79 |
|
80 /** |
|
81 * The underlying ZipArchive instance that does the heavy lifting. |
|
82 * |
|
83 * @var ZipArchive |
|
84 */ |
|
85 protected $zip; |
|
86 |
|
87 public function __construct($file_path) { |
|
88 $this->zip = new ZipArchive(); |
|
89 if ($this->zip->open($file_path) !== TRUE) { |
|
90 // @todo: This should be an interface-specific exception some day. |
|
91 throw new Exception(t('Cannot open %file_path', array('%file_path' => $file_path))); |
|
92 } |
|
93 } |
|
94 |
|
95 public function add($file_path) { |
|
96 $this->zip->addFile($file_path); |
|
97 |
|
98 return $this; |
|
99 } |
|
100 |
|
101 public function remove($file_path) { |
|
102 $this->zip->deleteName($file_path); |
|
103 |
|
104 return $this; |
|
105 } |
|
106 |
|
107 public function extract($path, Array $files = array()) { |
|
108 if ($files) { |
|
109 $this->zip->extractTo($path, $files); |
|
110 } |
|
111 else { |
|
112 $this->zip->extractTo($path); |
|
113 } |
|
114 |
|
115 return $this; |
|
116 } |
|
117 |
|
118 public function listContents() { |
|
119 $files = array(); |
|
120 for ($i=0; $i < $this->zip->numFiles; $i++) { |
|
121 $files[] = $this->zip->getNameIndex($i); |
|
122 } |
|
123 return $files; |
|
124 } |
|
125 |
|
126 /** |
|
127 * Retrieve the zip engine itself. |
|
128 * |
|
129 * In some cases it may be necessary to directly access the underlying |
|
130 * ZipArchive object for implementation-specific logic. This is for advanced |
|
131 * use only as it is not shared by other implementations of ArchiveInterface. |
|
132 * |
|
133 * @return |
|
134 * The ZipArchive object used by this object. |
|
135 */ |
|
136 public function getArchive() { |
|
137 return $this->zip; |
|
138 } |
|
139 } |