summaryrefslogtreecommitdiffstats
path: root/scribus/scpaths.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scribus/scpaths.cpp')
-rw-r--r--scribus/scpaths.cpp400
1 files changed, 400 insertions, 0 deletions
diff --git a/scribus/scpaths.cpp b/scribus/scpaths.cpp
new file mode 100644
index 0000000..22b9753
--- /dev/null
+++ b/scribus/scpaths.cpp
@@ -0,0 +1,400 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#include "scpaths.h"
+#include <QApplication>
+#include <QDebug>
+#include <QDir>
+
+#include "scconfig.h"
+
+// On Qt/Mac we need CoreFoundation to discover the location
+// of the app bundle.
+#ifdef Q_WS_MAC
+#include <CoreFoundation/CoreFoundation.h>
+#endif
+
+#ifdef _WIN32
+#include <windows.h>
+#include <shlobj.h>
+#endif
+
+#ifdef _WIN32
+const char ScPaths::envPathSeparator = ';';
+#else
+const char ScPaths::envPathSeparator = ':';
+#endif
+
+// Init the singleton's "self" address to NULL
+ScPaths* ScPaths::m_instance = NULL;
+
+// Singleton's public constructor
+const ScPaths& ScPaths::instance()
+{
+ if (!ScPaths::m_instance)
+ ScPaths::m_instance = new ScPaths();
+ return *ScPaths::m_instance;
+}
+
+// Singleton's public destructor
+void ScPaths::destroy()
+{
+ if (ScPaths::m_instance)
+ delete ScPaths::m_instance;
+}
+
+// Protected "real" constructor
+// All paths are initialized to compile-time defaults passed in
+// as preprocessor macros and set by autoconf.
+ScPaths::ScPaths() :
+ m_docDir(DOCDIR),
+ m_iconDir(ICONDIR),
+ m_libDir(LIBDIR),
+ m_pluginDir(PLUGINDIR),
+ m_sampleScriptDir(SAMPLESDIR),
+ m_scriptDir(SCRIPTSDIR),
+ m_templateDir(TEMPLATEDIR),
+ m_shareDir(SHAREDIR)
+{
+// On MacOS/X, override the compile-time settings with a location
+// obtained from the system.
+#ifdef Q_WS_MAC
+ QString pathPtr(bundleDir());
+ /*
+ // Set up the various app paths to look inside the app bundle
+ CFURLRef pluginRef = CFBundleCopyBundleURL(CFBundleGetMainBundle());
+ CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef,
+ kCFURLPOSIXPathStyle);
+ const char *pathPtr = CFStringGetCStringPtr(macPath,
+ CFStringGetSystemEncoding());
+
+ // make sure we get the Scribus.app directory, not some subdir
+
+ // strip trailing '/':
+ char *p = const_cast<char*>(pathPtr + strlen(pathPtr) - 1);
+ while (*p == '/')
+ --p;
+ ++p;
+ *p = '\0';
+ if (strcmp("/bin", p-4) == 0) {
+ p -= 4;
+ *p = '\0';
+ }
+ if (strcmp("/MacOS", p-6) == 0) {
+ p -= 6;
+ *p = '\0';
+ }
+ if (strcmp("/Contents", p-9) == 0) {
+ p -= 9;
+ *p = '\0';
+ }
+*/
+ qDebug() << QString("scpaths: bundle at %1:").arg(pathPtr);
+ m_shareDir = QString("%1/Contents/share/scribus/").arg(pathPtr);
+ m_docDir = QString("%1/Contents/share/doc/scribus/").arg(pathPtr);
+ m_iconDir = QString("%1/Contents/share/scribus/icons/").arg(pathPtr);
+ m_sampleScriptDir = QString("%1/Contents/share/scribus/samples/").arg(pathPtr);
+ m_scriptDir = QString("%1/Contents/share/scribus/scripts/").arg(pathPtr);
+ m_templateDir = QString("%1/Contents/share/scribus/templates/").arg(pathPtr);
+ m_libDir = QString("%1/Contents/lib/scribus/").arg(pathPtr);
+ m_pluginDir = QString("%1/Contents/lib/scribus/plugins/").arg(pathPtr);
+ QApplication::setLibraryPaths(QStringList(QString("%1/Contents/lib/qtplugins/").arg(pathPtr)));
+// CFRelease(pluginRef);
+// CFRelease(macPath);
+
+ // on OSX this goes to the sys console, so user only sees it when they care -- AV
+ qDebug() << QString("scpaths: doc dir=%1").arg(m_docDir);
+ qDebug() << QString("scpaths: icon dir=%1").arg(m_iconDir);
+ qDebug() << QString("scpaths: font dir=%1").arg(m_fontDir);
+ qDebug() << QString("scpaths: sample dir=%1").arg(m_sampleScriptDir);
+ qDebug() << QString("scpaths: script dir=%1").arg(m_scriptDir);
+ qDebug() << QString("scpaths: template dir=%1").arg(m_templateDir);
+ qDebug() << QString("scpaths: lib dir=%1").arg(m_libDir);
+ qDebug() << QString("scpaths: plugin dir=%1").arg(m_pluginDir);
+ qDebug() << QString("scpaths: qtplugins=%1").arg(QApplication::libraryPaths().join(":"));
+
+#elif defined(_WIN32)
+ QString appPath = qApp->applicationDirPath();
+ m_shareDir = QString("%1/share/").arg(appPath);
+ m_docDir = QString("%1/share/doc/").arg(appPath);
+ m_fontDir = QString("%1/share/fonts/").arg(appPath);
+ m_iconDir = QString("%1/share/icons/").arg(appPath);
+ m_sampleScriptDir = QString("%1/share/samples/").arg(appPath);
+ m_scriptDir = QString("%1/share/scripts/").arg(appPath);
+ m_templateDir = QString("%1/share/templates/").arg(appPath);
+ m_libDir = QString("%1/libs/").arg(appPath);
+ m_pluginDir = QString("%1/plugins/").arg(appPath);
+ QApplication::setLibraryPaths( QStringList(QString("%1/qtplugins/").arg(appPath)) );
+#endif
+
+// if(!m_shareDir.endsWith("/")) m_shareDir += "/";
+// if(!m_docDir.endsWith("/")) m_docDir += "/";
+// if(!m_fontDir.endsWith("/")) m_fontDir += "/";
+ if(!m_iconDir.endsWith("/")) m_iconDir += "/";
+// if(!m_sampleScriptDir.endsWith("/")) m_sampleScriptDir += "/";
+// if(!m_scriptDir.endsWith("/")) m_scriptDir += "/";
+// if(!m_templateDir.endsWith("/")) m_templateDir += "/";
+// if(!m_libDir.endsWith("/")) m_libDir += "/";
+// if(!m_pluginDir.endsWith("/")) m_pluginDir += "/";
+}
+
+ScPaths::~ScPaths() {};
+
+QString ScPaths::bundleDir(void) const
+{
+ // On MacOS/X, override the compile-time settings with a location
+ // obtained from the system.
+#ifdef Q_WS_MAC
+ // Set up the various app paths to look inside the app bundle
+ CFURLRef pluginRef = CFBundleCopyBundleURL(CFBundleGetMainBundle());
+ CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, kCFURLPOSIXPathStyle);
+ const char *pathPtr = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding());
+ if (pathPtr!=NULL && strlen(pathPtr)>0)
+ {
+ // make sure we get the Scribus.app directory, not some subdir
+ // strip trailing '/':
+ qDebug("Path = %s", pathPtr);
+ char *p = const_cast<char*>(pathPtr + strlen(pathPtr) - 1);
+ while (*p == '/')
+ --p;
+ ++p;
+ *p = '\0';
+ if (strcmp("/bin", p-4) == 0) {
+ p -= 4;
+ *p = '\0';
+ }
+ if (strcmp("/MacOS", p-6) == 0) {
+ p -= 6;
+ *p = '\0';
+ }
+ if (strcmp("/Contents", p-9) == 0) {
+ p -= 9;
+ *p = '\0';
+ }
+ CFRelease(pluginRef);
+ CFRelease(macPath);
+ return QString("%1").arg(pathPtr);
+ }
+ else
+ {
+ char buf[2048];
+ CFStringGetCString (macPath, buf, 2048, kCFStringEncodingUTF8);
+ QString q_pathPtr=QString::fromUtf8(buf);
+ if (q_pathPtr.endsWith("/bin"))
+ q_pathPtr.chop(4);
+ if (q_pathPtr.endsWith("/MacOS"))
+ q_pathPtr.chop(6);
+ if (q_pathPtr.endsWith("/Contents"))
+ q_pathPtr.chop(9);
+ CFRelease(pluginRef);
+ CFRelease(macPath);
+ return q_pathPtr;
+ }
+#endif
+ return QString::null;
+}
+
+const QString& ScPaths::docDir() const
+{
+ return m_docDir;
+}
+
+const QString& ScPaths::iconDir() const
+{
+ return m_iconDir;
+}
+
+const QString& ScPaths::fontDir() const
+{
+ return m_fontDir;
+}
+
+const QString& ScPaths::libDir() const
+{
+ return m_libDir;
+}
+
+const QString& ScPaths::pluginDir() const
+{
+ return m_pluginDir;
+}
+
+const QString& ScPaths::sampleScriptDir() const
+{
+ return m_sampleScriptDir;
+}
+
+const QString& ScPaths::scriptDir() const
+{
+ return m_scriptDir;
+}
+
+const QString& ScPaths::templateDir() const
+{
+ return m_templateDir;
+}
+
+const QString& ScPaths::shareDir() const
+{
+ return m_shareDir;
+}
+
+QString ScPaths::translationDir() const
+{
+ return (m_shareDir + "translations/");
+}
+
+QString ScPaths::dictDir() const
+{
+ return(m_shareDir + "dicts/");
+}
+
+QStringList ScPaths::getSystemFontDirs(void)
+{
+ QStringList fontDirs;
+#ifdef Q_OS_MAC
+ fontDirs.append(QDir::homePath() + "/Library/Fonts/");
+ fontDirs.append("/Library/Fonts/");
+ fontDirs.append("/Network/Library/Fonts/");
+ fontDirs.append("/System/Library/Fonts/");
+#elif defined(_WIN32)
+ fontDirs.append( getSpecialDir(CSIDL_FONTS) );
+#endif
+ return fontDirs;
+}
+
+QStringList ScPaths::getSystemProfilesDirs(void)
+{
+ QStringList iccProfDirs;
+#ifdef Q_OS_MAC
+ iccProfDirs.append(QDir::homePath()+"/Library/ColorSync/Profiles/");
+ iccProfDirs.append("/System/Library/ColorSync/Profiles/");
+ iccProfDirs.append("/Library/ColorSync/Profiles/");
+#elif defined(Q_WS_X11)
+ iccProfDirs.append(QDir::homePath()+"/color/icc/");
+ iccProfDirs.append(QDir::homePath()+"/.color/icc/");
+ iccProfDirs.append("/usr/share/color/icc/");
+ iccProfDirs.append("/usr/local/share/color/icc/");
+#elif defined(_WIN32)
+ // On Windows it's more complicated, profiles location depends on OS version
+ WCHAR sysDir[MAX_PATH + 1];
+ OSVERSIONINFO osVersion;
+ ZeroMemory( &osVersion, sizeof(OSVERSIONINFO));
+ osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // Necessary for GetVersionEx to succeed
+ GetVersionEx(&osVersion); // Get Windows version infos
+ GetSystemDirectoryW( sysDir, MAX_PATH ); // getSpecialDir(CSIDL_SYSTEM) fails on Win9x
+ QString winSysDir = QString::fromUtf16((const ushort*) sysDir);
+ winSysDir = winSysDir.replace('\\','/');
+ if( osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT ) // Windows NT/2k/XP
+ {
+ if( osVersion.dwMajorVersion >= 5 ) // for 2k and XP dwMajorVersion == 5
+ iccProfDirs.append( winSysDir + "/Spool/Drivers/Color/");
+ }
+ else if( osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) // Windows 9x/Me
+ {
+ if( osVersion.dwMajorVersion >= 4 && osVersion.dwMinorVersion >= 10) // Win98 or WinMe
+ iccProfDirs.append( winSysDir + "/Color/");
+ }
+#endif
+ return iccProfDirs;
+}
+
+QStringList ScPaths::getSystemCreateSwatchesDirs(void)
+{
+ QStringList createDirs;
+#ifdef Q_OS_MAC
+ createDirs.append(QDir::homePath()+"/create/swatches/");
+ createDirs.append(QDir::homePath()+"/.create/swatches/");
+#elif defined(Q_WS_X11)
+ createDirs.append(QDir::homePath()+"/create/swatches/");
+ createDirs.append(QDir::homePath()+"/.create/swatches/");
+ createDirs.append("/usr/share/create/swatches/");
+ createDirs.append("/usr/local/share/create/swatches/");
+#elif defined(_WIN32)
+ QString localAppData = getSpecialDir(CSIDL_LOCAL_APPDATA);
+ QString commonAppData = getSpecialDir(CSIDL_COMMON_APPDATA);
+ QString programFilesCommon = getSpecialDir(CSIDL_PROGRAM_FILES_COMMON);
+ createDirs.append(getSpecialDir(CSIDL_APPDATA) + "create/swatches/");
+ if ( !localAppData.isEmpty() )
+ createDirs.append(localAppData + "create/swatches/");
+ if ( !commonAppData.isEmpty() )
+ createDirs.append(commonAppData + "create/swatches/");
+ if ( !programFilesCommon.isEmpty() )
+ createDirs.append(programFilesCommon + "create/swatches/");
+#endif
+ return createDirs;
+}
+
+QString ScPaths::getApplicationDataDir(void)
+{
+#if defined(_WIN32)
+ QString appData = getSpecialDir(CSIDL_APPDATA);
+ if (QDir(appData).exists())
+ #ifdef APPLICATION_DATA_DIR
+ return (appData + "/" + APPLICATION_DATA_DIR + "/");
+ #else
+ return (appData + "/Scribus/");
+ #endif
+#endif
+
+#ifdef APPLICATION_DATA_DIR
+ return QDir::homePath() + "/" + APPLICATION_DATA_DIR + "/";
+#else
+ #ifdef Q_OS_MAC
+ return (QDir::homePath() + "/Library/Preferences/Scribus/");
+ #else
+ return (QDir::homePath() + "/.scribus/");
+ #endif
+#endif
+}
+
+QString ScPaths::getUserDocumentDir(void)
+{
+#if defined(_WIN32)
+ QString userDocs = getSpecialDir(CSIDL_PERSONAL);
+ if (QDir(userDocs).exists())
+ return userDocs;
+#endif
+ return (QDir::homePath() + "/");
+}
+
+QString ScPaths::getTempFileDir(void)
+{
+#if defined(_WIN32)
+ QString tempPath;
+ WCHAR wTempPath[1024];
+ DWORD result = GetTempPathW(1024, wTempPath);
+ if ( result )
+ {
+ tempPath = QString::fromUtf16((const unsigned short*) wTempPath);
+ tempPath.replace( '\\', '/' );
+ tempPath += "/";
+ // GetTempPath may return Windows directory, better not use this one
+ // for temporary files
+ if (QDir(tempPath).exists() && tempPath != getSpecialDir(CSIDL_WINDOWS))
+ return tempPath;
+ }
+#endif
+ return getApplicationDataDir();
+}
+
+QString ScPaths::getSpecialDir(int folder)
+{
+ QString qstr;
+#if defined(_WIN32)
+ WCHAR dir[256];
+ if ( SHGetSpecialFolderPathW(NULL, dir, folder , false) )
+ {
+ qstr = QString::fromUtf16((const unsigned short*) dir);
+ if( !qstr.endsWith("\\") )
+ qstr += "\\";
+ qstr.replace( '\\', '/' );
+ }
+#else
+ Q_ASSERT(false);
+#endif
+ return qstr;
+}