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