qtmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
    51 #define makename(x) makestr(x)
    51 #define makename(x) makestr(x)
    52 
    52 
    53 #include "maliciousplugin_p.h"
    53 #include "maliciousplugin_p.h"
    54 #include "qcontactmanager.h"
    54 #include "qcontactmanager.h"
    55 
    55 
       
    56 #include <QThread>
       
    57 #include <QMutex>
       
    58 #include <QSet>
       
    59 #include <QDebug>
       
    60 
       
    61 class MaliciousThreadObject : public QObject
       
    62 {
       
    63     Q_OBJECT
       
    64 public:
       
    65     MaliciousThreadObject() {}
       
    66 
       
    67 public slots:
       
    68     void activateRequest(QContactAbstractRequest* req)
       
    69     {
       
    70         mutex.lock();
       
    71         if (activeRequests.contains(req)) {
       
    72             QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::ActiveState);
       
    73         }
       
    74         mutex.unlock();
       
    75     }
       
    76 
       
    77     void finishRequest(QContactAbstractRequest* req)
       
    78     {
       
    79         QContactManager::Error errorResult = QContactManager::NoError;
       
    80         QMap<int, QContactManager::Error> errorsResult;
       
    81         QList<QContactLocalId> idResult;
       
    82         QList<QContact> contactResult;
       
    83         QList<QContactDetailDefinition> defResult;
       
    84         QMap<QString, QContactDetailDefinition> defMapResult;
       
    85         QList<QContactRelationship> relResult;
       
    86 
       
    87         mutex.lock();
       
    88         if (activeRequests.contains(req)) {
       
    89             switch(req->type()) {
       
    90                 case QContactAbstractRequest::ContactLocalIdFetchRequest:
       
    91                     QContactManagerEngine::updateContactLocalIdFetchRequest(static_cast<QContactLocalIdFetchRequest*>(req), idResult, errorResult, QContactAbstractRequest::FinishedState);
       
    92                     break;
       
    93 
       
    94                 case QContactAbstractRequest::ContactFetchRequest:
       
    95                     QContactManagerEngine::updateContactFetchRequest(static_cast<QContactFetchRequest*>(req), contactResult, errorResult, QContactAbstractRequest::FinishedState);
       
    96                     break;
       
    97 
       
    98                 case QContactAbstractRequest::DetailDefinitionSaveRequest:
       
    99                     QContactManagerEngine::updateDefinitionSaveRequest(static_cast<QContactDetailDefinitionSaveRequest*>(req), defResult, errorResult, errorsResult, QContactAbstractRequest::FinishedState);
       
   100                     break;
       
   101 
       
   102                 case QContactAbstractRequest::DetailDefinitionFetchRequest:
       
   103                     QContactManagerEngine::updateDefinitionFetchRequest(static_cast<QContactDetailDefinitionFetchRequest*>(req), defMapResult, errorResult, errorsResult, QContactAbstractRequest::FinishedState);
       
   104                     break;
       
   105 
       
   106                 case QContactAbstractRequest::DetailDefinitionRemoveRequest:
       
   107                     QContactManagerEngine::updateDefinitionRemoveRequest(static_cast<QContactDetailDefinitionRemoveRequest*>(req), errorResult, errorsResult, QContactAbstractRequest::FinishedState);
       
   108                     break;
       
   109                 default:
       
   110                     QContactManagerEngine::updateRequestState(req, QContactAbstractRequest::FinishedState);
       
   111                     break;
       
   112             }
       
   113         }
       
   114         activeRequests.remove(req);
       
   115         mutex.unlock();
       
   116     }
       
   117 public:
       
   118     QMutex mutex;
       
   119 
       
   120     QSet<QContactAbstractRequest*> activeRequests;
       
   121 };
       
   122 
       
   123 class MaliciousThread : public QThread
       
   124 {
       
   125     Q_OBJECT;
       
   126 public:
       
   127     MaliciousThread();
       
   128     ~MaliciousThread();
       
   129     QObject* eventLoopQuitHack;
       
   130 };
       
   131 
       
   132 MaliciousThread::MaliciousThread()
       
   133 {
       
   134     eventLoopQuitHack = new QObject;
       
   135     eventLoopQuitHack->moveToThread(this);
       
   136     connect(eventLoopQuitHack, SIGNAL(destroyed(QObject*)), SLOT(quit()), Qt::DirectConnection);
       
   137 }
       
   138 
       
   139 MaliciousThread::~MaliciousThread()
       
   140 {
       
   141     eventLoopQuitHack->deleteLater();
       
   142     wait();
       
   143 }
       
   144 
    56 MaliciousAsyncManagerEngine::MaliciousAsyncManagerEngine()
   145 MaliciousAsyncManagerEngine::MaliciousAsyncManagerEngine()
    57         : QContactManagerEngine()
   146         : QContactManagerEngine()
    58 {
   147 {
       
   148     thread = new MaliciousThread();
       
   149     threadObject = new MaliciousThreadObject();
       
   150     threadObject->moveToThread(thread);
       
   151 
       
   152     connect(this, SIGNAL(doStartRequest(QContactAbstractRequest*)), threadObject, SLOT(activateRequest(QContactAbstractRequest*)));
       
   153     connect(this, SIGNAL(doFinishRequest(QContactAbstractRequest*)), threadObject, SLOT(finishRequest(QContactAbstractRequest*)));
       
   154 
       
   155     thread->start();
       
   156 }
       
   157 
       
   158 MaliciousAsyncManagerEngine::~MaliciousAsyncManagerEngine()
       
   159 {
       
   160     delete thread;
       
   161     delete threadObject;
    59 }
   162 }
    60 
   163 
    61 QString MaliciousAsyncManagerEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const
   164 QString MaliciousAsyncManagerEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const
    62 {
   165 {
    63     Q_UNUSED(contact);
   166     Q_UNUSED(contact);
    70     return QString(makename(MALICIOUSPLUGINNAME));
   173     return QString(makename(MALICIOUSPLUGINNAME));
    71 }
   174 }
    72 
   175 
    73 bool MaliciousAsyncManagerEngine::startRequest(QContactAbstractRequest* req)
   176 bool MaliciousAsyncManagerEngine::startRequest(QContactAbstractRequest* req)
    74 {
   177 {
    75     // maliciously attempt to update the request with every result type
   178     threadObject->mutex.lock();
    76     updateRequestState(req, QContactAbstractRequest::ActiveState);
   179     threadObject->activeRequests.insert(req);
    77     // XXX TODO: call the request-type specific update functions
   180     threadObject->mutex.unlock();
    78 /*
   181 
    79     //QContactManager::Error errorResult = QContactManager::NoError;
   182     // Spawn a thread to do stuff on another thread
    80     QList<QContactManager::Error> errorsResult;
   183     emit doStartRequest(req);
    81     QList<QContactLocalId> idResult;
   184     emit doFinishRequest(req);
    82     QList<QContact> contactResult;
   185 
    83     QList<QContactDetailDefinition> defResult;
       
    84     QMap<QString, QContactDetailDefinition> defMapResult;
       
    85     QList<QContactRelationship> relResult;
       
    86 
       
    87     updateContactLocalIdFetchRequest(req, idResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false);
       
    88     updateContactFetchRequest(req, contactResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false);
       
    89     updateDefinitionSaveRequest(req, defResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState);
       
    90     updateDefinitionFetchRequest(req, defMapResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false);
       
    91     updateRequest(req, relResult, errorResult, errorsResult, QContactAbstractRequest::ActiveState, false);
       
    92 */
       
    93     QContactManagerEngine::startRequest(req);
       
    94     return true;
   186     return true;
    95 }
   187 }
    96 
   188 
    97 bool MaliciousAsyncManagerEngine::cancelRequest(QContactAbstractRequest *req)
   189 bool MaliciousAsyncManagerEngine::cancelRequest(QContactAbstractRequest *req)
    98 {
   190 {
    99     updateRequestState(req, QContactAbstractRequest::CanceledState);
   191     updateRequestState(req, QContactAbstractRequest::CanceledState);
   100     QContactManagerEngine::cancelRequest(req);
   192     QContactManagerEngine::cancelRequest(req);
   101     return true;
   193     return true;
   102 }
   194 }
   103 
   195 
       
   196 void MaliciousAsyncManagerEngine::requestDestroyed(QContactAbstractRequest *req)
       
   197 {
       
   198     threadObject->mutex.lock();
       
   199     threadObject->activeRequests.remove(req);
       
   200     threadObject->mutex.unlock();
       
   201     QContactManagerEngine::requestDestroyed(req);
       
   202 }
   104 
   203 
   105 QString MaliciousEngineFactory::managerName() const
   204 QString MaliciousEngineFactory::managerName() const
   106 {
   205 {
   107     return QString(makename(MALICIOUSPLUGINNAME));
   206     return QString(makename(MALICIOUSPLUGINNAME));
   108 }
   207 }
   112 {
   211 {
   113     Q_UNUSED(parameters);
   212     Q_UNUSED(parameters);
   114     *error = QContactManager::NoError;
   213     *error = QContactManager::NoError;
   115     return new MaliciousAsyncManagerEngine();
   214     return new MaliciousAsyncManagerEngine();
   116 }
   215 }
       
   216 
       
   217 #include "maliciousplugin.moc"