• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

libkdepim

  • sources
  • kde-4.12
  • kdepim
  • libkdepim
  • job
addemaildisplayjob.cpp
Go to the documentation of this file.
1 /*
2  Copyright 2013 Laurent Montel <montel@kde.org>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include "addemaildisplayjob.h"
21 #include "misc/broadcaststatus.h"
22 #include "widgets/selectedcollectiondialog.h"
23 
24 
25 #include <Akonadi/CollectionDialog>
26 #include <Akonadi/Contact/ContactSearchJob>
27 #include <Akonadi/Item>
28 #include <Akonadi/ItemCreateJob>
29 #include <Akonadi/ItemModifyJob>
30 #include <Akonadi/CollectionFetchJob>
31 #include <Akonadi/CollectionFetchScope>
32 #include <Akonadi/Collection>
33 #include <Akonadi/Contact/ContactEditorDialog>
34 #include <Akonadi/AgentTypeDialog>
35 #include <Akonadi/AgentType>
36 #include <Akonadi/AgentFilterProxyModel>
37 #include <Akonadi/AgentInstanceCreateJob>
38 
39 #include <KABC/Addressee>
40 #include <KABC/ContactGroup>
41 
42 #include <KLocale>
43 #include <KMessageBox>
44 
45 #include <QPointer>
46 #include <QTextDocument>
47 
48 using namespace KPIM;
49 
50 class AddEmailDiplayJob::Private
51 {
52 public:
53  Private( AddEmailDiplayJob *qq, const QString &emailString, QWidget *parentWidget )
54  : q( qq ),
55  mShowAsHTML(false),
56  mRemoteContent(false),
57  mCompleteAddress( emailString ),
58  mParentWidget( parentWidget )
59  {
60  KABC::Addressee::parseEmailAddress( emailString, mName, mEmail );
61  }
62 
63  void slotResourceCreationDone( KJob* job )
64  {
65  if ( job->error() ) {
66  q->setError( job->error() );
67  q->setErrorText( job->errorText() );
68  q->emitResult();
69  return;
70  }
71  createContact();
72  }
73 
74  void searchContact()
75  {
76  // first check whether a contact with the same email exists already
77  Akonadi::ContactSearchJob *searchJob = new Akonadi::ContactSearchJob( q );
78  searchJob->setLimit( 1 );
79  searchJob->setQuery( Akonadi::ContactSearchJob::Email, mEmail.toLower(),
80  Akonadi::ContactSearchJob::ExactMatch );
81  q->connect( searchJob, SIGNAL(result(KJob*)), q, SLOT(slotSearchDone(KJob*)) );
82  }
83 
84 
85  void modifyContact()
86  {
87  Akonadi::Item item = contact;
88  if (item.hasPayload<KABC::Addressee>()) {
89  KABC::Addressee address = item.payload<KABC::Addressee>();
90  address.insertCustom( QLatin1String( "KADDRESSBOOK" ), QLatin1String( "MailPreferedFormatting" ), mShowAsHTML ? QLatin1String("HTML") : QLatin1String("TEXT") );
91  address.insertCustom( QLatin1String( "KADDRESSBOOK" ), QLatin1String( "MailAllowToRemoteContent" ), mRemoteContent ? QLatin1String( "TRUE" ) : QLatin1String( "FALSE" ) );
92  item.setPayload<KABC::Addressee>( address );
93  Akonadi::ItemModifyJob *job = new Akonadi::ItemModifyJob( item );
94  q->connect( job, SIGNAL(result(KJob*)), SLOT(slotAddModifyContactDone(KJob*)) );
95  } else {
96  searchContact();
97  }
98  }
99 
100  void slotSearchDone( KJob *job )
101  {
102  if ( job->error() ) {
103  q->setError( job->error() );
104  q->setErrorText( job->errorText() );
105  q->emitResult();
106  return;
107  }
108 
109  const Akonadi::ContactSearchJob *searchJob = qobject_cast<Akonadi::ContactSearchJob*>( job );
110 
111  const Akonadi::Item::List items = searchJob->items();
112  if ( items.isEmpty() ) {
113  createContact();
114  } else {
115  Akonadi::Item item = items.at(0);
116  KABC::Addressee contact = searchJob->contacts()[0];
117  contact.insertCustom( QLatin1String( "KADDRESSBOOK" ), QLatin1String( "MailPreferedFormatting" ), mShowAsHTML ? QLatin1String("HTML") : QLatin1String("TEXT") );
118  contact.insertCustom( QLatin1String( "KADDRESSBOOK" ), QLatin1String( "MailAllowToRemoteContent" ), mRemoteContent ? QLatin1String( "TRUE" ) : QLatin1String( "FALSE" ) );
119  item.setPayload<KABC::Addressee>( contact );
120  Akonadi::ItemModifyJob *job = new Akonadi::ItemModifyJob( item );
121  q->connect( job, SIGNAL(result(KJob*)), SLOT(slotAddModifyContactDone(KJob*)) );
122  }
123  }
124 
125  void createContact()
126  {
127  const QStringList mimeTypes( KABC::Addressee::mimeType() );
128 
129  Akonadi::CollectionFetchJob * const addressBookJob =
130  new Akonadi::CollectionFetchJob( Akonadi::Collection::root(),
131  Akonadi::CollectionFetchJob::Recursive );
132 
133  addressBookJob->fetchScope().setContentMimeTypes( mimeTypes );
134  q->connect( addressBookJob, SIGNAL(result(KJob*)), SLOT(slotCollectionsFetched(KJob*)) );
135  }
136 
137  void slotCollectionsFetched( KJob *job )
138  {
139  if ( job->error() ) {
140  q->setError( job->error() );
141  q->setErrorText( job->errorText() );
142  q->emitResult();
143  return;
144  }
145 
146  const Akonadi::CollectionFetchJob *addressBookJob =
147  qobject_cast<Akonadi::CollectionFetchJob*>( job );
148 
149  Akonadi::Collection::List canCreateItemCollections ;
150 
151  foreach ( const Akonadi::Collection &collection, addressBookJob->collections() ) {
152  if ( Akonadi::Collection::CanCreateItem & collection.rights() ) {
153  canCreateItemCollections.append(collection);
154  }
155  }
156 
157  Akonadi::Collection addressBook;
158 
159  const int nbItemCollection( canCreateItemCollections.size() );
160  if ( nbItemCollection == 0 ) {
161  if(KMessageBox::questionYesNo(
162  mParentWidget,
163  i18nc( "@info",
164  "You must create an address book before adding a contact. Do you want to create an address book?" ),
165  i18nc( "@title:window", "No Address Book Available" ) ) == KMessageBox::Yes) {
166  Akonadi::AgentTypeDialog dlg( mParentWidget );
167  dlg.setCaption( i18n("Add Address Book") );
168  dlg.agentFilterProxyModel()->addMimeTypeFilter(KABC::Addressee::mimeType());
169  dlg.agentFilterProxyModel()->addMimeTypeFilter(KABC::ContactGroup::mimeType());
170  dlg.agentFilterProxyModel()->addCapabilityFilter( QLatin1String( "Resource" ) );
171 
172  if ( dlg.exec() ) {
173  const Akonadi::AgentType agentType = dlg.agentType();
174 
175  if ( agentType.isValid() ) {
176  Akonadi::AgentInstanceCreateJob *job = new Akonadi::AgentInstanceCreateJob( agentType, q );
177  q->connect( job, SIGNAL(result(KJob*)), SLOT(slotResourceCreationDone(KJob*)) );
178  job->configure( mParentWidget );
179  job->start();
180  return;
181  } else { //if agent is not valid => return error and finish job
182  q->setError( UserDefinedError );
183  q->emitResult();
184  return;
185  }
186  } else { //Canceled create agent => return error and finish job
187  q->setError( UserDefinedError );
188  q->emitResult();
189  return;
190  }
191  } else {
192  q->setError( UserDefinedError );
193  q->emitResult();
194  return;
195  }
196  } else if ( nbItemCollection == 1 ) {
197  addressBook = canCreateItemCollections[0];
198  } else {
199  // ask user in which address book the new contact shall be stored
200  QPointer<SelectedCollectionDialog> dlg = new SelectedCollectionDialog( mParentWidget );
201 
202  bool gotIt = true;
203  if ( dlg->exec() ) {
204  addressBook = dlg->selectedCollection();
205  } else {
206  q->setError( UserDefinedError );
207  q->emitResult();
208  gotIt = false;
209  }
210  delete dlg;
211  if ( !gotIt ) {
212  return;
213  }
214  }
215 
216  if ( !addressBook.isValid() ) {
217  q->setError( UserDefinedError );
218  q->emitResult();
219  return;
220  }
221  KABC::Addressee contact;
222  contact.setNameFromString( mName );
223  contact.insertEmail( mEmail, true );
224  contact.insertCustom( QLatin1String( "KADDRESSBOOK" ), QLatin1String( "MailPreferedFormatting" ), mShowAsHTML ? QLatin1String("HTML") : QLatin1String("TEXT") );
225  contact.insertCustom( QLatin1String( "KADDRESSBOOK" ), QLatin1String( "MailAllowToRemoteContent" ), mRemoteContent ? QLatin1String( "TRUE" ) : QLatin1String( "FALSE" ) );
226 
227  // create the new item
228  Akonadi::Item item;
229  item.setMimeType( KABC::Addressee::mimeType() );
230  item.setPayload<KABC::Addressee>( contact );
231 
232  // save the new item in akonadi storage
233  Akonadi::ItemCreateJob *createJob = new Akonadi::ItemCreateJob( item, addressBook, q );
234  q->connect( createJob, SIGNAL(result(KJob*)), SLOT(slotAddModifyContactDone(KJob*)) );
235  }
236 
237  void slotAddModifyContactDone( KJob *job )
238  {
239  if ( job->error() ) {
240  q->setError( job->error() );
241  q->setErrorText( job->errorText() );
242  }
243  q->emitResult();
244  }
245 
246  AddEmailDiplayJob *q;
247  Akonadi::Item contact;
248  bool mShowAsHTML;
249  bool mRemoteContent;
250  QString mCompleteAddress;
251  QString mEmail;
252  QString mName;
253  QWidget *mParentWidget;
254 };
255 
256 AddEmailDiplayJob::AddEmailDiplayJob( const QString &email, QWidget *parentWidget, QObject *parent )
257  : KJob( parent ), d( new Private( this, email, parentWidget ) )
258 {
259 }
260 
261 AddEmailDiplayJob::~AddEmailDiplayJob()
262 {
263  delete d;
264 }
265 
266 void AddEmailDiplayJob::setShowAsHTML(bool html)
267 {
268  d->mShowAsHTML = html;
269 }
270 
271 void AddEmailDiplayJob::setRemoteContent(bool b)
272 {
273  d->mRemoteContent = b;
274 }
275 
276 void AddEmailDiplayJob::setContact(const Akonadi::Item &contact)
277 {
278  d->contact = contact;
279 }
280 
281 void AddEmailDiplayJob::start()
282 {
283  if (d->contact.isValid()) {
284  d->modifyContact();
285  } else {
286  d->searchContact();
287  }
288 }
289 
290 #include "addemaildisplayjob.moc"
KPIM::AddEmailDiplayJob
Definition: addemaildisplayjob.h:33
selectedcollectiondialog.h
QWidget
QObject
KPIM::AddEmailDiplayJob::AddEmailDiplayJob
AddEmailDiplayJob(const QString &email, QWidget *parentWidget, QObject *parent=0)
Definition: addemaildisplayjob.cpp:256
addemaildisplayjob.h
KPIM::AddEmailDiplayJob::~AddEmailDiplayJob
~AddEmailDiplayJob()
Definition: addemaildisplayjob.cpp:261
KPIM::AddEmailDiplayJob::setContact
void setContact(const Akonadi::Item &contact)
Definition: addemaildisplayjob.cpp:276
KPIM::SelectedCollectionDialog
Definition: selectedcollectiondialog.h:36
KPIM::AddEmailDiplayJob::setRemoteContent
void setRemoteContent(bool b)
Definition: addemaildisplayjob.cpp:271
KPIM::AddEmailDiplayJob::setShowAsHTML
void setShowAsHTML(bool html)
Definition: addemaildisplayjob.cpp:266
KPIM::AddEmailDiplayJob::start
virtual void start()
Definition: addemaildisplayjob.cpp:281
broadcaststatus.h
KJob
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:03 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkdepim

Skip menu "libkdepim"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal