void DeliveryStatus::handleMessage(RouterHash const from, I2NP::MessagePtr const msg) { I2P_LOG_SCOPED_RH(m_log, from); I2P_LOG(m_log, debug) << "received DeliveryStatus message, replying with DatabaseStore message"; Mapping am; am.setValue("caps", "BC"); am.setValue("host", m_ctx.getDatabase().getConfigValue("ssu_external_ip")); am.setValue("key", m_ctx.getIdentity().getHashEncoded()); am.setValue("port", m_ctx.getDatabase().getConfigValue("ssu_external_port")); RouterAddress a(5, Date(0), "SSU", am); Mapping rm; rm.setValue("coreVersion", "0.9.6"); rm.setValue("netId", "2"); rm.setValue("router.version", "0.9.6"); rm.setValue("stat_uptime", "90m"); rm.setValue("caps", "MR"); RouterInfo myInfo(m_ctx.getIdentity(), Date(), rm); myInfo.addAddress(a); myInfo.sign(m_ctx.getSigningKey()); Botan::Pipe gzPipe(new Botan::Zlib_Compression); gzPipe.start_msg(); gzPipe.write(myInfo.serialize()); gzPipe.end_msg(); unsigned int size = gzPipe.remaining(); ByteArray gzInfoBytes(size); gzPipe.read(gzInfoBytes.data(), size); auto mydsm = std::make_shared<I2NP::DatabaseStore>(myInfo.getIdentity().getHash(), I2NP::DatabaseStore::DataType::ROUTER_INFO, 0, gzInfoBytes); m_ctx.getOutMsgDisp().sendMessage(from, mydsm); }
void QgsSymbol::setNamedPointSymbol( QString name ) { if ( name.startsWith( "svg:" ) ) { // do some sanity checking for svgs... QString myTempName = name; myTempName.replace( "svg:", "" ); QFile myFile( myTempName ); if ( !myFile.exists() ) { QgsDebugMsg( "\n\n\n *** Svg Symbol not found on fs ***" ); QgsDebugMsg( "Name: " + name ); //see if we can resolve the problem... // QStringList svgPaths = QgsApplication::svgPaths(); for ( int i = 0; i < svgPaths.size(); i++ ) { QgsDebugMsg( "SvgPath: " + svgPaths[i] ); QFileInfo myInfo( myTempName ); QString myFileName = myInfo.fileName(); // foo.svg QString myLowestDir = myInfo.dir().dirName(); QString myLocalPath = svgPaths[i] + "/" + myLowestDir + "/" + myFileName; QgsDebugMsg( "Alternative svg path: " + myLocalPath ); if ( QFile( myLocalPath ).exists() ) { name = "svg:" + myLocalPath; QgsDebugMsg( "Svg found in alternative path" ); } else if ( myInfo.isRelative() ) { QFileInfo pfi( QgsProject::instance()->fileName() ); if ( pfi.exists() && QFile( pfi.canonicalPath() + QDir::separator() + myTempName ).exists() ) { name = "svg:" + pfi.canonicalPath() + QDir::separator() + myTempName; QgsDebugMsg( "Svg found in alternative path" ); break; } else { QgsDebugMsg( "Svg not found in project path" ); } } else { //couldnt find the file, no happy ending :-( QgsDebugMsg( "Computed alternate path but no svg there either" ); } } } } mPointSymbolName = name; mCacheUpToDate = mCacheUpToDate2 = false; }
TrayIcon::TrayIcon(MainWindow* parent) : QObject(parent) , MainWindow_(parent) , Icon_(new QSystemTrayIcon(this)) , Menu_(new ContextMenu(0)) , MessageAlert_(new RecentMessagesAlert(new Logic::RecentItemDelegate(this))) , Base_(new QIcon(":/resources/main_window/appicon.ico")) , Unreads_(new QIcon(":/resources/main_window/appicon_unread.ico")) #ifdef _WIN32 , TrayBase_(new QIcon(":/resources/main_window/appicon_tray.ico")) , TrayUnreads_(new QIcon(":/resources/main_window/appicon_tray_unread.ico")) #else , TrayBase_(new QIcon(":/resources/main_window/appicon.ico")) , TrayUnreads_(new QIcon(":/resources/main_window/appicon_unread.ico")) #endif //_WIN32 , TaskBarOverlay_(new QPixmap(":/resources/main_window/appicon_overlay.png")) , HaveUnreads_(false) #ifdef _WIN32 , ptbl(0) #endif //_WIN32 { #ifdef _WIN32 if (QSysInfo().windowsVersion() >= QSysInfo::WV_WINDOWS7) { HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&ptbl)); if (FAILED(hr)) ptbl = 0; } #endif //_WIN32 init(); connect(Ui::GetDispatcher(), SIGNAL(login_complete()), this, SLOT(loggedIn()), Qt::QueuedConnection); connect(MessageAlert_, SIGNAL(messageClicked(QString)), this, SLOT(messageClicked(QString)), Qt::QueuedConnection); connect(Logic::GetContactListModel(), SIGNAL(selectedContactChanged(QString)), this, SLOT(clearNotifications(QString)), Qt::QueuedConnection); connect(Logic::GetContactListModel(), SIGNAL(contactChanged(QString)), this, SLOT(updateIcon()), Qt::QueuedConnection); connect(Ui::GetDispatcher(), SIGNAL(myInfo()), this, SLOT(myInfo())); connect(Ui::GetDispatcher(), SIGNAL(needLogin()), this, SLOT(loggedOut()), Qt::QueuedConnection); }
void NmdcHub::onLine(const string& aLine) throw() { lastActivity = GET_TICK(); if(aLine.length() == 0) return; if(aLine[0] != '$') { // Check if we're being banned... if(state != STATE_CONNECTED) { if(Util::findSubString(aLine, "banned") != string::npos) { reconnect = false; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::Message(), this, Util::validateMessage(fromNmdc(aLine), true)); return; } string cmd; string param; string::size_type x; if( (x = aLine.find(' ')) == string::npos) { cmd = aLine; } else { cmd = aLine.substr(0, x); param = aLine.substr(x+1); } if(cmd == "$Search") { if(state != STATE_CONNECTED) { return; } string::size_type i = 0; string::size_type j = param.find(' ', i); if(j == string::npos || i == j) return; string seeker = fromNmdc(param.substr(i, j-i)); // Filter own searches if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { if(seeker == (getLocalIp() + ":" + Util::toString(SETTING(IN_PORT)))) { return; } } else { // Hub:seeker if(Util::stricmp(seeker.c_str() + 4, getNick().c_str()) == 0) { return; } } i = j + 1; { Lock l(cs); u_int32_t tick = GET_TICK(); seekers.push_back(make_pair(seeker, tick)); // First, check if it's a flooder FloodIter fi; for(fi = flooders.begin(); fi != flooders.end(); ++fi) { if(fi->first == seeker) { return; } } int count = 0; for(fi = seekers.begin(); fi != seekers.end(); ++fi) { if(fi->first == seeker) count++; if(count > 7) { if(seeker.compare(0, 4, "Hub:") == 0) Speaker<NmdcHubListener>::fire(NmdcHubListener::SearchFlood(), this, seeker.substr(4)); else Speaker<NmdcHubListener>::fire(NmdcHubListener::SearchFlood(), this, seeker + STRING(NICK_UNKNOWN)); flooders.push_back(make_pair(seeker, tick)); return; } } } int a; if(param[i] == 'F') { a = SearchManager::SIZE_DONTCARE; } else if(param[i+2] == 'F') { a = SearchManager::SIZE_ATLEAST; } else { a = SearchManager::SIZE_ATMOST; } i += 4; j = param.find('?', i); if(j == string::npos || i == j) return; string size = param.substr(i, j-i); i = j + 1; j = param.find('?', i); if(j == string::npos || i == j) return; int type = Util::toInt(param.substr(i, j-i)) - 1; i = j + 1; param = param.substr(i); if(param.size() > 0) { Speaker<NmdcHubListener>::fire(NmdcHubListener::Search(), this, seeker, a, Util::toInt64(size), type, fromNmdc(param)); if(seeker.compare(0, 4, "Hub:") == 0) { User::Ptr u; { Lock l(cs); User::NickIter ni = users.find(seeker.substr(4)); if(ni != users.end() && !ni->second->isSet(User::PASSIVE)) { u = ni->second; u->setFlag(User::PASSIVE); } } if(u) { updated(u); } } } } else if(cmd == "$MyINFO") { string::size_type i, j; i = 5; j = param.find(' ', i); if( (j == string::npos) || (j == i) ) return; string nick = fromNmdc(param.substr(i, j-i)); i = j + 1; User::Ptr u; dcassert(nick.size() > 0); { Lock l(cs); User::NickIter ni = users.find(nick); if(ni == users.end()) { u = users[nick] = ClientManager::getInstance()->getUser(nick, this); } else { u = ni->second; } } j = param.find('$', i); if(j == string::npos) return; string tmpDesc = Util::validateMessage(fromNmdc(param.substr(i, j-i)), true); // Look for a tag... if(tmpDesc.size() > 0 && tmpDesc[tmpDesc.size()-1] == '>') { x = tmpDesc.rfind('<'); if(x != string::npos) { // Hm, we have something... u->setTag(tmpDesc.substr(x)); tmpDesc.erase(x); } else { u->setTag(Util::emptyString); } } else { u->setTag(Util::emptyString); } u->setDescription(tmpDesc); i = j + 3; j = param.find('$', i); if(j == string::npos) return; u->setConnection(fromNmdc(param.substr(i, j-i-1))); i = j + 1; j = param.find('$', i); if(j == string::npos) return; u->setEmail(Util::validateMessage(fromNmdc(param.substr(i, j-i)), true)); i = j + 1; j = param.find('$', i); if(j == string::npos) return; u->setBytesShared(param.substr(i, j-i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::MyInfo(), this, u); } else if(cmd == "$Quit") { if(!param.empty()) { User::Ptr u; { Lock l(cs); User::NickIter i = users.find(fromNmdc(param)); if(i == users.end()) { dcdebug("C::onLine Quitting user %s not found\n", param.c_str()); return; } u = i->second; users.erase(i); } Speaker<NmdcHubListener>::fire(NmdcHubListener::Quit(), this, u); ClientManager::getInstance()->putUserOffline(u, true); } } else if(cmd == "$ConnectToMe") { if(state != STATE_CONNECTED) { return; } string::size_type i = param.find(' '); string::size_type j; if( (i == string::npos) || ((i + 1) >= param.size()) ) { return; } i++; j = param.find(':', i); if(j == string::npos) { return; } string server = fromNmdc(param.substr(i, j-i)); if(j+1 >= param.size()) { return; } string port = param.substr(j+1); ConnectionManager::getInstance()->connect(server, (short)Util::toInt(port), getNick()); Speaker<NmdcHubListener>::fire(NmdcHubListener::ConnectToMe(), this, server, (short)Util::toInt(port)); } else if(cmd == "$RevConnectToMe") { if(state != STATE_CONNECTED) { return; } User::Ptr u; bool up = false; { Lock l(cs); string::size_type j = param.find(' '); if(j == string::npos) { return; } User::NickIter i = users.find(fromNmdc(param.substr(0, j))); if(i == users.end()) { return; } u = i->second; if(!u->isSet(User::PASSIVE)) { u->setFlag(User::PASSIVE); up = true; } } if(u) { if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { connectToMe(u); Speaker<NmdcHubListener>::fire(NmdcHubListener::RevConnectToMe(), this, u); } else { // Notify the user that we're passive too... if(up) revConnectToMe(u); } if(up) updated(u); } } else if(cmd == "$SR") { SearchManager::getInstance()->onSearchResult(aLine); } else if(cmd == "$HubName") { name = fromNmdc(param); Speaker<NmdcHubListener>::fire(NmdcHubListener::HubName(), this); } else if(cmd == "$Supports") { StringTokenizer<string> st(param, ' '); StringList& sl = st.getTokens(); for(StringIter i = sl.begin(); i != sl.end(); ++i) { if(*i == "UserCommand") { supportFlags |= SUPPORTS_USERCOMMAND; } else if(*i == "NoGetINFO") { supportFlags |= SUPPORTS_NOGETINFO; } else if(*i == "UserIP2") { supportFlags |= SUPPORTS_USERIP2; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::Supports(), this, sl); } else if(cmd == "$UserCommand") { string::size_type i = 0; string::size_type j = param.find(' '); if(j == string::npos) return; int type = Util::toInt(param.substr(0, j)); i = j+1; if(type == UserCommand::TYPE_SEPARATOR || type == UserCommand::TYPE_CLEAR) { int ctx = Util::toInt(param.substr(i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::UserCommand(), this, type, ctx, Util::emptyString, Util::emptyString); } else if(type == UserCommand::TYPE_RAW || type == UserCommand::TYPE_RAW_ONCE) { j = param.find(' ', i); if(j == string::npos) return; int ctx = Util::toInt(param.substr(i)); i = j+1; j = param.find('$'); if(j == string::npos) return; string name = fromNmdc(param.substr(i, j-i)); i = j+1; string command = fromNmdc(param.substr(i, param.length() - i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::UserCommand(), this, type, ctx, Util::validateMessage(name, true, false), Util::validateMessage(command, true, false)); } } else if(cmd == "$Lock") { if(state != STATE_LOCK) { return; } state = STATE_HELLO; if(!param.empty()) { string::size_type j = param.find(" Pk="); string lock, pk; if( j != string::npos ) { lock = param.substr(0, j); pk = param.substr(j + 4); } else { // Workaround for faulty linux hubs... j = param.find(" "); if(j != string::npos) lock = param.substr(0, j); else lock = param; } if(CryptoManager::getInstance()->isExtended(lock)) { StringList feat; feat.push_back("UserCommand"); feat.push_back("NoGetINFO"); feat.push_back("NoHello"); feat.push_back("UserIP2"); feat.push_back("TTHSearch"); if(BOOLSETTING(COMPRESS_TRANSFERS)) feat.push_back("GetZBlock"); supports(feat); } key(CryptoManager::getInstance()->makeKey(lock)); validateNick(getNick()); Speaker<NmdcHubListener>::fire(NmdcHubListener::CLock(), this, lock, pk); } } else if(cmd == "$Hello") { if(!param.empty()) { string nick = fromNmdc(param); User::Ptr u = ClientManager::getInstance()->getUser(nick, this); { Lock l(cs); users[nick] = u; } if(getNick() == nick) { setMe(u); u->setFlag(User::DCPLUSPLUS); if(SETTING(CONNECTION_TYPE) != SettingsManager::CONNECTION_ACTIVE) u->setFlag(User::PASSIVE); else u->unsetFlag(User::PASSIVE); } if(state == STATE_HELLO) { state = STATE_CONNECTED; updateCounts(false); version(); getNickList(); myInfo(); } Speaker<NmdcHubListener>::fire(NmdcHubListener::Hello(), this, u); } } else if(cmd == "$ForceMove") { disconnect(); Speaker<NmdcHubListener>::fire(NmdcHubListener::Redirect(), this, param); } else if(cmd == "$HubIsFull") { Speaker<NmdcHubListener>::fire(NmdcHubListener::HubFull(), this); } else if(cmd == "$ValidateDenide") { // Mind the spelling... disconnect(); Speaker<NmdcHubListener>::fire(NmdcHubListener::ValidateDenied(), this); } else if(cmd == "$UserIP") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& l = t.getTokens(); for(StringIter it = l.begin(); it != l.end(); ++it) { string::size_type j = 0; if((j = it->find(' ')) == string::npos) continue; if((j+1) == it->length()) continue; v.push_back(ClientManager::getInstance()->getUser(it->substr(0, j), this)); v.back()->setIp(it->substr(j+1)); } Speaker<NmdcHubListener>::fire(NmdcHubListener::UserIp(), this, v); } } else if(cmd == "$NickList") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& sl = t.getTokens(); for(StringIter it = sl.begin(); it != sl.end(); ++it) { v.push_back(ClientManager::getInstance()->getUser(*it, this)); } { Lock l(cs); for(User::Iter it2 = v.begin(); it2 != v.end(); ++it2) { users[(*it2)->getNick()] = *it2; } } if(!(getSupportFlags() & SUPPORTS_NOGETINFO)) { string tmp; // Let's assume 10 characters per nick... tmp.reserve(v.size() * (11 + 10 + getNick().length())); for(User::List::const_iterator i = v.begin(); i != v.end(); ++i) { tmp += "$GetINFO "; tmp += (*i)->getNick(); tmp += ' '; tmp += getNick(); tmp += '|'; } if(!tmp.empty()) { send(tmp); } } Speaker<NmdcHubListener>::fire(NmdcHubListener::NickList(), this, v); } } else if(cmd == "$OpList") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& sl = t.getTokens(); for(StringIter it = sl.begin(); it != sl.end(); ++it) { v.push_back(ClientManager::getInstance()->getUser(*it, this)); v.back()->setFlag(User::OP); } { Lock l(cs); for(User::Iter it2 = v.begin(); it2 != v.end(); ++it2) { users[(*it2)->getNick()] = *it2; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::OpList(), this, v); updateCounts(false); // Special...to avoid op's complaining that their count is not correctly // updated when they log in (they'll be counted as registered first...) myInfo(); } } else if(cmd == "$To:") { string::size_type i = param.find("From:"); if(i != string::npos) { i+=6; string::size_type j = param.find("$"); if(j != string::npos) { string from = fromNmdc(param.substr(i, j - 1 - i)); if(from.size() > 0 && param.size() > (j + 1)) { Speaker<NmdcHubListener>::fire(NmdcHubListener::PrivateMessage(), this, ClientManager::getInstance()->getUser(from, this, false), Util::validateMessage(fromNmdc(param.substr(j + 1)), true)); } } } } else if(cmd == "$GetPass") { setRegistered(true); Speaker<NmdcHubListener>::fire(NmdcHubListener::GetPassword(), this); } else if(cmd == "$BadPass") { Speaker<NmdcHubListener>::fire(NmdcHubListener::BadPassword(), this); } else if(cmd == "$LogedIn") { Speaker<NmdcHubListener>::fire(NmdcHubListener::LoggedIn(), this); } else { dcassert(cmd[0] == '$'); dcdebug("NmdcHub::onLine Unknown command %s\n", aLine.c_str()); } }
int main( int argc, char *argv[] ) { #ifdef WIN32 // Windows #ifdef _MSC_VER _set_fmode( _O_BINARY ); #else //MinGW _fmode = _O_BINARY; #endif // _MSC_VER #endif // WIN32 ///////////////////////////////////////////////////////////////// // Command line options 'behaviour' flag setup //////////////////////////////////////////////////////////////// // // Parse the command line arguments, looking to see if the user has asked for any // special behaviours. Any remaining non command arguments will be kept aside to // be passed as a list of layers and / or a project that should be loaded. // int myIterations = 1; QString mySnapshotFileName = ""; QString myLogFileName = ""; QString myPrefixPath = ""; int mySnapshotWidth = 800; int mySnapshotHeight = 600; QString myQuality = ""; // This behaviour will set initial extent of map canvas, but only if // there are no command line arguments. This gives a usable map // extent when qgis starts with no layers loaded. When layers are // loaded, we let the layers define the initial extent. QString myInitialExtent = ""; if ( argc == 1 ) myInitialExtent = "-1,-1,1,1"; // The user can specify a path which will override the default path of custom // user settings (~/.qgis) and it will be used for QSettings INI file QString configpath; #ifndef WIN32 //////////////////////////////////////////////////////////////// // USe the GNU Getopts utility to parse cli arguments // Invokes ctor `GetOpt (int argc, char **argv, char *optstring);' /////////////////////////////////////////////////////////////// int optionChar; while ( 1 ) { static struct option long_options[] = { /* These options set a flag. */ {"help", no_argument, 0, '?'}, /* These options don't set a flag. * We distinguish them by their indices. */ {"iterations", required_argument, 0, 'i'}, {"snapshot", required_argument, 0, 's'}, {"log", required_argument, 0, 'l'}, {"width", required_argument, 0, 'w'}, {"height", required_argument, 0, 'h'}, {"project", required_argument, 0, 'p'}, {"extent", required_argument, 0, 'e'}, {"optionspath", required_argument, 0, 'o'}, {"configpath", required_argument, 0, 'c'}, {"prefix", required_argument, 0, 'r'}, {"quality", required_argument, 0, 'q'}, {0, 0, 0, 0} }; /* getopt_long stores the option index here. */ int option_index = 0; optionChar = getopt_long( argc, argv, "islwhpeocrq", long_options, &option_index ); /* Detect the end of the options. */ if ( optionChar == -1 ) break; switch ( optionChar ) { case 0: /* If this option set a flag, do nothing else now. */ if ( long_options[option_index].flag != 0 ) break; printf( "option %s", long_options[option_index].name ); if ( optarg ) printf( " with arg %s", optarg ); printf( "\n" ); break; case 'i': myIterations = QString( optarg ).toInt(); break; case 's': mySnapshotFileName = QDir::convertSeparators( QFileInfo( QFile::decodeName( optarg ) ).absoluteFilePath() ); break; case 'l': myLogFileName = QDir::convertSeparators( QFileInfo( QFile::decodeName( optarg ) ).absoluteFilePath() ); break; case 'w': mySnapshotWidth = QString( optarg ).toInt(); break; case 'h': mySnapshotHeight = QString( optarg ).toInt(); break; case 'p': myProjectFileName = QDir::convertSeparators( QFileInfo( QFile::decodeName( optarg ) ).absoluteFilePath() ); break; case 'e': myInitialExtent = optarg; break; case 'o': QSettings::setPath( QSettings::IniFormat, QSettings::UserScope, optarg ); break; case 'c': configpath = optarg; break; case 'r': myPrefixPath = optarg; break; case 'q': myQuality = optarg; break; case '?': usage( argv[0] ); return 2; // XXX need standard exit codes break; default: QgsDebugMsg( QString( "%1: getopt returned character code %2" ).arg( argv[0] ).arg( optionChar ) ); return 1; // XXX need standard exit codes } } // Add any remaining args to the file list - we will attempt to load them // as layers in the map view further down.... QgsDebugMsg( QString( "Files specified on command line: %1" ).arg( optind ) ); if ( optind < argc ) { while ( optind < argc ) { #ifdef QGISDEBUG int idx = optind; QgsDebugMsg( QString( "%1: %2" ).arg( idx ).arg( argv[idx] ) ); #endif myFileList.append( QDir::convertSeparators( QFileInfo( QFile::decodeName( argv[optind++] ) ).absoluteFilePath() ) ); } } #else for ( int i = 1; i < argc; i++ ) { QString arg = argv[i]; if ( arg == "--help" || arg == "-?" ) { usage( argv[0] ); return 2; } else if ( i + 1 < argc && ( arg == "--iterations" || arg == "-i" ) ) { myIterations = QString( argv[++i] ).toInt(); } else if ( i + 1 < argc && ( arg == "--snapshot" || arg == "-s" ) ) { mySnapshotFileName = QDir::convertSeparators( QFileInfo( QFile::decodeName( argv[++i] ) ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == "--log" || arg == "-l" ) ) { myLogFileName = QDir::convertSeparators( QFileInfo( QFile::decodeName( argv[++i] ) ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == "--width" || arg == "-w" ) ) { mySnapshotWidth = QString( argv[++i] ).toInt(); } else if ( i + 1 < argc && ( arg == "--height" || arg == "-h" ) ) { mySnapshotHeight = QString( argv[++i] ).toInt(); } else if ( i + 1 < argc && ( arg == "--project" || arg == "-p" ) ) { myProjectFileName = QDir::convertSeparators( QFileInfo( QFile::decodeName( argv[++i] ) ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == "--extent" || arg == "-e" ) ) { myInitialExtent = argv[++i]; } else if ( i + 1 < argc && ( arg == "--optionspath" || arg == "-o" ) ) { QSettings::setPath( QSettings::IniFormat, QSettings::UserScope, argv[++i] ); } else if ( i + 1 < argc && ( arg == "--configpath" || arg == "-c" ) ) { configpath = argv[++i]; QSettings::setPath( QSettings::IniFormat, QSettings::UserScope, configpath ); } else if ( i + 1 < argc && ( arg == "--prefix" ) ) { myPrefixPath = argv[++i]; } else if ( i + 1 < argc && ( arg == "--quality" || arg == "-q" ) ) { myQuality = argv[++i]; } else { myFileList.append( QDir::convertSeparators( QFileInfo( QFile::decodeName( argv[i] ) ).absoluteFilePath() ) ); } } #endif //WIN32 ///////////////////////////////////////////////////////////////////// // Now we have the handlers for the different behaviours... //////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // Initialise the application and the translation stuff ///////////////////////////////////////////////////////////////////// if ( !configpath.isEmpty() ) { // tell QSettings to use INI format and save the file in custom config path QSettings::setPath( QSettings::IniFormat, QSettings::UserScope, configpath ); } // TODO: Qt: there should be exactly one QCoreApplication object for console app. // but QgsApplication inherits from QApplication (GUI) // it is working, but maybe we should make QgsCoreApplication, which // could also be used by mapserver // Note (mkuhn,20.4.2013): Labeling does not work with QCoreApplication, because // fontconfig needs some X11 dependencies which are initialized in QApplication (GUI) // using it with QCoreApplication only crashes at the moment. // Only use QgsApplication( int, char **, bool GUIenabled, QString) for newer versions // so that this program may be run with old libraries //QgsApplication myApp( argc, argv, false, configpath ); QCoreApplication *myApp; #if VERSION_INT >= 10900 myApp = new QgsApplication( argc, argv, false ); #else myApp = new QCoreApplication( argc, argv ); #endif if ( myPrefixPath.isEmpty() ) { QDir dir( QCoreApplication::applicationDirPath() ); dir.cdUp(); myPrefixPath = dir.absolutePath(); } QgsApplication::setPrefixPath( myPrefixPath, true ); // Set up the QSettings environment must be done after qapp is created QgsApplication::setOrganizationName( "QuantumGIS" ); QgsApplication::setOrganizationDomain( "qgis.org" ); QgsApplication::setApplicationName( "QGIS2" ); QgsProviderRegistry::instance( QgsApplication::pluginPath() ); #ifdef Q_OS_MACX // If the GDAL plugins are bundled with the application and GDAL_DRIVER_PATH // is not already defined, use the GDAL plugins in the application bundle. QString gdalPlugins( QCoreApplication::applicationDirPath().append( "/lib/gdalplugins" ) ); if ( QFile::exists( gdalPlugins ) && !getenv( "GDAL_DRIVER_PATH" ) ) { setenv( "GDAL_DRIVER_PATH", gdalPlugins.toUtf8(), 1 ); } #endif QSettings mySettings; // For non static builds on mac and win (static builds are not supported) // we need to be sure we can find the qt image // plugins. In mac be sure to look in the // application bundle... #ifdef Q_WS_WIN QCoreApplication::addLibraryPath( QApplication::applicationDirPath() + QDir::separator() + "qtplugins" ); #endif #ifdef Q_OS_MACX //qDebug("Adding qt image plugins to plugin search path..."); CFURLRef myBundleRef = CFBundleCopyBundleURL( CFBundleGetMainBundle() ); CFStringRef myMacPath = CFURLCopyFileSystemPath( myBundleRef, kCFURLPOSIXPathStyle ); const char *mypPathPtr = CFStringGetCStringPtr( myMacPath, CFStringGetSystemEncoding() ); CFRelease( myBundleRef ); CFRelease( myMacPath ); QString myPath( mypPathPtr ); // if we are not in a bundle assume that the app is built // as a non bundle app and that image plugins will be // in system Qt frameworks. If the app is a bundle // lets try to set the qt plugin search path... QFileInfo myInfo( myPath ); if ( myInfo.isBundle() ) { // First clear the plugin search paths so we can be sure // only plugins from the bundle are being used QStringList myPathList; QCoreApplication::setLibraryPaths( myPathList ); // Now set the paths inside the bundle myPath += "/Contents/plugins"; QCoreApplication::addLibraryPath( myPath ); } #endif QgsBench *qbench = new QgsBench( mySnapshotWidth, mySnapshotHeight, myIterations ); ///////////////////////////////////////////////////////////////////// // If no --project was specified, parse the args to look for a // // .qgs file and set myProjectFileName to it. This allows loading // // of a project file by clicking on it in various desktop managers // // where an appropriate mime-type has been set up. // ///////////////////////////////////////////////////////////////////// if ( myProjectFileName.isEmpty() ) { // check for a .qgs for ( int i = 0; i < argc; i++ ) { QString arg = QDir::convertSeparators( QFileInfo( QFile::decodeName( argv[i] ) ).absoluteFilePath() ); if ( arg.contains( ".qgs" ) ) { myProjectFileName = arg; break; } } } ///////////////////////////////////////////////////////////////////// // Load a project file if one was specified ///////////////////////////////////////////////////////////////////// if ( ! myProjectFileName.isEmpty() ) { if ( ! qbench->openProject( myProjectFileName ) ) { fprintf( stderr, "Cannot load project\n" ); return 1; } } if ( ! myQuality.isEmpty() ) { QPainter::RenderHints hints; QStringList list = myQuality.split( ',' ); foreach ( QString q, list ) { if ( q == "Antialiasing" ) hints |= QPainter::Antialiasing; else if ( q == "TextAntialiasing" ) hints |= QPainter::TextAntialiasing; else if ( q == "SmoothPixmapTransform" ) hints |= QPainter::SmoothPixmapTransform; else if ( q == "NonCosmeticDefaultPen" ) hints |= QPainter::NonCosmeticDefaultPen; else { fprintf( stderr, "Unknown quality option\n" ); return 1; } } QgsDebugMsg( QString( "hints: %1" ).arg( hints ) ); qbench->setRenderHints( hints ); }
//private method meant for internal use by this class only QgsCoordinateReferenceSystem::RecordMap QgsCoordinateReferenceSystem::getRecord( QString theSql ) { QString myDatabaseFileName; QgsCoordinateReferenceSystem::RecordMap myMap; QString myFieldName; QString myFieldValue; sqlite3 *myDatabase; const char *myTail; sqlite3_stmt *myPreparedStatement; int myResult; QgsDebugMsg( "running query: " + theSql ); // Get the full path name to the sqlite3 spatial reference database. myDatabaseFileName = QgsApplication::srsDbFilePath(); QFileInfo myInfo( myDatabaseFileName ); if ( !myInfo.exists() ) { QgsDebugMsg( "failed : " + myDatabaseFileName + " does not exist!" ); return myMap; } //check the db is available myResult = openDb( myDatabaseFileName, &myDatabase ); if ( myResult != SQLITE_OK ) { return myMap; } myResult = sqlite3_prepare( myDatabase, theSql.toUtf8(), theSql.toUtf8().length(), &myPreparedStatement, &myTail ); // XXX Need to free memory from the error msg if one is set if ( myResult == SQLITE_OK && sqlite3_step( myPreparedStatement ) == SQLITE_ROW ) { QgsDebugMsg( "trying system srs.db" ); int myColumnCount = sqlite3_column_count( myPreparedStatement ); //loop through each column in the record adding its expression name and value to the map for ( int myColNo = 0; myColNo < myColumnCount; myColNo++ ) { myFieldName = QString::fromUtf8(( char * )sqlite3_column_name( myPreparedStatement, myColNo ) ); myFieldValue = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, myColNo ) ); myMap[myFieldName] = myFieldValue; } } else { QgsDebugMsg( "trying user qgis.db" ); sqlite3_finalize( myPreparedStatement ); sqlite3_close( myDatabase ); myDatabaseFileName = QgsApplication::qgisUserDbFilePath(); QFileInfo myFileInfo; myFileInfo.setFile( myDatabaseFileName ); if ( !myFileInfo.exists( ) ) { QgsDebugMsg( "user qgis.db not found" ); return myMap; } //check the db is available myResult = openDb( myDatabaseFileName, &myDatabase ); if ( myResult != SQLITE_OK ) { return myMap; } myResult = sqlite3_prepare( myDatabase, theSql.toUtf8(), theSql.toUtf8().length(), &myPreparedStatement, &myTail ); // XXX Need to free memory from the error msg if one is set if ( myResult == SQLITE_OK && sqlite3_step( myPreparedStatement ) == SQLITE_ROW ) { int myColumnCount = sqlite3_column_count( myPreparedStatement ); //loop through each column in the record adding its field name and value to the map for ( int myColNo = 0; myColNo < myColumnCount; myColNo++ ) { myFieldName = QString::fromUtf8(( char * )sqlite3_column_name( myPreparedStatement, myColNo ) ); myFieldValue = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, myColNo ) ); myMap[myFieldName] = myFieldValue; } } else { QgsDebugMsg( "failed : " + theSql ); } } sqlite3_finalize( myPreparedStatement ); sqlite3_close( myDatabase ); #ifdef QGISDEBUG QgsDebugMsg( "retrieved: " + theSql ); RecordMap::Iterator it; for ( it = myMap.begin(); it != myMap.end(); ++it ) { QgsDebugMsgLevel( it.key() + " => " + it.value(), 2 ); } #endif return myMap; }
bool QgsCoordinateReferenceSystem::loadFromDb( QString db, QString expression, QString value ) { QgsDebugMsgLevel( "load CRS from " + db + " where " + expression + " is " + value, 3 ); mIsValidFlag = false; QFileInfo myInfo( db ); if ( !myInfo.exists() ) { QgsDebugMsg( "failed : " + db + " does not exist!" ); return mIsValidFlag; } sqlite3 *myDatabase; const char *myTail; sqlite3_stmt *myPreparedStatement; int myResult; //check the db is available myResult = openDb( db, &myDatabase ); if ( myResult != SQLITE_OK ) { QgsDebugMsg( "failed : " + db + " could not be opened!" ); return mIsValidFlag; } /* srs_id INTEGER PRIMARY KEY, description text NOT NULL, projection_acronym text NOT NULL, ellipsoid_acronym NOT NULL, parameters text NOT NULL, srid integer NOT NULL, auth_name varchar NOT NULL, auth_id integer NOT NULL, is_geo integer NOT NULL); */ QString mySql = "select srs_id,description,projection_acronym,ellipsoid_acronym,parameters,srid,auth_name||':'||auth_id,is_geo from tbl_srs where " + expression + "=" + quotedValue( value ); myResult = sqlite3_prepare( myDatabase, mySql.toUtf8(), mySql.toUtf8().length(), &myPreparedStatement, &myTail ); // XXX Need to free memory from the error msg if one is set if ( myResult == SQLITE_OK && sqlite3_step( myPreparedStatement ) == SQLITE_ROW ) { mSrsId = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 0 ) ).toLong(); mDescription = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 1 ) ); mProjectionAcronym = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 2 ) ); mEllipsoidAcronym = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 3 ) ); QString toProj4 = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 4 ) ); mSRID = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 5 ) ).toLong(); mAuthId = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 6 ) ); int geo = QString::fromUtf8(( char * )sqlite3_column_text( myPreparedStatement, 7 ) ).toInt(); mGeoFlag = ( geo == 0 ? false : true ); setProj4String( toProj4 ); setMapUnits(); } else { QgsDebugMsg( "failed : " + mySql ); } sqlite3_finalize( myPreparedStatement ); sqlite3_close( myDatabase ); return mIsValidFlag; }