emailuis/nmailui/src/nmuriserviceinterface.cpp
author hgs
Fri, 28 May 2010 13:56:43 +0300
changeset 43 99bcbff212ad
child 47 f83bd4ae1fe3
permissions -rw-r--r--
201021
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: NMail Application Launcher interface used for interfacing between
hgs
parents:
diff changeset
    15
*              QT highway and other applications
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
//  INCLUDES
hgs
parents:
diff changeset
    20
#include <xqaiwdecl.h>
hgs
parents:
diff changeset
    21
#include "nmuiheaders.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
/*!
hgs
parents:
diff changeset
    24
    \class NmStartParamDataHelper
hgs
parents:
diff changeset
    25
    \brief A helper class for processing the data given to the actual service.
hgs
parents:
diff changeset
    26
*/
hgs
parents:
diff changeset
    27
class NmStartParamDataHelper
hgs
parents:
diff changeset
    28
{
hgs
parents:
diff changeset
    29
public:
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
    /*!
hgs
parents:
diff changeset
    32
        Class constructor.
hgs
parents:
diff changeset
    33
    */
hgs
parents:
diff changeset
    34
    inline NmStartParamDataHelper()
hgs
parents:
diff changeset
    35
    : mSubject(0),
hgs
parents:
diff changeset
    36
      mToAddresses(0),
hgs
parents:
diff changeset
    37
      mCcAddresses(0),
hgs
parents:
diff changeset
    38
      mBccAddresses(0)
hgs
parents:
diff changeset
    39
    {
hgs
parents:
diff changeset
    40
        NM_FUNCTION;
hgs
parents:
diff changeset
    41
    }
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
    /*!
hgs
parents:
diff changeset
    44
        Class destructor.
hgs
parents:
diff changeset
    45
    */
hgs
parents:
diff changeset
    46
    inline ~NmStartParamDataHelper()
hgs
parents:
diff changeset
    47
    {
hgs
parents:
diff changeset
    48
        NM_FUNCTION;
hgs
parents:
diff changeset
    49
    }
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
    /*!
hgs
parents:
diff changeset
    52
        Extracts the data from the given QString into the class members.
hgs
parents:
diff changeset
    53
        \param data QString containing the data.
hgs
parents:
diff changeset
    54
        \return True if success, false otherwise.
hgs
parents:
diff changeset
    55
    */
hgs
parents:
diff changeset
    56
    inline bool extractData(const QString &data)
hgs
parents:
diff changeset
    57
    {
hgs
parents:
diff changeset
    58
        NM_FUNCTION;
hgs
parents:
diff changeset
    59
        
hgs
parents:
diff changeset
    60
        bool success = false;
hgs
parents:
diff changeset
    61
        
hgs
parents:
diff changeset
    62
        QUrl uri(data);
hgs
parents:
diff changeset
    63
        
hgs
parents:
diff changeset
    64
        if (uri.isValid()) {
hgs
parents:
diff changeset
    65
            
hgs
parents:
diff changeset
    66
            mSubject = new QString(uri.queryItemValue(emailSendSubjectKey));
hgs
parents:
diff changeset
    67
            QString to = uri.path();
hgs
parents:
diff changeset
    68
            QString cc = uri.queryItemValue(emailSendCcKey);
hgs
parents:
diff changeset
    69
            QString bcc = uri.queryItemValue(emailSendBccKey);
hgs
parents:
diff changeset
    70
            
hgs
parents:
diff changeset
    71
            addAddressesToList(to, &mToAddresses);
hgs
parents:
diff changeset
    72
            addAddressesToList(cc, &mCcAddresses);
hgs
parents:
diff changeset
    73
            addAddressesToList(bcc, &mBccAddresses);
hgs
parents:
diff changeset
    74
            
hgs
parents:
diff changeset
    75
            success = true;
hgs
parents:
diff changeset
    76
        }
hgs
parents:
diff changeset
    77
        
hgs
parents:
diff changeset
    78
        return success;
hgs
parents:
diff changeset
    79
    }
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
    /*!
hgs
parents:
diff changeset
    82
        Appends the given addresses into the given list.
hgs
parents:
diff changeset
    83
        \param address The addresses to append.
hgs
parents:
diff changeset
    84
        \param list The list where the addresses are appended to.
hgs
parents:
diff changeset
    85
    */
hgs
parents:
diff changeset
    86
    inline void addAddressesToList(QString &addresses,
hgs
parents:
diff changeset
    87
                                   QList<NmAddress*> **list)
hgs
parents:
diff changeset
    88
    {
hgs
parents:
diff changeset
    89
        NM_FUNCTION;
hgs
parents:
diff changeset
    90
        
hgs
parents:
diff changeset
    91
        if (!addresses.isEmpty()) {
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
            QList<NmAddress*> foundAddresses;
hgs
parents:
diff changeset
    94
                    
hgs
parents:
diff changeset
    95
            // Process multiple addresses.
hgs
parents:
diff changeset
    96
            if (addresses.contains(",")) {
hgs
parents:
diff changeset
    97
                QString str;               
hgs
parents:
diff changeset
    98
                while (addresses.contains(",")) {
hgs
parents:
diff changeset
    99
                    str = addresses.section(",", 0, 0); // Get the occurance.
hgs
parents:
diff changeset
   100
                    addresses.remove(0, (addresses.indexOf(",")+1)); // Remove the occurance.
hgs
parents:
diff changeset
   101
                    if (!str.isEmpty()) { // In case str would be empty on some error data. 
hgs
parents:
diff changeset
   102
                        NmAddress *address = new NmAddress(str);
hgs
parents:
diff changeset
   103
                        foundAddresses.append(address);    
hgs
parents:
diff changeset
   104
                    }
hgs
parents:
diff changeset
   105
                }
hgs
parents:
diff changeset
   106
            }
hgs
parents:
diff changeset
   107
            if (!addresses.isEmpty()) { // In case addresses would be empty on some error data. 
hgs
parents:
diff changeset
   108
                // Last one or single address.
hgs
parents:
diff changeset
   109
                NmAddress *address = new NmAddress(addresses);
hgs
parents:
diff changeset
   110
                foundAddresses.append(address);
hgs
parents:
diff changeset
   111
            }
hgs
parents:
diff changeset
   112
            // Append the found addresses into the given list.
hgs
parents:
diff changeset
   113
            *list = new QList<NmAddress*>();
hgs
parents:
diff changeset
   114
            (*list)->append(foundAddresses);
hgs
parents:
diff changeset
   115
        }
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
        
hgs
parents:
diff changeset
   118
    /*!
hgs
parents:
diff changeset
   119
        Deletes the class members. Must be used if NmUiStartParam does not
hgs
parents:
diff changeset
   120
        take ownership of the members.
hgs
parents:
diff changeset
   121
    */
hgs
parents:
diff changeset
   122
    inline void deleteData()
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
        NM_FUNCTION;
hgs
parents:
diff changeset
   125
        
hgs
parents:
diff changeset
   126
        delete mSubject;
hgs
parents:
diff changeset
   127
        mSubject = 0;
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
        if (mToAddresses) {
hgs
parents:
diff changeset
   130
            qDeleteAll(*mToAddresses);
hgs
parents:
diff changeset
   131
            delete mToAddresses;
hgs
parents:
diff changeset
   132
            mToAddresses = 0;
hgs
parents:
diff changeset
   133
        }
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
        if (mCcAddresses) {
hgs
parents:
diff changeset
   136
            qDeleteAll(*mCcAddresses);
hgs
parents:
diff changeset
   137
            delete mCcAddresses;
hgs
parents:
diff changeset
   138
            mCcAddresses = 0;
hgs
parents:
diff changeset
   139
        }
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
        if (mBccAddresses) {
hgs
parents:
diff changeset
   142
            qDeleteAll(*mBccAddresses);
hgs
parents:
diff changeset
   143
            delete mBccAddresses;
hgs
parents:
diff changeset
   144
            mBccAddresses = 0;
hgs
parents:
diff changeset
   145
        }
hgs
parents:
diff changeset
   146
    }
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
public: // Data
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
    QString *mSubject; // Not owned.
hgs
parents:
diff changeset
   151
    QList<NmAddress*> *mToAddresses; // Not owned.
hgs
parents:
diff changeset
   152
    QList<NmAddress*> *mCcAddresses; // Not owned.
hgs
parents:
diff changeset
   153
    QList<NmAddress*> *mBccAddresses; // Not owned.
hgs
parents:
diff changeset
   154
};
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
/*!
hgs
parents:
diff changeset
   157
    \class NmUriServiceInterface
hgs
parents:
diff changeset
   158
    \brief NMail application service interface which provides an email sending
hgs
parents:
diff changeset
   159
           interface for other application using the Qt Highway.
hgs
parents:
diff changeset
   160
*/
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
/*!
hgs
parents:
diff changeset
   163
    Class constructor.
hgs
parents:
diff changeset
   164
*/
hgs
parents:
diff changeset
   165
