>From 7a659b5b20b8b9568bdace5bc279a87ed74ce7ed Mon Sep 17 00:00:00 2001
From: Christophe Dumez <christophe.dumez@intel.com>
Date: Tue, 10 May 2011 15:16:11 +0300
Subject: [PATCH 1/2] QContactAbstractRequest: make start() method return a
 boolean

Make the start method return a boolean since it can fail and the
caller should be able to know about it.
---
 src/qcontactabstractrequestworker_p.h |    2 +-
 src/qcontactremoverequestworker.cpp   |    6 ++++--
 src/qcontactremoverequestworker_p.h   |    2 +-
 src/qcontactsaverequestworker.cpp     |   18 ++++++++++++++++--
 src/qcontactsaverequestworker_p.h     |    2 +-
 5 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/qcontactabstractrequestworker_p.h b/src/qcontactabstractrequestworker_p.h
index 6272892..dbddf6b 100644
--- a/src/qcontactabstractrequestworker_p.h
+++ b/src/qcontactabstractrequestworker_p.h
@@ -73,7 +73,7 @@ class QContactAbstractRequestWorker : public QObject {
 
   public slots:
   /*! Starts the asynchronous request */
-  virtual void start() = 0;
+  virtual bool start() = 0;
 
   /*! Waits for the asynchronous request to finish */
   bool waitForFinished(int msec = 0) {
diff --git a/src/qcontactremoverequestworker.cpp b/src/qcontactremoverequestworker.cpp
index 7eb855e..f53c10a 100644
--- a/src/qcontactremoverequestworker.cpp
+++ b/src/qcontactremoverequestworker.cpp
@@ -58,9 +58,9 @@ QContactRemoveRequestWorker::~QContactRemoveRequestWorker()
 }
 
 /*! \reimp */
-void QContactRemoveRequestWorker::start()
+bool QContactRemoveRequestWorker::start()
 {
-  if (requestState() == QContactAbstractRequest::CanceledState) return;
+  if (requestState() == QContactAbstractRequest::CanceledState) return false;
   // Set request state to active
   QContactManagerEngine::updateRequestState(m_request.data(), QContactAbstractRequest::ActiveState);
   emit started();
@@ -83,6 +83,8 @@ void QContactRemoveRequestWorker::start()
     // Async removal of the contact
     e_book_remove_contact_async(m_ebook, eContact, delContactCB, m_sharedData[i]);
   }
+
+  return true;
 }
 
 /*!
diff --git a/src/qcontactremoverequestworker_p.h b/src/qcontactremoverequestworker_p.h
index cdb71a3..c4ca771 100644
--- a/src/qcontactremoverequestworker_p.h
+++ b/src/qcontactremoverequestworker_p.h
@@ -38,7 +38,7 @@ public:
   ~QContactRemoveRequestWorker();
 
 public slots:
-  virtual void start();
+  virtual bool start();
   void handleSubRequestFinished(int index);
 
 private:
diff --git a/src/qcontactsaverequestworker.cpp b/src/qcontactsaverequestworker.cpp
index 44f1d0c..8a2ac55 100644
--- a/src/qcontactsaverequestworker.cpp
+++ b/src/qcontactsaverequestworker.cpp
@@ -69,13 +69,15 @@ QContactSaveRequestWorker::~QContactSaveRequestWorker() {
 }
 
 /*! \reimp */
-void QContactSaveRequestWorker::start()
+bool QContactSaveRequestWorker::start()
 {
-  if (requestState() == QContactAbstractRequest::CanceledState) return;
+  if (requestState() == QContactAbstractRequest::CanceledState) return false;
   // Set request state to active
   QContactManagerEngine::updateRequestState(m_request.data(), QContactAbstractRequest::ActiveState);
   emit started();
 
+  bool subReqStarted = false;
+
   // Prepare the shared data
   for (int i=0; i<m_contacts.size(); ++i) {
     SaveJobSharedData *sd = new SaveJobSharedData(this);
@@ -145,7 +147,19 @@ void QContactSaveRequestWorker::start()
       // Add
       e_book_add_contact_async(m_ebook, eContact, addContactCB, m_sharedData[i]);
     }
+    subReqStarted = true;
   }
+
+  // Detect the case where no subrequest were made due to errors
+  if (!subReqStarted) {
+    QContactManagerEngine::updateContactSaveRequest(static_cast<QContactSaveRequest*>(m_request.data()),
+                                                    m_contacts, QContactManager::BadArgumentError, errors(),
+                                                    QContactAbstractRequest::CanceledState);
+    emit finished();
+    return false;
+  }
+
+  return true;
 }
 
 /*!
diff --git a/src/qcontactsaverequestworker_p.h b/src/qcontactsaverequestworker_p.h
index 937938c..fadaa15 100644
--- a/src/qcontactsaverequestworker_p.h
+++ b/src/qcontactsaverequestworker_p.h
@@ -40,7 +40,7 @@ public:
   ~QContactSaveRequestWorker();
 
 public slots:
-  virtual void start();
+  virtual bool start();
   void handleSubRequestFinished(int index);
 
 private:
-- 
1.7.4.4

