--- a/src/hbservers/hbthemeserver/hbthemeserver_generic.cpp Mon May 03 12:48:33 2010 +0300
+++ b/src/hbservers/hbthemeserver/hbthemeserver_generic.cpp Fri May 14 16:09:54 2010 +0300
@@ -24,6 +24,7 @@
****************************************************************************/
#include "hbthemeserver_generic_p_p.h"
+#include "hbthemeserverapplication_p.h"
#include <QLabel>
#include <QLocalServer>
@@ -38,6 +39,7 @@
#include <QPainter>
#include <QStringList>
#include <QPixmap>
+#include <QTimer>
#include <hbinstance.h>
@@ -53,6 +55,9 @@
#include "hblayeredstyleloader_p.h"
#include "hbthemesystemeffect_p.h"
#include "hbsharedmemorymanager_p.h"
+#include "hbtypefaceinfodatabase_p.h"
+
+static const int CLOSE_TIMEOUT = 3000;
/*!
@hbserver
@@ -83,7 +88,10 @@
sessionList.clear();
#ifdef QT_DEBUG
setWindowTitle("Theme Server");
+ setCentralWidget(&statusLabel);
#endif
+ // renderMode set to SW mode by default
+ renderMode = ESWRendering;
// Using QScopedPointer so that it deallocates memory
// when std::badalloc exception occurs.
QScopedPointer <HbIconDataCache> tempIconCache(new HbIconDataCache());
@@ -92,6 +100,8 @@
cssCache = tempCssCache.take();
setMaxGpuCacheSize(GPU_CACHE_SIZE);
setMaxCpuCacheSize(CPU_CACHE_SIZE);
+
+ connect(server, SIGNAL(newConnection()), this, SLOT(newClientConnected()));
}
/*!
@@ -112,25 +122,43 @@
*/
bool HbThemeServerPrivate::start()
{
- bool success = false;
- if (!server->listen(THEME_SERVER_NAME)) {
- qWarning("Unable to start the server: %s.", server->errorString().toLatin1().data());
-#if defined(Q_OS_LINUX) || defined(Q_OS_MAC)
- if (server->serverError() == QAbstractSocket::AddressInUseError) {
- qDebug() << "Trying to delete temporary file hbthemeserver";
- QFile::remove("/tmp/hbthemeserver");
- success = start();
- }
+ // try max 2 times
+ bool success = listen() || listen();
+ if (!success) {
+ qWarning() << "HbThemeServer: unable to start the server.";
+ } else {
+#ifdef QT_DEBUG
+ statusLabel.setText("Theme Server Started");
#endif
- return success;
+ }
+ return success;
+}
+
+bool HbThemeServerPrivate::listen()
+{
+ bool success = server->listen(THEME_SERVER_NAME);
+ if (!success) {
+ qWarning() << "HbThemeServer:" << server->errorString();
+ if (server->serverError() == QAbstractSocket::AddressInUseError) {
+ stop();
+ }
}
+ return success;
+}
+
+/*!
+ \fn HbThemeServerPrivate::stop()
+ stop the themeserver
+*/
+void HbThemeServerPrivate::stop()
+{
+ if (server) {
+ server->close();
+ }
+ QLocalServer::removeServer(THEME_SERVER_NAME);
#ifdef QT_DEBUG
- statusLabel.setText("Theme Server Started");
- setCentralWidget(&statusLabel);
+ statusLabel.setText("Theme Server Stopped");
#endif
- connect(server, SIGNAL(newConnection()), this, SLOT(newClientConnected()));
- success = true;
- return success;
}
/*!
@@ -162,7 +190,7 @@
*/
HbIconCacheItem *HbThemeServerPrivate::iconCacheItem(const HbIconKey &key)
{
- return(iconCache->getCacheItem(key, false));
+ return(iconCache->getCacheItem(key, renderMode, false));
}
/*!
@@ -247,11 +275,7 @@
#endif
// Modify the QSettings to store the applied theme
QSettings settings(QLatin1String(ORGANIZATION), QLatin1String(THEME_COMPONENT));
- QString prevTheme = settings.value(CURRENT_THEME_KEY).toString();
- if (prevTheme == newTheme) {
- // Theme did not change, return.
- return;
- }
+
// Clear cached icons and session data
clearIconCache();
HbThemeServerSession *session;
@@ -402,7 +426,44 @@
break;
}
}
- qDebug() << "Total No of Connection after deletion = " << sessionList.count();
+
+ QTimer::singleShot(CLOSE_TIMEOUT, this, SLOT(clienDisconnected()));
+}
+
+void HbThemeServerPrivate::clienDisconnected()
+{
+#ifdef THEME_SERVER_TRACES
+ qDebug()<<"Total No of Connection after deletion = "<<sessionList.count();
+#endif
+
+ // Quit the server if no more clients connected
+ if (!HbThemeServerApplication::Options::persistent && sessionList.isEmpty()) {
+#ifdef THEME_SERVER_TRACES
+ qDebug() << "HbThemeServerQt: last application quit, so do we!";
+#endif
+ stop();
+ QCoreApplication::quit();
+ }
+}
+
+/**
+ * HbThemeServerPrivate::currentRenderingMode
+ * This function returns ThemeServer's current rendering mode
+ *
+ */
+HbRenderingMode HbThemeServerPrivate::currentRenderingMode() const
+{
+ return renderMode;
+}
+
+/**
+ * HbThemeServerPrivate::setCurrentRenderingMode
+ * This function sets ThemeServer's current rendering mode
+ *
+ */
+void HbThemeServerPrivate::setCurrentRenderingMode(HbRenderingMode currentMode)
+{
+ renderMode = currentMode;
}
//Debug Code for Test Purpose
@@ -626,15 +687,6 @@
((QLocalSocket *)sender())->write(outputByteArray);
break;
}
- case ESecondaryCacheOffset: {
- int offset = HbThemeServerUtils::sharedCacheOffset();
- QByteArray outputByteArray;
- QDataStream outputDataStream(&outputByteArray, QIODevice::WriteOnly);
- outputDataStream << requestType;
- outputDataStream << offset;
- ((QLocalSocket *)sender())->write(outputByteArray);
- break;
- }
case EEffectLookupFilePath:
case EEffectAdd: {
QString fileName;
@@ -698,7 +750,7 @@
#ifdef THEME_SERVER_TRACES
qDebug() << "image req at server: " << filename;
#endif
- HbIconKey key(filename, size, (Qt::AspectRatioMode)aspectRatioMode, (QIcon::Mode)mode, mirrored, color);
+ HbIconKey key(filename, size, (Qt::AspectRatioMode)aspectRatioMode, (QIcon::Mode)mode, mirrored, color, iServer->currentRenderingMode());
QByteArray output = handleIconLookup(key, data, options);
((QLocalSocket *)sender())->write(output);
break;
@@ -749,7 +801,7 @@
HbIconKey finalIconKey(iconId, frameItemParams.size,
(Qt::AspectRatioMode)frameItemParams.aspectRatioMode,
(QIcon::Mode)frameItemParams.mode, frameItemParams.mirrored,
- frameItemParams.color);
+ frameItemParams.color, (HbRenderingMode)frameItemParams.renderMode);
stitchedData.type = INVALID_FORMAT;
@@ -804,7 +856,7 @@
for (int i = 0; i < fileList.count(); i++) {
HbIconKey key(fileList[i], sizeList[i],
static_cast<Qt::AspectRatioMode>(aspectRatioMode),
- static_cast<QIcon::Mode>(mode), mirrored, color);
+ static_cast<QIcon::Mode>(mode), mirrored, color, iServer->currentRenderingMode());
output.append(handleIconLookup(key, data, options));
}
@@ -915,6 +967,13 @@
case EServerHeap: {
}
#endif
+#ifdef HB_THEME_SERVER_MEMORY_REPORT
+ case ECreateMemoryReport: {
+ GET_MEMORY_MANAGER(HbMemoryManager::SharedMemory);
+ static_cast<HbSharedMemoryManager *>(manager)->createReport();
+ break;
+ }
+#endif
case EUnloadIcon: {
QString filename;
QSizeF size;
@@ -932,7 +991,7 @@
inputDataStream >> color;
HbIconKey key(filename, size, (Qt::AspectRatioMode)aspectRatioMode,
- (QIcon::Mode)mode, mirrored, color);
+ (QIcon::Mode)mode, mirrored, color, iServer->currentRenderingMode());
iServer->removeIconCacheItem(key);
sessionIconData.removeOne(key);
QByteArray outputByteArray;
@@ -960,6 +1019,24 @@
break;
}
+ case ETypefaceOffset: {
+ int offset = -1;
+ HbTypefaceInfoDatabase *typefaceDatabase =
+ HbTypefaceInfoDatabase::instance(HbMemoryManager::SharedMemory);
+
+ if (typefaceDatabase) {
+ offset = typefaceDatabase->typefaceInfoVectorOffset();
+ }
+ // offset will be -1 if the typefaceDatabase is NULL.
+ QByteArray outputByteArray;
+ QDataStream outputDataStream(&outputByteArray, QIODevice::WriteOnly);
+ outputDataStream << requestType;
+ outputDataStream << offset;
+ ((QLocalSocket *)sender())->write(outputByteArray);
+ break;
+ }
+
+
default:
break;
}
@@ -1003,6 +1080,7 @@
tempIconCacheItem.reset(HbIconCacheItemCreator::createCacheItem(key,
(HbIconLoader::IconLoaderOptions)options,
format,
+ iServer->currentRenderingMode(),
false));
cacheItemOfPiece = tempIconCacheItem.data();
if (cacheItemOfPiece) {
@@ -1042,7 +1120,7 @@
QScopedPointer <HbIconCacheItem> tempIconCacheItem;
tempIconCacheItem.reset(HbIconCacheItemCreator::createCacheItem(finalIconKey,
- static_cast<HbIconLoader::IconLoaderOptions>(params.options), format, false));
+ static_cast<HbIconLoader::IconLoaderOptions>(params.options), format, iServer->currentRenderingMode(),false));
cacheItem = tempIconCacheItem.data();
cacheItem->rasterIconData = rasterIcon->sharedIconData();
@@ -1082,7 +1160,7 @@
bool iconPieceMirrored = false;
HbIconKey key(params.multiPartIconList.at(i), params.multiPartIconData.pixmapSizes[i],
static_cast<Qt::AspectRatioMode>(stichedKey.aspectRatioMode),
- static_cast<QIcon::Mode>(stichedKey.mode), iconPieceMirrored, stichedKey.color);
+ static_cast<QIcon::Mode>(stichedKey.mode), iconPieceMirrored, stichedKey.color,stichedKey.renderMode );
insertKeyIntoSessionList = iconInfoFromSingleIcon(key, data);
if (!insertKeyIntoSessionList) {
insertKeyIntoSessionList = createCacheItemData(key, params.options, data);
@@ -1289,25 +1367,28 @@
} else {
bool tryAgain = false;
do {
- offset = HbThemeServerUtils::getSharedStylesheet(fileName, priority);
- if (offset >= 0) {
- HbCacheItem *cssItem = new HbCacheItem(offset, 0, fileName);
- insertKeyIntoSessionList = iServer->insertCssCacheItem(fileName, cssItem);
- if (priority == HbLayeredStyleLoader::Priority_Core && cssItem->refCount == 1) {
- // This will make sure the requested stylesheet will always remain
- // in the primary and secondary cache.
- cssItem->incrementRefCount();
+ bool inSharedCache = false;
+ offset = HbThemeServerUtils::getSharedStylesheet(fileName, priority, &inSharedCache);
+ if (!inSharedCache) {
+ if (offset >= 0) {
+ HbCacheItem *cssItem = new HbCacheItem(offset, 0, fileName);
+ insertKeyIntoSessionList = iServer->insertCssCacheItem(fileName, cssItem);
+ if (priority == HbLayeredStyleLoader::Priority_Core && cssItem->refCount == 1) {
+ // This will make sure the requested stylesheet will always remain
+ // in the primary and secondary cache.
+ cssItem->incrementRefCount();
+ }
+ if (priority == HbLayeredStyleLoader::Priority_Theme && cssItem->refCount == 1) {
+ iServer->themePriorityItems.insert(fileName,cssItem);
+ }
+ break;
+ } else if (offset == OUT_OF_MEMORY_ERROR && tryAgain == false) {
+ iServer->doCleanup();
+ tryAgain = true;
+ } else if (offset == OUT_OF_MEMORY_ERROR && tryAgain == true) {
+ //try only once to free up memory.
+ tryAgain = false;
}
- if (priority == HbLayeredStyleLoader::Priority_Theme && cssItem->refCount == 1) {
- iServer->themePriorityItems.insert(fileName,cssItem);
- }
- break;
- } else if (offset == OUT_OF_MEMORY_ERROR && tryAgain == false) {
- iServer->doCleanup();
- tryAgain = true;
- } else if (offset == OUT_OF_MEMORY_ERROR && tryAgain == true) {
- //try only once to free up memory, else offset remains -2
- tryAgain = false;
}
} while (tryAgain);
}
@@ -1355,6 +1436,7 @@
tempIconCacheItem.reset(HbIconCacheItemCreator::createCacheItem(key,
(HbIconLoader::IconLoaderOptions)options,
format,
+ iServer->currentRenderingMode(),
false));
cacheItem = tempIconCacheItem.data();
if (cacheItem) {