1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
16: class IMP_Mime_Viewer_Related extends Horde_Mime_Viewer_Base
17: {
18: 19:
20: protected $_capability = array(
21: 'full' => true,
22: 'info' => false,
23: 'inline' => true,
24: 'raw' => false
25: );
26:
27: 28:
29: protected $_metadata = array(
30: 'compressed' => false,
31: 'embedded' => false,
32: 'forceinline' => true
33: );
34:
35: 36: 37: 38: 39:
40: protected $_start;
41:
42: 43:
44: protected function _render()
45: {
46: return $this->_IMPrender(false);
47: }
48:
49: 50:
51: protected function _renderInline()
52: {
53: return $this->_IMPrender(true);
54: }
55:
56: 57: 58: 59: 60: 61: 62:
63: protected function _IMPrender($inline)
64: {
65: $related_id = $this->_mimepart->getMimeId();
66: $used = array($related_id);
67:
68: if (!($id = $this->_init($inline))) {
69: return array();
70: }
71:
72: $render = $this->getConfigParam('imp_contents')->renderMIMEPart($id, $inline ? IMP_Contents::RENDER_INLINE : IMP_Contents::RENDER_FULL);
73:
74: if (!$inline) {
75: foreach (array_keys($render) as $key) {
76: if (!is_null($render[$key])) {
77: return array($related_id => $render[$key]);
78: }
79: }
80: return null;
81: }
82:
83: $data_id = null;
84: $ret = array_fill_keys(array_keys($this->_mimepart->contentTypeMap()), null);
85:
86: foreach (array_keys($render) as $val) {
87: $ret[$val] = $render[$val];
88: if ($ret[$val]) {
89: $data_id = $val;
90: }
91: }
92:
93: if (!is_null($data_id)) {
94: $this->_mimepart->setMetadata('viewable_part', $data_id);
95:
96: 97: 98: 99: 100:
101: if ($data_id !== $related_id) {
102: $ret[$related_id] = $ret[$data_id];
103: $ret[$data_id] = null;
104: }
105: }
106:
107: 108:
109: if ($cids_used = $this->_mimepart->getMetadata('related_cids_used')) {
110: $used = array_merge($used, $cids_used);
111: }
112:
113: foreach (array_diff(array_keys($ret), $used) as $val) {
114: if (($val !== $id) && !Horde_Mime::isChild($id, $val)) {
115: $summary = $this->getConfigParam('imp_contents')->getSummary(
116: $val,
117: IMP_Contents::SUMMARY_SIZE |
118: IMP_Contents::SUMMARY_ICON |
119: IMP_Contents::SUMMARY_DESCRIP_LINK |
120: IMP_Contents::SUMMARY_DOWNLOAD
121: );
122:
123: $status = new IMP_Mime_Status(array(
124: _("This part contains an attachment that can not be displayed within this part:"),
125: implode(' ', array(
126: $summary['icon'],
127: $summary['description'],
128: $summary['size'],
129: $summary['download']
130: ))
131: ));
132: $status->action(IMP_Mime_Status::WARNING);
133:
134: if (isset($ret[$related_id]['status']) &&
135: !is_array($ret[$related_id]['status'])) {
136: $ret[$related_id]['status'] = array($ret[$related_id]['status']);
137: } else {
138: $ret[$related_id]['status'] = array();
139: }
140: $ret[$related_id]['status'][] = $status;
141: }
142: }
143:
144: return $ret;
145: }
146:
147: 148: 149: 150: 151: 152: 153:
154: protected function _init($inline)
155: {
156: if (!isset($this->_start)) {
157: $ids = array_keys($this->_mimepart->contentTypeMap());
158: $related_id = $this->_mimepart->getMimeId();
159: $cids = array();
160: $id = null;
161:
162:
163: foreach ($ids as $val) {
164: if (strcmp($related_id, $val) !== 0) {
165: $part = $this->_mimepart->getPart($val);
166: $cids[$val] = $part->getContentId();
167: }
168: }
169:
170: 171: 172:
173: $start = $this->_mimepart->getContentTypeParameter('start');
174: if (!empty($start)) {
175: $id = array_search($id, $cids);
176: }
177:
178: if (empty($id)) {
179: reset($ids);
180: $id = next($ids);
181: }
182:
183:
184: $this->_mimepart->setMetadata('related_cids', $cids);
185:
186: $this->_start = $id;
187: }
188:
189: 190:
191: return ($inline && !$this->getConfigParam('imp_contents')->canDisplay($this->_start, IMP_Contents::RENDER_INLINE))
192: ? null
193: : $this->_start;
194: }
195:
196: 197:
198: public function canRender($mode)
199: {
200: return (($mode == 'inline') && !$this->_init(true))
201: ? false
202: : parent::canRender($mode);
203: }
204:
205: }
206: