File indexing completed on 2024-04-28 04:37:04

0001 /*
0002     SPDX-FileCopyrightText: 2006 Adam Treat <treat@kde.org>
0003     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "projectconfigskeleton.h"
0009 #include "debug.h"
0010 
0011 #include <interfaces/iproject.h>
0012 #include <util/path.h>
0013 
0014 #include <KIO/CopyJob>
0015 
0016 using namespace KDevelop;
0017 
0018 class KDevelop::ProjectConfigSkeletonPrivate
0019 {
0020 public:
0021     QString m_developerTempFile;
0022     QString m_projectTempFile;
0023     Path m_projectFile;
0024     Path m_developerFile;
0025     bool mUseDefaults;
0026 };
0027 
0028 ProjectConfigSkeleton::ProjectConfigSkeleton( const QString & configname )
0029     : KConfigSkeleton(configname)
0030     , d_ptr(new ProjectConfigSkeletonPrivate)
0031 {
0032     Q_D(ProjectConfigSkeleton);
0033 
0034     d->m_developerTempFile = configname;
0035 }
0036 
0037 ProjectConfigSkeleton::ProjectConfigSkeleton( KSharedConfigPtr config )
0038     : KConfigSkeleton(config)
0039     , d_ptr(new ProjectConfigSkeletonPrivate)
0040 {
0041     Q_D(ProjectConfigSkeleton);
0042 
0043     Q_ASSERT(config);
0044     d->m_developerTempFile = config->name();
0045 }
0046 
0047 ProjectConfigSkeleton::~ProjectConfigSkeleton() = default;
0048 
0049 void ProjectConfigSkeleton::setDeveloperTempFile( const QString& cfg )
0050 {
0051     Q_D(ProjectConfigSkeleton);
0052 
0053     d->m_developerTempFile = cfg;
0054     setSharedConfig( KSharedConfig::openConfig( cfg ) );
0055 }
0056 
0057 void ProjectConfigSkeleton::setProjectTempFile( const QString& cfg )
0058 {
0059     Q_D(ProjectConfigSkeleton);
0060 
0061     d->m_projectTempFile = cfg;
0062     config()->addConfigSources( QStringList() << cfg );
0063     load();
0064 }
0065 
0066 void ProjectConfigSkeleton::setProjectFile( const Path& cfg )
0067 {
0068     Q_D(ProjectConfigSkeleton);
0069 
0070     d->m_projectFile = cfg;
0071 }
0072 
0073 void ProjectConfigSkeleton::setDeveloperFile( const Path& cfg )
0074 {
0075     Q_D(ProjectConfigSkeleton);
0076 
0077     d->m_developerFile = cfg;
0078 }
0079 
0080 Path ProjectConfigSkeleton::projectFile() const
0081 {
0082     Q_D(const ProjectConfigSkeleton);
0083 
0084     return d->m_projectFile;
0085 }
0086 
0087 Path ProjectConfigSkeleton::developerFile() const
0088 {
0089     Q_D(const ProjectConfigSkeleton);
0090 
0091     return d->m_developerFile;
0092 }
0093 
0094 void ProjectConfigSkeleton::setDefaults()
0095 {
0096     Q_D(ProjectConfigSkeleton);
0097 
0098     qCDebug(PROJECT) << "Setting Defaults";
0099     KConfig cfg( d->m_projectTempFile );
0100     const auto items = this->items();
0101     for (KConfigSkeletonItem* item : items) {
0102         item->swapDefault();
0103         if( cfg.hasGroup( item->group() ) )
0104         {
0105             KConfigGroup grp = cfg.group( item->group() );
0106             if( grp.hasKey( item->key() ) )
0107                 item->setProperty( grp.readEntry( item->key(), item->property() ) );
0108         }
0109     }
0110 }
0111 
0112 bool ProjectConfigSkeleton::useDefaults( bool b )
0113 {
0114     Q_D(ProjectConfigSkeleton);
0115 
0116     if( b == d->mUseDefaults )
0117         return d->mUseDefaults;
0118 
0119     if( b )
0120     {
0121         KConfig cfg( d->m_projectTempFile );
0122         const auto items = this->items();
0123         for (KConfigSkeletonItem* item : items) {
0124             item->swapDefault();
0125             if( cfg.hasGroup( item->group() ) )
0126             {
0127                 qCDebug(PROJECT) << "reading";
0128                 KConfigGroup grp = cfg.group( item->group() );
0129                 if( grp.hasKey( item->key() ) )
0130                     item->setProperty( grp.readEntry( item->key(), item->property() ) );
0131             }
0132         }
0133     } else
0134     {
0135         KConfig cfg( d->m_developerTempFile );
0136         KConfig defCfg( d->m_projectTempFile );
0137         const auto items = this->items();
0138         for (KConfigSkeletonItem* item : items) {
0139             if( cfg.hasGroup( item->group() ) )
0140             {
0141                 KConfigGroup grp = cfg.group( item->group() );
0142                 if( grp.hasKey( item->key() ) )
0143                     item->setProperty( grp.readEntry( item->key(), item->property() ) );
0144                 else
0145                 {
0146                     KConfigGroup grp = defCfg.group( item->group() );
0147                     item->setProperty( grp.readEntry( item->key(), item->property() ) );
0148                 }
0149             } else
0150             {
0151                 KConfigGroup grp = defCfg.group( item->group() );
0152                 item->setProperty( grp.readEntry( item->key(), item->property() ) );
0153             }
0154         }
0155     }
0156     d->mUseDefaults = b;
0157     return !d->mUseDefaults;
0158 }
0159 
0160 bool ProjectConfigSkeleton::writeConfig()
0161 {
0162     Q_D(ProjectConfigSkeleton);
0163 
0164     const KConfigSkeletonItem::List myitems = items();
0165     for (auto* item : myitems) {
0166         item->writeConfig(config());
0167     }
0168 
0169     config()->sync();
0170 
0171     load();
0172 
0173     auto copyJob = KIO::copy(QUrl::fromLocalFile(d->m_developerTempFile), d->m_developerFile.toUrl(), KIO::HideProgressInfo);
0174     copyJob ->exec();
0175 
0176     emit configChanged();
0177     return true;
0178 }
0179 
0180 #include "moc_projectconfigskeleton.cpp"