// Verify the correct file name is created from the untranslatedname void ProfileTest::testProfileFileNames() { Profile::Ptr profile = Profile::Ptr(new Profile); QFileInfo fileInfo; ProfileWriter* writer = new KDE4ProfileWriter; profile->setProperty(Profile::UntranslatedName, "Indiana"); fileInfo.setFile(writer->getPath(profile)); QCOMPARE(fileInfo.fileName(), QString("Indiana.profile")); profile->setProperty(Profile::UntranslatedName, "Old Paris"); fileInfo.setFile(writer->getPath(profile)); QCOMPARE(fileInfo.fileName(), QString("Old Paris.profile")); /* FIXME: deal w/ file systems that are case-insensitive This leads to confusion as both Test and test can appear in the Manager Profile dialog while really there is only 1 test.profile file. Suggestions: all lowercase, testing the file system, ... */ /* profile->setProperty(Profile::UntranslatedName, "New Profile"); fileInfo.setFile(writer->getPath(profile)); QCOMPARE(fileInfo.fileName(), QString("new profile.profile")); */ /* FIXME: don't allow certain characters in file names Consider: ,^@=+{}[]~!?:&*\"|#%<>$\"'();`'/\ Suggestions: changing them all to _, just remove them, ... Bug 315086 comes from a user using / in the profile name - multiple issues there. */ /* profile->setProperty(Profile::UntranslatedName, "new/profile"); fileInfo.setFile(writer->getPath(profile)); QCOMPARE(fileInfo.fileName(), QString("new_profile.profile")); */ delete writer; }
void Application::createTabFromArgs(KCmdLineArgs* args, MainWindow* window, const QHash<QString, QString>& tokens) { const QString& title = tokens["title"]; const QString& command = tokens["command"]; const QString& profile = tokens["profile"]; const QString& workdir = tokens["workdir"]; Profile::Ptr baseProfile; if (!profile.isEmpty()) { baseProfile = ProfileManager::instance()->loadProfile(profile); } if (!baseProfile) { // fallback to default profile baseProfile = ProfileManager::instance()->defaultProfile(); } Profile::Ptr newProfile = Profile::Ptr(new Profile(baseProfile)); newProfile->setHidden(true); // FIXME: the method of determining whethter to use newProfile does not // scale well when we support more fields in the future bool shouldUseNewProfile = false; if (!command.isEmpty()) { newProfile->setProperty(Profile::Command, command); newProfile->setProperty(Profile::Arguments, command.split(' ')); shouldUseNewProfile = true; } if (!title.isEmpty()) { newProfile->setProperty(Profile::LocalTabTitleFormat, title); newProfile->setProperty(Profile::RemoteTabTitleFormat, title); shouldUseNewProfile = true; } if (args->isSet("workdir")) { newProfile->setProperty(Profile::Directory, args->getOption("workdir")); shouldUseNewProfile = true; } if (!workdir.isEmpty()) { newProfile->setProperty(Profile::Directory, workdir); shouldUseNewProfile = true; } // Create the new session Profile::Ptr theProfile = shouldUseNewProfile ? newProfile : baseProfile; Session* session = window->createSession(theProfile, QString()); if (!args->isSet("close")) { session->setAutoClose(false); } if (!window->testAttribute(Qt::WA_Resized)) { window->resize(window->sizeHint()); } // FIXME: this ugly hack here is to make the session start running, so that // its tab title is displayed as expected. // // This is another side effect of the commit fixing BKO 176902. window->show(); window->hide(); }
Profile::Ptr ProfileManager::loadProfile(const QString& shortPath) { // the fallback profile has a 'special' path name, "FALLBACK/" if (shortPath == _fallbackProfile->path()) return _fallbackProfile; QString path = shortPath; // add a suggested suffix and relative prefix if missing QFileInfo fileInfo(path); if (fileInfo.isDir()) return Profile::Ptr(); if (fileInfo.suffix() != QLatin1String("profile")) path.append(".profile"); if (fileInfo.path().isEmpty() || fileInfo.path() == QLatin1String(".")) path.prepend(QLatin1String("konsole") + QDir::separator()); // if the file is not an absolute path, look it up if (!fileInfo.isAbsolute()) path = QStandardPaths::locate(QStandardPaths::GenericDataLocation, path); // if the file is not found, return immediately if (path.isEmpty()) { return Profile::Ptr(); } // check that we have not already loaded this profile foreach(const Profile::Ptr& profile, _profiles) { if (profile->path() == path) return profile; } // guard to prevent problems if a profile specifies itself as its parent // or if there is recursion in the "inheritance" chain // (eg. two profiles, A and B, specifying each other as their parents) static QStack<QString> recursionGuard; PopStackOnExit<QString> popGuardOnExit(recursionGuard); if (recursionGuard.contains(path)) { qWarning() << "Ignoring attempt to load profile recursively from" << path; return _fallbackProfile; } else { recursionGuard.push(path); } // load the profile ProfileReader* reader = new KDE4ProfileReader; Profile::Ptr newProfile = Profile::Ptr(new Profile(fallbackProfile())); newProfile->setProperty(Profile::Path, path); QString parentProfilePath; bool result = reader->readProfile(path, newProfile, parentProfilePath); if (!parentProfilePath.isEmpty()) { Profile::Ptr parentProfile = loadProfile(parentProfilePath); newProfile->setParent(parentProfile); } delete reader; if (!result) { qWarning() << "Could not load profile from " << path; return Profile::Ptr(); } else { addProfile(newProfile); return newProfile; } }