--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/nmailui/src/nmutilities.cpp Tue Aug 31 15:04:17 2010 +0300
@@ -0,0 +1,376 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: UI utilities class
+*
+*/
+
+#include "nmuiheaders.h"
+
+static const int NmMegabyte = 1048576;
+static const qreal NmMinAttachmentSize = 0.1;
+// taken from http://www.regular-expressions.info/email.html
+static const QRegExp NmEmailAddressPattern("[A-Za-z\\d!#$%&'*+/=?^_`{|}~-]+"
+ "(?:"
+ "\\."
+ "[A-Za-z\\d!#$%&'*+/=?^_`{|}~-]+"
+ ")*"
+ "@"
+ "(?:"
+ "[A-Za-z\\d]"
+ "(?:"
+ "[A-Za-z\\d-]*[A-Za-z\\d]"
+ ")?"
+ "\\."
+ ")+"
+ "[A-Za-z\\d]"
+ "(?:"
+ "[A-Za-z\\d-]*[A-Za-z\\d]"
+ ")?"
+ );
+
+/*!
+ Gets valid, invalid or all the recipients from a message
+ */
+void NmUtilities::getRecipientsFromMessage( const NmMessage &message,
+ QList<NmAddress> &recipients,
+ NmAddressValidationType type )
+{
+ NM_FUNCTION;
+
+ // Get envelope from message
+ const NmMessageEnvelope &env = message.envelope();
+
+ // validate TO addresses
+ QList<NmAddress> toRecipients = env.toRecipients();
+ int recipientCount = toRecipients.count();
+
+ for (int i = 0; i < recipientCount; ++i) {
+ bool validAddress = isValidEmailAddress(toRecipients.at(i).address());
+
+ if (type == NmDefault ||
+ type == NmValidAddress && validAddress ||
+ type == NmInvalidAddress && !validAddress) {
+ recipients.append(toRecipients.at(i));
+ }
+ }
+
+ // validate CC addresses
+ QList<NmAddress> ccRecipients = env.ccRecipients();
+ recipientCount = ccRecipients.count();
+
+ for (int i = 0; i < recipientCount; ++i) {
+ bool validAddress = isValidEmailAddress(ccRecipients.at(i).address());
+
+ if (type == NmDefault ||
+ type == NmValidAddress && validAddress ||
+ type == NmInvalidAddress && !validAddress) {
+ recipients.append(ccRecipients.at(i));
+ }
+ }
+
+ // validate BCC addresses
+ QList<NmAddress> bccRecipients = env.bccRecipients();
+ recipientCount = bccRecipients.count();
+
+ for (int i = 0; i < recipientCount; ++i) {
+ bool validAddress = isValidEmailAddress(bccRecipients.at(i).address());
+
+ if (type == NmDefault ||
+ type == NmValidAddress && validAddress ||
+ type == NmInvalidAddress && !validAddress) {
+ recipients.append(bccRecipients.at(i));
+ }
+ }
+}
+
+/*!
+ Validates the given string against an email address pattern.
+*/
+bool NmUtilities::isValidEmailAddress( const QString &emailAddress )
+{
+ NM_FUNCTION;
+
+ return NmEmailAddressPattern.exactMatch(emailAddress);
+}
+
+/*!
+ Generates a display string from an NmAddress object.
+*/
+QString NmUtilities::addressToDisplayName( const NmAddress &address )
+{
+ NM_FUNCTION;
+
+ QString emailAddress = address.address();
+ QString displayName = address.displayName();
+
+ QString ret;
+ if (displayName.length() > 0 && displayName != emailAddress) {
+ ret = displayName + " <" + emailAddress + ">";
+ }
+ else {
+ ret = emailAddress;
+ }
+ return ret;
+}
+
+/*!
+ Returns an NmAddress object that is parsed from a display name string.
+*/
+bool NmUtilities::parseEmailAddress( const QString &emailAddress, NmAddress &address )
+{
+ NM_FUNCTION;
+
+ bool foundAddress(false);
+
+ QRegExp rx(NmEmailAddressPattern);
+ // locate the email address in the string
+ int pos = rx.indexIn(emailAddress);
+ if (pos != -1) {
+ // extract the email address...
+ int matchedLen = rx.matchedLength();
+ QString addr = emailAddress.mid(pos, matchedLen);
+ address.setAddress(addr);
+
+ // ...and use the rest as display name
+ QString name = emailAddress.left(pos) + emailAddress.mid(pos + matchedLen);
+ address.setDisplayName(cleanupDisplayName(name));
+
+ foundAddress = true;
+ }
+
+ return foundAddress;
+}
+
+/*!
+ Cleans up display name by stripping extra characters from the beginning and end of the string.
+*/
+QString NmUtilities::cleanupDisplayName( const QString &displayName )
+{
+ NM_FUNCTION;
+
+ // find the first and last position that is NOT one of the characters below
+ QRegExp rx("[^\\s\"<>]");
+ int firstPos = std::max(rx.indexIn(displayName), 0);
+ int lastPos = rx.lastIndexIn(displayName);
+
+ if (lastPos < 0) {
+ lastPos = displayName.length() - 1;
+ }
+
+ return displayName.mid(firstPos, lastPos - firstPos + 1);
+}
+
+/*!
+ Opens file specified by XQSharableFile handle. Usually used by viewer
+ for opening attachments from message store as RFiles
+*/
+int NmUtilities::openFile(XQSharableFile &file)
+{
+ NM_FUNCTION;
+
+ int ret(NmNotFoundError);
+ XQApplicationManager aiwMgr;
+ XQAiwRequest *request(NULL);
+ request = aiwMgr.create(file);
+ // Create request for the sharable file
+ if (request)
+ {
+ // Set request arguments
+ QList<QVariant> args;
+ args << qVariantFromValue(file);
+ request->setArguments(args);
+ // Send the request, ownership of request is transferred
+ bool res = request->send();
+ if (res) {
+ // Request ok, set error status.
+ ret = NmNoError;
+ }
+ }
+ return ret;
+}
+
+/*!
+ * Truncate a string to a specific length. If length is less than
+ * the string, ellipses are added to the end of the string.
+ */
+QString NmUtilities::truncate( const QString &string, int length )
+{
+ NM_FUNCTION;
+
+ if (string.length() <= length) {
+ return string;
+ }
+
+ QString padding = "...";
+
+ return string.mid(0, length - padding.length()) + padding;
+}
+
+/*!
+ * Shows an error note. Used by at least editor and viewer classes.
+ *
+ */
+void NmUtilities::displayErrorNote(QString noteText)
+{
+ NM_FUNCTION;
+
+ HbNotificationDialog *note = new HbNotificationDialog();
+
+ note->setIcon(HbIcon(QLatin1String("note_warning")));
+ note->setTitle(noteText);
+ note->setTitleTextWrapping(Hb::TextWordWrap);
+ note->setDismissPolicy(HbPopup::TapAnywhere);
+ note->setAttribute(Qt::WA_DeleteOnClose);
+ note->setSequentialShow(false);
+
+ note->show();
+}
+
+/*!
+ Function returns localized attachment size string based
+ on attachment size in bytes
+ */
+QString NmUtilities::attachmentSizeString(const int sizeInBytes)
+{
+ NM_FUNCTION;
+
+ qreal sizeMb = (qreal)sizeInBytes / (qreal)NmMegabyte;
+ if (sizeMb < NmMinAttachmentSize) {
+ // NmMinAttachmentSize (0.1Mb) is the minimum size shown for attachment
+ sizeMb = NmMinAttachmentSize;
+ }
+ return QString().sprintf("(%.1f Mb)", sizeMb); // Use loc string when available
+}
+
+/*!
+ Displays a note with Yes/No buttons. Note has no timeout, i.e. it has to be dismissed manually.
+ Returns pointer to dialog so that caller can take ownership and handle deletion.
+ Parameter 'receiver' is the object and 'member' is the slot where user selection is passed.
+*/
+HbMessageBox* NmUtilities::displayQuestionNote(
+ QString noteText, QObject* receiver, const char* member)
+{
+ NM_FUNCTION;
+
+ HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
+ messageBox->setStandardButtons(HbMessageBox::Yes | HbMessageBox::No);
+ messageBox->setText(noteText);
+ messageBox->setTimeout(HbMessageBox::NoTimeout); // Note has to be dismissed manually
+ messageBox->open(receiver, member);
+ return messageBox;
+}
+
+/*!
+ * displays an warning note.
+ */
+HbMessageBox* NmUtilities::displayWarningNote(QString noteText, QObject* receiver, const char* member)
+{
+ NM_FUNCTION;
+
+ HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeWarning);
+ messageBox->setText(noteText);
+ messageBox->setTimeout(HbMessageBox::NoTimeout); // Note has to be dismissed manually
+ messageBox->open(receiver, member);
+ return messageBox;
+}
+
+/*!
+ Function returns localized "Original message" header
+ in html format based on envelope
+*/
+QString NmUtilities::createReplyHeader(const NmMessageEnvelope &env)
+{
+ NM_FUNCTION;
+
+ QString ret = "<html><body>";
+ // Two empty lines before reply header.
+ ret+="<br><br>";
+ // Append "----- Original message ----" text
+ ret+=hbTrId("txt_mail_editor_reply_original_msg");
+ // Append sender
+ ret+="<br>";
+ ret+=hbTrId("txt_mail_editor_reply_from");
+ ret+=" ";
+ if (env.sender().displayName().length()){
+ ret+=env.sender().displayName();
+ }
+ else{
+ ret+=env.sender().address();
+ }
+ // Append sent time
+ ret+="<br>";
+ ret+=hbTrId("txt_mail_editor_reply_sent");
+ ret+=" ";
+ HbExtendedLocale locale = HbExtendedLocale::system();
+ QDateTime localTime = env.sentTime().addSecs(locale.universalTimeOffset());
+ QDate sentLocalDate = localTime.date();
+ ret+=locale.format(sentLocalDate, r_qtn_date_usual);
+ // Append to recipients
+ const QList<NmAddress> &toList = env.toRecipients();
+ if (toList.count()){
+ ret+="<br>";
+ ret+=hbTrId("txt_mail_editor_reply_to");
+ ret+=" ";
+ for (int i=0;i<toList.count();i++){
+ if (toList[i].displayName().length()){
+ ret+=toList[i].displayName();
+ }
+ else{
+ ret+=toList[i].address();
+ }
+ if (i!=toList.count()-1){
+ ret+=";";
+ }
+ }
+ }
+ // Append cc recipients
+ const QList<NmAddress> &ccList = env.ccRecipients();
+ if (ccList.count()){
+ ret+="<br>";
+ ret+=hbTrId("txt_mail_editor_reply_cc");
+ ret+=" ";
+ for (int i=0;i<ccList.count();i++){
+ if (ccList[i].displayName().length()){
+ ret+=ccList[i].displayName();
+ }
+ else{
+ ret+=ccList[i].address();
+ }
+ if (i!=toList.count()-1){
+ ret+=";";
+ }
+ }
+ }
+ // Append subject if there is subject to display
+ if (env.subject().length()){
+ ret+="<br>";
+ ret+=hbTrId("txt_mail_editor_reply_subject");
+ ret+=" ";
+ ret+=env.subject();
+ }
+ // Append priority if it is other than normal
+ if (env.priority()!=NmMessagePriorityNormal){
+ ret+="<br>";
+ ret+=hbTrId("txt_mail_editor_reply_importance");
+ ret+=" ";
+ if (env.priority()==NmMessagePriorityLow){
+ ret+=hbTrId("txt_mail_editor_reply_importance_low");
+ }
+ else {
+ ret+=hbTrId("txt_mail_editor_reply_importance_high");
+ }
+ }
+ ret+="<br></body></html>";
+ return ret;
+}