controlpanelui/src/cpcategorymodel/src/cpcategorymodelutility.cpp
author hgs
Fri, 14 May 2010 13:21:08 +0800
changeset 19 36aa4756ee82
child 22 a5692c68d772
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0""
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include "cpcategorymodelutility.h"
hgs
parents:
diff changeset
    18
#include <QString>
hgs
parents:
diff changeset
    19
#include <QDir>
hgs
parents:
diff changeset
    20
#include <QFileInfo>
hgs
parents:
diff changeset
    21
#include <hbinstance.h>
hgs
parents:
diff changeset
    22
#include <cpbasepath.h>
hgs
parents:
diff changeset
    23
#include <cppluginloader.h>
hgs
parents:
diff changeset
    24
#include <cpplugininterface.h>
hgs
parents:
diff changeset
    25
#include <cplogger.h>
hgs
parents:
diff changeset
    26
#include <cpevent.h>
hgs
parents:
diff changeset
    27
#include <cptaskexecutor.h>
hgs
parents:
diff changeset
    28
#include <cpsettingformentryitemdata.h>
hgs
parents:
diff changeset
    29
#include "cpcategorysettingformitemdata.h"
hgs
parents:
diff changeset
    30
#include "cppluginconfigreader.h"
hgs
parents:
diff changeset
    31
