c534da2125912bdf8e23101dca9880be5f908496
[squirrelmail.git] / plugins / calendar / calendar_data.php
1 <?php
2
3 /**
4 * functions to operate on calendar data files.
5 *
6 * @copyright 2002-2017 The SquirrelMail Project Team
7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 * @version $Id$
9 * @package plugins
10 * @subpackage calendar
11 */
12
13 /**
14 * this is array that contains all events
15 * it is three dimensional array with fallowing structure
16 * $calendardata[date][time] = array(length,priority,title,message,reminder);
17 */
18 $calendardata = array();
19
20 /**
21 * Reads multilined calendar data
22 *
23 * Plugin stores multiline texts converted to single line with PHP nl2br().
24 * Function undoes nl2br() conversion and html encoding of ASCII vertical bar.
25 *
26 * Older plugin versions sanitized data with sm_encode_html_special_chars. Since 1.5.1 calendar
27 * data is not sanitized. Output functions must make sure that data is correctly
28 * encoded and sanitized.
29 * @param string $string calendar string
30 * @return string calendar string converted to multiline text
31 * @access private
32 * @since 1.5.1
33 */
34 function calendar_readmultiline($string) {
35 /**
36 * replace html line breaks with ASCII line feeds
37 * replace htmlencoded | with ASCII vertical bar
38 */
39 $string = str_replace(array('<br />','<br>','&#124;'),array("\n","\n",'|'),$string);
40 return $string;
41 }
42
43 /**
44 * Callback function used to sanitize calendar data before saving it to file
45 * @param string $sValue array value
46 * @param string $sKey array key
47 * @access private
48 * @since 1.5.1
49 */
50 function calendar_encodedata(&$sValue, $sKey) {
51 /**
52 * add html line breaks
53 * remove original ASCII line feeds and carriage returns
54 * replace ASCII vertical bar with html code in order to sanitize field delimiter
55 */
56 $sValue = str_replace(array("\n","\r",'|'),array('','','&#124;'),nl2br($sValue));
57 }
58
59 /**
60 * read events into array
61 *
62 * data is | delimited, just like addressbook
63 * files are structured like this:
64 * date|time|length|priority|title|message
65 * files are divided by year for performance increase
66 */
67 function readcalendardata() {
68 global $calendardata, $username, $data_dir, $year;
69
70 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
71
72 if (file_exists($filename)){
73 $fp = fopen ($filename,'r');
74
75 if ($fp){
76 while ($fdata = fgetcsv ($fp, 4096, '|')) {
77 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
78 'priority' => $fdata[3],
79 'title' => str_replace("\n",' ',calendar_readmultiline($fdata[4])),
80 'message' => calendar_readmultiline($fdata[5]),
81 'reminder' => $fdata[6] );
82 }
83 fclose ($fp);
84 // this is to sort the events within a day on starttime
85 $new_calendardata = array();
86 foreach($calendardata as $day => $data) {
87 ksort($data, SORT_NUMERIC);
88 $new_calendardata[$day] = $data;
89 }
90 $calendardata = $new_calendardata;
91 }
92 }
93 }
94
95 /**
96 * Saves calendar data
97 * @return void
98 * @access private
99 */
100 function writecalendardata() {
101 global $calendardata, $username, $data_dir, $year, $color;
102
103 $filetmp = getHashedFile($username, $data_dir, "$username.$year.cal.tmp");
104 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
105 $fp = fopen ($filetmp,"w");
106 if ($fp) {
107 while ( $calfoo = each ($calendardata)) {
108 while ( $calbar = each ($calfoo['value'])) {
109 $calfoobar = $calendardata[$calfoo['key']][$calbar['key']];
110 array_walk($calfoobar,'calendar_encodedata');
111 /**
112 * Make sure that reminder field is set. Calendar forms don't implement it,
113 * but it is still used for calendar data. Backwards compatibility.
114 */
115 if (!isset($calfoobar['reminder'])) $calfoobar['reminder']='';
116
117 $calstr = "$calfoo[key]|$calbar[key]|$calfoobar[length]|$calfoobar[priority]|$calfoobar[title]|$calfoobar[message]|$calfoobar[reminder]\n";
118 if(sq_fwrite($fp, $calstr, 4096) === FALSE) {
119 error_box(_("Could not write calendar file %s", "$username.$year.cal.tmp"));
120 }
121 }
122
123 }
124 fclose ($fp);
125 @unlink($filename);
126 rename($filetmp,$filename);
127 }
128 }
129
130 /**
131 * deletes event from file
132 * @return void
133 * @access private
134 */
135 function delete_event($date, $time) {
136 global $calendardata, $username, $data_dir, $year;
137
138 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
139 $fp = fopen ($filename,'r');
140 if ($fp){
141 while ($fdata = fgetcsv ($fp, 4096, "|")) {
142 if (($fdata[0]==$date) && ($fdata[1]==$time)){
143 // do nothing
144 } else {
145 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
146 'priority' => $fdata[3],
147 'title' => $fdata[4],
148 'message' => $fdata[5],
149 'reminder' => $fdata[6] );
150 }
151 }
152 fclose ($fp);
153 }
154 writecalendardata();
155 }
156
157 /**
158 * same as delete but does not save calendar
159 * saving is done inside event_edit.php
160 * @return void
161 * @access private
162 * @todo code reuse
163 */
164 function update_event($date, $time) {
165 global $calendardata, $username, $data_dir, $year;
166
167 $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
168 $fp = fopen ($filename,'r');
169 if ($fp){
170 while ($fdata = fgetcsv ($fp, 4096, '|')) {
171 if (($fdata[0]==$date) && ($fdata[1]==$time)){
172 // do nothing
173 } else {
174 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
175 'priority' => $fdata[3],
176 'title' => $fdata[4],
177 'message' => $fdata[5],
178 'reminder' => $fdata[6] );
179 }
180 }
181 fclose ($fp);
182 }
183 }