void Backend::checkLocalDirs(){ //Check for directories first QString base = "/usr/local/share/PCDM"; QDir mainDir(base); if(!mainDir.exists()){ mainDir.mkdir(base); } if(!mainDir.exists("themes")){ mainDir.mkdir("themes"); } //Check for sample files if(!mainDir.exists("pcdm.conf.sample")){ QFile::copy(":samples/pcdm.conf",base+"/pcdm.conf.sample"); } }
bool createDirectories(QString previousMemoryPath) { QDir dir(QDir::home()); QString mainDirectoryName = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh:mm:ss"); if(!dir.mkdir(mainDirectoryName)) return false; dir.cd(mainDirectoryName); mainDirectoryPath = dir.path(); qDebug()<<"Main Directory Path"<<mainDirectoryPath; QDir mainDir(QDir::homePath().append("/").append(mainDirectoryName)); QString imageDirectory = "images"; if(!mainDir.mkdir(imageDirectory)) return false; mainDir.cd(imageDirectory); imagesPath = mainDir.path(); qDebug()<<"Image directory path"<<imagesPath; QString databasepath = QDir::homePath(); databasepath.append("/emptydb"); QString detecplacesdbpath = databasepath; detecplacesdbpath.append("/detected_places.db"); QFile file(detecplacesdbpath); if(file.exists()) { QString newdir = mainDirectoryPath; newdir.append("/detected_places.db"); QFile::copy(detecplacesdbpath,newdir); if(!dbmanager.openDB(newdir)) return false; // file.close(); } else return false; // If we don't have a previous memory than create an empty memory if(previousMemoryPath.size() <= 1 || previousMemoryPath.isNull()) { QString knowledgedbpath = databasepath; knowledgedbpath.append("/knowledge.db"); QFile file2(knowledgedbpath); if(file2.exists()) { QString newdir = mainDirectoryPath; QFile::copy(knowledgedbpath,newdir.append("/knowledge.db")); // file.close(); } else return false; } // If we have supplied a previous memory path, then open that db else { QString knowledgedbpath = previousMemoryPath; knowledgedbpath.append("/knowledge.db"); QFile file2(knowledgedbpath); if(file2.exists()) { QString newdir = mainDirectoryPath; QFile::copy(knowledgedbpath,newdir.append("/knowledge.db")); // file.close(); } else return false; } return true; }
void BikerHttpRequestProcessor::processRequest() { std::cerr << "processing request..." << std::endl; QRegExp numberRegExp("(\\d+(?:.\\d+)?)"); //Es wird nur GET unterstützt, der Rest nicht. Bei was anderem: Grantig sein und 405 antworten. if (_requestType != "GET") { this->send405(); return; } if (_requestPath.contains("..")) { //".." im Pfad ist ein falscher Request. Damit könnte man ins Dateisystem gelangen. std::cerr << "\"..\" in request: not allowed." << std::endl; this->send400(); } std::cerr << "request file: " << _requestPath << std::endl; if (_requestPath.startsWith("/files/")) { if (! ProgramOptions::getInstance()->webserver_no_serve_files) { //"/files/" entfernen! QString _myRequestPath = _requestPath.remove(0, 7); QDir mainDir((ProgramOptions::getInstance()->webserver_public_html_folder).c_str()); if ((ProgramOptions::getInstance()->webserver_public_html_folder == "") || !mainDir.exists()) { this->send404(); return; } QFile file(QString(ProgramOptions::getInstance()->webserver_public_html_folder.c_str()) + "/" + _myRequestPath); QDir dir(QString(ProgramOptions::getInstance()->webserver_public_html_folder.c_str()) + "/" + _myRequestPath); //Wenn die Datei existiert, und alle sie lesen dürfen (nicht nur // Benutzer oder Gruppe): Datei senden. Sonst: 404 Not found. if ((!dir.exists()) && file.exists() && (file.permissions() & QFile::ReadOther)) { std::cerr << "serving file: \"" << file.fileName() << "\"" << std::endl; this->sendFile(file); } else { if (dir.exists()) std::cerr << "file is a directory: \"" << file.fileName() << "\". Not serving." << std::endl; else if (!file.exists()) std::cerr << "file not found: \"" << file.fileName() << "\". Not serving." << std::endl; else if (file.permissions() & QFile::ReadOther) std::cerr << "file does not have read permissions for everybody: \"" << file.fileName() << "\". Not serving." << std::endl; //In jedem Fall: 404 senden. this->send404(); } return; } else { //Dateien ausliefern durch Einstellungen verboten: Nicht ausliefern. std::cerr << "webserver configured not to serve files." << std::endl; this->send404(); return; } } else { /** * @todo RegExp nur einmal erzeugen und dann wiederverwenden! */ QRegExp cloudmadeApiKeyRegExp("^/([\\da-fA-F]{1,64})/(?:api|API)/0.(\\d)"); //QRegExp cloudmadeApiPointListRegExp("^/(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16})),(?:\\[(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16}))(?:,(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16}))){0,20}\\],)?(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16}))"); QRegExp cloudmadeApiPointListRegExp("^/(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16})),(?:\\[(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16}))(?:,(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16})){0,200}\\],)?(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16}))"); QRegExp cloudmadeApiPointListExtractor("(?:(\\d{1,3}.\\d{1,16}),(\\d{1,3}.\\d{1,16}))"); QRegExp cloudmadeApiRouteTypeRegExp("^/([a-zA-Z0-9]{1,64})(?:/([a-zA-Z0-9]{1,64}))?.(gpx|GPX|js|JS)$"); QString apiKey=""; int apiVersion=0; QVector<GPSPosition> routePointList; QString routeType=""; QString routeModifier=""; QString routeDataType=""; int position=0; if ((position=cloudmadeApiKeyRegExp.indexIn(_requestPath)) != -1) { apiKey = cloudmadeApiKeyRegExp.cap(1).toLower(); apiVersion = cloudmadeApiKeyRegExp.cap(2).toInt(); //API-Key gefunden. Falls uns der interessiert, hier was damit machen! if (ProgramOptions::getInstance()->webserver_apikey != "") { if (ProgramOptions::getInstance()->webserver_apikey != apiKey.toStdString()) { std::cerr << "api key \"" << apiKey << "\" is not valid." << std::endl; this->send403(); return; } } if (apiVersion != 3) { std::cerr << "requested api version 0." << apiVersion << ", which is not supported." << std::endl; this->send405(); return; } position += cloudmadeApiKeyRegExp.cap(0).length(); } else { this->send400(); return; } position+=cloudmadeApiPointListRegExp.indexIn(_requestPath.mid(position)); if (cloudmadeApiPointListRegExp.cap(0).length() != 0) { //Punktliste gefunden. Auswerten! //Neue RegExp zum Punkte herausholen... cloudmadeApiPointListExtractor.indexIn(cloudmadeApiPointListRegExp.cap(0)); QString strLat, strLon; routePointList.clear(); for (int pos=0; pos>=0; pos=cloudmadeApiPointListExtractor.indexIn(cloudmadeApiPointListRegExp.cap(0), cloudmadeApiPointListExtractor.cap(0).length()+pos)) { strLat = cloudmadeApiPointListExtractor.cap(1); strLon = cloudmadeApiPointListExtractor.cap(2); GPSPosition point(strLat.toDouble(), strLon.toDouble()); routePointList << point; } position += cloudmadeApiPointListRegExp.cap(0).length(); } else { this->send400(); return; } position+=cloudmadeApiRouteTypeRegExp.indexIn(_requestPath.mid(position)); if (cloudmadeApiRouteTypeRegExp.cap(0).length() != 0) { routeType = cloudmadeApiRouteTypeRegExp.cap(1).toLower(); routeModifier = cloudmadeApiRouteTypeRegExp.cap(2).toLower(); routeDataType = cloudmadeApiRouteTypeRegExp.cap(3).toLower(); //Routentyp gefunden. Auswerten! } else { this->send400(); return; } //this->send102(); boost::shared_ptr<RoutingMetric> metric; boost::shared_ptr<Router> router; boost::shared_ptr<DatabaseConnection> dbA; boost::shared_ptr<DatabaseConnection> dbB; boost::shared_ptr<AltitudeProvider> altitudeProvider; #ifdef ZZIP_FOUND altitudeProvider.reset(new SRTMProvider()); #else altitudeProvider.reset(new ZeroAltitudeProvider()); #endif if ((routeType == "bicycle") || (routeType == "bike")) { //altitudeProvider.reset(new ZeroAltitudeProvider()); //Routingmetrik festlegen anhand der Benutzerwahl if ((routeModifier == "euclidean")) { metric.reset(new EuclideanRoutingMetric(altitudeProvider)); } else if ((routeModifier == "simpleheight") || (routeModifier == "shortest")) { float detourPerHeightMeter = 100.0f; if (numberRegExp.indexIn(_parameterMap["detourperheightmeter"]) != -1) { detourPerHeightMeter = numberRegExp.cap(1).toFloat(); } metric.reset(new SimpleHeightRoutingMetric(altitudeProvider, detourPerHeightMeter)); } else if (routeModifier == "advancedheight") { float punishment = 1.0f; float detourPerHeightMeter = 200.0f; if (numberRegExp.indexIn(_parameterMap["punishment"]) != -1) { punishment = numberRegExp.cap(1).toFloat(); } if (numberRegExp.indexIn(_parameterMap["detourperheightmeter"]) != -1) { detourPerHeightMeter = numberRegExp.cap(1).toFloat(); } metric.reset(new AdvancedHeightRoutingMetric(altitudeProvider, detourPerHeightMeter, punishment)); } else if (routeModifier == "simplepower") { double weight = 90.0; double efficiency = 3 * weight; if (numberRegExp.indexIn(_parameterMap["weight"]) != -1) weight = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["efficiency"]) != -1) efficiency = numberRegExp.cap(1).toDouble(); metric.reset(new SimplePowerRoutingMetric(altitudeProvider, weight, efficiency)); } else if ((routeModifier == "power") || (routeModifier == "") || (routeModifier == "fastest")) { double weight = 90.0; //double maxPower = 140.0; double maxPower = 150.0; double minSpeed = 2.5; double pushBikeSpeed = 0.5; double haltungskorrekturfaktor = 0.4; double maxSpeed = -1.0; double noCyclewayPunishmentFactor = 5; if (numberRegExp.indexIn(_parameterMap["weight"]) != -1) weight = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["maxpower"]) != -1) maxPower = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["minspeed"]) != -1) minSpeed = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["maxspeed"]) != -1) maxSpeed = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["pushbikespeed"]) != -1) pushBikeSpeed = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["nocyclewaypunishmentfactor"]) != -1) noCyclewayPunishmentFactor = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["haltungskorrekturfaktor"]) != -1) haltungskorrekturfaktor = numberRegExp.cap(1).toDouble(); metric.reset(new PowerRoutingMetric(altitudeProvider, weight, maxPower, minSpeed, pushBikeSpeed, haltungskorrekturfaktor, noCyclewayPunishmentFactor ,maxSpeed)); } else if ((routeModifier == "biketourpower") || (routeModifier == "biketour")) { double weight = 90.0; //double maxPower = 140.0; double maxPower = 100.0; double minSpeed = 2.5; double pushBikeSpeed = 0.5; double haltungskorrekturfaktor = 0.4; double maxSpeed = -1.0; double noCyclewayPunishmentFactor = 7; if (numberRegExp.indexIn(_parameterMap["weight"]) != -1) weight = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["maxpower"]) != -1) maxPower = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["minspeed"]) != -1) minSpeed = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["maxspeed"]) != -1) maxSpeed = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["pushbikespeed"]) != -1) pushBikeSpeed = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["nocyclewaypunishmentfactor"]) != -1) noCyclewayPunishmentFactor = numberRegExp.cap(1).toDouble(); if (numberRegExp.indexIn(_parameterMap["haltungskorrekturfaktor"]) != -1) haltungskorrekturfaktor = numberRegExp.cap(1).toDouble(); metric.reset(new BikeTourPowerRoutingMetric(altitudeProvider, weight, maxPower, minSpeed, pushBikeSpeed, haltungskorrekturfaktor, noCyclewayPunishmentFactor ,maxSpeed)); } else { std::cerr << "routeModifier \"" << routeModifier << "\" not supported." << std::endl; this->send405(); return; } } else if (routeType == "car") { //TODO this->send405(); return; } else if (routeType == "foot") { if ((routeModifier == "euclidean") || (routeModifier == "") || (routeModifier == "shortest") || (routeModifier == "fastest")) { metric.reset(new EuclideanRoutingMetric(altitudeProvider)); } } else { std::cerr << "requested routeType=" << routeType << ", which is not supported." << std::endl; this->send405(); return; } #ifdef SPATIALITE_FOUND if (ProgramOptions::getInstance()->dbBackend == "spatialite") { dbA.reset(new SpatialiteDatabaseConnection()); dbB.reset(new SpatialiteDatabaseConnection()); } else #endif if (ProgramOptions::getInstance()->dbBackend == "sqlite") { dbA.reset(new SQLiteDatabaseConnection()); dbB.reset(new SQLiteDatabaseConnection()); } //Datenbank ist die globale DB... dbA->open(ProgramOptions::getInstance()->dbFilename.c_str()); dbB->open(ProgramOptions::getInstance()->dbFilename.c_str()); //TODO: Testen, ob das mit dem Cache überhaupt was bringt... dbA = boost::shared_ptr<DatabaseConnection>(new DatabaseRAMCache(dbA, ProgramOptions::getInstance()->dbCacheSize)); dbB = boost::shared_ptr<DatabaseConnection>(new DatabaseRAMCache(dbB, ProgramOptions::getInstance()->dbCacheSize)); //Routingalgorithmus heraussuchen, je nach Angabe. Standard: Mehrthread-A* oder Mehrthread-Dijkstra - je nach Metrik. if (_parameterMap["algorithm"] == "multithreadeddijkstra") router.reset(new MultithreadedDijkstraRouter(dbA, dbB, metric)); else if (_parameterMap["algorithm"] == "dijkstra") router.reset(new DijkstraRouter(dbA, metric)); else if (_parameterMap["algorithm"] == "astar") router.reset(new AStarRouter(dbA, metric)); else if (_parameterMap["algorithm"] == "multithreadedastar") router.reset(new MultithreadedAStarRouter(dbA, dbB, metric)); else { if (metric->getMeasurementUnit() == DISTANCE) router.reset(new MultithreadedAStarRouter(dbA, dbB, metric)); else router.reset(new MultithreadedDijkstraRouter(dbA, dbB, metric)); } //Route berechnen GPSRoute route = router->calculateShortestRoute(routePointList); //Keine Route gefunden? 404 senden. if (route.isEmpty()) { std::cerr << "no route found." << std::endl; this->send404(); return; } else { std::cerr << "found route." << std::endl << " length: " << route.calcLength()/1000.0 << "km" << std::endl << " duration: " << route.getDuration()/60.0 << "min" << std::endl << " has " << route.getSize() << " points." << std::endl; } //Antwort entsprechend des Routentypen senden. if (routeDataType == "gpx") this->sendFile(route.exportGPXString(altitudeProvider)); else if (routeDataType == "js") this->sendFile(route.exportJSONString()); else std::cerr << "route datatype \"" << routeDataType << "\" not supported." << std::endl; return; } }