NmUriServiceInterface::NmUriServiceInterface(QObject *parent,
hgs
parents:
diff changeset
   166
                                               NmUiEngine &uiEngine,
hgs
parents:
diff changeset
   167
                                               NmApplication *application)
hgs
parents:
diff changeset
   168
#ifndef NM_WINS_ENV
hgs
parents:
diff changeset
   169
    : XQServiceProvider(emailServiceName+"."+XQI_URI_VIEW, parent),
hgs
parents:
diff changeset
   170
#else
hgs
parents:
diff changeset
   171
    : QObject(parent),
hgs
parents:
diff changeset
   172
#endif
hgs
parents:
diff changeset
   173
      mApplication(application),
hgs
parents:
diff changeset
   174
      mUiEngine(uiEngine),
hgs
parents:
diff changeset
   175
      mAsyncReqId(0),
hgs
parents:
diff changeset
   176
      mStartParam(NULL),
hgs
parents:
diff changeset
   177
      mSelectionDialog(NULL),
hgs
parents:
diff changeset
   178
      mCurrentView(NULL)
hgs
parents:
diff changeset
   179
{
hgs
parents:
diff changeset
   180
#ifndef NM_WINS_ENV
hgs
parents:
diff changeset
   181
    publishAll();
hgs
parents:
diff changeset
   182
#endif
hgs
parents:
diff changeset
   183
}
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
/*!
hgs
parents:
diff changeset
   187
    Class desctructor.
hgs
parents:
diff changeset
   188
*/
hgs
parents:
diff changeset
   189
