1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
28: class Horde_Core_Factory_MimeViewer extends Horde_Core_Factory_Base
29: {
30: 31: 32: 33: 34:
35: private $_config = array();
36:
37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
53: public function create(Horde_Mime_Part $mime, array $opts = array())
54: {
55: $app = isset($opts['app'])
56: ? $opts['app']
57: : $GLOBALS['registry']->getApp();
58:
59: $type = isset($opts['type'])
60: ? $opts['type']
61: : $mime->getType();
62:
63: list($driver, $params) = $this->getViewerConfig($type, $app);
64:
65: return Horde_Mime_Viewer::factory($driver, $mime, $params);
66: }
67:
68: 69: 70: 71: 72: 73: 74: 75:
76: public function getViewerConfig($type, $app)
77: {
78: $config = $this->_getDriver($type, $app);
79:
80: $config['driver'] = ucfirst($config['driver']);
81: $driver = ($config['app'] == 'horde')
82: ? $config['driver']
83: : $config['app'] . '_Mime_Viewer_' . $config['driver'];
84:
85: $params = array_merge($config, array(
86: 'charset' => 'UTF-8',
87:
88:
89: 'temp_file' => array('Horde', 'getTempFile'),
90: 'text_filter' => array($this->_injector->getInstance('Horde_Core_Factory_TextFilter'), 'filter')
91: ));
92:
93: switch ($config['driver']) {
94: case 'Deb':
95: case 'Rpm':
96: $params['monospace'] = 'fixed';
97: break;
98:
99: case 'Html':
100: $params['browser'] = $GLOBALS['browser'];
101: $params['external_callback'] = array('Horde', 'externalUrl');
102: break;
103:
104: case 'Ooo':
105: $params['zip'] = Horde_Compress::factory('Zip');
106: break;
107:
108: case 'Rar':
109: $params['monospace'] = 'fixed';
110: $params['rar'] = Horde_Compress::factory('Rar');
111: break;
112:
113: case 'Report':
114: case 'Security':
115: $params['viewer_callback'] = array($this, 'getViewerCallback');
116: break;
117:
118: case 'Syntaxhighlighter':
119: if ($config['app'] == 'horde') {
120: $driver = 'Horde_Core_Mime_Viewer_Syntaxhighlighter';
121: }
122: $params['registry'] = $GLOBALS['registry'];
123: break;
124:
125: case 'Tgz':
126: $params['gzip'] = Horde_Compress::factory('Gzip');
127: $params['monospace'] = 'fixed';
128: $params['tar'] = Horde_Compress::factory('Tar');
129: break;
130:
131: case 'Tnef':
132: $params['tnef'] = Horde_Compress::factory('Tnef');
133: break;
134:
135: case 'Vcard':
136: if ($config['app'] == 'horde') {
137: $driver = 'Horde_Core_Mime_Viewer_Vcard';
138: }
139: $params['browser'] = $GLOBALS['browser'];
140: $params['notification'] = $GLOBALS['notification'];
141: $params['prefs'] = $GLOBALS['prefs'];
142: $params['registry'] = $GLOBALS['registry'];
143: break;
144:
145: case 'Zip':
146: $params['monospace'] = 'fixed';
147: $params['zip'] = Horde_Compress::factory('Zip');
148: break;
149: }
150:
151: return array($driver, $params);
152: }
153:
154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167:
168: public function getViewerCallback(Horde_Mime_Viewer_Base $viewer,
169: Horde_Mime_Part $mime, $type)
170: {
171: return $this->getViewer($mime, array('type' => $type));
172: }
173:
174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186:
187: public function getIcon($mime, array $opts = array())
188: {
189: $app = isset($opts['app'])
190: ? $opts['app']
191: : $GLOBALS['registry']->getApp();
192:
193: $type = ($mime instanceof Horde_Mime_Part)
194: ? $mime->getType()
195: : $mime;
196:
197: $config = $this->_getDriver($type, $app);
198:
199: if (!isset($config['icon'])) {
200: $config['icon'] = array(
201: 'app' => 'horde',
202: 'icon' => 'text.png'
203: );
204: }
205:
206: return Horde_Themes::img('mime/' . $config['icon']['icon'], $config['icon']['app']);
207: }
208:
209: 210: 211: 212: 213:
214: private function _loadConfig($app)
215: {
216: if ($app != 'horde') {
217: $this->_loadConfig('horde');
218: }
219:
220: 221:
222: if (isset($this->_config[$app])) {
223: return;
224: }
225:
226: try {
227: $aconfig = Horde::loadConfiguration('mime_drivers.php', 'mime_drivers', $app);
228: } catch (Horde_Exception $e) {
229: $aconfig = array();
230: }
231:
232: $config = array(
233: 'config' => array(),
234: 'handles' => array()
235: );
236:
237: foreach ($aconfig as $key => $val) {
238: if (empty($val['disable'])) {
239: if (!empty($val['handles'])) {
240: $config['handles'] = array_merge($config['handles'], array_fill_keys(array_values($val['handles']), $key));
241: unset($val['handles']);
242: }
243:
244: $config['config'][$key] = $val;
245: }
246: }
247:
248:
249: if (($app == 'horde') && !isset($config['config']['default'])) {
250: $config['config']['default'] = array();
251: }
252:
253: $this->_config[$app] = $config;
254: }
255:
256: 257: 258: 259: 260: 261: 262: 263:
264: private function _getDriver($type, $app)
265: {
266: $this->_loadConfig($app);
267:
268: 269:
270: $config = array();
271: list($ptype,) = explode('/', $type, 2);
272: $wild = $ptype . '/*';
273:
274: $app_list = array(
275: array('horde', 'default', 'config'),
276: array($app, 'default', 'config'),
277: array('horde', $wild, 'handles'),
278: array($app, $wild, 'handles'),
279: array('horde', $type, 'handles'),
280: array($app, $type, 'handles')
281: );
282: if ($app == 'horde') {
283: unset($app_list[1], $app_list[3], $app_list[5]);
284: }
285:
286: foreach ($app_list as $val) {
287: $driver = isset($this->_config[$val[0]][$val[2]][$val[1]])
288: ? (($val[1] == 'default') ? 'default' : $this->_config[$val[0]][$val[2]][$val[1]])
289: : null;
290:
291: if ($driver) {
292: $tmp = $this->_config[$val[0]]['config'][$driver];
293: if (isset($tmp['icons'])) {
294: foreach (array($type, $wild, 'default') as $val2) {
295: if (isset($tmp['icons'][$val2])) {
296: $tmp['icon'] = array(
297: 'app' => $val[0],
298: 'icon' => $tmp['icons'][$val2]
299: );
300: break;
301: }
302: }
303: unset($tmp['icons']);
304: }
305:
306: $config = array_merge(Horde_Array::replaceRecursive($config, $tmp), array(
307: 'app' => $val[0],
308: 'driver' => $driver
309: ));
310:
311: }
312: }
313:
314: return $config;
315: }
316:
317: }
318: