QGIS API Documentation  2.14.18-Essen
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) && !defined(USING_NINJA)
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) && !defined(USING_NINJA)
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() + "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", QString() ).toString();
700  if ( !myPaths.isEmpty() )
701  {
702  myPathList = myPaths.split( '|' );
703  }
704 
705  // maintain user set order while stripping duplicates
706  QStringList paths;
707  Q_FOREACH ( const QString& path, myPathList )
708  {
709  if ( !paths.contains( path ) )
710  paths.append( path );
711  }
712  Q_FOREACH ( const QString& path, ABISYM( mDefaultSvgPaths ) )
713  {
714  if ( !paths.contains( path ) )
715  paths.append( path );
716  }
717 
718  return paths;
719 }
720 
725 {
726  //local directories to search when looking for an SVG with a given basename
727  //defined by user in options dialog
728  QSettings settings;
729  QStringList myPathList;
730  QString myPaths = settings.value( "composer/searchPathsForTemplates", QString() ).toString();
731  if ( !myPaths.isEmpty() )
732  {
733  myPathList = myPaths.split( '|' );
734  }
735 
736  return myPathList;
737 }
738 
740 {
741  return qgisSettingsDirPath() + QLatin1String( "symbology-ng-style.db" );
742 }
743 
745 {
746  return QRegExp( "^[A-Za-z][A-Za-z0-9\\._-]*" );
747 }
748 
750 {
751  if ( !sUserName.isEmpty() )
752  return sUserName;
753 
754 #ifdef Q_OS_WIN
755  TCHAR name [ UNLEN + 1 ];
756  DWORD size = UNLEN + 1;
757 
758  if ( GetUserName(( TCHAR* )name, &size ) )
759  {
760  sUserName = QString( name );
761  }
762 
763 #else
764  QProcess process;
765 
766  process.start( "whoami" );
767  process.waitForFinished();
768  sUserName = process.readAllStandardOutput().trimmed();
769 #endif
770 
771  if ( !sUserName.isEmpty() )
772  return sUserName;
773 
774  //backup plan - use environment variables
775  sUserName = qgetenv( "USER" );
776  if ( !sUserName.isEmpty() )
777  return sUserName;
778 
779  //last resort
780  sUserName = qgetenv( "USERNAME" );
781  return sUserName;
782 }
783 
785 {
786  if ( !sUserFullName.isEmpty() )
787  return sUserFullName;
788 
789 #ifdef Q_OS_WIN
790  TCHAR name [ UNLEN + 1 ];
791  DWORD size = UNLEN + 1;
792 
793  //note - this only works for accounts connected to domain
794  if ( GetUserNameEx( NameDisplay, ( TCHAR* )name, &size ) )
795  {
796  sUserFullName = QString( name );
797  }
798 
799  //fall back to login name
800  if ( sUserFullName.isEmpty() )
801  sUserFullName = userLoginName();
802 #elif defined(Q_OS_ANDROID)
803  sUserFullName = "Not available";
804 #else
805  struct passwd *p = getpwuid( getuid() );
806 
807  if ( p )
808  {
809  QString gecosName = QString( p->pw_gecos );
810  sUserFullName = gecosName.left( gecosName.indexOf( ',', 0 ) );
811  }
812 
813 #endif
814 
815  return sUserFullName;
816 }
817 
819 {
820 #if defined(Q_OS_ANDROID)
821  return QLatin1String( "android" );
822 #elif defined(Q_OS_MAC)
823  return QLatin1String( "osx" );
824 #elif defined(Q_OS_WIN)
825  return QLatin1String( "windows" );
826 #elif defined(Q_OS_LINUX)
827  return QLatin1String( "linux" );
828 #else
829  return QLatin1String( "unknown" );
830 #endif
831 }
832 
834 {
835  return sPlatformName;
836 }
837 
839 {
840  return qgisSettingsDirPath() + QLatin1String( "/themes" );
841 }
842 
844 {
845  return ABISYM( mPkgDataPath ) + QLatin1String( "/resources/symbology-ng-style.db" );
846 }
847 
849 {
850  return ABISYM( mPkgDataPath ) + QLatin1String( "/resources/themes" );
851 }
852 
854 {
855  return ABISYM( mLibraryPath );
856 }
857 
859 {
860  return ABISYM( mLibexecPath );
861 }
862 
864 {
865  return ( htonl( 1 ) == 1 ) ? XDR : NDR;
866 }
867 
869 {
870  // set the provider plugin path (this creates provider registry)
872 
873  // create map layer registry if doesn't exist
875 
876  // initialize authentication manager and connect to database
878 }
879 
881 {
882  delete QgsAuthManager::instance();
883 
884  //Ensure that all remaining deleteLater QObjects are actually deleted before we exit.
885  //This isn't strictly necessary (since we're exiting anyway) but doing so prevents a lot of
886  //LeakSanitiser noise which hides real issues
887  QgsApplication::sendPostedEvents( nullptr, QEvent::DeferredDelete );
888 
890 
891  //delete all registered functions from expression engine (see above comment)
893 
894  // tear-down GDAL/OGR
895  OGRCleanupAll();
896  GDALDestroyDriverManager();
897 }
898 
900 {
901  QString myEnvironmentVar( getenv( "QGIS_PREFIX_PATH" ) );
902  QString myState = tr( "Application state:\n"
903  "QGIS_PREFIX_PATH env var:\t\t%1\n"
904  "Prefix:\t\t%2\n"
905  "Plugin Path:\t\t%3\n"
906  "Package Data Path:\t%4\n"
907  "Active Theme Name:\t%5\n"
908  "Active Theme Path:\t%6\n"
909  "Default Theme Path:\t%7\n"
910  "SVG Search Paths:\t%8\n"
911  "User DB Path:\t%9\n"
912  "Auth DB Path:\t%10\n" )
913  .arg( myEnvironmentVar,
914  prefixPath(),
915  pluginPath(),
916  pkgDataPath(),
917  themeName(),
918  activeThemePath(),
920  svgPaths().join( tr( "\n\t\t", "match indentation of application state" ) ),
922  .arg( qgisAuthDbFilePath() );
923  return myState;
924 }
925 
927 {
928  //
929  // Make the style sheet desktop preferences aware by using qappliation
930  // palette as a basis for colors where appropriate
931  //
932 // QColor myColor1 = palette().highlight().color();
933  QColor myColor1( Qt::lightGray );
934  QColor myColor2 = myColor1;
935  myColor2 = myColor2.lighter( 110 ); //10% lighter
936  QString myStyle;
937  myStyle = "p.glossy{ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
938  " stop: 0 " + myColor1.name() + ","
939  " stop: 0.1 " + myColor2.name() + ","
940  " stop: 0.5 " + myColor1.name() + ","
941  " stop: 0.9 " + myColor2.name() + ","
942  " stop: 1 " + myColor1.name() + ");"
943  " color: black;"
944  " padding-left: 4px;"
945  " padding-top: 20px;"
946  " padding-bottom: 8px;"
947  " border: 1px solid #6c6c6c;"
948  "}"
949  "p.subheaderglossy{ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
950  " stop: 0 " + myColor1.name() + ","
951  " stop: 0.1 " + myColor2.name() + ","
952  " stop: 0.5 " + myColor1.name() + ","
953  " stop: 0.9 " + myColor2.name() + ","
954  " stop: 1 " + myColor1.name() + ");"
955  " font-weight: bold;"
956  " font-size: medium;"
957  " line-height: 1.1em;"
958  " width: 100%;"
959  " color: black;"
960  " padding-left: 4px;"
961  " padding-right: 4px;"
962  " padding-top: 20px;"
963  " padding-bottom: 8px;"
964  " border: 1px solid #6c6c6c;"
965  "}"
966  "th.glossy{ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, "
967  " stop: 0 " + myColor1.name() + ","
968  " stop: 0.1 " + myColor2.name() + ","
969  " stop: 0.5 " + myColor1.name() + ","
970  " stop: 0.9 " + myColor2.name() + ","
971  " stop: 1 " + myColor1.name() + ");"
972  " color: black;"
973  " border: 1px solid #6c6c6c;"
974  "}"
975  ".overview{ font: 1.82em; font-weight: bold;}"
976  "body{ background: white;"
977  " color: black;"
978  " font-family: arial,sans-serif;"
979  "}"
980  "h1{ background-color: #F6F6F6;"
981  " color: #8FB171; "
982  " font-size: x-large; "
983  " font-weight: normal;"
984  " font-family: luxi serif, georgia, times new roman, times, serif;"
985  " background: none;"
986  " padding: 0.75em 0 0;"
987  " margin: 0;"
988  " line-height: 3em;"
989  "}"
990  "h2{ background-color: #F6F6F6;"
991  " color: #8FB171; "
992  " font-size: medium; "
993  " font-weight: normal;"
994  " font-family: luxi serif, georgia, times new roman, times, serif;"
995  " background: none;"
996  " padding: 0.75em 0 0;"
997  " margin: 0;"
998  " line-height: 1.1em;"
999  "}"
1000  "h3{ background-color: #F6F6F6;"
1001  " color: #729FCF;"
1002  " font-family: luxi serif, georgia, times new roman, times, serif;"
1003  " font-weight: bold;"
1004  " font-size: large;"
1005  " text-align: right;"
1006  " border-bottom: 5px solid #DCEB5C;"
1007  "}"
1008  "h4{ background-color: #F6F6F6;"
1009  " color: #729FCF;"
1010  " font-family: luxi serif, georgia, times new roman, times, serif;"
1011  " font-weight: bold;"
1012  " font-size: medium;"
1013  " text-align: right;"
1014  "}"
1015  "h5{ background-color: #F6F6F6;"
1016  " color: #729FCF;"
1017  " font-family: luxi serif, georgia, times new roman, times, serif;"
1018  " font-weight: bold;"
1019  " font-size: small;"
1020  " text-align: right;"
1021  "}"
1022  "a{ color: #729FCF;"
1023  " font-family: arial,sans-serif;"
1024  " font-size: small;"
1025  "}"
1026  "label{ background-color: #FFFFCC;"
1027  " border: 1px solid black;"
1028  " margin: 1px;"
1029  " padding: 0px 3px; "
1030  " font-size: small;"
1031  "}";
1032  return myStyle;
1033 }
1034 
1036 {
1037  if ( 0 >= OGRGetDriverCount() )
1038  {
1039  OGRRegisterAll();
1040  }
1041 }
1042 
1044 {
1045  QString aPathUrl = aPath;
1046  QString tPathUrl = targetPath;
1047 #if defined( Q_OS_WIN )
1048  const Qt::CaseSensitivity cs = Qt::CaseInsensitive;
1049 
1050  aPathUrl.replace( '\\', '/' );
1051  if ( aPathUrl.startsWith( "//" ) )
1052  {
1053  // keep UNC prefix
1054  aPathUrl = "\\\\" + aPathUrl.mid( 2 );
1055  }
1056 
1057  tPathUrl.replace( '\\', '/' );
1058  if ( tPathUrl.startsWith( "//" ) )
1059  {
1060  // keep UNC prefix
1061  tPathUrl = "\\\\" + tPathUrl.mid( 2 );
1062  }
1063 #else
1064  const Qt::CaseSensitivity cs = Qt::CaseSensitive;
1065 #endif
1066 
1067  QStringList targetElems = tPathUrl.split( '/', QString::SkipEmptyParts );
1068  QStringList aPathElems = aPathUrl.split( '/', QString::SkipEmptyParts );
1069 
1070  targetElems.removeAll( "." );
1071  aPathElems.removeAll( "." );
1072 
1073  // remove common part
1074  int n = 0;
1075  while ( !aPathElems.isEmpty() &&
1076  !targetElems.isEmpty() &&
1077  aPathElems[0].compare( targetElems[0], cs ) == 0 )
1078  {
1079  aPathElems.removeFirst();
1080  targetElems.removeFirst();
1081  n++;
1082  }
1083 
1084  if ( n == 0 )
1085  {
1086  // no common parts; might not even be a file
1087  return aPathUrl;
1088  }
1089 
1090  if ( !targetElems.isEmpty() )
1091  {
1092  // go up to the common directory
1093  for ( int i = 0; i < targetElems.size(); i++ )
1094  {
1095  aPathElems.insert( 0, ".." );
1096  }
1097  }
1098  else
1099  {
1100  // let it start with . nevertheless,
1101  // so relative path always start with either ./ or ../
1102  aPathElems.insert( 0, "." );
1103  }
1104 
1105  return aPathElems.join( "/" );
1106 }
1107 
1109 {
1110  // relative path should always start with ./ or ../
1111  if ( !rpath.startsWith( "./" ) && !rpath.startsWith( "../" ) )
1112  {
1113  return rpath;
1114  }
1115 
1116  QString rPathUrl = rpath;
1117  QString targetPathUrl = targetPath;
1118 
1119 #if defined(Q_OS_WIN)
1120  rPathUrl.replace( '\\', '/' );
1121  targetPathUrl.replace( '\\', '/' );
1122 
1123  bool uncPath = targetPathUrl.startsWith( "//" );
1124 #endif
1125 
1126  QStringList srcElems = rPathUrl.split( '/', QString::SkipEmptyParts );
1127  QStringList targetElems = targetPathUrl.split( '/', QString::SkipEmptyParts );
1128 
1129 #if defined(Q_OS_WIN)
1130  if ( uncPath )
1131  {
1132  targetElems.insert( 0, "" );
1133  targetElems.insert( 0, "" );
1134  }
1135 #endif
1136 
1137  // append source path elements
1138  targetElems << srcElems;
1139  targetElems.removeAll( "." );
1140 
1141  // resolve ..
1142  int pos;
1143  while (( pos = targetElems.indexOf( ".." ) ) > 0 )
1144  {
1145  // remove preceding element and ..
1146  targetElems.removeAt( pos - 1 );
1147  targetElems.removeAt( pos - 1 );
1148  }
1149 
1150 #if !defined(Q_OS_WIN)
1151  // make path absolute
1152  targetElems.prepend( "" );
1153 #endif
1154 
1155  return targetElems.join( "/" );
1156 }
1157 
1158 void QgsApplication::skipGdalDriver( const QString& theDriver )
1159 {
1160  if ( ABISYM( mGdalSkipList ).contains( theDriver ) || theDriver.isEmpty() )
1161  {
1162  return;
1163  }
1164  ABISYM( mGdalSkipList ) << theDriver;
1166 }
1167 
1169 {
1170  if ( !ABISYM( mGdalSkipList ).contains( theDriver ) )
1171  {
1172  return;
1173  }
1174  int myPos = ABISYM( mGdalSkipList ).indexOf( theDriver );
1175  if ( myPos >= 0 )
1176  {
1177  ABISYM( mGdalSkipList ).removeAt( myPos );
1178  }
1180 }
1181 
1183 {
1184  ABISYM( mGdalSkipList ).removeDuplicates();
1185  QString myDriverList = ABISYM( mGdalSkipList ).join( " " );
1186  QgsDebugMsg( "Gdal Skipped driver list set to:" );
1187  QgsDebugMsg( myDriverList );
1188  CPLSetConfigOption( "GDAL_SKIP", myDriverList.toUtf8() );
1189  GDALAllRegister(); //to update driver list and skip missing ones
1190 }
1191 
1193 {
1194  QString folder = userThemesFolder();
1195  QDir myDir( folder );
1196  if ( !myDir.exists() )
1197  {
1198  myDir.mkpath( folder );
1199  }
1200 
1201  copyPath( defaultThemesFolder(), userThemesFolder() );
1202  return true;
1203 }
1204 
1205 void QgsApplication::copyPath( const QString& src, const QString& dst )
1206 {
1207  QDir dir( src );
1208  if ( ! dir.exists() )
1209  return;
1210 
1211  Q_FOREACH ( const QString& d, dir.entryList( QDir::Dirs | QDir::NoDotAndDotDot ) )
1212  {
1213  QString dst_path = dst + QDir::separator() + d;
1214  dir.mkpath( dst_path );
1215  copyPath( src + QDir::separator() + d, dst_path );
1216  }
1217 
1218  Q_FOREACH ( const QString& f, dir.entryList( QDir::Files ) )
1219  {
1220  QFile::copy( src + QDir::separator() + f, dst + QDir::separator() + f );
1221  }
1222 }
1223 
1224 bool QgsApplication::createDB( QString *errorMessage )
1225 {
1226  // set a working directory up for gdal to write .aux.xml files into
1227  // for cases where the raster dir is read only to the user
1228  // if the env var is already set it will be used preferentially
1229  QString myPamPath = qgisSettingsDirPath() + QLatin1String( "gdal_pam/" );
1230  QDir myDir( myPamPath );
1231  if ( !myDir.exists() )
1232  {
1233  myDir.mkpath( myPamPath ); //fail silently
1234  }
1235 
1236 #if defined(Q_OS_WIN)
1237  CPLSetConfigOption( "GDAL_PAM_PROXY_DIR", myPamPath.toUtf8() );
1238 #else
1239  //under other OS's we use an environment var so the user can
1240  //override the path if he likes
1241  int myChangeFlag = 0; //whether we want to force the env var to change
1242  setenv( "GDAL_PAM_PROXY_DIR", myPamPath.toUtf8(), myChangeFlag );
1243 #endif
1244 
1245  // Check qgis.db and make private copy if necessary
1246  QFile qgisPrivateDbFile( QgsApplication::qgisUserDbFilePath() );
1247 
1248  // first we look for ~/.qgis/qgis.db
1249  if ( !qgisPrivateDbFile.exists() )
1250  {
1251  // if it doesnt exist we copy it in from the global resources dir
1252  QString qgisMasterDbFileName = QgsApplication::qgisMasterDbFilePath();
1253  QFile masterFile( qgisMasterDbFileName );
1254 
1255  // Must be sure there is destination directory ~/.qgis
1257 
1258  //now copy the master file into the users .qgis dir
1259  bool isDbFileCopied = masterFile.copy( qgisPrivateDbFile.fileName() );
1260 
1261  if ( !isDbFileCopied )
1262  {
1263  if ( errorMessage )
1264  {
1265  *errorMessage = tr( "[ERROR] Can not make qgis.db private copy" );
1266  }
1267  return false;
1268  }
1269  }
1270  else
1271  {
1272  // migrate if necessary
1273  sqlite3 *db;
1274  if ( sqlite3_open( QgsApplication::qgisUserDbFilePath().toUtf8().constData(), &db ) != SQLITE_OK )
1275  {
1276  if ( errorMessage )
1277  {
1278  *errorMessage = tr( "Could not open qgis.db" );
1279  }
1280  return false;
1281  }
1282 
1283  char *errmsg;
1284  int res = sqlite3_exec( db, "SELECT epsg FROM tbl_srs LIMIT 0", nullptr, nullptr, &errmsg );
1285  if ( res == SQLITE_OK )
1286  {
1287  // epsg column exists => need migration
1288  if ( sqlite3_exec( db,
1289  "ALTER TABLE tbl_srs RENAME TO tbl_srs_bak;"
1290  "CREATE TABLE tbl_srs ("
1291  "srs_id INTEGER PRIMARY KEY,"
1292  "description text NOT NULL,"
1293  "projection_acronym text NOT NULL,"
1294  "ellipsoid_acronym NOT NULL,"
1295  "parameters text NOT NULL,"
1296  "srid integer,"
1297  "auth_name varchar,"
1298  "auth_id varchar,"
1299  "is_geo integer NOT NULL,"
1300  "deprecated boolean);"
1301  "CREATE INDEX idx_srsauthid on tbl_srs(auth_name,auth_id);"
1302  "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;"
1303  "DROP TABLE tbl_srs_bak", nullptr, nullptr, &errmsg ) != SQLITE_OK
1304  )
1305  {
1306  if ( errorMessage )
1307  {
1308  *errorMessage = tr( "Migration of private qgis.db failed.\n%1" ).arg( QString::fromUtf8( errmsg ) );
1309  }
1310  sqlite3_free( errmsg );
1311  sqlite3_close( db );
1312  return false;
1313  }
1314  }
1315  else
1316  {
1317  sqlite3_free( errmsg );
1318  }
1319 
1320  if ( sqlite3_exec( db, "DROP VIEW vw_srs", nullptr, nullptr, &errmsg ) != SQLITE_OK )
1321  {
1322  QgsDebugMsg( QString( "vw_srs didn't exists in private qgis.db: %1" ).arg( errmsg ) );
1323  }
1324 
1325  if ( sqlite3_exec( db,
1326  "CREATE VIEW vw_srs AS"
1327  " SELECT"
1328  " a.description AS description"
1329  ",a.srs_id AS srs_id"
1330  ",a.is_geo AS is_geo"
1331  ",coalesce(b.name,a.projection_acronym) AS name"
1332  ",a.parameters AS parameters"
1333  ",a.auth_name AS auth_name"
1334  ",a.auth_id AS auth_id"
1335  ",a.deprecated AS deprecated"
1336  " FROM tbl_srs a"
1337  " LEFT OUTER JOIN tbl_projection b ON a.projection_acronym=b.acronym"
1338  " ORDER BY coalesce(b.name,a.projection_acronym),a.description", nullptr, nullptr, &errmsg ) != SQLITE_OK
1339  )
1340  {
1341  if ( errorMessage )
1342  {
1343  *errorMessage = tr( "Update of view in private qgis.db failed.\n%1" ).arg( QString::fromUtf8( errmsg ) );
1344  }
1345  sqlite3_free( errmsg );
1346  sqlite3_close( db );
1347  return false;
1348  }
1349 
1350  sqlite3_close( db );
1351  }
1352  return true;
1353 }
1354 
1356 {
1357  QgsDebugMsg( QString( "maxThreads: %1" ).arg( maxThreads ) );
1358 
1359  // make sure value is between 1 and #cores, if not set to -1 (use #cores)
1360  // 0 could be used to disable any parallel processing
1361  if ( maxThreads < 1 || maxThreads > QThread::idealThreadCount() )
1362  maxThreads = -1;
1363 
1364  // save value
1365  ABISYM( mMaxThreads ) = maxThreads;
1366 
1367  // if -1 use #cores
1368  if ( maxThreads == -1 )
1369  maxThreads = QThread::idealThreadCount();
1370 
1371  // set max thread count in QThreadPool
1373  QgsDebugMsg( QString( "set QThreadPool max thread count to %1" ).arg( QThreadPool::globalInstance()->maxThreadCount() ) );
1374 }
1375 
1377 {
1378  emit settingsChanged();
1379 }
1380 
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)
bool contains(const QString &str, Qt::CaseSensitivity cs) const
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.
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.
QString what() const
Definition: qgsexception.h:36
void emitSettingsChanged()
Causes the application instance to emit the settingsChanged() signal.
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
void append(const T &value)
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...
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
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 settingsChanged()
Emitted whenever any global, application-wide settings are changed.
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