NmUriServiceInterface::~NmUriServiceInterface()
hgs
parents:
diff changeset
   190
{
hgs
parents:
diff changeset
   191
    NM_FUNCTION;
hgs
parents:
diff changeset
   192
    
hgs
parents:
diff changeset
   193
    delete mStartParam;
hgs
parents:
diff changeset
   194
    delete mSelectionDialog;
hgs
parents:
diff changeset
   195
}
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
/*!
hgs
parents:
diff changeset
   199
    Queries the user for a mailbox to use.
hgs
parents:
diff changeset
   200
    \param mailboxId Where the ID of the selected mailbox is set.
hgs
parents:
diff changeset
   201
    \return True if a mailbox was selected, false otherwise.
hgs
parents:
diff changeset
   202
*/
hgs
parents:
diff changeset
   203
void NmUriServiceInterface::selectionDialogClosed(NmId &mailboxId)
hgs
parents:
diff changeset
   204
{
hgs
parents:
diff changeset
   205
    NM_FUNCTION;
hgs
parents:
diff changeset
   206
    
hgs
parents:
diff changeset
   207
    if (mailboxId.id()) { // mailbox selected
hgs
parents:
diff changeset
   208
        launchEditorView(mailboxId);
hgs
parents:
diff changeset
   209
    }
hgs
parents:
diff changeset
   210
    else {
hgs
parents:
diff changeset
   211
        cancelService();
hgs
parents:
diff changeset
   212
    }
hgs
parents:
diff changeset
   213
}
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
/*!
hgs
parents:
diff changeset
   217
    Used from external applications to handle mailto: uri's.
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
    \param data <mailto:> uri
hgs
parents:
diff changeset
   220
*/
hgs
parents:
diff changeset
   221
