QGIS API Documentation  2.13.0-Master
qgsapplication.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsapplication.cpp - Accessors for application-wide data
3  --------------------------------------
4  Date : 02-Jan-2006
5  Copyright : (C) 2006 by Tom Elwertowski
6  Email : telwertowski at users dot sourceforge dot net
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgsapplication.h"
17 #include "qgsauthmanager.h"
18 #include "qgscrscache.h"
20 #include "qgsexception.h"
21 #include "qgsgeometry.h"
22 #include "qgslogger.h"
23 #include "qgsmaplayerregistry.h"
25 #include "qgsproviderregistry.h"
26 #include "qgsexpression.h"
27 
28 #include <QDir>
29 #include <QFile>
30 #include <QFileInfo>
31 #include <QFileOpenEvent>
32 #include <QMessageBox>
33 #include <QPalette>
34 #include <QProcess>
35 #include <QSettings>
36 #include <QIcon>
37 #include <QPixmap>
38 #include <QThreadPool>
39 
40 #ifndef Q_OS_WIN
41 #include <netinet/in.h>
42 #include <pwd.h>
43 #else
44 #include <winsock.h>
45 #include <windows.h>
46 #include <Lmcons.h>
47 #define SECURITY_WIN32
48 #include <Security.h>
49 #pragma comment( lib, "Secur32.lib" )
50 #endif
51 
52 #include "qgsconfig.h"
53 
54 #include <gdal.h>
55 #include <ogr_api.h>
56 #include <cpl_conv.h> // for setting gdal options
57 #include <sqlite3.h>
58 
59 QObject * ABISYM( QgsApplication::mFileOpenEventReceiver );
60 QStringList ABISYM( QgsApplication::mFileOpenEventList );
61 QString ABISYM( QgsApplication::mPrefixPath );
62 QString ABISYM( QgsApplication::mPluginPath );
63 QString ABISYM( QgsApplication::mPkgDataPath );
64 QString ABISYM( QgsApplication::mLibraryPath );
65 QString ABISYM( QgsApplication::mLibexecPath );
66 QString ABISYM( QgsApplication::mThemeName );
67 QString ABISYM( QgsApplication::mUIThemeName );
68 QStringList ABISYM( QgsApplication::mDefaultSvgPaths );
69 QMap<QString, QString> ABISYM( QgsApplication::mSystemEnvVars );
70 QString ABISYM( QgsApplication::mConfigPath );
71 bool ABISYM( QgsApplication::mRunningFromBuildDir ) = false;
72 QString ABISYM( QgsApplication::mBuildSourcePath );
73 #ifdef _MSC_VER
74 QString ABISYM( QgsApplication::mCfgIntDir );
75 #endif
76 QString ABISYM( QgsApplication::mBuildOutputPath );
77 QStringList ABISYM( QgsApplication::mGdalSkipList );
78 int ABISYM( QgsApplication::mMaxThreads );
79 QString ABISYM( QgsApplication::mAuthDbDirPath );
80 
81 QString QgsApplication::sUserName;
82 QString QgsApplication::sUserFullName;
83 QString QgsApplication::sPlatformName = "desktop";
84 
85 const char* QgsApplication::QGIS_ORGANIZATION_NAME = "QGIS";
86 const char* QgsApplication::QGIS_ORGANIZATION_DOMAIN = "qgis.org";
87 const char* QgsApplication::QGIS_APPLICATION_NAME = "QGIS2";
88 
102 QgsApplication::QgsApplication( int & argc, char ** argv, bool GUIenabled, const QString& customConfigPath, const QString& platformName )
103  : QApplication( argc, argv, GUIenabled )
104 {
105  sPlatformName = platformName;
106 
107  init( customConfigPath ); // init can also be called directly by e.g. unit tests that don't inherit QApplication.
108 }
109 
110 void QgsApplication::init( QString customConfigPath )
111 {
112  if ( customConfigPath.isEmpty() )
113  {
114  if ( getenv( "QGIS_CUSTOM_CONFIG_PATH" ) )
115  {
116  customConfigPath = getenv( "QGIS_CUSTOM_CONFIG_PATH" );
117  }
118  else
119  {
120  customConfigPath = QString( "%1/.qgis%2/" ).arg( QDir::homePath() ).arg( QGis::QGIS_VERSION_INT / 10000 );
121  }
122  }
123 
124  qRegisterMetaType<QgsGeometry::Error>( "QgsGeometry::Error" );
125 
126  QString prefixPath( getenv( "QGIS_PREFIX_PATH" ) ? getenv( "QGIS_PREFIX_PATH" ) : applicationDirPath() );
127  // QgsDebugMsg( QString( "prefixPath(): %1" ).arg( prefixPath ) );
128 
129  // check if QGIS is run from build directory (not the install directory)
130  QFile f;
131  // "/../../.." is for Mac bundled app in build directory
132  Q_FOREACH ( const QString& path, QStringList() << "" << "/.." << "/bin" << "/../../.." )
133  {
134  f.setFileName( prefixPath + path + "/qgisbuildpath.txt" );
135  if ( f.exists() )
136  break;
137  }
138  if ( f.exists() && f.open( QIODevice::ReadOnly ) )
139  {
140  ABISYM( mRunningFromBuildDir ) = true;
141  ABISYM( mBuildSourcePath ) = f.readLine().trimmed();
142  ABISYM( mBuildOutputPath ) = f.readLine().trimmed();
143  qDebug( "Running from build directory!" );
144  qDebug( "- source directory: %s", ABISYM( mBuildSourcePath ).toUtf8().data() );
145  qDebug( "- output directory of the build: %s", ABISYM( mBuildOutputPath ).toUtf8().data() );
146 #ifdef _MSC_VER
147  ABISYM( mCfgIntDir ) = prefixPath.split( '/', QString::SkipEmptyParts ).last();
148  qDebug( "- cfg: %s", ABISYM( mCfgIntDir ).toUtf8().data() );
149 #endif
150  }
151 
152  if ( ABISYM( mRunningFromBuildDir ) )
153  {
154  // we run from source directory - not installed to destination (specified prefix)
155  ABISYM( mPrefixPath ) = QString(); // set invalid path
156 #if defined(_MSC_VER) && !defined(USING_NMAKE)
157  setPluginPath( ABISYM( mBuildOutputPath ) + '/' + QString( QGIS_PLUGIN_SUBDIR ) + '/' + ABISYM( mCfgIntDir ) );
158 #else
159  setPluginPath( ABISYM( mBuildOutputPath ) + '/' + QString( QGIS_PLUGIN_SUBDIR ) );
160 #endif
161  setPkgDataPath( ABISYM( mBuildSourcePath ) ); // directly source path - used for: doc, resources, svg
162  ABISYM( mLibraryPath ) = ABISYM( mBuildOutputPath ) + '/' + QGIS_LIB_SUBDIR + '/';
163 #if defined(_MSC_VER) && !defined(USING_NMAKE)
164  ABISYM( mLibexecPath ) = ABISYM( mBuildOutputPath ) + '/' + QGIS_LIBEXEC_SUBDIR + '/' + ABISYM( mCfgIntDir ) + '/';
165 #else
166  ABISYM( mLibexecPath ) = ABISYM( mBuildOutputPath ) + '/' + QGIS_LIBEXEC_SUBDIR + '/';
167 #endif
168  }
169  else
170  {
171  char *prefixPath = getenv( "QGIS_PREFIX_PATH" );
172  if ( !prefixPath )
173  {
174 #if defined(Q_OS_MACX) || defined(Q_OS_WIN)
176 #elif defined(ANDROID)
177  // this is "/data/data/org.qgis.qgis" in android
178  QDir myDir( QDir::homePath() );
179  myDir.cdUp();
180  QString myPrefix = myDir.absolutePath();
181  setPrefixPath( myPrefix, true );
182 #else
183  QDir myDir( applicationDirPath() );
184  myDir.cdUp();
185  QString myPrefix = myDir.absolutePath();
186  setPrefixPath( myPrefix, true );
187 #endif
188  }
189  else
190  {
191  setPrefixPath( prefixPath, true );
192  }
193  }
194 
195  if ( !customConfigPath.isEmpty() )
196  {
197  ABISYM( mConfigPath ) = customConfigPath + '/'; // make sure trailing slash is included
198  }
199 
200  ABISYM( mDefaultSvgPaths ) << qgisSettingsDirPath() + QLatin1String( "svg/" );
201 
202  ABISYM( mAuthDbDirPath ) = qgisSettingsDirPath();
203  if ( getenv( "QGIS_AUTH_DB_DIR_PATH" ) )
204  {
205  setAuthDbDirPath( getenv( "QGIS_AUTH_DB_DIR_PATH" ) );
206  }
207 
208 
209  // store system environment variables passed to application, before they are adjusted
210  QMap<QString, QString> systemEnvVarMap;
211  QString passfile( "QGIS_AUTH_PASSWORD_FILE" ); // QString, for comparison
212  Q_FOREACH ( const QString &varStr, QProcess::systemEnvironment() )
213  {
214  int pos = varStr.indexOf( QLatin1Char( '=' ) );
215  if ( pos == -1 )
216  continue;
217  QString varStrName = varStr.left( pos );
218  QString varStrValue = varStr.mid( pos + 1 );
219  if ( varStrName != passfile )
220  {
221  systemEnvVarMap.insert( varStrName, varStrValue );
222  }
223  }
224  ABISYM( mSystemEnvVars ) = systemEnvVarMap;
225 
226  // allow Qt to search for Qt plugins (e.g. sqldrivers) in our plugin directory
228 
229  // set max. thread count to -1
230  // this should be read from QSettings but we don't know where they are at this point
231  // so we read actual value in main.cpp
232  ABISYM( mMaxThreads ) = -1;
233 }
234 
236 {
237 }
238 
240 {
241  bool done = false;
242  if ( event->type() == QEvent::FileOpen )
243  {
244  // handle FileOpen event (double clicking a file icon in Mac OS X Finder)
245  if ( ABISYM( mFileOpenEventReceiver ) )
246  {
247  // Forward event to main window.
248  done = notify( ABISYM( mFileOpenEventReceiver ), event );
249  }
250  else
251  {
252  // Store filename because receiver has not registered yet.
253  // If QGIS has been launched by double clicking a file icon, FileOpen will be
254  // the first event; the main window is not yet ready to handle the event.
255  ABISYM( mFileOpenEventList ).append( static_cast<QFileOpenEvent *>( event )->file() );
256  done = true;
257  }
258  }
259  else
260  {
261  // pass other events to base class
262  done = QApplication::event( event );
263  }
264  return done;
265 }
266 
268 {
269  bool done = false;
270  // Crashes in customization (especially on Mac), if we're not in the main/UI thread, see #5597
271  if ( thread() == receiver->thread() )
272  emit preNotify( receiver, event, &done );
273 
274  if ( done )
275  return true;
276 
277  // Send event to receiver and catch unhandled exceptions
278  done = true;
279  try
280  {
281  done = QApplication::notify( receiver, event );
282  }
283  catch ( QgsException & e )
284  {
285  QgsDebugMsg( "Caught unhandled QgsException: " + e.what() );
286  if ( qApp->thread() == QThread::currentThread() )
287  QMessageBox::critical( activeWindow(), tr( "Exception" ), e.what() );
288  }
289  catch ( std::exception & e )
290  {
291  QgsDebugMsg( "Caught unhandled std::exception: " + QString::fromAscii( e.what() ) );
292  if ( qApp->thread() == QThread::currentThread() )
293  QMessageBox::critical( activeWindow(), tr( "Exception" ), e.what() );
294  }
295  catch ( ... )
296  {
297  QgsDebugMsg( "Caught unhandled unknown exception" );
298  if ( qApp->thread() == QThread::currentThread() )
299  QMessageBox::critical( activeWindow(), tr( "Exception" ), tr( "unknown exception" ) );
300  }
301 
302  return done;
303 }
304 
306 {
307  // Set receiver for FileOpen events
308  ABISYM( mFileOpenEventReceiver ) = receiver;
309  // Propagate any events collected before the receiver has registered.
310  if ( ABISYM( mFileOpenEventList ).count() > 0 )
311  {
312  QStringListIterator i( ABISYM( mFileOpenEventList ) );
313  while ( i.hasNext() )
314  {
315  QFileOpenEvent foe( i.next() );
316  QgsApplication::sendEvent( ABISYM( mFileOpenEventReceiver ), &foe );
317  }
318  ABISYM( mFileOpenEventList ).clear();
319  }
320 }
321 
322 void QgsApplication::setPrefixPath( const QString &thePrefixPath, bool useDefaultPaths )
323 {
324  ABISYM( mPrefixPath ) = thePrefixPath;
325 #if defined(_MSC_VER)
326  if ( ABISYM( mPrefixPath ).endsWith( "/bin" ) )
327  {
328  ABISYM( mPrefixPath ).chop( 4 );
329  }
330 #endif
331  if ( useDefaultPaths && !ABISYM( mRunningFromBuildDir ) )
332  {
333  setPluginPath( ABISYM( mPrefixPath ) + '/' + QString( QGIS_PLUGIN_SUBDIR ) );
334  setPkgDataPath( ABISYM( mPrefixPath ) + '/' + QString( QGIS_DATA_SUBDIR ) );
335  }
336  ABISYM( mLibraryPath ) = ABISYM( mPrefixPath ) + '/' + QGIS_LIB_SUBDIR + '/';
337  ABISYM( mLibexecPath ) = ABISYM( mPrefixPath ) + '/' + QGIS_LIBEXEC_SUBDIR + '/';
338 }
339 
340 void QgsApplication::setPluginPath( const QString &thePluginPath )
341 {
342  ABISYM( mPluginPath ) = thePluginPath;
343 }
344 
345 void QgsApplication::setPkgDataPath( const QString &thePkgDataPath )
346 {
347  ABISYM( mPkgDataPath ) = thePkgDataPath;
348  QString mySvgPath = thePkgDataPath + ( ABISYM( mRunningFromBuildDir ) ? "/images/svg/" : "/svg/" );
349  // avoid duplicate entries
350  if ( !ABISYM( mDefaultSvgPaths ).contains( mySvgPath ) )
351  ABISYM( mDefaultSvgPaths ) << mySvgPath;
352 }
353 
355 {
356  ABISYM( mDefaultSvgPaths ) = pathList;
357 }
358 
359 void QgsApplication::setAuthDbDirPath( const QString& theAuthDbDirPath )
360 {
361  QFileInfo fi( theAuthDbDirPath );
362  if ( fi.exists() && fi.isDir() && fi.isWritable() )
363  {
364  ABISYM( mAuthDbDirPath ) = fi.canonicalFilePath() + QDir::separator();
365  }
366 }
367 
369 {
370  if ( ABISYM( mRunningFromBuildDir ) )
371  {
372  static bool once = true;
373  if ( once )
374  qWarning( "!!! prefix path was requested, but it is not valid - we do not run from installed path !!!" );
375  once = false;
376  }
377 
378  return ABISYM( mPrefixPath );
379 }
381 {
382  return ABISYM( mPluginPath );
383 }
385 {
386  return ABISYM( mPkgDataPath );
387 }
389 {
390  return ":/images/themes/default/";
391 }
393 {
394  return userThemesFolder() + QDir::separator() + themeName() + QDir::separator() + "icons/";
395 }
396 
398 {
399  return iconsPath() + ( QDate::currentDate().month() == 12 ? tr( "qgis-icon-60x60_xmas.png", "December application icon" ) : QString( "qgis-icon-60x60.png" ) );
400 }
401 
403 {
404  // try active theme
405  QString path = activeThemePath();
406  if ( QFile::exists( path + iconFile ) )
407  return path + iconFile;
408 
409  // use default theme
410  return defaultThemePath() + iconFile;
411 }
412 
414 {
415  QString myPreferredPath = activeThemePath() + QDir::separator() + theName;
416  QString myDefaultPath = defaultThemePath() + QDir::separator() + theName;
417  if ( QFile::exists( myPreferredPath ) )
418  {
419  return QIcon( myPreferredPath );
420  }
421  else if ( QFile::exists( myDefaultPath ) )
422  {
423  //could still return an empty icon if it
424  //doesnt exist in the default theme either!
425  return QIcon( myDefaultPath );
426  }
427  else
428  {
429  return QIcon();
430  }
431 }
432 
433 // TODO: add some caching mechanism ?
435 {
436  QString myPreferredPath = activeThemePath() + QDir::separator() + theName;
437  QString myDefaultPath = defaultThemePath() + QDir::separator() + theName;
438  if ( QFile::exists( myPreferredPath ) )
439  {
440  return QPixmap( myPreferredPath );
441  }
442  else
443  {
444  //could still return an empty icon if it
445  //doesnt exist in the default theme either!
446  return QPixmap( myDefaultPath );
447  }
448 }
449 
453 void QgsApplication::setThemeName( const QString &theThemeName )
454 {
455  ABISYM( mThemeName ) = theThemeName;
456 }
461 {
462  return ABISYM( mThemeName );
463 }
464 
466 {
467  // Loop all style sheets, find matching name, load it.
469  QString themename = themeName;
470  if ( !themes.contains( themename ) )
471  themename = "default";
472 
473  QString path = themes[themename];
474  QString stylesheetname = path + "/style.qss";
475  QString autostylesheet = stylesheetname + ".auto";
476 
477  QFile file( stylesheetname );
478  QFile variablesfile( path + "/variables.qss" );
479  QFile fileout( autostylesheet );
480 
481  QFileInfo variableInfo( variablesfile );
482 
483  if ( variableInfo.exists() && variablesfile.open( QIODevice::ReadOnly ) )
484  {
485  if ( !file.open( QIODevice::ReadOnly ) || !fileout.open( QIODevice::WriteOnly | QIODevice::Text ) )
486  {
487  return;
488  }
489 
490  QHash<QString, QString> variables;
491  QString styledata = file.readAll();
492  QTextStream in( &variablesfile );
493  while ( !in.atEnd() )
494  {
495  QString line = in.readLine();
496  // This is is a variable
497  if ( line.startsWith( '@' ) )
498  {
499  int index = line.indexOf( ':' );
500  QString name = line.mid( 0, index );
501  QString value = line.mid( index + 1, line.length() );
502  styledata.replace( name, value );
503  }
504  }
505  variablesfile.close();
506  QTextStream out( &fileout );
507  out << styledata;
508  fileout.close();
509  file.close();
510  stylesheetname = autostylesheet;
511  }
512 
513  QString styleSheet = QLatin1String( "file:///" );
514  styleSheet.append( stylesheetname );
515  qApp->setStyleSheet( styleSheet );
516  setThemeName( themename );
517 }
518 
520 {
522  QHash<QString, QString> mapping;
523  mapping.insert( "default", "" );
524  Q_FOREACH ( const QString& path, paths )
525  {
526  QDir folder( path );
527  QFileInfoList styleFiles = folder.entryInfoList( QDir::Dirs | QDir::NoDotAndDotDot );
528  Q_FOREACH ( const QFileInfo& info, styleFiles )
529  {
530  QFileInfo styleFile( info.absoluteFilePath() + "/style.qss" );
531  if ( !styleFile.exists() )
532  continue;
533 
534  QString name = info.baseName();
535  QString path = info.absoluteFilePath();
536  mapping.insert( name, path );
537  }
538  }
539  return mapping;
540 }
541 
546 {
547  return ABISYM( mPkgDataPath ) + QLatin1String( "/doc/AUTHORS" );
548 }
553 {
554  return ABISYM( mPkgDataPath ) + QLatin1String( "/doc/CONTRIBUTORS" );
555 }
557 {
558  return ABISYM( mPkgDataPath ) + QLatin1String( "/doc/developersmap.html" );
559 }
560 
565 {
566  return ABISYM( mPkgDataPath ) + QLatin1String( "/doc/SPONSORS" );
567 }
568 
573 {
574  return ABISYM( mPkgDataPath ) + QLatin1String( "/doc/DONORS" );
575 }
576 
579 {
580  return ABISYM( mPkgDataPath ) + QLatin1String( "/doc/TRANSLATORS" );
581 }
582 
585 {
586  return ABISYM( mPkgDataPath ) + QLatin1String( "/doc/LICENSE" );
587 }
588 
593 {
595 #ifdef Q_OS_MACX
596  helpAppPath = applicationDirPath() + "/bin/qgis_help.app/Contents/MacOS";
597 #else
598  helpAppPath = libexecPath();
599 #endif
600  helpAppPath += "/qgis_help";
601 #ifdef Q_OS_WIN
602  helpAppPath += ".exe";
603 #endif
604  return helpAppPath;
605 }
610 {
611  if ( ABISYM( mRunningFromBuildDir ) )
612  return ABISYM( mBuildOutputPath ) + QLatin1String( "/i18n" );
613  else
614  return ABISYM( mPkgDataPath ) + QLatin1String( "/i18n/" );
615 }
616 
621 {
622  return ABISYM( mPkgDataPath ) + QLatin1String( "/resources/qgis.db" );
623 }
624 
629 {
630  return ABISYM( mConfigPath );
631 }
632 
637 {
638  return qgisSettingsDirPath() + QLatin1String( "qgis.db" );
639 }
640 
645 {
646  return ABISYM( mAuthDbDirPath ) + QLatin1String( "qgis-auth.db" );
647 }
648 
653 {
654  return QString( ":/images/splash/" );
655 }
656 
661 {
662  return ABISYM( mPkgDataPath ) + QLatin1String( "/images/icons/" );
663 }
668 {
669  if ( ABISYM( mRunningFromBuildDir ) )
670  {
671  QString tempCopy = QDir::tempPath() + "/srs.db";
672 
673  if ( !QFile( tempCopy ).exists() )
674  {
675  QFile f( ABISYM( mPkgDataPath ) + "/resources/srs.db" );
676  if ( !f.copy( tempCopy ) )
677  {
678  qFatal( "Could not create temporary copy" );
679  }
680  }
681 
682  return tempCopy;
683  }
684  else
685  {
686  return ABISYM( mPkgDataPath ) + QLatin1String( "/resources/srs.db" );
687  }
688 }
689 
694 {
695  //local directories to search when looking for an SVG with a given basename
696  //defined by user in options dialog
697  QSettings settings;
698  QStringList myPathList;
699  QString myPaths = settings.value( "svg/searchPathsForSVG", QDir::homePath() ).toString();
700  if ( !myPaths.isEmpty() )
701  {
702  myPathList = myPaths.split( '|' );
703  }
704 
705  myPathList << ABISYM( mDefaultSvgPaths );
706  return myPathList;
707 }
708 
713 {
714  //local directories to search when looking for an SVG with a given basename
715  //defined by user in options dialog
716  QSettings settings;
717  QStringList myPathList;
718  QString myPaths = settings.value( "composer/searchPathsForTemplates", QDir::homePath() ).toString();
719  if ( !myPaths.isEmpty() )
720  {
721  myPathList = myPaths.split( '|' );
722  }
723 
724  return myPathList;
725 }
726 
728 {
729  return qgisSettingsDirPath() + QLatin1String( "symbology-ng-style.db" );
730 }
731 
733 {
734  return QRegExp( "^[A-Za-z][A-Za-z0-9\\._-]*" );
735 }
736 
738 {
739  if ( !sUserName.isEmpty() )
740  return sUserName;
741 
742 #ifdef Q_OS_WIN
743  TCHAR name [ UNLEN + 1 ];
744  DWORD size = UNLEN + 1;
745 
746  if ( GetUserName(( TCHAR* )name, &size ) )
747  {
748  sUserName = QString( name );
749  }
750 
751 #else
752  QProcess process;
753 
754  process.start( "whoami" );
755  process.waitForFinished();
756  sUserName = process.readAllStandardOutput().trimmed();
757 #endif
758 
759  if ( !sUserName.isEmpty() )
760  return sUserName;
761 
762  //backup plan - use environment variables
763  sUserName = qgetenv( "USER" );
764  if ( !sUserName.isEmpty() )
765  return sUserName;
766 
767  //last resort
768  sUserName = qgetenv( "USERNAME" );
769  return sUserName;
770 }
771 
773 {
774  if ( !sUserFullName.isEmpty() )
775  return sUserFullName;
776 
777 #ifdef Q_OS_WIN
778  TCHAR name [ UNLEN + 1 ];
779  DWORD size = UNLEN + 1;
780 
781  //note - this only works for accounts connected to domain
782  if ( GetUserNameEx( NameDisplay, ( TCHAR* )name, &size ) )
783  {
784  sUserFullName = QString( name );
785  }
786 
787  //fall back to login name
788  if ( sUserFullName.isEmpty() )
789  sUserFullName = userLoginName();
790 #else
791  struct passwd *p = getpwuid( getuid() );
792 
793  if ( p )
794  {
795  QString gecosName = QString( p->pw_gecos );
796  sUserFullName = gecosName.left( gecosName.indexOf( ',', 0 ) );
797  }
798 
799 #endif
800 
801  return sUserFullName;
802 }
803 
805 {
806 #if defined(Q_OS_ANDROID)
807  return QLatin1String( "android" );
808 #elif defined(Q_OS_MAC)
809  return QLatin1String( "osx" );
810 #elif defined(Q_OS_WIN)
811  return QLatin1String( "windows" );
812 #elif defined(Q_OS_LINUX)
813  return QLatin1String( "linux" );
814 #else
815  return QLatin1String( "unknown" );
816 #endif
817 }
818 
820 {
821  return sPlatformName;
822 }
823 
825 {
826  return qgisSettingsDirPath() + QLatin1String( "/themes" );
827 }
828 
830 {
831  return ABISYM( mPkgDataPath ) + QLatin1String( "/resources/symbology-ng-style.db" );
832 }
833 
835 {
836  return ABISYM( mPkgDataPath ) + QLatin1String( "/resources/themes" );
837 }
838 
840 {
841  return ABISYM( mLibraryPath );
842 }
843 
845 {
846  return ABISYM( mLibexecPath );
847 }
848 
850 {
851  return ( htonl( 1 ) == 1 ) ? XDR : NDR;
852 }
853 
855 {
856  // set the provider plugin path (this creates provider registry)
858 
859  // create map layer registry if doesn't exist
861 
862  // initialize authentication manager and connect to database
864 }
865 
867 {
869 
870  delete QgsAuthManager::instance();
871 
872  //Ensure that all remaining deleteLater QObjects are actually deleted before we exit.
873  //This isn't strictly necessary (since we're exiting anyway) but doing so prevents a lot of
874  //LeakSanitiser noise which hides real issues
875  QgsApplication::sendPostedEvents( nullptr, QEvent::DeferredDelete );
876 
877  //delete all registered functions from expression engine (see above comment)
879 
880  // tear-down GDAL/OGR
881  OGRCleanupAll();
882  GDALDestroyDriverManager();
883 }
884 
886 {
887  QString myEnvironmentVar( getenv( "QGIS_PREFIX_PATH" ) );
888  QString myState = tr( "Application state:\n"
889  "QGIS_PREFIX_PATH env var:\t\t%1\n"
890  "Prefix:\t\t%2\n"
891  "Plugin Path:\t\t%3\n"
892  "Package Data Path:\t%4\n"
893  "Active Theme Name:\t%5\n"
894  "Active Theme Path:\t%6\n"
895  "Default Theme Path:\t%7\n"
896  "SVG Search Paths:\t%8\n"
897  "User DB Path:\t%9\n"
898  "Auth DB Path:\t%10\n" )
899  .arg( myEnvironmentVar,
900  prefixPath(),
901  pluginPath(),
902  pkgDataPath(),
903  themeName(),
904  activeThemePath(),
906  svgPaths().join( tr( "\n\t\t", "match indentation of application state" ) ),
908  .arg( qgisAuthDbFilePath() );
909  return myState;
910 }
911 
913 {
914  //
915  // Make the style sheet desktop preferences aware by using qappliation
916  // palette as a basis for colors where appropriate
917  //
918 // QColor myColor1 = palette().highlight().color();
919  QColor myColor1( Qt::lightGray );
920  QColor myColor2 = myColor1;
921  myColor2 = myColor2.lighter( 110 ); //10% lighter
922  QString myStyle;
923  myStyle = "p.glossy{ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
924  " stop: 0 " + myColor1.name() + ","
925  " stop: 0.1 " + myColor2.name() + ","
926  " stop: 0.5 " + myColor1.name() + ","
927  " stop: 0.9 " + myColor2.name() + ","
928  " stop: 1 " + myColor1.name() + ");"
929  " color: black;"
930  " padding-left: 4px;"
931  " padding-top: 20px;"
932  " padding-bottom: 8px;"
933  " border: 1px solid #6c6c6c;"
934  "}"
935  "p.subheaderglossy{ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
936  " stop: 0 " + myColor1.name() + ","
937  " stop: 0.1 " + myColor2.name() + ","
938  " stop: 0.5 " + myColor1.name() + ","
939  " stop: 0.9 " + myColor2.name() + ","
940  " stop: 1 " + myColor1.name() + ");"
941  " font-weight: bold;"
942  " font-size: medium;"
943  " line-height: 1.1em;"
944  " width: 100%;"
945  " color: black;"
946  " padding-left: 4px;"
947  " padding-right: 4px;"
948  " padding-top: 20px;"
949  " padding-bottom: 8px;"
950  " border: 1px solid #6c6c6c;"
951  "}"
952  "th.glossy{ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
953  " stop: 0 " + myColor1.name() + ","
954  " stop: 0.1 " + myColor2.name() + ","
955  " stop: 0.5 " + myColor1.name() + ","
956  " stop: 0.9 " + myColor2.name() + ","
957  " stop: 1 " + myColor1.name() + ");"
958  " color: black;"
959  " border: 1px solid #6c6c6c;"
960  "}"
961  ".overview{ font: 1.82em; font-weight: bold;}"
962  "body{ background: white;"
963  " color: black;"
964  " font-family: arial,sans-serif;"
965  "}"
966  "h1{ background-color: #F6F6F6;"
967  " color: #8FB171; "
968  " font-size: x-large; "
969  " font-weight: normal;"
970  " font-family: luxi serif, georgia, times new roman, times, serif;"
971  " background: none;"
972  " padding: 0.75em 0 0;"
973  " margin: 0;"
974  " line-height: 3em;"
975  "}"
976  "h2{ background-color: #F6F6F6;"
977  " color: #8FB171; "
978  " font-size: medium; "
979  " font-weight: normal;"
980  " font-family: luxi serif, georgia, times new roman, times, serif;"
981  " background: none;"
982  " padding: 0.75em 0 0;"
983  " margin: 0;"
984  " line-height: 1.1em;"
985  "}"
986  "h3{ background-color: #F6F6F6;"
987  " color: #729FCF;"
988  " font-family: luxi serif, georgia, times new roman, times, serif;"
989  " font-weight: bold;"
990  " font-size: large;"
991  " text-align: right;"
992  " border-bottom: 5px solid #DCEB5C;"
993  "}"
994  "h4{ background-color: #F6F6F6;"
995  " color: #729FCF;"
996  " font-family: luxi serif, georgia, times new roman, times, serif;"
997  " font-weight: bold;"
998  " font-size: medium;"
999  " text-align: right;"
1000  "}"
1001  "h5{ background-color: #F6F6F6;"
1002  " color: #729FCF;"
1003  " font-family: luxi serif, georgia, times new roman, times, serif;"
1004  " font-weight: bold;"
1005  " font-size: small;"
1006  " text-align: right;"
1007  "}"
1008  "a{ color: #729FCF;"
1009  " font-family: arial,sans-serif;"
1010  " font-size: small;"
1011  "}"
1012  "label{ background-color: #FFFFCC;"
1013  " border: 1px solid black;"
1014  " margin: 1px;"
1015  " padding: 0px 3px; "
1016  " font-size: small;"
1017  "}";
1018  return myStyle;
1019 }
1020 
1022 {
1023  if ( 0 >= OGRGetDriverCount() )
1024  {
1025  OGRRegisterAll();
1026  }
1027 }
1028 
1030 {
1031  QString aPathUrl = aPath;
1032  QString tPathUrl = targetPath;
1033 #if defined( Q_OS_WIN )
1034  const Qt::CaseSensitivity cs = Qt::CaseInsensitive;
1035 
1036  aPathUrl.replace( '\\', '/' );
1037  if ( aPathUrl.startsWith( "//" ) )
1038  {
1039  // keep UNC prefix
1040  aPathUrl = "\\\\" + aPathUrl.mid( 2 );
1041  }
1042 
1043  tPathUrl.replace( '\\', '/' );
1044  if ( tPathUrl.startsWith( "//" ) )
1045  {
1046  // keep UNC prefix
1047  tPathUrl = "\\\\" + tPathUrl.mid( 2 );
1048  }
1049 #else
1050  const Qt::CaseSensitivity cs = Qt::CaseSensitive;
1051 #endif
1052 
1053  QStringList targetElems = tPathUrl.split( '/', QString::SkipEmptyParts );
1054  QStringList aPathElems = aPathUrl.split( '/', QString::SkipEmptyParts );
1055 
1056  targetElems.removeAll( "." );
1057  aPathElems.removeAll( "." );
1058 
1059  // remove common part
1060  int n = 0;
1061  while ( !aPathElems.isEmpty() &&
1062  !targetElems.isEmpty() &&
1063  aPathElems[0].compare( targetElems[0], cs ) == 0 )
1064  {
1065  aPathElems.removeFirst();
1066  targetElems.removeFirst();
1067  n++;
1068  }
1069 
1070  if ( n == 0 )
1071  {
1072  // no common parts; might not even be a file
1073  return aPathUrl;
1074  }
1075 
1076  if ( !targetElems.isEmpty() )
1077  {
1078  // go up to the common directory
1079  for ( int i = 0; i < targetElems.size(); i++ )
1080  {
1081  aPathElems.insert( 0, ".." );
1082  }
1083  }
1084  else
1085  {
1086  // let it start with . nevertheless,
1087  // so relative path always start with either ./ or ../
1088  aPathElems.insert( 0, "." );
1089  }
1090 
1091  return aPathElems.join( "/" );
1092 }
1093 
1095 {
1096  // relative path should always start with ./ or ../
1097  if ( !rpath.startsWith( "./" ) && !rpath.startsWith( "../" ) )
1098  {
1099  return rpath;
1100  }
1101 
1102  QString rPathUrl = rpath;
1103  QString targetPathUrl = targetPath;
1104 
1105 #if defined(Q_OS_WIN)
1106  rPathUrl.replace( '\\', '/' );
1107  targetPathUrl.replace( '\\', '/' );
1108 
1109  bool uncPath = targetPathUrl.startsWith( "//" );
1110 #endif
1111 
1112  QStringList srcElems = rPathUrl.split( '/', QString::SkipEmptyParts );
1113  QStringList targetElems = targetPathUrl.split( '/', QString::SkipEmptyParts );
1114 
1115 #if defined(Q_OS_WIN)
1116  if ( uncPath )
1117  {
1118  targetElems.insert( 0, "" );
1119  targetElems.insert( 0, "" );
1120  }
1121 #endif
1122 
1123  // append source path elements
1124  targetElems << srcElems;
1125  targetElems.removeAll( "." );
1126 
1127  // resolve ..
1128  int pos;
1129  while (( pos = targetElems.indexOf( ".." ) ) > 0 )
1130  {
1131  // remove preceding element and ..
1132  targetElems.removeAt( pos - 1 );
1133  targetElems.removeAt( pos - 1 );
1134  }
1135 
1136 #if !defined(Q_OS_WIN)
1137  // make path absolute
1138  targetElems.prepend( "" );
1139 #endif
1140 
1141  return targetElems.join( "/" );
1142 }
1143 
1144 void QgsApplication::skipGdalDriver( const QString& theDriver )
1145 {
1146  if ( ABISYM( mGdalSkipList ).contains( theDriver ) || theDriver.isEmpty() )
1147  {
1148  return;
1149  }
1150  ABISYM( mGdalSkipList ) << theDriver;
1152 }
1153 
1155 {
1156  if ( !ABISYM( mGdalSkipList ).contains( theDriver ) )
1157  {
1158  return;
1159  }
1160  int myPos = ABISYM( mGdalSkipList ).indexOf( theDriver );
1161  if ( myPos >= 0 )
1162  {
1163  ABISYM( mGdalSkipList ).removeAt( myPos );
1164  }
1166 }
1167 
1169 {
1170  ABISYM( mGdalSkipList ).removeDuplicates();
1171  QString myDriverList = ABISYM( mGdalSkipList ).join( " " );
1172  QgsDebugMsg( "Gdal Skipped driver list set to:" );
1173  QgsDebugMsg( myDriverList );
1174  CPLSetConfigOption( "GDAL_SKIP", myDriverList.toUtf8() );
1175  GDALAllRegister(); //to update driver list and skip missing ones
1176 }
1177 
1179 {
1180  QString folder = userThemesFolder();
1181  QDir myDir( folder );
1182  if ( !myDir.exists() )
1183  {
1184  myDir.mkpath( folder );
1185  }
1186 
1187  copyPath( defaultThemesFolder(), userThemesFolder() );
1188  return true;
1189 }
1190 
1191 void QgsApplication::copyPath( const QString& src, const QString& dst )
1192 {
1193  QDir dir( src );
1194  if ( ! dir.exists() )
1195  return;
1196 
1197  Q_FOREACH ( const QString& d, dir.entryList( QDir::Dirs | QDir::NoDotAndDotDot ) )
1198  {
1199  QString dst_path = dst + QDir::separator() + d;
1200  dir.mkpath( dst_path );
1201  copyPath( src + QDir::separator() + d, dst_path );
1202  }
1203 
1204  Q_FOREACH ( const QString& f, dir.entryList( QDir::Files ) )
1205  {
1206  QFile::copy( src + QDir::separator() + f, dst + QDir::separator() + f );
1207  }
1208 }
1209 
1210 bool QgsApplication::createDB( QString *errorMessage )
1211 {
1212  // set a working directory up for gdal to write .aux.xml files into
1213  // for cases where the raster dir is read only to the user
1214  // if the env var is already set it will be used preferentially
1215  QString myPamPath = qgisSettingsDirPath() + QLatin1String( "gdal_pam/" );
1216  QDir myDir( myPamPath );
1217  if ( !myDir.exists() )
1218  {
1219  myDir.mkpath( myPamPath ); //fail silently
1220  }
1221 
1222 #if defined(Q_OS_WIN)
1223  CPLSetConfigOption( "GDAL_PAM_PROXY_DIR", myPamPath.toUtf8() );
1224 #else
1225  //under other OS's we use an environment var so the user can
1226  //override the path if he likes
1227  int myChangeFlag = 0; //whether we want to force the env var to change
1228  setenv( "GDAL_PAM_PROXY_DIR", myPamPath.toUtf8(), myChangeFlag );
1229 #endif
1230 
1231  // Check qgis.db and make private copy if necessary
1232  QFile qgisPrivateDbFile( QgsApplication::qgisUserDbFilePath() );
1233 
1234  // first we look for ~/.qgis/qgis.db
1235  if ( !qgisPrivateDbFile.exists() )
1236  {
1237  // if it doesnt exist we copy it in from the global resources dir
1238  QString qgisMasterDbFileName = QgsApplication::qgisMasterDbFilePath();
1239  QFile masterFile( qgisMasterDbFileName );
1240 
1241  // Must be sure there is destination directory ~/.qgis
1243 
1244  //now copy the master file into the users .qgis dir
1245  bool isDbFileCopied = masterFile.copy( qgisPrivateDbFile.fileName() );
1246 
1247  if ( !isDbFileCopied )
1248  {
1249  if ( errorMessage )
1250  {
1251  *errorMessage = tr( "[ERROR] Can not make qgis.db private copy" );
1252  }
1253  return false;
1254  }
1255  }
1256  else
1257  {
1258  // migrate if necessary
1259  sqlite3 *db;
1260  if ( sqlite3_open( QgsApplication::qgisUserDbFilePath().toUtf8().constData(), &db ) != SQLITE_OK )
1261  {
1262  if ( errorMessage )
1263  {
1264  *errorMessage = tr( "Could not open qgis.db" );
1265  }
1266  return false;
1267  }
1268 
1269  char *errmsg;
1270  int res = sqlite3_exec( db, "SELECT epsg FROM tbl_srs LIMIT 0", nullptr, nullptr, &errmsg );
1271  if ( res == SQLITE_OK )
1272  {
1273  // epsg column exists => need migration
1274  if ( sqlite3_exec( db,
1275  "ALTER TABLE tbl_srs RENAME TO tbl_srs_bak;"
1276  "CREATE TABLE tbl_srs ("
1277  "srs_id INTEGER PRIMARY KEY,"
1278  "description text NOT NULL,"
1279  "projection_acronym text NOT NULL,"
1280  "ellipsoid_acronym NOT NULL,"
1281  "parameters text NOT NULL,"
1282  "srid integer,"
1283  "auth_name varchar,"
1284  "auth_id varchar,"
1285  "is_geo integer NOT NULL,"
1286  "deprecated boolean);"
1287  "CREATE INDEX idx_srsauthid on tbl_srs(auth_name,auth_id);"
1288  "INSERT INTO tbl_srs(srs_id,description,projection_acronym,ellipsoid_acronym,parameters,srid,auth_name,auth_id,is_geo,deprecated) SELECT srs_id,description,projection_acronym,ellipsoid_acronym,parameters,srid,'','',is_geo,0 FROM tbl_srs_bak;"
1289  "DROP TABLE tbl_srs_bak", nullptr, nullptr, &errmsg ) != SQLITE_OK
1290  )
1291  {
1292  if ( errorMessage )
1293  {
1294  *errorMessage = tr( "Migration of private qgis.db failed.\n%1" ).arg( QString::fromUtf8( errmsg ) );
1295  }
1296  sqlite3_free( errmsg );
1297  sqlite3_close( db );
1298  return false;
1299  }
1300  }
1301  else
1302  {
1303  sqlite3_free( errmsg );
1304  }
1305 
1306  if ( sqlite3_exec( db, "DROP VIEW vw_srs", nullptr, nullptr, &errmsg ) != SQLITE_OK )
1307  {
1308  QgsDebugMsg( QString( "vw_srs didn't exists in private qgis.db: %1" ).arg( errmsg ) );
1309  }
1310 
1311  if ( sqlite3_exec( db,
1312  "CREATE VIEW vw_srs AS"
1313  " SELECT"
1314  " a.description AS description"
1315  ",a.srs_id AS srs_id"
1316  ",a.is_geo AS is_geo"
1317  ",coalesce(b.name,a.projection_acronym) AS name"
1318  ",a.parameters AS parameters"
1319  ",a.auth_name AS auth_name"
1320  ",a.auth_id AS auth_id"
1321  ",a.deprecated AS deprecated"
1322  " FROM tbl_srs a"
1323  " LEFT OUTER JOIN tbl_projection b ON a.projection_acronym=b.acronym"
1324  " ORDER BY coalesce(b.name,a.projection_acronym),a.description", nullptr, nullptr, &errmsg ) != SQLITE_OK
1325  )
1326  {
1327  if ( errorMessage )
1328  {
1329  *errorMessage = tr( "Update of view in private qgis.db failed.\n%1" ).arg( QString::fromUtf8( errmsg ) );
1330  }
1331  sqlite3_free( errmsg );
1332  sqlite3_close( db );
1333  return false;
1334  }
1335 
1336  sqlite3_close( db );
1337  }
1338  return true;
1339 }
1340 
1342 {
1343  QgsDebugMsg( QString( "maxThreads: %1" ).arg( maxThreads ) );
1344 
1345  // make sure value is between 1 and #cores, if not set to -1 (use #cores)
1346  // 0 could be used to disable any parallel processing
1347  if ( maxThreads < 1 || maxThreads > QThread::idealThreadCount() )
1348  maxThreads = -1;
1349 
1350  // save value
1351  ABISYM( mMaxThreads ) = maxThreads;
1352 
1353  // if -1 use #cores
1354  if ( maxThreads == -1 )
1355  maxThreads = QThread::idealThreadCount();
1356 
1357  // set max thread count in QThreadPool
1359  QgsDebugMsg( QString( "set QThreadPool max thread count to %1" ).arg( QThreadPool::globalInstance()->maxThreadCount() ) );
1360 }
1361 
static bool createDB(QString *errorMessage=nullptr)
initialise qgis.db
static void init(QString customConfigPath=QString())
This method initialises paths etc for QGIS.
QString fromAscii(const char *str, int size)
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
static unsigned index
static QgsProviderRegistry * instance(const QString &pluginPath=QString::null)
Means of accessing canonical single instance.
QString & append(QChar ch)
Type type() const
iterator insert(const Key &key, const T &value)
static void skipGdalDriver(const QString &theDriver)
Sets the GDAL_SKIP environment variable to include the specified driver and then calls GDALDriverMana...
static QgsAuthManager * instance()
Enforce singleton pattern.
QStringList systemEnvironment()
static QString authorsFilePath()
Returns the path to the authors file.
static QString qgisSettingsDirPath()
Returns the path to the settings directory in user&#39;s home dir.
static QString qgisUserDbFilePath()
Returns the path to the user qgis.db file.
static QString libraryPath()
Returns the path containing qgis_core, qgis_gui, qgispython (and other) libraries.
static QString defaultThemePath()
Returns the path to the default theme directory.
QString readLine(qint64 maxlen)
QByteArray trimmed() const
virtual bool event(QEvent *event) override
Watch for QFileOpenEvent.
QString name() const
static QString qgisAuthDbFilePath()
Returns the path to the user authentication database file: qgis-auth.db.
static QString donorsFilePath()
Returns the path to the donors file.
static QString relativePathToAbsolutePath(const QString &rpath, const QString &targetPath)
Converts path relative to target to an absolute path.
static void setPrefixPath(const QString &thePrefixPath, bool useDefaultPaths=false)
Alters prefix path - used by 3rd party apps.
QgsApplication(int &argc, char **argv, bool GUIenabled, const QString &customConfigPath=QString(), const QString &platformName="desktop")
#define QgsDebugMsg(str)
Definition: qgslogger.h:33
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
int removeDuplicates()
static QIcon getThemeIcon(const QString &theName)
Helper to get a theme icon.
static QString themeName()
Set the active theme to the specified theme.
static QString defaultThemesFolder()
Returns the path to default themes folder from install (works as a starting point).
void removeFirst()
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
QThreadPool * globalInstance()
void removeAt(int i)
void setFileName(const QString &name)
static void registerOgrDrivers()
Register OGR drivers ensuring this only happens once.
QString join(const QString &separator) const
bool exists() const
QThread * thread() const
static void setFileOpenEventReceiver(QObject *receiver)
Set the FileOpen event receiver.
static QString reportStyleSheet()
get a standard css style sheet for reports.
static int maxThreads()
Get maximum concurrent thread count.
int month() const
static endian_t endian()
Returns whether this machine uses big or little endian.
QString homePath()
QChar separator()
QString tr(const char *sourceText, const char *disambiguation, int n)
static QPixmap getThemePixmap(const QString &theName)
Helper to get a theme icon as a pixmap.
bool copy(const QString &newName)
static QString userFullName()
Returns the user&#39;s operating system login account full display name.
static QString developersMapFilePath()
Returns the path to the developers map file.
void addLibraryPath(const QString &path)
int size() const
static QString absolutePathToRelativePath(const QString &apath, const QString &targetPath)
Converts absolute path to path relative to target.
static void applyGdalSkippedDrivers()
Apply the skipped drivers list to gdal.
const char * name() const
QString canonicalFilePath() const
QWidget * activeWindow()
endian_t
Constants for endian-ness.
bool exists() const
QString fromUtf8(const char *str, int size)
bool atEnd() const
void setMaxThreadCount(int maxThreadCount)
QString tempPath()
static QString pluginPath()
Returns the path to the application plugin directory.
bool isDir() const
static void setThemeName(const QString &theThemeName)
Set the active theme to the specified theme.
bool init(const QString &pluginPath=QString::null)
Initialize QCA, prioritize qca-ossl plugin and optionally set up the authentication database...
static QString helpAppPath()
Returns the path to the help application.
static bool createThemeFolder()
Create the users theme folder.
static void cleanRegisteredFunctions()
Deletes all registered functions whose ownership have been transferred to the expression engine...
bool isEmpty() const
QFileInfoList entryInfoList(QFlags< QDir::Filter > filters, QFlags< QDir::SortFlag > sort) const
QString absoluteFilePath() const
virtual ~QgsApplication()
bool isEmpty() const
int removeAll(const T &value)
static QString i18nPath()
Returns the path to the translation directory.
bool sendEvent(QObject *receiver, QEvent *event)
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
QByteArray readAll()
static void setPkgDataPath(const QString &thePkgDataPath)
Alters pkg data path - used by 3rd party apps.
static QString splashPath()
Returns the path to the splash screen image directory.
QStringList ABISYM(QgsApplication::mFileOpenEventList)
static const char * QGIS_ORGANIZATION_NAME
static QString qgisMasterDbFilePath()
Returns the path to the master qgis.db file.
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
static void setPluginPath(const QString &thePluginPath)
Alters plugin path - used by 3rd party apps.
bool cdUp()
static void restoreGdalDriver(const QString &theDriver)
Sets the GDAL_SKIP environment variable to exclude the specified driver and then calls GDALDriverMana...
static QString userLoginName()
Returns the user&#39;s operating system login account name.
bool exists() const
static QString pkgDataPath()
Returns the common root path of all application data directories.
struct sqlite3 sqlite3
static QString osName()
Returns a string name of the operating system QGIS is running on.
static void initQgis()
loads providers
static void setDefaultSvgPaths(const QStringList &pathList)
Alters default svg paths - used by 3rd party apps.
QColor lighter(int factor) const
virtual void close()
static void setAuthDbDirPath(const QString &theAuthDbDirPath)
Alters authentication data base directory path - used by 3rd party apps.
static QString defaultStyleV2Path()
Returns the path to default style (works as a starting point).
static QRegExp shortNameRegExp()
Returns the short name regular expression for line edit validator.
static QString userStyleV2Path()
Returns the path to user&#39;s style.
QString & replace(int position, int n, QChar after)
static QString showSettings()
Convenience function to get a summary of the paths used in this application instance useful for debug...
QString what() const
Definition: qgsexception.h:36
QVariant value(const QString &key, const QVariant &defaultValue) const
static QString appIconPath()
get application icon
static const char * QGIS_ORGANIZATION_DOMAIN
int idealThreadCount()
static QgsMapLayerRegistry * instance()
Returns the instance pointer, creating the object on the first call.
QString mid(int position, int n) const
virtual bool notify(QObject *receiver, QEvent *event) override
Catch exceptions when sending event to receiver.
static QString contributorsFilePath()
Returns the path to the contributors file.
static QString activeThemePath()
Returns the path to the currently active theme directory.
virtual bool event(QEvent *e)
QString absolutePath() const
void insert(int i, const T &value)
void sendPostedEvents()
QThread * currentThread()
QStringList entryList(QFlags< QDir::Filter > filters, QFlags< QDir::SortFlag > sort) const
QDate currentDate()
StandardButton critical(QWidget *parent, const QString &title, const QString &text, QFlags< QMessageBox::StandardButton > buttons, StandardButton defaultButton)
QString styleSheet() const
bool isWritable() const
int length() const
static QString platform()
Returns the QGIS platform name, eg "desktop" or "server".
QString left(int n) const
static void exitQgis()
deletes provider registry and map layer registry
static QStringList svgPaths()
Returns the pathes to svg directories.
static QString sponsorsFilePath()
Returns the path to the sponsors file.
int indexOf(const QRegExp &rx, int from) const
void prepend(const T &value)
iterator insert(const Key &key, const T &value)
bool contains(const Key &key) const
static QStringList composerTemplatePaths()
Returns the pathes to composer template directories.
static QString srsDbFilePath()
Returns the path to the srs.db file.
static QHash< QString, QString > uiThemes()
All themes found in ~/.qgis2/themes folder.
static QString libexecPath()
Returns the path with utility executables (help viewer, crssync, ...)
static QString prefixPath()
Returns the path to the application prefix directory.
static QString iconsPath()
Returns the path to the icons image directory.
static QString translatorsFilePath()
Returns the path to the sponsors file.
static const char * QGIS_APPLICATION_NAME
QString applicationDirPath()
virtual bool notify(QObject *receiver, QEvent *e)
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QString toString() const
static const int QGIS_VERSION_INT
Definition: qgis.h:44
Defines a qgis exception class.
Definition: qgsexception.h:25
QByteArray readAllStandardOutput()
QString baseName() const
void start(const QString &program, const QStringList &arguments, QFlags< QIODevice::OpenModeFlag > mode)
static void setMaxThreads(int maxThreads)
Set maximum concurrent thread count.
bool mkpath(const QString &dirPath) const
static void setUITheme(const QString &themeName)
Set the current UI theme used to style the interface.
static QString licenceFilePath()
Returns the path to the licence file.
qint64 readLine(char *data, qint64 maxSize)
static QString userThemesFolder()
Returns the path to user&#39;s themes folder.
void preNotify(QObject *receiver, QEvent *event, bool *done)
bool waitForFinished(int msecs)
QByteArray toUtf8() const