123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- <?php
- /**
- * functions to operate on calendar data files.
- *
- * @copyright © 2002-2007 The SquirrelMail Project Team
- * @license http://opensource.org/licenses/gpl-license.php GNU Public License
- * @version $Id$
- * @package plugins
- * @subpackage calendar
- */
- /**
- * this is array that contains all events
- * it is three dimensional array with fallowing structure
- * $calendardata[date][time] = array(length,priority,title,message,reminder);
- */
- $calendardata = array();
- /**
- * Reads multilined calendar data
- *
- * Plugin stores multiline texts converted to single line with PHP nl2br().
- * Function undoes nl2br() conversion and html encoding of ASCII vertical bar.
- *
- * Older plugin versions sanitized data with htmlspecialchars. Since 1.5.1 calendar
- * data is not sanitized. Output functions must make sure that data is correctly
- * encoded and sanitized.
- * @param string $string calendar string
- * @return string calendar string converted to multiline text
- * @access private
- * @since 1.5.1
- */
- function calendar_readmultiline($string) {
- /**
- * replace html line breaks with ASCII line feeds
- * replace htmlencoded | with ASCII vertical bar
- */
- $string = str_replace(array('<br />','<br>','|'),array("\n","\n",'|'),$string);
- return $string;
- }
- /**
- * Callback function used to sanitize calendar data before saving it to file
- * @param string $sValue array value
- * @param string $sKey array key
- * @access private
- * @since 1.5.1
- */
- function calendar_encodedata(&$sValue, $sKey) {
- /**
- * add html line breaks
- * remove original ASCII line feeds and carriage returns
- * replace ASCII vertical bar with html code in order to sanitize field delimiter
- */
- $sValue = str_replace(array("\n","\r",'|'),array('','','|'),nl2br($sValue));
- }
- /**
- * read events into array
- *
- * data is | delimited, just like addressbook
- * files are structured like this:
- * date|time|length|priority|title|message
- * files are divided by year for performance increase
- */
- function readcalendardata() {
- global $calendardata, $username, $data_dir, $year;
- $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
- if (file_exists($filename)){
- $fp = fopen ($filename,'r');
- if ($fp){
- while ($fdata = fgetcsv ($fp, 4096, '|')) {
- $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
- 'priority' => $fdata[3],
- 'title' => str_replace("\n",' ',calendar_readmultiline($fdata[4])),
- 'message' => calendar_readmultiline($fdata[5]),
- 'reminder' => $fdata[6] );
- }
- fclose ($fp);
- // this is to sort the events within a day on starttime
- $new_calendardata = array();
- foreach($calendardata as $day => $data) {
- ksort($data, SORT_NUMERIC);
- $new_calendardata[$day] = $data;
- }
- $calendardata = $new_calendardata;
- }
- }
- }
- /**
- * Saves calendar data
- * @return void
- * @access private
- */
- function writecalendardata() {
- global $calendardata, $username, $data_dir, $year, $color;
- $filetmp = getHashedFile($username, $data_dir, "$username.$year.cal.tmp");
- $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
- $fp = fopen ($filetmp,"w");
- if ($fp) {
- while ( $calfoo = each ($calendardata)) {
- while ( $calbar = each ($calfoo['value'])) {
- $calfoobar = $calendardata[$calfoo['key']][$calbar['key']];
- array_walk($calfoobar,'calendar_encodedata');
- /**
- * Make sure that reminder field is set. Calendar forms don't implement it,
- * but it is still used for calendar data. Backwards compatibility.
- */
- if (!isset($calfoobar['reminder'])) $calfoobar['reminder']='';
- $calstr = "$calfoo[key]|$calbar[key]|$calfoobar[length]|$calfoobar[priority]|$calfoobar[title]|$calfoobar[message]|$calfoobar[reminder]\n";
- if(sq_fwrite($fp, $calstr, 4096) === FALSE) {
- error_box(_("Could not write calendar file %s", "$username.$year.cal.tmp"));
- }
- }
- }
- fclose ($fp);
- @unlink($filename);
- rename($filetmp,$filename);
- }
- }
- /**
- * deletes event from file
- * @return void
- * @access private
- */
- function delete_event($date, $time) {
- global $calendardata, $username, $data_dir, $year;
- $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
- $fp = fopen ($filename,'r');
- if ($fp){
- while ($fdata = fgetcsv ($fp, 4096, "|")) {
- if (($fdata[0]==$date) && ($fdata[1]==$time)){
- // do nothing
- } else {
- $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
- 'priority' => $fdata[3],
- 'title' => $fdata[4],
- 'message' => $fdata[5],
- 'reminder' => $fdata[6] );
- }
- }
- fclose ($fp);
- }
- writecalendardata();
- }
- /**
- * same as delete but does not save calendar
- * saving is done inside event_edit.php
- * @return void
- * @access private
- * @todo code reuse
- */
- function update_event($date, $time) {
- global $calendardata, $username, $data_dir, $year;
- $filename = getHashedFile($username, $data_dir, "$username.$year.cal");
- $fp = fopen ($filename,'r');
- if ($fp){
- while ($fdata = fgetcsv ($fp, 4096, '|')) {
- if (($fdata[0]==$date) && ($fdata[1]==$time)){
- // do nothing
- } else {
- $calendardata[$fdata[0]][$fdata[1]] = array( 'length' => $fdata[2],
- 'priority' => $fdata[3],
- 'title' => $fdata[4],
- 'message' => $fdata[5],
- 'reminder' => $fdata[6] );
- }
- }
- fclose ($fp);
- }
- }
|