bool NmUriServiceInterface::view(const QString& uri)
hgs
parents:
diff changeset
   222
{
hgs
parents:
diff changeset
   223
    NM_FUNCTION;
hgs
parents:
diff changeset
   224
    
hgs
parents:
diff changeset
   225
#ifndef NM_WINS_ENV
hgs
parents:
diff changeset
   226
    
hgs
parents:
diff changeset
   227
    // Make sure that nmail stays background if user presses back in editorview
hgs
parents:
diff changeset
   228
    mApplication->updateVisibilityState();
hgs
parents:
diff changeset
   229
    
hgs
parents:
diff changeset
   230
    HbMainWindow *mainWindow = mApplication->mainWindow();
hgs
parents:
diff changeset
   231
    mCurrentView = mainWindow->currentView();
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
    // Hide the current view.
hgs
parents:
diff changeset
   234
    if (mCurrentView) {
hgs
parents:
diff changeset
   235
        mCurrentView->hide();
hgs
parents:
diff changeset
   236
    }
hgs
parents:
diff changeset
   237
    
hgs
parents:
diff changeset
   238
    // Check the given data.
hgs
parents:
diff changeset
   239
    NmStartParamDataHelper dataHelper;
hgs
parents:
diff changeset
   240
    bool validData = dataHelper.extractData(uri);
hgs
parents:
diff changeset
   241
     
hgs
parents:
diff changeset
   242
    NmMailboxListModel &mailboxListModel = mUiEngine.mailboxListModel();
hgs
parents:
diff changeset
   243
    const int count = mailboxListModel.rowCount();
hgs
parents:
diff changeset
   244
    NmId mailboxId(0);
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
    mAsyncReqId = setCurrentRequestAsync();
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
    if (!validData) {
hgs
parents:
diff changeset
   249
        // Failed to extract the data!
hgs
parents:
diff changeset
   250
        NM_ERROR(1,"NmUriServiceInterface::view(): failed to process the given data");
hgs
parents:
diff changeset
   251
        cancelService();
hgs
parents:
diff changeset
   252
    }
hgs
parents:
diff changeset
   253
    else if (count == 0) {
hgs
parents:
diff changeset
   254
        HbDeviceMessageBox note(hbTrId("txt_mail_dialog_no_mailboxes_defined"),
hgs
parents:
diff changeset
   255
                          HbMessageBox::MessageTypeInformation);
hgs
parents:
diff changeset
   256
        note.setTimeout(HbMessageBox::NoTimeout);
hgs
parents:
diff changeset
   257
        note.show();
hgs
parents:
diff changeset
   258
        cancelService();
hgs
parents:
diff changeset
   259
    }
hgs
parents:
diff changeset
   260
    else { // count > 0
hgs
parents:
diff changeset
   261
        // Make sure the NMail application is in the foreground.
hgs
parents:
diff changeset
   262
        XQServiceUtil::toBackground(false);
hgs
parents:
diff changeset
   263
        mainWindow->show();
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
    	mStartParam = new NmUiStartParam(
hgs
parents:
diff changeset
   266
        	NmUiViewMessageEditor,
hgs
parents:
diff changeset
   267
	        0, // account id
hgs
parents:
diff changeset
   268
	        0, // folder id
hgs
parents:
diff changeset
   269
    	    0, // message id
hgs
parents:
diff changeset
   270
    	    NmUiEditorMailto, // editor start mode
hgs
parents:
diff changeset
   271
	        dataHelper.mToAddresses, // address list
hgs
parents:
diff changeset
   272
    	    0, // attachment list
hgs
parents:
diff changeset
   273
        	true, // start as service
hgs
parents:
diff changeset
   274
	        dataHelper.mSubject, // message subject
hgs
parents:
diff changeset
   275
	        dataHelper.mCcAddresses, // list containing cc recipient addresses
hgs
parents:
diff changeset
   276
    	    dataHelper.mBccAddresses // list containing bcc recipient addresses
hgs
parents:
diff changeset
   277
	    );
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
        if (count == 1) {
hgs
parents:
diff changeset
   280
            // A single mailbox exists.
hgs
parents:
diff changeset
   281
            QModelIndex modelIndex = mailboxListModel.index(0, 0);
hgs
parents:
diff changeset
   282
            QVariant mailbox(mailboxListModel.data(modelIndex));
hgs
parents:
diff changeset
   283
            NmMailboxMetaData *mailboxMetaData = mailbox.value<NmMailboxMetaData*>();
hgs
parents:
diff changeset
   284
            mailboxId = mailboxMetaData->id();
hgs
parents:
diff changeset
   285
        	launchEditorView(mailboxId);
hgs
parents:
diff changeset
   286
        }
hgs
parents:
diff changeset
   287
        else { // count > 1
hgs
parents:
diff changeset
   288
            if (!mSelectionDialog) {
hgs
parents:
diff changeset
   289
                mSelectionDialog =
hgs
parents:
diff changeset
   290
                    new NmMailboxSelectionDialog(mUiEngine.mailboxListModel());
hgs
parents:
diff changeset
   291
            }
hgs
parents:
diff changeset
   292
            connect(mSelectionDialog,SIGNAL(selectionDialogClosed(NmId&)),
hgs
parents:
diff changeset
   293
                this,SLOT(selectionDialogClosed(NmId&)));
hgs
parents:
diff changeset
   294
            mSelectionDialog->open();
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
            // launch the editor when the dialog is closed
hgs
parents:
diff changeset
   297
        }
hgs
parents:
diff changeset
   298
    }
hgs
parents:
diff changeset
   299
    
hgs
parents:
diff changeset
   300
    return true;
hgs
parents:
diff changeset
   301
}
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
/*!
hgs
parents:
diff changeset
   304
    Called when mailbox id is known and editor can be opened
hgs
parents:
diff changeset
   305
    \param mailboxId mailbox using in editor
hgs
parents:
diff changeset
   306
 */
