checks if URL exists before trying to download attachment
[tine20] / tine20 / Tinebase / Helper.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Tinebase
6  * @subpackage  Server
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Cornelius Weiss <c.weiss@metaways.de>
10  */
11
12
13 /**
14  * returns one value of an array, indentified by its key
15  *
16  * @param mixed $_key
17  * @param array $_array
18  * @return mixed
19  */
20 function array_value($_key, array $_array)
21 {
22     return (isset($_array[$_key]) || array_key_exists($_key, $_array)) ? $_array[$_key] : NULL;
23 }
24
25 /**
26  * converts string with M or K to bytes integer
27  * - for example: 50M -> 52428800
28  *
29  * @param mixed $_value
30  * @return integer
31  */
32 function convertToBytes($_value)
33 {
34     if (is_int($_value) || ! $_value) {
35         $bytes = $_value;
36     } else {
37         if (preg_match("/M/", $_value)) {
38             $value = substr($_value, 0, strpos($_value, 'M'));
39             $factor = 1024 * 1024;
40         } elseif (preg_match("/K/", $_value)) {
41             $value = substr($_value, 0, strpos($_value, 'K'));
42             $factor = 1024;
43         } elseif (is_string($_value)) {
44             $value = $_value;
45             $factor = 1;
46         } else {
47             throw new Exception('Argument type not supported:' . gettype($_value));
48         }
49         $bytes = intval($value) * $factor;
50     }
51     
52     return $bytes;
53 }
54
55 /**
56  * converts value to megabytes
57  * 
58  * @param integer $_value
59  * @return integer
60  */
61 function convertToMegabytes($_value)
62 {
63     $result = ($_value) ? round($_value / 1024 / 1024) : $_value;
64     return $result;
65 }
66
67 /**
68  * get svn revision info
69  *
70  * @return string
71  */
72 function getDevelopmentRevision()
73 {
74     $branch = '';
75     $rev = 0;
76     $date = '';
77     
78     try {
79         // try to find the .git dir
80         $dir = realpath(dirname(dirname(dirname(__FILE__)))) . '/.git';
81         if (file_exists($dir)) {
82             $HEAD = trim(str_replace('ref: ', '', @file_get_contents("$dir/HEAD")));
83             $explodedHead = explode('/', $HEAD);
84             
85             $branch = array_pop($explodedHead);
86             $rev = trim(@file_get_contents("$dir/$HEAD"));
87             
88             $hashes = str_split($rev, 2);
89
90             $objPath = "$dir/objects";
91             while (count($hashes) != 0) {
92                 $objPath .= '/' . array_shift($hashes);
93                 $objFile = "$objPath/" . implode('', $hashes);
94                 if (@file_exists($objFile)) {
95                     $date = date_create('@' . filemtime($objFile))->format('Y-m-d H:i:s');
96                     break;
97                 }
98             }
99         }
100         $revision = "$branch: $rev ($date)";
101     } catch (Exception $e) {
102         $revision = 'not resolvable';
103     }
104     
105     return $revision;
106 }
107
108 /**
109  * converts cache id
110  * cache id strings can only contain the chars [a-zA-Z0-9_]
111  * 
112  * @param string $_cacheId
113  * @return string
114  */
115 function convertCacheId($_cacheId) 
116 {
117     $result = preg_replace('/[^a-z^A-Z^0-9^_]/', '', $_cacheId);
118
119     return $result;
120 }
121
122 /**
123  * recursive deleting of directory and all containing files
124  * 
125  * @param string $_dir
126  * @return void
127  */
128 function removeDir($_dir)
129 {
130     $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($_dir), RecursiveIteratorIterator::CHILD_FIRST);
131     foreach ($iterator as $fullFilename => $cur) {
132         if (is_dir($fullFilename) && substr($fullFilename, -1) !== '.') {
133             rmdir($fullFilename);
134         } elseif (is_file($fullFilename)) {
135             unlink($fullFilename);
136         }
137     }
138     if (is_dir($_dir)) rmdir($_dir);
139 }
140
141 /**
142  * replaces and/or strips special chars from given string
143  *
144  * @param string $_input
145  * @return string
146  */
147 function replaceSpecialChars($_input)
148 {
149     $search  = array('ä',  'ü',  'ö',  'ß',  'é', 'è', 'ê', 'ó' ,'ô', 'á', 'ź', 'Ä',  'Ü',  'Ö',  'É', 'È', 'Ê', 'Ó' ,'Ô', 'Á', 'Ź');
150     $replace = array('ae', 'ue', 'oe', 'ss', 'e', 'e', 'e', 'o', 'o', 'a', 'z', 'Ae', 'Ue', 'Oe', 'E', 'E', 'E', 'O', 'O', 'a', 'z');
151                 
152     $output = str_replace($search, $replace, $_input);
153     
154     return preg_replace('/[^a-zA-Z0-9._\-]/', '', $output);
155 }
156
157 /**
158  * Checks if needle $_str is in haystack $_arr but ignores case.
159  * 
160  * @param array $_arr
161  * @param string $_str
162  * @return boolean
163  */
164 function in_array_case($_arr, $_str)
165 {
166     if (! is_array($_arr)) {
167         return false;
168     }
169     
170     foreach ($_arr as $s) {
171         if (strcasecmp($_str, $s) == 0) {
172             return true;
173         }
174     }
175     return false;
176 }
177
178 /**
179  * try to convert string to utf8 using mb_convert_encoding
180  * 
181  * @param string $string
182  * @param string $encodingTo (default: utf-8)
183  * @return string
184  */
185 function mbConvertTo($string, $encodingTo = 'utf-8')
186 {
187     if (! extension_loaded('mbstring')) {
188         return $string;
189     }
190     // try to fix bad encodings
191     $encoding = mb_detect_encoding($string, array('utf-8', 'iso-8859-1', 'windows-1252', 'iso-8859-15'));
192     if ($encoding !== FALSE) {
193         $string = @mb_convert_encoding($string, $encodingTo, $encoding);
194     }
195     
196     return $string;
197 }
198
199 /**
200  * converts all linebreaks to unix linebreaks
201  *
202  * @param string $string
203  * @return string
204  */
205 function normalizeLineBreaks($string)
206 {
207     if (is_string($string)) {
208         $result = str_replace(array("\r\n", "\r"), "\n", $string);
209     } else {
210         $result = $string;
211     }
212     
213     return $result;
214 }
215
216 /**
217  * get clone to be used with right hand side operator
218  *
219  * @param  Object $obj
220  * @return Object
221  */
222 function getClone($obj)
223 {
224     return clone $obj;
225 }
226
227 /**
228  * returns all elements of an array whose key matches the $pattern
229  * 
230  * @param string $pattern
231  * @param array $array
232  * @return array
233  */
234 function searchArrayByRegexpKey($pattern, $array)
235 {
236     $keys = array_keys($array);
237     $result = preg_grep($pattern, $keys);
238     
239     return array_intersect_key($array, array_flip($result));
240 }
241
242 /**
243  * checks if a string is valid json
244  * 
245  * @param string $string
246  * @return boolean 
247  */
248 function is_json($string)
249 {
250     if (! is_string($string) || (substr($string, 0, 1) !== '[' && substr($string, 0, 1) !== '{')) {
251         return false;
252     }
253     
254     try {
255         Zend_Json::decode($string);
256     } catch (Exception $e) {
257         return false;
258     }
259     
260     // check if error occured (only if json_last_error() exists)
261     return (! function_exists('json_last_error') || json_last_error() == JSON_ERROR_NONE);
262 }
263
264 /**
265  * formats a microtime diff to an appropriate string containing time unit based on the value range
266  * 
267  * value ranges
268  * below 1s return ms
269  * below 1m return s
270  * below 1h return m
271  * as of 1h return h
272  * 
273  * @param float $timediff
274  * @return string
275  */
276 function formatMicrotimeDiff($timediff)
277 {
278     $ms = (int)($timediff * 1000);
279     if ($ms>=3600000) {
280         return (((int)($ms / 3600000 * 100.0)) / 100.0).'h';
281     } elseif ($ms>=60000) {
282         return (((int)($ms / 60000 * 100.0)) / 100.0).'m';
283     } elseif ($ms>=1000) {
284         return (((int)($ms / 1000 * 100.0)) / 100.0).'s';
285     } else {
286         return $ms.'ms';
287     }
288 }
289
290 /**
291  * checks if an url exists by checking headers 
292  * -> inspired by http://php.net/manual/en/function.file-exists.php#75064
293  * 
294  * @param string $url
295  * @return boolean
296  */
297 function urlExists($url)
298 {
299     $file_headers = @get_headers($url);
300     if ($file_headers[0] == 'HTTP/1.1 404 Not Found') {
301         $exists = false;
302     } else {
303         $exists = true;
304     }
305     
306     return $exists;
307 }