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