hgs
parents:
diff changeset
   307
void NmUriServiceInterface::launchEditorView(NmId mailboxId)
hgs
parents:
diff changeset
   308
{
hgs
parents:
diff changeset
   309
    NM_FUNCTION;
hgs
parents:
diff changeset
   310
    NM_COMMENT(QString("NmUriServiceInterface::launchEditorView(): mailboxId=%1").arg(mailboxId.id()));
hgs
parents:
diff changeset
   311
    
hgs
parents:
diff changeset
   312
    // Make the previous view visible again.
hgs
parents:
diff changeset
   313
    if (mCurrentView) {
hgs
parents:
diff changeset
   314
        mCurrentView->show();
hgs
parents:
diff changeset
   315
        mCurrentView = NULL;
hgs
parents:
diff changeset
   316
    }
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
    if (mStartParam) {
hgs
parents:
diff changeset
   319
        mStartParam->setMailboxId(mailboxId);
hgs
parents:
diff changeset
   320
        mApplication->enterNmUiView(mStartParam);
hgs
parents:
diff changeset
   321
        mStartParam = NULL; // ownership passed
hgs
parents:
diff changeset
   322
    }
hgs
parents:
diff changeset
   323
    completeRequest(mAsyncReqId, 1);
hgs
parents:
diff changeset
   324
    mAsyncReqId = 0;
hgs
parents:
diff changeset
   325
}
hgs
parents:
diff changeset
   326
hgs
parents:
diff changeset
   327
void NmUriServiceInterface::cancelService()
hgs
parents:
diff changeset
   328
{
hgs
parents:
diff changeset
   329
    NM_FUNCTION;
hgs
parents:
diff changeset
   330
    
hgs
parents:
diff changeset
   331
    delete mStartParam;
hgs
parents:
diff changeset
   332
    mStartParam = NULL;
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
    // If the service was started as embedded, do not hide the app.
hgs
parents:
diff changeset
   335
    if (!XQServiceUtil::isEmbedded()) {
hgs
parents:
diff changeset
   336
        XQServiceUtil::toBackground(true);
hgs
parents:
diff changeset
   337
    }
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
    completeRequest(mAsyncReqId, 0);
hgs
parents:
diff changeset
   340
    mAsyncReqId = 0;
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
    // If started as service, the application must be closed now.
hgs
parents:
diff changeset
   343
    if (XQServiceUtil::isService()) {
hgs
parents:
diff changeset
   344
        connect(this, SIGNAL(returnValueDelivered()),
hgs
parents:
diff changeset
   345
            mApplication, SLOT(delayedExitApplication()));
hgs
parents:
diff changeset
   346
    }
hgs
parents:
diff changeset
   347
    else {
hgs
parents:
diff changeset
   348
        // Make the previous view visible again
hgs
parents:
diff changeset
   349
        if (mCurrentView) {
hgs
parents:
diff changeset
   350
            mCurrentView->show();
hgs
parents:
diff changeset
   351
            mCurrentView = NULL;
hgs
parents:
diff changeset
   352
        }
hgs
parents:
diff changeset
   353
    }
hgs
parents:
diff changeset
   354
}
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
#endif /* NM_WINS_ENV */
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
// End of file.