#include "cpplaceholderitemdata.h"
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
static HbMainWindow *mainWindow() 
hgs
parents:
diff changeset
    34
{
hgs
parents:
diff changeset
    35
    QList< HbMainWindow* > mainWindows = hbInstance->allMainWindows();
hgs
parents:
diff changeset
    36
    if (!mainWindows.isEmpty()) {
hgs
parents:
diff changeset
    37
        return mainWindows.front();
hgs
parents:
diff changeset
    38
    }
hgs
parents:
diff changeset
    39
    return 0;
hgs
parents:
diff changeset
    40
}
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
//#define ASYNC_LOAD_CPPLUGIN
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
class CpLoadConfigPluginsTask : public CpTask
hgs
parents:
diff changeset
    46
{
hgs
parents:
diff changeset
    47
public:
hgs
parents:
diff changeset
    48
    CpLoadConfigPluginsTask(HbDataFormModelItem *parentItem,
hgs
parents:
diff changeset
    49
                            const QString &configFile,
hgs
parents:
diff changeset
    50
                            CpItemDataHelper *itemDataHelper,
hgs
parents:
diff changeset
    51
                            int startPosition) : 
hgs
parents:
diff changeset
    52
                            mParentItem(parentItem),
hgs
parents:
diff changeset
    53
                            mConfigFile(configFile),
hgs
parents:
diff changeset
    54
                            mItemDataHelper(itemDataHelper),
hgs
parents:
diff changeset
    55
                            mStartPosition(startPosition)
hgs
parents:
diff changeset
    56
    { 
hgs
parents:
diff changeset
    57
        
hgs
parents:
diff changeset
    58
    }
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    virtual ~CpLoadConfigPluginsTask()
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
        
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
    
hgs
parents:
diff changeset
    65
    virtual void execute(volatile bool *stopped)
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
        if (!mParentItem) {
hgs
parents:
diff changeset
    68
            return;
hgs
parents:
diff changeset
    69
        }
hgs
parents:
diff changeset
    70
        
hgs
parents:
diff changeset
    71
        QString configPath(mConfigFile);
hgs
parents:
diff changeset
    72
        QFileInfo fi(mConfigFile);
hgs
parents:
diff changeset
    73
        //if it is a relative path, search the config file from device drives.
hgs
parents:
diff changeset
    74
        if (!fi.isAbsolute()) {
hgs
parents:
diff changeset
    75
          QStringList dirs = CpCategoryModelUtility::configFileDirectories();
hgs
parents:
diff changeset
    76
          foreach(const QString &dir,dirs) {
hgs
parents:
diff changeset
    77
              configPath = dir + fi.fileName();
hgs
parents:
diff changeset
    78
              if (QFileInfo(configPath).exists()) {
hgs
parents:
diff changeset
    79
                  CPFW_LOG(configPath + " has been found.");
hgs
parents:
diff changeset
    80
                  break;      
hgs
parents:
diff changeset
    81
              }
hgs
parents:
diff changeset
    82
          }
hgs
parents:
diff changeset
    83
        }       
hgs
parents:
diff changeset
    84
        
hgs
parents:
diff changeset
    85
        QList<CpPluginConfig> pluginConfigs = CpPluginConfigReader(configPath).readCpPluginConfigs();
hgs
parents:
diff changeset
    86
        
hgs
parents:
diff changeset
    87
        int position = mStartPosition;
hgs
parents:
diff changeset
    88
        foreach(const CpPluginConfig &pluginConfig, pluginConfigs)  {
hgs
parents:
diff changeset
    89
            if (stopped && *stopped) {
hgs
parents:
diff changeset
    90
                break;
hgs
parents:
diff changeset
    91
            }
hgs
parents:
diff changeset
    92
            
hgs
parents:
diff changeset
    93
            CPFW_LOG(QLatin1String("Load plugin: ") + pluginConfig.mPluginFile + " from " + configPath);
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
            CpCreatePluginItemDataEvent *event = new CpCreatePluginItemDataEvent;
hgs
parents:
diff changeset
    96
            
hgs
parents:
diff changeset
    97
            event->mParentItem     = mParentItem;
hgs
parents:
diff changeset
    98
            
hgs
parents:
diff changeset
    99
            if (mStartPosition < 0) {
hgs
parents:
diff changeset
   100
                event->mItemPosition = mStartPosition; //append
hgs
parents:
diff changeset
   101
            }
hgs
parents:
diff changeset
   102
            else {
hgs
parents:
diff changeset
   103
                event->mItemPosition   = position++;   
hgs
parents:
diff changeset
   104
            }
hgs
parents:
diff changeset
   105
                        
hgs
parents:
diff changeset
   106
            event->mItemDataHelper = mItemDataHelper;
hgs
parents:
diff changeset
   107
            
hgs
parents:
diff changeset
   108
            event->mDisplayName    = pluginConfig.mDisplayName;
hgs
parents:
diff changeset
   109
            event->mDescription    = pluginConfig.mDescription;
hgs
parents:
diff changeset
   110
            event->mPluginFile     = pluginConfig.mPluginFile;
hgs
parents:
diff changeset
   111
                        
hgs
parents:
diff changeset
   112
            //firstly, handle CpPluginInterface
hgs
parents:
diff changeset
   113
            if (CpPluginInterface *plugin = CpPluginLoader().loadCpPluginInterface(pluginConfig.mPluginFile)) {
hgs
parents:
diff changeset
   114
                CPFW_LOG("Load  root component CpPluginInterface succeed.");
hgs
parents:
diff changeset
   115
                event->mPluginInterface = plugin;
hgs
parents:
diff changeset
   116
            }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
            //post event to main window in main thread
hgs
parents:
diff changeset
   119
            QCoreApplication::postEvent(mainWindow(),event);
hgs
parents:
diff changeset
   120
            
hgs
parents:
diff changeset
   121
        } //end foreach
hgs
parents:
diff changeset
   122
        
hgs
parents:
diff changeset
   123
    }
hgs
parents:
diff changeset
   124
private:
hgs
parents:
diff changeset
   125
    HbDataFormModelItem *mParentItem;
hgs
parents:
diff changeset
   126
    QString mConfigFile;
hgs
parents:
diff changeset
   127
    CpItemDataHelper *mItemDataHelper;
hgs
parents:
diff changeset
   128
    int mStartPosition;
hgs
parents:
diff changeset
   129
};
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
void CpCategoryModelUtility::buildConfigPluginItems(HbDataFormModelItem *parent,
hgs
parents:
diff changeset
   132
									   const QString &configFile,
hgs
parents:
diff changeset
   133
									   CpItemDataHelper &itemDataHelper,
hgs
parents:
diff changeset
   134
									   int startPosition)
