32 #include <xqconversions.h> |
32 #include <xqconversions.h> |
33 |
33 |
34 // USER INCLUDES |
34 // USER INCLUDES |
35 #include "debugtraces.h" |
35 #include "debugtraces.h" |
36 #include "msgunieditoraddress.h" |
36 #include "msgunieditoraddress.h" |
37 #include "msgunifiededitorlineedit.h" |
37 #include "msgunieditorlineedit.h" |
38 #include "msgmonitor.h" |
38 #include "msgunieditormonitor.h" |
39 #include "unieditorgenutils.h" |
39 #include "UniEditorGenUtils.h" |
40 |
40 |
41 const QString PBK_ICON("qtg_mono_contacts"); |
41 const QString PBK_ICON("qtg_mono_contacts"); |
42 const QString SEND_ICON("qtg_mono_send"); |
42 const QString SEND_ICON("qtg_mono_send"); |
43 const QString replacementStr("; "); |
43 const QString REPLACEMENT_STR("; "); |
|
44 const QString COMMA_SEPERATOR(","); |
44 |
45 |
45 // Constants |
46 // Constants |
46 const int KDefaultGsmNumberMatchLength = 7; //matching unique ph numbers |
47 const int KDefaultGsmNumberMatchLength = 7; //matching unique ph numbers |
47 #define LOC_SMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dialog_number_of_recipients_exceeded") |
48 #define LOC_SMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dialog_number_of_recipients_exceeded") |
48 #define LOC_MMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dpopinfo_unable_to_add_more_recipien") |
49 #define LOC_MMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dpopinfo_unable_to_add_more_recipien") |
49 #define LOC_DIALOG_OK hbTrId("txt_common_button_ok") |
50 #define LOC_DIALOG_OK hbTrId("txt_common_button_ok") |
50 #define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel") |
51 #define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel") |
51 #define LOC_INVALID_RECIPIENT hbTrId("txt_messaging_dialog_invalid_recipient_found") |
52 #define LOC_INVALID_RECIPIENT hbTrId("txt_messaging_dialog_invalid_recipient_found") |
|
53 #define LOC_INVALID_RECIPIENT_NOT_ADDED hbTrId("txt_messaging_dialog_invalid_recipient_not_added") |
|
54 #define LOC_INVALID_RECIPIENTS_NOT_ADDED hbTrId("txt_messaging_dialog_invalid_recipients_not_added") |
|
55 |
|
56 |
|
57 |
|
58 |
52 |
59 |
53 MsgUnifiedEditorAddress::MsgUnifiedEditorAddress( const QString& label, |
60 MsgUnifiedEditorAddress::MsgUnifiedEditorAddress( const QString& label, |
54 QGraphicsItem *parent ) : |
61 QGraphicsItem *parent ) : |
55 MsgUnifiedEditorBaseWidget(parent), |
62 MsgUnifiedEditorBaseWidget(parent), |
56 mSkipMaxRecipientQuery(false), |
63 mSkipMaxRecipientQuery(false), |
88 //style()->unregisterPlugin(mPluginPath); |
95 //style()->unregisterPlugin(mPluginPath); |
89 } |
96 } |
90 |
97 |
91 void MsgUnifiedEditorAddress::fetchContacts() |
98 void MsgUnifiedEditorAddress::fetchContacts() |
92 { |
99 { |
|
100 mLaunchBtn->blockSignals(true); |
|
101 |
93 QList<QVariant> args; |
102 QList<QVariant> args; |
94 QString serviceName("com.nokia.services.phonebookservices"); |
103 QString serviceName("com.nokia.services.phonebookservices"); |
95 QString operation("fetch(QString,QString,QString)"); |
104 QString operation("fetch(QString,QString,QString)"); |
96 XQAiwRequest* request; |
105 XQAiwRequest* request; |
97 XQApplicationManager appManager; |
106 XQApplicationManager appManager; |
195 mAboutToExceedMaxMmsRecipients = false; |
207 mAboutToExceedMaxMmsRecipients = false; |
196 mExceedsMaxMmsRecipientsBy = 0; |
208 mExceedsMaxMmsRecipientsBy = 0; |
197 |
209 |
198 // first, we check if MMS max-recipient count will exceed |
210 // first, we check if MMS max-recipient count will exceed |
199 int count = addrlist.count(); |
211 int count = addrlist.count(); |
200 int futureCount = count + MsgMonitor::msgAddressCount(); |
212 int futureCount = count + MsgUnifiedEditorMonitor::msgAddressCount(); |
201 if(futureCount > MsgMonitor::maxMmsRecipients()) |
213 if(futureCount > MsgUnifiedEditorMonitor::maxMmsRecipients()) |
202 { |
214 { |
203 mAboutToExceedMaxMmsRecipients = true; |
215 mAboutToExceedMaxMmsRecipients = true; |
204 mExceedsMaxMmsRecipientsBy = |
216 mExceedsMaxMmsRecipientsBy = |
205 futureCount - MsgMonitor::maxMmsRecipients(); |
217 futureCount - MsgUnifiedEditorMonitor::maxMmsRecipients(); |
206 } |
218 } |
207 // else, check if SMS max-recipient count will exceed |
219 // else, check if SMS max-recipient count will exceed |
208 else if(!mSkipMaxRecipientQuery) |
220 else if(!mSkipMaxRecipientQuery) |
209 { |
221 { |
210 futureCount = count + addressCount(); |
222 futureCount = count + addressCount(); |
211 if( (addressCount() <= MsgMonitor::maxSmsRecipients()) && |
223 if( (addressCount() <= MsgUnifiedEditorMonitor::maxSmsRecipients()) && |
212 (futureCount > MsgMonitor::maxSmsRecipients()) ) |
224 (futureCount > MsgUnifiedEditorMonitor::maxSmsRecipients()) ) |
213 { |
225 { |
214 mAboutToExceedMaxSmsRecipients = true; |
226 mAboutToExceedMaxSmsRecipients = true; |
215 } |
227 } |
216 } |
228 } |
217 |
229 |
218 |
230 int invalidCount= 0; |
|
231 QString invalidContacts; |
219 for(int i = 0; i < count; i++ ) |
232 for(int i = 0; i < count; i++ ) |
220 { |
233 { |
221 mAddressMap.insertMulti(addrlist[i]->address(), addrlist[i]->alias()); |
234 bool isValid = false; |
222 if(!addrlist[i]->alias().isEmpty()) |
235 isValid = checkValidAddress(addrlist.at(i)->address()); |
223 { |
236 if(!isValid) |
224 mAddressEdit->setText(addrlist[i]->alias()); |
237 { |
225 } |
238 invalidCount ++; |
226 else |
239 // append the comma till last but one contact. |
227 { |
240 // add the invalid ocntacts to the " , " seperated string. |
228 mAddressEdit->setText(addrlist[i]->address(), false); |
241 if(invalidCount > 1) |
229 } |
242 { |
230 } |
243 invalidContacts.append(COMMA_SEPERATOR); |
|
244 } |
|
245 invalidContacts.append(addrlist.at(i)->alias()); |
|
246 } |
|
247 else |
|
248 { |
|
249 mAddressMap.insertMulti(addrlist[i]->address(), addrlist[i]->alias()); |
|
250 if(!addrlist[i]->alias().isEmpty()) |
|
251 { |
|
252 mAddressEdit->setText(addrlist[i]->alias()); |
|
253 } |
|
254 else |
|
255 { |
|
256 mAddressEdit->setText(addrlist[i]->address(), false); |
|
257 } |
|
258 } |
|
259 |
|
260 } |
|
261 if(invalidCount) |
|
262 { |
|
263 QString invalidStr; |
|
264 (invalidCount == 1)?(invalidStr = QString(LOC_INVALID_RECIPIENT_NOT_ADDED)) :(invalidStr = QString(LOC_INVALID_RECIPIENTS_NOT_ADDED)); |
|
265 // append line seperator |
|
266 invalidStr.append("<br>"); |
|
267 invalidStr.append(invalidContacts); |
|
268 HbMessageBox::information(invalidStr); |
|
269 } |
231 |
270 |
232 // addition operation complete, reset flags |
271 // addition operation complete, reset flags |
233 mAboutToExceedMaxSmsRecipients = false; |
272 mAboutToExceedMaxSmsRecipients = false; |
234 mAboutToExceedMaxMmsRecipients = false; |
273 mAboutToExceedMaxMmsRecipients = false; |
235 mExceedsMaxMmsRecipientsBy = 0; |
274 mExceedsMaxMmsRecipientsBy = 0; |
254 |
293 |
255 void MsgUnifiedEditorAddress::onContentsChanged(const QString& text) |
294 void MsgUnifiedEditorAddress::onContentsChanged(const QString& text) |
256 { |
295 { |
257 // Max MMS recipient count check |
296 // Max MMS recipient count check |
258 if( mAboutToExceedMaxMmsRecipients || |
297 if( mAboutToExceedMaxMmsRecipients || |
259 (MsgMonitor::msgAddressCount() >= MsgMonitor::maxMmsRecipients()) ) |
298 (MsgUnifiedEditorMonitor::msgAddressCount() >= MsgUnifiedEditorMonitor::maxMmsRecipients()) ) |
260 { |
299 { |
261 if(mAboutToExceedMaxMmsRecipients) |
300 if(mAboutToExceedMaxMmsRecipients) |
262 {// show discreet note only once |
301 {// show discreet note only once |
263 --mExceedsMaxMmsRecipientsBy; |
302 --mExceedsMaxMmsRecipientsBy; |
264 if(!mExceedsMaxMmsRecipientsBy) |
303 if(!mExceedsMaxMmsRecipientsBy) |
288 return; |
327 return; |
289 } |
328 } |
290 |
329 |
291 // Max SMS recipient count check |
330 // Max SMS recipient count check |
292 if( !mSkipMaxRecipientQuery && |
331 if( !mSkipMaxRecipientQuery && |
293 (MsgMonitor::messageType() == ConvergedMessage::Sms) && |
332 (MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Sms) && |
294 (mAddressEdit->addresses().count() > MsgMonitor::maxSmsRecipients()) ) |
333 (mAddressEdit->addresses().count() > MsgUnifiedEditorMonitor::maxSmsRecipients()) ) |
295 { |
334 { |
296 // when we show this dialog, we don't want the intermediate states |
335 // when we show this dialog, we don't want the intermediate states |
297 // to be signalled to us |
336 // to be signalled to us |
298 disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)), |
337 disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)), |
299 this, SLOT(onContentsChanged(const QString&))); |
338 this, SLOT(onContentsChanged(const QString&))); |
412 // to be signalled to us |
451 // to be signalled to us |
413 disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)), |
452 disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)), |
414 this, SLOT(onContentsChanged(const QString&))); |
453 this, SLOT(onContentsChanged(const QString&))); |
415 |
454 |
416 mAddressEdit->clearContent(); |
455 mAddressEdit->clearContent(); |
417 QStringList list = mPrevBuffer.split(replacementStr, |
456 QStringList list = mPrevBuffer.split(REPLACEMENT_STR, |
418 QString::SkipEmptyParts); |
457 QString::SkipEmptyParts); |
419 int count = list.count(); |
458 int count = list.count(); |
420 QStringList valList = mAddressMap.values(); |
459 QStringList valList = mAddressMap.values(); |
421 for(int i=0; i<count; i++) |
460 for(int i=0; i<count; i++) |
422 { |
461 { |
465 syncAdditionsToMap(); |
504 syncAdditionsToMap(); |
466 |
505 |
467 // get the list of contacts in address-field |
506 // get the list of contacts in address-field |
468 QStringList fieldAddresses(mAddressEdit->addresses()); |
507 QStringList fieldAddresses(mAddressEdit->addresses()); |
469 |
508 |
470 bool allValid = true; |
509 bool isValid = true; |
471 foreach(QString addr, fieldAddresses) |
510 foreach(QString addr, fieldAddresses) |
472 { |
511 { |
473 // run address validation only if address is unmapped |
512 // run address validation only if address is unmapped |
474 // (i.e. user-inserted) |
513 // (i.e. user-inserted) |
475 if(mAddressMap.contains(addr)) |
514 if(mAddressMap.contains(addr)) |
476 { |
515 { |
477 // 1. perform number validation |
516 isValid = checkValidAddress(addr); |
478 allValid = CommonPhoneParser::IsValidPhoneNumber( |
517 if(!isValid) |
479 *XQConversions::qStringToS60Desc(addr), |
|
480 CommonPhoneParser::ESMSNumber ); |
|
481 |
|
482 // 2. if number validity fails, then perform email addr validation |
|
483 if( !allValid && |
|
484 (MsgMonitor::messageType() == ConvergedMessage::Mms) ) |
|
485 { // additional check for MMS only |
|
486 allValid = genUtils->IsValidEmailAddress( |
|
487 *XQConversions::qStringToS60Desc(addr) ); |
|
488 } |
|
489 |
|
490 if(!allValid) |
|
491 { |
518 { |
492 mAddressEdit->highlightInvalidString(addr); |
519 mAddressEdit->highlightInvalidString(addr); |
493 QString invalidAddrStr = |
520 QString invalidAddrStr = |
494 QString(LOC_INVALID_RECIPIENT).arg(addr); |
521 QString(LOC_INVALID_RECIPIENT).arg(addr); |
495 HbMessageBox* dlg = new HbMessageBox(invalidAddrStr, |
522 HbMessageBox* dlg = new HbMessageBox(invalidAddrStr, |
500 dlg->open(this, SLOT(handleInvalidContactDialog(HbAction*))); |
527 dlg->open(this, SLOT(handleInvalidContactDialog(HbAction*))); |
501 break; |
528 break; |
502 } |
529 } |
503 } |
530 } |
504 } |
531 } |
|
532 |
|
533 return isValid; |
|
534 } |
|
535 // ---------------------------------------------------------------------------- |
|
536 // MsgUnifiedEditorAddress::checkValidAddress |
|
537 // @see header |
|
538 // ---------------------------------------------------------------------------- |
|
539 bool MsgUnifiedEditorAddress::checkValidAddress(const QString& addr) |
|
540 { |
|
541 bool isValid = false; |
|
542 // 1. perform number validation |
|
543 isValid = CommonPhoneParser::IsValidPhoneNumber( |
|
544 *XQConversions::qStringToS60Desc(addr), |
|
545 CommonPhoneParser::ESMSNumber ); |
|
546 |
|
547 // 2. if number validity fails, then perform email addr validation |
|
548 UniEditorGenUtils* genUtils = new UniEditorGenUtils; |
|
549 if( !isValid && |
|
550 ( MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms) ) |
|
551 { // additional check for MMS only |
|
552 isValid = genUtils->IsValidEmailAddress( |
|
553 *XQConversions::qStringToS60Desc(addr) ); |
|
554 } |
505 delete genUtils; |
555 delete genUtils; |
506 return allValid; |
556 return isValid; |
507 } |
557 } |
508 |
558 |
509 void MsgUnifiedEditorAddress::handleInvalidContactDialog( |
559 void MsgUnifiedEditorAddress::handleInvalidContactDialog( |
510 HbAction* act) |
560 HbAction* act) |
511 { |
561 { |
512 Q_UNUSED(act); |
562 Q_UNUSED(act); |
513 QTimer::singleShot(250, this, SLOT(setFocus())); |
563 QTimer::singleShot(250, this, SLOT(setFocus())); |
514 } |
564 } |
515 |
565 |
|
566 void MsgUnifiedEditorAddress::unblockSignals() |
|
567 { |
|
568 mLaunchBtn->blockSignals(false); |
|
569 } |
|
570 |
516 Q_IMPLEMENT_USER_METATYPE(CntServicesContact) |
571 Q_IMPLEMENT_USER_METATYPE(CntServicesContact) |
517 Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList) |
572 Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList) |
518 |
573 |
519 //EOF |
574 //EOF |