Happy New Year
[squirrelmail.git] / plugins / calendar / calendar_data.php
CommitLineData
2c85de8f 1<?php
7c67a5e8 2
3/**
7c67a5e8 4 * functions to operate on calendar data files.
d61a01d4 5 *
353d074a 6 * @copyright 2002-2018 The SquirrelMail Project Team
4b4abf93 7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 * @version $Id$
ea5f4b8e 9 * @package plugins
10 * @subpackage calendar
d61a01d4 11 */
12
1c7143ad 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 */
d61a01d4 18$calendardata = array();
19
ea5f4b8e 20/**
607428ac 21 * Reads multilined calendar data
22 *
23 * Plugin stores multiline texts converted to single line with PHP nl2br().
1c7143ad 24 * Function undoes nl2br() conversion and html encoding of ASCII vertical bar.
25 *
3047e291 26 * Older plugin versions sanitized data with sm_encode_html_special_chars. Since 1.5.1 calendar
1c7143ad 27 * data is not sanitized. Output functions must make sure that data is correctly
28 * encoded and sanitized.
607428ac 29 * @param string $string calendar string
30 * @return string calendar string converted to multiline text
1c7143ad 31 * @access private
607428ac 32 * @since 1.5.1
33 */
34function calendar_readmultiline($string) {
1c7143ad 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);
607428ac 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
1c7143ad 47 * @access private
607428ac 48 * @since 1.5.1
49 */
50function calendar_encodedata(&$sValue, $sKey) {
1c7143ad 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));
607428ac 57}
58
59/**
ea5f4b8e 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
1c7143ad 65 * files are divided by year for performance increase
66 */
d61a01d4 67function 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');
88cb1b4d 74
75 if ($fp){
76 while ($fdata = fgetcsv ($fp, 4096, '|')) {
1c7143ad 77 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
78 'priority' => $fdata[3],
f1d482ae 79 'title' => str_replace("\n",' ',calendar_readmultiline($fdata[4])),
1c7143ad 80 'message' => calendar_readmultiline($fdata[5]),
81 'reminder' => $fdata[6] );
88cb1b4d 82 }
83 fclose ($fp);
5d01bcce 84 // this is to sort the events within a day on starttime
bdb21d65 85 $new_calendardata = array();
91e0dccc 86 foreach($calendardata as $day => $data) {
5d01bcce 87 ksort($data, SORT_NUMERIC);
bdb21d65 88 $new_calendardata[$day] = $data;
5d01bcce 89 }
91e0dccc 90 $calendardata = $new_calendardata;
d61a01d4 91 }
d61a01d4 92 }
93}
94
1c7143ad 95/**
96 * Saves calendar data
97 * @return void
98 * @access private
99 */
d61a01d4 100function writecalendardata() {
3ecad5e6 101 global $calendardata, $username, $data_dir, $year, $color;
d61a01d4 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)) {
88cb1b4d 108 while ( $calbar = each ($calfoo['value'])) {
109 $calfoobar = $calendardata[$calfoo['key']][$calbar['key']];
607428ac 110 array_walk($calfoobar,'calendar_encodedata');
1c7143ad 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
d61a01d4 117 $calstr = "$calfoo[key]|$calbar[key]|$calfoobar[length]|$calfoobar[priority]|$calfoobar[title]|$calfoobar[message]|$calfoobar[reminder]\n";
3ecad5e6 118 if(sq_fwrite($fp, $calstr, 4096) === FALSE) {
1b858d86 119 error_box(_("Could not write calendar file %s", "$username.$year.cal.tmp"));
91e0dccc 120 }
d61a01d4 121 }
122
123 }
124 fclose ($fp);
1d461a18 125 @unlink($filename);
d61a01d4 126 rename($filetmp,$filename);
127 }
128}
129
1c7143ad 130/**
131 * deletes event from file
132 * @return void
133 * @access private
134 */
d61a01d4 135function 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)){
1c7143ad 143 // do nothing
d61a01d4 144 } else {
1c7143ad 145 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
d61a01d4 146 'priority' => $fdata[3],
1c7143ad 147 'title' => $fdata[4],
148 'message' => $fdata[5],
d61a01d4 149 'reminder' => $fdata[6] );
150 }
151 }
152 fclose ($fp);
153 }
154 writecalendardata();
d61a01d4 155}
156
1c7143ad 157/**
f1d482ae 158 * same as delete but does not save calendar
1c7143ad 159 * saving is done inside event_edit.php
160 * @return void
161 * @access private
162 * @todo code reuse
163 */
d61a01d4 164function 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)){
1c7143ad 172 // do nothing
d61a01d4 173 } else {
1c7143ad 174 $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
d61a01d4 175 'priority' => $fdata[3],
1c7143ad 176 'title' => $fdata[4],
177 'message' => $fdata[5],
d61a01d4 178 'reminder' => $fdata[6] );
179 }
180 }
181 fclose ($fp);
182 }
183}