hgs
parents:
diff changeset
   135
{
hgs
parents:
diff changeset
   136
#ifdef ASYNC_LOAD_CPPLUGIN
hgs
parents:
diff changeset
   137
    CpTaskExecutor::globalInstance()->runTask
hgs
parents:
diff changeset
   138
        ( new CpLoadConfigPluginsTask(parent,configFile,&itemDataHelper,startPosition) );
hgs
parents:
diff changeset
   139
    
hgs
parents:
diff changeset
   140
#else    
hgs
parents:
diff changeset
   141
    if (!parent) {
hgs
parents:
diff changeset
   142
        return;
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
	QString configPath(configFile);
hgs
parents:
diff changeset
   146
	QFileInfo fi(configFile);
hgs
parents:
diff changeset
   147
    //if it is a relative path, search the config file from device drives.
hgs
parents:
diff changeset
   148
	if (!fi.isAbsolute()) {
hgs
parents:
diff changeset
   149
		QStringList dirs = CpCategoryModelUtility::configFileDirectories();
hgs
parents:
diff changeset
   150
		foreach(const QString &dir,dirs) {
hgs
parents:
diff changeset
   151
			configPath = dir + fi.fileName();
hgs
parents:
diff changeset
   152
			if (QFileInfo(configPath).exists()) {
hgs
parents:
diff changeset
   153
                CPFW_LOG(configPath + " has been found.");
hgs
parents:
diff changeset
   154
				break;		
hgs
parents:
diff changeset
   155
			}
hgs
parents:
diff changeset
   156
		}
hgs
parents:
diff changeset
   157
	}
hgs
parents:
diff changeset
   158
    	
hgs
parents:
diff changeset
   159
    QList<CpPluginConfig> pluginConfigs = CpPluginConfigReader(configPath).readCpPluginConfigs();
hgs
parents:
diff changeset
   160
		
hgs
parents:
diff changeset
   161
	foreach(const CpPluginConfig &pluginConfig, pluginConfigs)  {
hgs
parents:
diff changeset
   162
        CPFW_LOG(QLatin1String("Load plugin: ") + pluginConfig.mPluginFile + " from " + configPath);
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
		QList<CpSettingFormItemData*> itemDataList;
hgs
parents:
diff changeset
   165
		
hgs
parents:
diff changeset
   166
        //firstly, handle CpPluginInterface
hgs
parents:
diff changeset
   167
		if (CpPluginInterface *plugin = CpPluginLoader().loadCpPluginInterface(pluginConfig.mPluginFile)) {
hgs
parents:
diff changeset
   168
            CPFW_LOG("Load  root component CpPluginInterface succeed.");
hgs
parents:
diff changeset
   169
			itemDataList = plugin->createSettingFormItemData(itemDataHelper);
hgs
parents:
diff changeset
   170
		}
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
		else {
hgs
parents:
diff changeset
   173
            CPFW_LOG(QLatin1String("Load plugin:") + pluginConfig.mPluginFile + QLatin1String(" failed."));
hgs
parents:
diff changeset
   174
            #ifdef _DEBUG
hgs
parents:
diff changeset
   175
              CPFW_LOG(QLatin1String("***Add a placeholder."));
hgs
parents:
diff changeset
   176
              itemDataList.append(new CpPlaceHolderItemData(itemDataHelper,pluginConfig));
hgs
parents:
diff changeset
   177
            #endif
hgs
parents:
diff changeset
   178
		}
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
        foreach(CpSettingFormItemData *itemData,itemDataList) {
hgs
parents:
diff changeset
   181
            if (itemData) {
hgs
parents:
diff changeset
   182
                //append the new created setting form item to its parent item.
hgs
parents:
diff changeset
   183
                parent->insertChild(startPosition++,itemData);
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
                if (CpCategorySettingFormItemData *categoryItemData 
hgs
parents:
diff changeset
   186
                    = qobject_cast<CpCategorySettingFormItemData*>(itemData)) {
hgs
parents:
diff changeset
   187
                    categoryItemData->initialize(itemDataHelper);
hgs
parents:
diff changeset
   188
                }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
                //set the text and description from config if it is empty.
hgs
parents:
diff changeset
   191
                setEntryItemContentIfEmpty(itemData,pluginConfig.mDisplayName,pluginConfig.mDescription);
hgs
parents:
diff changeset
   192
            }
hgs
parents:
diff changeset
   193
        } //end foreach
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
	} //end foreach
hgs
parents:
diff changeset
   196
#endif
hgs
parents:
diff changeset
   197
	
hgs
parents:
diff changeset
   198
}
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
bool CpCategoryModelUtility::setEntryItemContentIfEmpty(CpSettingFormItemData *itemData, 
hgs
parents:
diff changeset
   201
    const QString &displayName,
hgs
parents:
diff changeset
   202
    const QString &description)
hgs
parents:
diff changeset
   203
{
hgs
parents:
diff changeset
   204
    CpSettingFormEntryItemData *entryItemData = qobject_cast< CpSettingFormEntryItemData* > (itemData);
hgs
parents:
diff changeset
   205
    if (!entryItemData) {
hgs
parents:
diff changeset
   206
        return false;
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
    
hgs
parents:
diff changeset
   209
    if (entryItemData->text().isEmpty()) {
hgs
parents:
diff changeset
   210
        entryItemData->setText(displayName);
hgs
parents:
diff changeset
   211
    }
hgs
parents:
diff changeset
   212
    if (entryItemData->description().isEmpty()) {
hgs
parents:
diff changeset
   213
        entryItemData->setDescription(description);
hgs
parents:
diff changeset
   214
    }
hgs
parents:
diff changeset
   215
    if (entryItemData->iconName().isEmpty()) {
hgs
parents:
diff changeset
   216
        entryItemData->setIconName(
hgs
parents:
diff changeset
   217
                  CP_RESOURCE_PATH
hgs
parents:
diff changeset
   218
                  + QDir::separator() 
hgs
parents:
diff changeset
   219
                  + ICON_SUB_PATH 
hgs
parents:
diff changeset
   220
                  + QDir::separator() 
hgs
parents:
diff changeset
   221
                  + QLatin1String("qgn_prop_set_default_sub.svg") );
hgs
parents:
diff changeset
   222
    }
hgs
parents:
diff changeset
   223
    
hgs
parents:
diff changeset
   224
    return true;
hgs
parents:
diff changeset
   225
}
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
QStringList CpCategoryModelUtility::drives()
hgs
parents:
diff changeset
   228
{
hgs
parents:
diff changeset
   229
	static QStringList drives;
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
	if (drives.empty()) {
hgs
parents:
diff changeset
   232
        CPFW_LOG("device drives:");
hgs
parents:
diff changeset
   233
#ifdef WIN32
hgs
parents:
diff changeset
   234
		drives.append("C:");
hgs
parents:
diff changeset
   235
        CPFW_LOG("C:");
hgs
parents:
diff changeset
   236
#else
hgs
parents:
diff changeset
   237
		QFileInfoList fileInfoList = QDir::drives();
hgs
parents:
diff changeset
   238
		foreach(const QFileInfo &fileInfo,fileInfoList) {
hgs
parents:
diff changeset
   239
			QString str = fileInfo.filePath();
hgs
parents:
diff changeset
   240
			if (str.length() > 2) {
hgs
parents:
diff changeset
   241
				str = str.left(2);
hgs
parents:
diff changeset
   242
			}
hgs
parents:
diff changeset
   243
			drives.append(str);
hgs
parents:
diff changeset
   244
            CPFW_LOG(str);
hgs
parents:
diff changeset
   245
		}
hgs
parents:
diff changeset
   246
#endif  
hgs
parents:
diff changeset
   247
	}
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
	return drives;
hgs
parents:
diff changeset
   250
}
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
static QStringList directoriesFromAllDrives(const QString &baseDir)
hgs
parents:
diff changeset
   253
{
hgs
parents:
diff changeset
   254
	QStringList dirs;
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
	QStringList drives = CpCategoryModelUtility::drives();
hgs
parents:
diff changeset
   257
	foreach(const QString &drive,drives) {
hgs
parents:
diff changeset
   258
		QString dir = drive + baseDir + QDir::separator();
hgs
parents:
diff changeset
   259
		if (QFileInfo(dir).exists()) {
hgs
parents:
diff changeset
   260
			dirs.append(dir);
hgs
parents:
diff changeset
   261
            CPFW_LOG(dir);
hgs
parents:
diff changeset
   262
		}
hgs
parents:
diff changeset
   263
	}
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
	return dirs;
hgs
parents:
diff changeset
   266
}
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
QStringList CpCategoryModelUtility::pluginDirectories()
hgs
parents:
diff changeset
   269
{
hgs
parents:
diff changeset
   270
	static QStringList dirs;
hgs
parents:
diff changeset
   271
	if (dirs.empty()) {
hgs
parents:
diff changeset
   272
        CPFW_LOG("ControlPanel plugin derectories:")
hgs
parents:
diff changeset
   273
		dirs = directoriesFromAllDrives(CP_PLUGIN_PATH);
hgs
parents:
diff changeset
   274
	}
hgs
parents:
diff changeset
   275
	return dirs;
hgs
parents:
diff changeset
   276
}
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
QStringList CpCategoryModelUtility::configFileDirectories()
hgs
parents:
diff changeset
   279
{
hgs
parents:
diff changeset
   280
	static QStringList dirs;
hgs
parents:
diff changeset
   281
	if (dirs.empty()) {
hgs
parents:
diff changeset
   282
        CPFW_LOG("ControlPanel configuration file derectories:");
hgs
parents:
diff changeset
   283
		dirs = directoriesFromAllDrives(CP_PLUGIN_CONFIG_PATH);
hgs
parents:
diff changeset
   284
	}
hgs
parents:
diff changeset
   285
	return dirs;
hgs
parents:
diff changeset
   286
}
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
CP_CATEGORY_EXPORT int createCpPluginItemData(CpCreatePluginItemDataEvent *event)
hgs
parents:
diff changeset
   289
{
hgs
parents:
diff changeset
   290
    QList<CpSettingFormItemData*> itemDataList;
hgs
parents:
diff changeset
   291
    
hgs
parents:
diff changeset
   292
    if (event->mPluginInterface) {
hgs
parents:
diff changeset
   293
        itemDataList = event->mPluginInterface->createSettingFormItemData(*(event->mItemDataHelper));
hgs
parents:
diff changeset
   294
    }
hgs
parents:
diff changeset
   295
    
hgs
parents:
diff changeset
   296
    else {
hgs
parents:
diff changeset
   297
        #ifdef _DEBUG
hgs
parents:
diff changeset
   298
          itemDataList.append(new CpPlaceHolderItemData(*(event->mItemDataHelper),event->mDisplayName,event->mPluginFile));
hgs
parents:
diff changeset
   299
        #endif
hgs
parents:
diff changeset
   300
    }
hgs
parents:
diff changeset
   301
    
hgs
parents:
diff changeset
   302
    foreach(CpSettingFormItemData *itemData,itemDataList) {
hgs
parents:
diff changeset
   303
        if (itemData) {
hgs
parents:
diff changeset
   304
            //append the new created setting form item to its parent item.
hgs
parents:
diff changeset
   305
            if (event->mItemPosition < 0) {
hgs
parents:
diff changeset
   306
                event->mParentItem->appendChild(itemData);
hgs
parents:
diff changeset
   307
            }
hgs
parents:
diff changeset
   308
            else {
hgs
parents:
diff changeset
   309
                event->mParentItem->insertChild(event->mItemPosition,itemData);
hgs
parents:
diff changeset
   310
            }
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
            if (CpCategorySettingFormItemData *categoryItemData 
hgs
parents:
diff changeset
   313
                = qobject_cast<CpCategorySettingFormItemData*>(itemData)) {
hgs
parents:
diff changeset
   314
                categoryItemData->initialize(*(event->mItemDataHelper));
hgs
parents:
diff changeset
   315
            }
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
            //set the text and description from config if it is empty.
hgs
parents:
diff changeset
   318
            CpCategoryModelUtility::setEntryItemContentIfEmpty(itemData,event->mDisplayName,event->mDescription);
hgs
parents:
diff changeset
   319
        }
hgs
parents:
diff changeset
   320
    } //end foreach
hgs
parents:
diff changeset
   321
       
hgs
parents:
diff changeset
   322
    return itemDataList.count();
hgs
parents:
diff changeset
   323
}
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
//End of File
hgs
parents:
diff changeset
   326