diff -r c39a6cfd1fb9 -r be09cf1f39dd smf/smfservermodule/smfserver/server/smfserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smf/smfservermodule/smfserver/server/smfserver.cpp Tue May 18 17:37:12 2010 +0530 @@ -0,0 +1,385 @@ +/** + * Copyright (c) 2010 Sasken Communication Technologies Ltd. + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html" + * + * Initial Contributors: + * Chandradeep Gandhi, Sasken Communication Technologies Ltd - Initial contribution + * + * Contributors: + * Manasij Roy, Nalina Hariharan + */ + +#include "smfserver.h" +#include "smfpluginmanager.h" +#include "smftransportmanager.h" +#include "smfclientglobal.h" +#include +#include +#include +#include +#include +#include +//#ifdef NO_OTHER_MODULES +#include +#include +#include +#include +#include +//#endif +#ifdef Q_OS_SYMBIAN +#include "smfserversymbian_p.h" +#else +#include "smfserverqt_p.h" +#endif + +SmfServer::SmfServer(QObject* parent): QObject(parent) + { + } +bool SmfServer::startServer() + { + bool success = false; + //Initialize all the component handles + writeLog("Not doing SmfTransportManager::getInstance"); + //m_transportManager = SmfTransportManager::getInstance(); + writeLog("Not doing m_transportManager->initializeTransport"); + //checking the network status, no need to proceed if not permitted + //SmfTransportInitializeResult networkStatus = m_transportManager->initializeTransport(); + writeLog("Before networkStatus"); + //TODO:-check this + if(1/*networkStatus == SmfTransportInitNoError*/) + { + writeLog("Before m_pluginManager construction"); + m_pluginManager = SmfPluginManager::getInstance(this); + writeLog("After m_pluginManager construction"); + // m_dataStoreManager = new SmfDataStoreManager(); + //Initialize private implementation + #ifdef Q_OS_SYMBIAN + TRAPD(err, m_SmfServerPrivate = SmfServerSymbian::NewL(CActive::EPriorityStandard,this)); + QString log("SmfServer::startServer="); + int errorQ = err ; + log += errorQ; + writeLog(log); + if( KErrNone != err ) + { + return success; + } + TInt error = m_SmfServerPrivate->Start( KSmfServerName ); + errorQ = error ; + log.clear(); + log = QString("m_SmfServerPrivate->Start="); + log += QString::number(error); + writeLog(log); + if( KErrNone == error ) + { + success = true; + } + else + { + //error + return success; + } + #else + m_SmfServerPrivate = new SmfServerQt(); + success = m_SmfServerPrivate->start(); + if (!success) + { + return success; + } + #endif + //request CM server for auth expiry info, note:- we should resend the request everytime we get expiry + //notification + //TODO:- Do it after CM implementation + //CMclient->requestAuthExpiryNotify(); + //connect(CMClient,SIGNAL(authExpiryNotify(NotificationType,SmfPluginID),this,SLOT(NotificationType,SmfPluginID)); + } + return success; + } +//Note:- Almost all the following APIs are called by private impl via the handle +/** + * This called first once a session is created by the private impl + * @param clientID some unique client process ID, SID for symbian platform + * TODO:-How to get the pid for rest of the platforms? + * @return true if client is already athorized, else false + * + */ +bool SmfServer::isClientAuthorized(SmfClientAuthID clientID) + { + //TODO:- once CM is complete do it properly + Q_UNUSED(clientID); + return true; + } +/** + * This API is called by the private impl when isClientAuthorized returns false + * @param clientID client Id (SID for symbian platform), provided by the private impl + * Note:- The session(and in turn the client) will be blocked untill authorization completes. + */ +void SmfServer::authorizeClient(SmfClientAuthID clientID) + { + //TODO:- once CM is complete, do it properly + //CMclient->authorizeClient(clientID) + //connect(CMClient,SIGNAL(clientAuthorizationFinished(bool,SmfClientAuthID)),this,SLOT(clientAuthorizationFinished(bool,SmfClientAuthID))); + Q_UNUSED(clientID); + } +/** + * This API is called by the private impl when client is authorized + * @param interfaceID Interface id, provided by the private impl (it gets it from client) + * @param pluginIDMap Map of plugins who implement this interface and corresponding provider, + * this is returned to the private impl + * It calls PM to get the list. Note:- PM may return SmfProviderBase which is superset of SmfProvider. + * TODO:- session should store this map for future ref? + */ +void SmfServer::getPlugins(SmfInterfaceID interfaceID, QMap& pluginIDMap) + { + pluginIDMap.clear(); + m_pluginManager->getPlugins(interfaceID,pluginIDMap); + } + +SmfPluginID SmfServer::getPlugin(SmfInterfaceID interfaceID,SmfProvider provider) + { + //TODO:- do it properly as per PM implementation + //return PM->getplugin(interfaceID,provider); + //TODO:- PM is not yet ready + SmfPluginID id; + m_pluginManager->getPluginId(interfaceID,provider, id); + return id; + //testing purpose only + } +/** + * This API is called by the private impl to get a list of authorized plugins from CM + * @param list List of plugins to be filtered + * @param authList List of authorised plugins filled by CM + * this is returned to the private impl + * It calls CMclient to get the list synchronously + * TODO:- session should store this for future ref? + */ +void SmfServer::getAuthorizedPlugins(QList& list,QList& authList) + { + //TODO:- do it properly as per CMclient implementation + //CMclient->getAuthorizedPlugins(list,authList); + //testing purpose only +#ifdef NO_OTHER_MODULES + authList = list; +#endif + } +/** + * This API is called by the private impl to request the PM to do the actual request/parsing asynchronously + * Note:- the sever private impl (SmfServerSymbian for symbian platform) maintains a map of session ptr and some randomely + * generated number.For the time being we are allowing only one outstanding request per session, so no need to store + * both session and msg ptr, but in future we may need to. + * @param requestID Request id (corresponds to the key of the mapmaintained by SmfServerSymbian). + * @param pluginID PluginID, provided by the session + * @param interfaceID InterfaceID provided by session + * @requestTypeID Request Opcode, provided by session + */ +void SmfServer::getRequestedData(int requestID,SmfPluginID pluginID,SmfInterfaceID interfaceID, SmfRequestTypeID requestTypeID,QByteArray dataForPlugin) + { + //TODO:- cross check the params with PM owner + //PM->getData(requestID,pluginID,interfaceID,requestTypeID); + m_SmfServerPrivate->writeLog("SmfServer::getRequestedData"); + m_SmfServerPrivate->writeLog(QString::number(requestID)); + m_SmfServerPrivate->writeLog(pluginID); + m_SmfServerPrivate->writeLog(interfaceID); + m_SmfServerPrivate->writeLog(QString::number(requestTypeID)); + bool defaultCase = false; + //serializedInfo contains base provider info+ other data depending on requestTypeID + QDataStream reader(&dataForPlugin,QIODevice::ReadOnly); + QByteArray dataTobeSent; + switch(requestTypeID) + { + case SmfContactPost: + { + SmfProvider provider; + SmfPost post; + SmfLocation loc; + reader>>provider; + reader>>post; + reader>>loc; + //now form the serialized bytearray with only SmfPost and SmfPlace + QDataStream writer(&dataTobeSent,QIODevice::WriteOnly); + writer<>provider; + reader>>post; + //now form the serialized bytearray with only SmfPost + QDataStream writer(&dataTobeSent,QIODevice::WriteOnly); + writer<>provider; + reader>>post; + reader>>contact; + reader>>place; + QDataStream writer(&dataTobeSent,QIODevice::WriteOnly); + writer<>provider; + reader>>post; + reader>>contact; + reader>>edited; + //now form the serialized bytearray with only SmfPost + QDataStream writer(&dataTobeSent,QIODevice::WriteOnly); + writer<>provider; + reader>>picture; + //now form the serialized bytearray with only SmfPicture + QDataStream writer(&dataTobeSent,QIODevice::WriteOnly); + writer<>provider; + reader>>pictureList; + //now form the serialized bytearray with only SmfPicture + QDataStream writer(&dataTobeSent,QIODevice::WriteOnly); + writer<>provider; + reader>>picture; + reader>>comment; + //now form the serialized bytearray with only SmfPicture + QDataStream writer(&dataTobeSent,QIODevice::WriteOnly); + writer<createRequest(requestID,pluginID,requestTypeID,dataTobeSent); + } + //when plugin manager needs to xtra info + else + { + QByteArray arr; + m_pluginManager->createRequest(requestID,pluginID,requestTypeID,arr); + } + } +/** + * This slot is invoked when CM finishes the authorization of the client. + * @param authID As it contains the session ptr, sever directly invokes the session's API to notify success + */ +void SmfServer::clientAuthorizationFinished(bool success,SmfClientAuthID authID ) + { + //TODO:- implement this api in session class + //note:- in case success is false client completes the request with SmfErrClientAuthFailed + //TODO:- define set of smf wide error after consulting with other module owners + authID.session->clientathorizationFinished(success); + } +/** + * This API is called by PM once its done with request and parsing + * @param requestID The request id which is completed + * @param parsedData Serialized data(as per request type) filled by PM + * @param error Error occured + * TODO:- should use smf wide global errors instead + */ +void SmfServer::resultsAvailable(int requestID,QByteArray* parsedData,SmfError error) + { + m_SmfServerPrivate->writeLog("SmfServer::resultsAvailable"); + m_SmfServerPrivate->writeLog("requestID="); + m_SmfServerPrivate->writeLog(QString::number(requestID)); + m_SmfServerPrivate->writeLog("parsedData->size()="); + m_SmfServerPrivate->writeLog(QString::number(parsedData->size())); + m_SmfServerPrivate->writeLog("Error="); + m_SmfServerPrivate->writeLog(QString::number(error)); + //Serialize error followed by actual data + QByteArray dataWithError; + QDataStream writer(&dataWithError,QIODevice::WriteOnly); + writer<findAndServiceclient(requestID,&dataWithError,error); + } +/** + * Seems reduntant in symbian as client is served with RMessage2::Complete() + */ +void SmfServer::serviceClient(QByteArray* parsedData) + { + Q_UNUSED(parsedData); + } +/** + * Used by PM to get a list of tokens + * TODO:- cross check the params + */ +void SmfServer::getAuthenticationKeys(int pluginID,QStringList& keys,QStringList& urls) + { + //SMF-CM communication will be via CM client + //TODO:- do it properly as per CM client impl + //CMclient->getKeys(pluginID,keys,urls); + Q_UNUSED(pluginID); + Q_UNUSED(keys); + Q_UNUSED(urls); + } + +/** + * This is called when CMclient notifies client expiry. + * @param type notification type, set of enums for future expansion + * @param id Plugin Id for which the authentication has expired + */ +void SmfServer::authenticationKeysExpired(NotificationType type,SmfPluginID id) + { + //resend the notify request + //CMclient->requestAuthExpiryNotify(); + Q_UNUSED(type); + Q_UNUSED(id); + } + +void SmfServer::writeLog(QString log) const + { +#ifdef WRITE_LOG + QFile file("c:\\data\\SmfServerLogs.txt"); + if (!file.open(QIODevice::Append | QIODevice::Text)) + ; + QTextStream out(&file); + out << log << "\n"; + file.close(); +#else + Q_UNUSED(log); +#endif + }