* @copyright Julien Veyssier 2019 */ namespace OCA\Maps\Controller; use OCA\Maps\Service\TracksService; use OCP\App\IAppManager; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\DataResponse; use OCP\IConfig; use OCP\IDateTimeZone; use OCP\IGroupManager; use OCP\IL10N; use OCP\IRequest; use OCP\IServerContainer; use OCP\IUserManager; use OCP\Share\IManager; class RoutingController extends Controller { private $userId; private $userfolder; private $config; private $appVersion; private $shareManager; private $userManager; private $groupManager; private $dbtype; private $dbdblquotes; private $defaultDeviceId; private $l; private $dateTimeZone; private $tracksService; protected $appName; public function __construct($AppName, IRequest $request, IServerContainer $serverContainer, IConfig $config, IManager $shareManager, IAppManager $appManager, IUserManager $userManager, IGroupManager $groupManager, IL10N $l, IDateTimeZone $dateTimeZone, TracksService $tracksService, $UserId) { parent::__construct($AppName, $request); $this->dateTimeZone = $dateTimeZone; $this->appName = $AppName; $this->appVersion = $config->getAppValue('maps', 'installed_version'); $this->userId = $UserId; $this->userManager = $userManager; $this->groupManager = $groupManager; $this->l = $l; $this->dbtype = $config->getSystemValue('dbtype'); // IConfig object $this->config = $config; if ($UserId !== '' and $UserId !== null and $serverContainer !== null) { // path of user files folder relative to DATA folder $this->userfolder = $serverContainer->getUserFolder($UserId); } $this->shareManager = $shareManager; $this->tracksService = $tracksService; } /** * @NoAdminRequired * @param $type * @param $coords * @param $name * @param $totDist * @param $totTime * @return DataResponse * @throws \OCP\Files\NotFoundException * @throws \OCP\Files\NotPermittedException */ public function exportRoute($type, $coords, $name, $totDist, $totTime, $myMapId = null): DataResponse { // create /Maps directory if necessary $userFolder = $this->userfolder; if (is_null($myMapId) || $myMapId === '') { if (!$userFolder->nodeExists('/Maps')) { $userFolder->newFolder('Maps'); } if ($userFolder->nodeExists('/Maps')) { $mapsFolder = $userFolder->get('/Maps'); if ($mapsFolder->getType() !== \OCP\Files\FileInfo::TYPE_FOLDER) { $response = new DataResponse($this->l->t('/Maps is not a directory'), 400); return $response; } elseif (!$mapsFolder->isCreatable()) { $response = new DataResponse($this->l->t('/Maps directory is not writeable'), 400); return $response; } } else { $response = new DataResponse($this->l->t('Impossible to create /Maps directory'), 400); return $response; } } else { $folders = $userFolder->getById($myMapId); if (!is_array($folders) or count($folders) === 0) { $response = new DataResponse('myMaps Folder not found', 404); return $response; } $mapsFolder = array_shift($folders); if (is_null($mapsFolder)) { $response = new DataResponse('myMaps Folder not found', 404); return $response; } } $filename = $name . '.gpx'; if ($mapsFolder->nodeExists($filename)) { $mapsFolder->get($filename)->delete(); } if ($mapsFolder->nodeExists($filename . '.tmp')) { $mapsFolder->get($filename . '.tmp')->delete(); } $file = $mapsFolder->newFile($filename . 'tmp'); $fileHandler = $file->fopen('w'); $dt = new \DateTime(); $date = $dt->format('Y-m-d\TH:i:s\Z'); $gpxHeader = ' ' . $name . ' '; fwrite($fileHandler, $gpxHeader . "\n"); if ($type === 'route') { fwrite($fileHandler, ' ' . "\n"); fwrite($fileHandler, ' ' . $name . '' . "\n"); foreach ($coords as $ll) { $line = ' ' . "\n"; fwrite($fileHandler, $line); } fwrite($fileHandler, ' ' . "\n"); } elseif ($type === 'track') { fwrite($fileHandler, ' ' . "\n"); fwrite($fileHandler, ' ' . $name . '' . "\n"); fwrite($fileHandler, ' ' . "\n"); foreach ($coords as $ll) { $line = ' ' . "\n"; fwrite($fileHandler, $line); } fwrite($fileHandler, ' ' . "\n"); fwrite($fileHandler, ' ' . "\n"); } fwrite($fileHandler, '' . "\n"); fclose($fileHandler); $file->touch(); $file->move(substr($file->getPath(), 0, -3)); $track = $this->tracksService->getTrackByFileIDFromDB($file->getId(), $this->userId); return new DataResponse($track); } }