nextcloud/apps/calendar/ajax/import/import.php

150 lines
5.1 KiB
PHP
Raw Normal View History

<?php
/**
* Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
2012-05-03 14:23:29 +04:00
OCP\JSON::checkLoggedIn();
2012-05-02 21:08:37 +04:00
OCP\App::checkAppEnabled('calendar');
session_write_close();
2012-07-04 00:33:24 +04:00
if (isset($_POST['progresskey']) && isset($_POST['getprogress'])) {
echo OCP\JSON::success(array('percent'=>OC_Cache::get($_POST['progresskey'])));
exit;
}
2012-07-01 23:36:09 +04:00
$file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']);
if(!$file){
OCP\JSON::error(array('error'=>'404'));
}
2012-07-01 23:36:09 +04:00
$import = new OC_Calendar_Import($file);
$import->setUserID(OCP\User::getUser());
$import->setTimeZone(OC_Calendar_App::$tz);
$import->enableProgressCache();
2012-07-04 00:33:24 +04:00
$import->setProgresskey($_POST['progresskey']);
2012-07-01 23:36:09 +04:00
if(!$import->isValid()){
OCP\JSON::error(array('error'=>'notvalid'));
exit;
}
2012-07-01 23:36:09 +04:00
$newcal = false;
if($_POST['method'] == 'new'){
2012-07-01 23:36:09 +04:00
$calendars = OC_Calendar_Calendar::allCalendars(OCP\User::getUser());
foreach($calendars as $calendar){
2012-07-03 18:47:46 +04:00
if($calendar['displayname'] == $_POST['calname']){
2012-07-01 23:36:09 +04:00
$id = $calendar['id'];
$newcal = false;
break;
}
$newcal = true;
}
if($newcal){
2012-07-03 15:43:18 +04:00
$id = OC_Calendar_Calendar::addCalendar(OCP\USER::getUser(), strip_tags($_POST['calname']),'VEVENT,VTODO,VJOURNAL',null,0,$import->createCalendarColor());
2012-07-01 23:36:09 +04:00
OC_Calendar_Calendar::setCalendarActive($id, 1);
}
}else{
$calendar = OC_Calendar_App::getCalendar($_POST['id']);
2012-05-01 20:50:31 +04:00
if($calendar['userid'] != OCP\USER::getUser()){
2012-07-01 23:36:09 +04:00
OCP\JSON::error(array('error'=>'missingcalendarrights'));
exit();
}
$id = $_POST['id'];
}
2012-07-01 23:36:09 +04:00
$import->setCalendarID($id);
2012-07-04 00:33:24 +04:00
try{
$import->import();
}catch (Exception $e) {
OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('Import failed'), 'debug'=>$e->getMessage()));
//write some log
}
2012-07-01 23:36:09 +04:00
$count = $import->getCount();
if($count == 0){
if($newcal){
OC_Calendar_Calendar::deleteCalendar($id);
}
2012-07-03 15:43:18 +04:00
OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('The file contained either no events or all events are already saved in your calendar.')));
2012-07-01 23:36:09 +04:00
}else{
2012-07-03 15:43:18 +04:00
if($newcal){
OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in the new calendar') . ' ' . strip_tags($_POST['calname'])));
}else{
OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in your calendar')));
}
2012-07-01 23:36:09 +04:00
}
/* //////////////////////////// Attention: following code is quite painfull !!! ///////////////////////
writeProgress('20');
2012-04-22 00:12:31 +04:00
// normalize the newlines
$file = str_replace(array("\r","\n\n"), array("\n","\n"), $file);
$lines = explode("\n", $file);
unset($file);
writeProgress('30');
2012-04-22 00:12:31 +04:00
// analyze the file, group components by uid, and keep refs to originating calendar object
// $cals is array calendar objects, keys are 1st line# $cal, ie array( $cal => $caldata )
// $caldata is array( 'first' => 1st component line#, 'last' => last comp line#, 'end' => end line# )
// $caldata is used to create prefix/suffix strings when building import text
// $uids is array of component arrays, keys are $uid, ie array( $uid => array( $beginlineno => $component ) )
// $component is array( 'end' => end line#, 'cal'=> $cal )
$comp=$uid=$cal=false;
$cals=$uids=array();
$i = 0;
2012-04-22 00:12:31 +04:00
foreach($lines as $line) {
if(strpos($line, ':')!==false) {
list($attr, $val) = explode(':', strtoupper($line));
if ($attr == 'BEGIN' && $val == 'VCALENDAR') {
$cal = $i;
$cals[$cal] = array('first'=>$i,'last'=>$i,'end'=>$i);
} elseif ($attr =='BEGIN' && $cal!==false && isset($comps[$val])) {
$comp = $val;
$beginNo = $i;
} elseif ($attr == 'END' && $cal!==false && $val == 'VCALENDAR') {
if($comp!==false) {
unset($cals[$cal]); // corrupt calendar, unset it
} else {
$cals[$cal]['end'] = $i;
}
$comp=$uid=$cal=false; // reset calendar
} elseif ($attr == 'END' && $comp!==false && $val == $comp) {
if(! $uid) {
$uid = OC_Calendar_Object::createUID();
}
2012-04-22 00:12:31 +04:00
$uids[$uid][$beginNo] = array('end'=>$i, 'cal'=>$cal);
if ($cals[$cal]['first'] == $cal) {
$cals[$cal]['first'] = $beginNo;
}
2012-04-22 00:12:31 +04:00
$cals[$cal]['last'] = $i;
$comp=$uid=false; // reset component
} elseif ($attr =="UID" && $comp!==false) {
list($attr, $uid) = explode(':', $line);
}
}
$i++;
}
2012-04-22 00:12:31 +04:00
// import the calendar
writeProgress('60');
2012-04-22 00:12:31 +04:00
foreach($uids as $uid) {
$prefix=$suffix=$content=array();
foreach($uid as $begin=>$details) {
$cal = $details['cal'];
if(!isset($cals[$cal])) {
continue; // from corrupt/incomplete calendar
}
$cdata = $cals[$cal];
// if we have multiple components from different calendar objects,
// we should really merge their elements (enhancement?) -- 1st one wins for now.
if(! count($prefix)) {
$prefix = array_slice($lines, $cal, $cdata['first'] - $cal);
}
2012-04-22 00:12:31 +04:00
if(! count($suffix)) {
$suffix = array_slice($lines, $cdata['last']+1, $cdata['end'] - $cdata['last']);
}
$content = array_merge($content, array_slice($lines, $begin, $details['end'] - $begin + 1));
}
2012-04-22 00:12:31 +04:00
if(count($content)) {
$import = join($nl, array_merge($prefix, $content, $suffix)) . $nl;
OC_Calendar_Object::add($id, $import);
}
}
2012-04-22 00:12:31 +04:00
// finished import
writeProgress('100');
sleep(3);
OC_Cache::remove($progresskey);
2012-07-04 00:33:24 +04:00
OCP\JSON::success();*/