--- a/qtmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp Mon May 03 13:18:40 2010 +0300
@@ -40,9 +40,6 @@
****************************************************************************/
#include "cntsymbiansimengine.h"
-#include <qtcontacts.h>
-#include <mmtsy_names.h>
-
#include "cntsymbiansimtransformerror.h"
#include "cntsimstore.h"
#include "cntsimcontactfetchrequest.h"
@@ -50,17 +47,13 @@
#include "cntsimcontactsaverequest.h"
#include "cntsimcontactremoverequest.h"
#include "cntsimdetaildefinitionfetchrequest.h"
-
-#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER
-#include <mpbutil_etel_test_server.h>
-#else
-#include <mpbutil.h>
-#endif
+#include <qtcontacts.h>
#include <QEventLoop>
#include <QTimer>
+#include <QDebug>
-
+const int KRequestTimeout = 30000; // in ms
CntSymbianSimEngineData::CntSymbianSimEngineData()
:m_simStore(0)
@@ -82,18 +75,22 @@
}
}
-CntSymbianSimEngine::CntSymbianSimEngine(const QMap<QString, QString>& parameters, QContactManager::Error& error)
+CntSymbianSimEngine::CntSymbianSimEngine(const QMap<QString, QString>& parameters, QContactManager::Error* error)
{
- error = QContactManager::NoError;
+ *error = QContactManager::NoError;
d = new CntSymbianSimEngineData();
- d->m_simStore = new CntSimStore(this, parameters.value(KParameterKeySimStoreName));
+ d->m_simStore = new CntSimStore(this, parameters.value(KParameterKeySimStoreName), error);
+ if (*error != QContactManager::NoError) {
+ //qDebug() << "Failed to open SIM store" << error;
+ return;
+ }
if(d->m_simStore->storeName() == KParameterValueSimStoreNameSdn) {
// In case of SDN store we need to check if any SDN contacts exist to
// determine if the store is supported or not
if(d->m_simStore->storeInfo().iUsedEntries == 0)
- error = QContactManager::NotSupportedError;
+ *error = QContactManager::NotSupportedError;
}
}
@@ -108,33 +105,16 @@
}
-void CntSymbianSimEngine::deref()
-{
- delete this;
-}
-
QString CntSymbianSimEngine::managerName() const
{
return CNT_SYMBIANSIM_MANAGER_NAME;
}
/*!
- * Returns a list of the ids of contacts that match the supplied \a filter.
- * Any error that occurs will be stored in \a error.
- */
-QList<QContactLocalId> CntSymbianSimEngine::contactIds(const QList<QContactSortOrder>& sortOrders, QContactManager::Error& error) const
-{
- QContactLocalIdFetchRequest req;
- req.setSorting(sortOrders);
- executeRequest(&req, error);
- return req.ids();
-}
-
-/*!
* Returns a list of the ids of contacts that match the supplied \a filter, sorted according to the given \a sortOrders.
* Any error that occurs will be stored in \a error. Uses the generic (slow) filtering of QContactManagerEngine.
*/
-QList<QContactLocalId> CntSymbianSimEngine::contactIds(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, QContactManager::Error& error) const
+QList<QContactLocalId> CntSymbianSimEngine::contactIds(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, QContactManager::Error* error) const
{
QContactLocalIdFetchRequest req;
req.setFilter(filter);
@@ -143,21 +123,12 @@
return req.ids();
}
-QList<QContact> CntSymbianSimEngine::contacts(const QList<QContactSortOrder>& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const
-{
- QContactFetchRequest req;
- req.setSorting(sortOrders);
- req.setDefinitionRestrictions(definitionRestrictions);
- executeRequest(&req, error);
- return req.contacts();
-}
-
-QList<QContact> CntSymbianSimEngine::contacts(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const
+QList<QContact> CntSymbianSimEngine::contacts(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const
{
QContactFetchRequest req;
req.setFilter(filter);
req.setSorting(sortOrders);
- req.setDefinitionRestrictions(definitionRestrictions);
+ req.setFetchHint(fetchHint);
executeRequest(&req, error);
return req.contacts();
}
@@ -171,20 +142,20 @@
* \return A QContact for the requested QContactLocalId value or 0 if the read
* operation was unsuccessful (e.g. contact not found).
*/
-QContact CntSymbianSimEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const
+QContact CntSymbianSimEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const
{
QContactFetchRequest req;
QContactLocalIdFilter filter;
filter.setIds(QList<QContactLocalId>() << contactId);
req.setFilter(filter);
- req.setDefinitionRestrictions(definitionRestrictions);
+ req.setFetchHint(fetchHint);
executeRequest(&req, error);
if (req.contacts().count() == 0)
return QContact();
return req.contacts().at(0);
}
-QString CntSymbianSimEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const
+QString CntSymbianSimEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const
{
Q_UNUSED(error);
@@ -198,32 +169,17 @@
}
/*!
- * Saves the contact to the Etel store. Only part of the contact's details
+ * Saves the contacts to the Etel store. Only part of the contact's details
* can be saved, and some fields may be trimmed to fit to the SIM card.
*
- * \param contact Contact to be saved.
+ * \param contacts Contact to be saved.
* \param qtError Qt error code.
* \return Error status.
*/
-bool CntSymbianSimEngine::saveContact(QContact* contact, QContactManager::Error& error)
-{
- if (!contact) {
- error = QContactManager::BadArgumentError;
- return false;
- }
-
- QContactSaveRequest req;
- req.setContacts(QList<QContact>() << *contact);
- executeRequest(&req, error);
- if (req.contacts().count())
- *contact = req.contacts().at(0);
- return (error == QContactManager::NoError);
-}
-
-bool CntSymbianSimEngine::saveContacts(QList<QContact>* contacts, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error& error)
+bool CntSymbianSimEngine::saveContacts(QList<QContact>* contacts, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
{
if (!contacts) {
- error = QContactManager::BadArgumentError;
+ *error = QContactManager::BadArgumentError;
return false;
}
@@ -233,7 +189,7 @@
if (errorMap)
*errorMap = req.errorMap();
*contacts = req.contacts();
- return (error == QContactManager::NoError );
+ return (*error == QContactManager::NoError );
}
/*!
@@ -243,41 +199,30 @@
* \param qtError Qt error code.
* \return Error status.
*/
-bool CntSymbianSimEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error& error)
+bool CntSymbianSimEngine::removeContacts(const QList<QContactLocalId>& contactIds, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
{
QContactRemoveRequest req;
- req.setContactIds(QList<QContactLocalId>() << contactId);
- return executeRequest(&req, error);
-}
-
-bool CntSymbianSimEngine::removeContacts(QList<QContactLocalId>* contactIds, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error& error)
-{
- if (!contactIds) {
- error = QContactManager::BadArgumentError;
- return false;
- }
- QContactRemoveRequest req;
- req.setContactIds(*contactIds);
+ req.setContactIds(contactIds);
executeRequest(&req, error);
if (errorMap)
*errorMap = req.errorMap();
- return (error == QContactManager::NoError);
+ return (*error == QContactManager::NoError);
}
/*!
* Returns a map of identifier to detail definition which are valid for contacts whose type is the given \a contactType
* which are valid for the contacts in this store
*/
-QMap<QString, QContactDetailDefinition> CntSymbianSimEngine::detailDefinitions(const QString& contactType, QContactManager::Error& error) const
+QMap<QString, QContactDetailDefinition> CntSymbianSimEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const
{
if (!supportedContactTypes().contains(contactType)) {
// Should never happen
- error = QContactManager::NotSupportedError;
+ *error = QContactManager::NotSupportedError;
return QMap<QString, QContactDetailDefinition>();
}
// Get store information
- RMobilePhoneBookStore::TMobilePhoneBookInfoV5 storeInfo = d->m_simStore->storeInfo();
+ TSimStoreInfo storeInfo = d->m_simStore->storeInfo();
// the map we will eventually return
QMap<QString, QContactDetailDefinition> retn;
@@ -340,6 +285,7 @@
retn.insert(def.name(), def);
// email support needs to be checked run-time, because it is SIM specific
+#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1
if (storeInfo.iMaxEmailAddr > 0) {
def.setName(QContactEmailAddress::DefinitionName);
fields.clear();
@@ -350,6 +296,7 @@
def.setUnique(true);
retn.insert(def.name(), def);
}
+#endif
// phone number
def.setName(QContactPhoneNumber::DefinitionName);
@@ -359,6 +306,7 @@
fields.insert(QContactPhoneNumber::FieldNumber, f);
// TODO: subtypes supported in case a sim contact can have multiple phone numbers?
def.setFields(fields);
+#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1
if (storeInfo.iMaxAdditionalNumbers > 0) {
// multiple numbers supported
def.setUnique(false);
@@ -366,9 +314,14 @@
// only one phone number allowed
def.setUnique(true);
}
+#else
+ // only one phone number allowed
+ def.setUnique(true);
+#endif
retn.insert(def.name(), def);
// nickname support needs to be checked run-time, because it is SIM specific
+#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1
if (storeInfo.iMaxSecondNames > 0) {
def.setName(QContactNickname::DefinitionName);
fields.clear();
@@ -379,6 +332,7 @@
def.setUnique(true);
retn.insert(def.name(), def);
}
+#endif
// name
def.setName(QContactName::DefinitionName);
@@ -526,12 +480,17 @@
void CntSymbianSimEngine::updateDisplayLabel(QContact& contact) const
{
QContactManager::Error error(QContactManager::NoError);
- QString label = synthesizedDisplayLabel(contact, error);
+ QString label = synthesizedDisplayLabel(contact, &error);
if(error == QContactManager::NoError) {
- contact = setContactDisplayLabel(label, contact);
+ setContactDisplayLabel(&contact, label);
}
}
+void CntSymbianSimEngine::setReadOnlyAccessConstraint(QContactDetail* detail) const
+{
+ setDetailAccessConstraints(detail, QContactDetail::ReadOnly);
+}
+
/*!
* Executes an asynchronous request so that it will appear synchronous. This is
* used internally in all synchronous functions. This way we only need to
@@ -541,8 +500,10 @@
* \param qtError Qt error code.
* \return true if succesfull, false if unsuccesfull.
*/
-bool CntSymbianSimEngine::executeRequest(QContactAbstractRequest *req, QContactManager::Error& qtError) const
+bool CntSymbianSimEngine::executeRequest(QContactAbstractRequest *req, QContactManager::Error* qtError) const
{
+ *qtError = QContactManager::NoError;
+
// TODO:
// Remove this code when threads-branch is merged to master. Then this code
// should not be needed because the default implementation at QContactManager
@@ -553,18 +514,24 @@
CntSymbianSimEngine engine(*this);
// Mimic the way how async requests are normally run
- if (engine.startRequest(req))
- engine.waitForRequestFinished(req, 0); // should we have a timeout?
+ if (!engine.startRequest(req)) {
+ *qtError = QContactManager::LockedError;
+ } else {
+ if (!engine.waitForRequestFinished(req, KRequestTimeout))
+ *qtError = QContactManager::UnspecifiedError; // timeout occurred
+ }
engine.requestDestroyed(req);
- qtError = req->error();
- return (qtError == QContactManager::NoError);
+ if (req->error())
+ *qtError = req->error();
+
+ return (*qtError == QContactManager::NoError);
}
-QContactManagerEngine* CntSymbianSimFactory::engine(const QMap<QString, QString>& parameters, QContactManager::Error& error)
+QContactManagerEngine* CntSymbianSimFactory::engine(const QMap<QString, QString>& parameters, QContactManager::Error* error)
{
CntSymbianSimEngine *engine = new CntSymbianSimEngine(parameters, error);
- if(error != QContactManager::NoError) {
+ if(*error != QContactManager::NoError) {
delete engine;
return 0;
}