messagingapp/msgui/appengine/tsrc/testconversationengine/src/testconversationengine.cpp
author hgs
Fri, 25 Jun 2010 15:47:40 +0530
changeset 37 518b245aa84c
permissions -rw-r--r--
201025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2009 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:
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
// INCLUDES
hgs
parents:
diff changeset
    19
#include "conversationsengine.h"
hgs
parents:
diff changeset
    20
#include "testconversationengine.h"
hgs
parents:
diff changeset
    21
#include "testconversationenginestub.h"
hgs
parents:
diff changeset
    22
#include "testconversationenginestub.h"
hgs
parents:
diff changeset
    23
#include "testconversationupdatehandler.h"
hgs
parents:
diff changeset
    24
#include <ccsclientconversation.h>
hgs
parents:
diff changeset
    25
#include <ccsconversationentry.h>
hgs
parents:
diff changeset
    26
#include <xqconversions.h>
hgs
parents:
diff changeset
    27
#include <conversationsenginedefines.h>
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
void TConversationEngine::initTestCase()
hgs
parents:
diff changeset
    31
{
hgs
parents:
diff changeset
    32
    iConvUpdateHandler = new TConversationUpdateHandler();
hgs
parents:
diff changeset
    33
    QVERIFY2(ConversationsEngine::instance() != NULL, "Appengine is not initialized.");
hgs
parents:
diff changeset
    34
    QVERIFY2(TestConversationEngineStub::Instance() != NULL, "Appengine Stub is not initialized.");
hgs
parents:
diff changeset
    35
    
hgs
parents:
diff changeset
    36
}
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
void TConversationEngine::init()
hgs
parents:
diff changeset
    39
{
hgs
parents:
diff changeset
    40
    // allocate, setup the neccessary environment for 
hgs
parents:
diff changeset
    41
    // current test case to execute 
hgs
parents:
diff changeset
    42
}
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// fetch the conversations from server
hgs
parents:
diff changeset
    45
void TConversationEngine::GetConversationsFromServer()
hgs
parents:
diff changeset
    46
{
hgs
parents:
diff changeset
    47
    QVERIFY2(ConversationsEngine::instance()->
hgs
parents:
diff changeset
    48
            getConversations(TestConversationEngineStub::Instance()->
hgs
parents:
diff changeset
    49
                            GetConversationID()), "Get conversations failed");
hgs
parents:
diff changeset
    50
}
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
//fetch the coversation and validate conversation view
hgs
parents:
diff changeset
    53
void TConversationEngine::FetchConversationsAndUpdateCV()
hgs
parents:
diff changeset
    54
{
hgs
parents:
diff changeset
    55
    QVERIFY2(ConversationsEngine::instance()->
hgs
parents:
diff changeset
    56
            getConversations(TestConversationEngineStub::Instance()->
hgs
parents:
diff changeset
    57
                            GetConversationID()), "Get conversations failed");
hgs
parents:
diff changeset
    58
    
hgs
parents:
diff changeset
    59
    //should be used once, will work for all the test cases
hgs
parents:
diff changeset
    60
    iConvUpdateHandler->SetConversationsViewUpdateHandler();
hgs
parents:
diff changeset
    61
    
hgs
parents:
diff changeset
    62
    //listen for emitted signal
hgs
parents:
diff changeset
    63
    QSignalSpy convListUpdate(ConversationsEngine::instance(), 
hgs
parents:
diff changeset
    64
                        SIGNAL(conversationModelPopulated()));
hgs
parents:
diff changeset
    65
    
hgs
parents:
diff changeset
    66
    // Now we check to make sure we don't have any signals already
hgs
parents:
diff changeset
    67
    QCOMPARE( convListUpdate.count(), 0 );
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
    //update the coversation model and 
hgs
parents:
diff changeset
    70
    //wait for active object to execute
hgs
parents:
diff changeset
    71
    TestConversationEngineStub::Instance()->UpdateConversationList();
hgs
parents:
diff changeset
    72
    QTest::qWait(2000);
hgs
parents:
diff changeset
    73
    
hgs
parents:
diff changeset
    74
    //conversation engine should have emitted signal
hgs
parents:
diff changeset
    75
    QCOMPARE( convListUpdate.count(), 1 );        
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
//validate the current conversation id
hgs
parents:
diff changeset
    79
void TConversationEngine::CheckCurrentConversationID()
hgs
parents:
diff changeset
    80
{
hgs
parents:
diff changeset
    81
    QVERIFY2((ConversationsEngine::instance()->getCurrentConversationId() 
hgs
parents:
diff changeset
    82
            == TestConversationEngineStub::Instance()->GetConversationID()), 
hgs
parents:
diff changeset
    83
            "Current conversation id mismatch");
hgs
parents:
diff changeset
    84
}
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
//mark the conversation as read and validate the conversation view
hgs
parents:
diff changeset
    87
void TConversationEngine::MarkConversationReadAndUpdateCV()
hgs
parents:
diff changeset
    88
{
hgs
parents:
diff changeset
    89
    //mark the conversation as read
hgs
parents:
diff changeset
    90
    ConversationsEngine::instance()->
hgs
parents:
diff changeset
    91
            markConversationRead(TestConversationEngineStub::Instance()->
hgs
parents:
diff changeset
    92
                                GetConversationID());
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
    //listen for emitted signal
hgs
parents:
diff changeset
    95
    QSignalSpy convModify(ConversationsEngine::instance(), 
hgs
parents:
diff changeset
    96
                        SIGNAL(conversationModelUpdated()));
hgs
parents:
diff changeset
    97
    
hgs
parents:
diff changeset
    98
    // Now we check to make sure we don't have any signals already
hgs
parents:
diff changeset
    99
    QCOMPARE( convModify.count(), 0 );
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
    // update the conversation view with modified conversation 
hgs
parents:
diff changeset
   102
    TestConversationEngineStub::Instance()->
hgs
parents:
diff changeset
   103
            UpdateConvEntry(TestConversationEngineStub::Instance()->
hgs
parents:
diff changeset
   104
                                GetConversationID());
hgs
parents:
diff changeset
   105
    
hgs
parents:
diff changeset
   106
    ConversationsEngine::instance()->emitConversationModelUpdated();
hgs
parents:
diff changeset
   107
    
hgs
parents:
diff changeset
   108
    //conversation engine should have emitted signal
hgs
parents:
diff changeset
   109
    QCOMPARE( convModify.count(), 1 );
hgs
parents:
diff changeset
   110
}
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
//delete the conversation and validate updetad conversation view
hgs
parents:
diff changeset
   113
void TConversationEngine::DeleteConversationAndUpdateCV()
hgs
parents:
diff changeset
   114
{
hgs
parents:
diff changeset
   115
    // delete the conversation entry
hgs
parents:
diff changeset
   116
    ConversationsEngine::instance()->
hgs
parents:
diff changeset
   117
            deleteConversations(TestConversationEngineStub::Instance()->
hgs
parents:
diff changeset
   118
                                GetConversationID());
hgs
parents:
diff changeset
   119
   
hgs
parents:
diff changeset
   120
    //listen for emitted signal
hgs
parents:
diff changeset
   121
    QSignalSpy convDelete(ConversationsEngine::instance(), 
hgs
parents:
diff changeset
   122
                        SIGNAL(conversationModelUpdated()));
hgs
parents:
diff changeset
   123
    
hgs
parents:
diff changeset
   124
    // Now we check to make sure we don't have any signals already
hgs
parents:
diff changeset
   125
    QCOMPARE( convDelete.count(), 0 );
hgs
parents:
diff changeset
   126
    
hgs
parents:
diff changeset
   127
    // update the conversation view with deleted entry  
hgs
parents:
diff changeset
   128
    TestConversationEngineStub::Instance()->UpdateDeletedConvEntry();
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
    ConversationsEngine::instance()->emitConversationModelUpdated();
hgs
parents:
diff changeset
   131
    
hgs
parents:
diff changeset
   132
    //conversation engine should have emitted signal
hgs
parents:
diff changeset
   133
    QCOMPARE( convDelete.count(), 1 );
hgs
parents:
diff changeset
   134
}
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
//notify new recieved conversation and validate conversation view
hgs
parents:
diff changeset
   137
void TConversationEngine::NotifyNewConversationEntryAndUpdateCV()
hgs
parents:
diff changeset
   138
{
hgs
parents:
diff changeset
   139
    //listen for emitted signal
hgs
parents:
diff changeset
   140
    QSignalSpy convAdd(ConversationsEngine::instance(), 
hgs
parents:
diff changeset
   141
                        SIGNAL(conversationModelUpdated()));
hgs
parents:
diff changeset
   142
    
hgs
parents:
diff changeset
   143
    // Now we check to make sure we don't have any signals already
hgs
parents:
diff changeset
   144
    QCOMPARE( convAdd.count(), 0 );
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    TestConversationEngineStub::Instance()->UpdateAddConvEntry();
hgs
parents:
diff changeset
   147
    
hgs
parents:
diff changeset
   148
    //conversation engine should have emitted signal
hgs
parents:
diff changeset
   149
    QCOMPARE( convAdd.count(), 1 );
hgs
parents:
diff changeset
   150
}
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
//update conversation client list and validate conversation summary model
hgs
parents:
diff changeset
   153
void TConversationEngine::NotifyConversationClientListAndUpdateCLV()
hgs
parents:
diff changeset
   154
{
hgs
parents:
diff changeset
   155
    //should be used once, will work for all the test cases
hgs
parents:
diff changeset
   156
    //set the conversation summary view update handler 
hgs
parents:
diff changeset
   157
    iConvUpdateHandler->SetConversationsSummaryViewUpdateHandler();
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
    //listen for emitted signal
hgs
parents:
diff changeset
   160
    QSignalSpy convClientList(ConversationsEngine::instance(), 
hgs
parents:
diff changeset
   161
                        SIGNAL(conversationListModelPopulated()));
hgs
parents:
diff changeset
   162
    
hgs
parents:
diff changeset
   163
    // Now we check to make sure we don't have any signals already
hgs
parents:
diff changeset
   164
    QCOMPARE( convClientList.count(), 0 );
hgs
parents:
diff changeset
   165
    
hgs
parents:
diff changeset
   166
    //update the conversation client list to summary model
hgs
parents:
diff changeset
   167
    TestConversationEngineStub::Instance()->UpdateConversationClientList();
hgs
parents:
diff changeset
   168
    QTest::qWait(2000);
hgs
parents:
diff changeset
   169
    
hgs
parents:
diff changeset
   170
    //conversation engine should have emitted signal
hgs
parents:
diff changeset
   171
    QCOMPARE( convClientList.count(), 1 );
hgs
parents:
diff changeset
   172
}
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
//get contactt details associated with conversation id
hgs
parents:
diff changeset
   175
void TConversationEngine::GetContactDetailsFromConversationID()
hgs
parents:
diff changeset
   176
{
hgs
parents:
diff changeset
   177
    //get the conversation client list
hgs
parents:
diff changeset
   178
    RPointerArray<CCsClientConversation>&  clientList 
hgs
parents:
diff changeset
   179
            = TestConversationEngineStub::Instance()->GetConversationClientList();
hgs
parents:
diff changeset
   180
    
hgs
parents:
diff changeset
   181
    //match the client list with summary model list
hgs
parents:
diff changeset
   182
    for (int loop = 0; loop < clientList.Count(); loop++)
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
        CCsClientConversation* clientConv = clientList[loop];
hgs
parents:
diff changeset
   185
         
hgs
parents:
diff changeset
   186
        qint64 msgId = clientConv->GetConversationEntryId();
hgs
parents:
diff changeset
   187
         
hgs
parents:
diff changeset
   188
        QString fname;
hgs
parents:
diff changeset
   189
        QString address;
hgs
parents:
diff changeset
   190
         
hgs
parents:
diff changeset
   191
        ConversationsEngine::instance()->
hgs
parents:
diff changeset
   192
                getContactDetails(msgId, fname, address);
hgs
parents:
diff changeset
   193
         
hgs
parents:
diff changeset
   194
        qDebug() << "msgId " << msgId;
hgs
parents:
diff changeset
   195
          
hgs
parents:
diff changeset
   196
        //check the bunch of converation client details 
hgs
parents:
diff changeset
   197
        QCOMPARE(fname,
hgs
parents:
diff changeset
   198
               XQConversions::s60DescToQString(
hgs
parents:
diff changeset
   199
                       *(clientConv->GetDisplayName())));
hgs
parents:
diff changeset
   200
          
hgs
parents:
diff changeset
   201
        QCOMPARE(address,
hgs
parents:
diff changeset
   202
                XQConversions::s60DescToQString(
hgs
parents:
diff changeset
   203
                        *(clientConv->GetConversationEntry()->Contact())));
hgs
parents:
diff changeset
   204
    }
hgs
parents:
diff changeset
   205
}
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
// get conversation id associated with contact id
hgs
parents:
diff changeset
   208
void TConversationEngine::GetConversationIDFromContatcID()
hgs
parents:
diff changeset
   209
{
hgs
parents:
diff changeset
   210
    //get the conversation client list
hgs
parents:
diff changeset
   211
    RPointerArray<CCsClientConversation>&  clientList 
hgs
parents:
diff changeset
   212
            = TestConversationEngineStub::Instance()->GetConversationClientList();
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
    //match the client list with summary model list
hgs
parents:
diff changeset
   215
    for (int loop = 0; loop < clientList.Count(); loop++)
hgs
parents:
diff changeset
   216
     {
hgs
parents:
diff changeset
   217
         CCsClientConversation* clientConv = clientList[loop];
hgs
parents:
diff changeset
   218
         
hgs
parents:
diff changeset
   219
         qint64 msgId = clientConv->GetConversationEntryId();
hgs
parents:
diff changeset
   220
         
hgs
parents:
diff changeset
   221
         qint64 convID = ConversationsEngine::instance()->
hgs
parents:
diff changeset
   222
                 getConversationIdFromContactId(clientConv->GetContactId());
hgs
parents:
diff changeset
   223
         QCOMPARE(convID, msgId);
hgs
parents:
diff changeset
   224
     }
hgs
parents:
diff changeset
   225
}
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
// update the new conversation client to summary view 
hgs
parents:
diff changeset
   228
void TConversationEngine::NotifyNewConversationClientAndUpdateCLV()
hgs
parents:
diff changeset
   229
{
hgs
parents:
diff changeset
   230
    //Add and update new conversation client to summary model
hgs
parents:
diff changeset
   231
    TestConversationEngineStub::Instance()->UpdateAddConvClient();
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
    //emit the signal for validating the summary model
hgs
parents:
diff changeset
   234
    ConversationsEngine::instance()->emitConversationListModelPopulated();
hgs
parents:
diff changeset
   235
}
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
//update the modified conversation client
hgs
parents:
diff changeset
   238
void TConversationEngine::NotifyModifyConversationClientAndUpdateCLV()
hgs
parents:
diff changeset
   239
{
hgs
parents:
diff changeset
   240
    //update the modified conversation client to summary model
hgs
parents:
diff changeset
   241
    TestConversationEngineStub::Instance()->
hgs
parents:
diff changeset
   242
            UpdateConvClient(TestConversationEngineStub::Instance()->GetConversationID());
hgs
parents:
diff changeset
   243
    
hgs
parents:
diff changeset
   244
    //emit the signal for validating the summary model
hgs
parents:
diff changeset
   245
    ConversationsEngine::instance()->emitConversationListModelPopulated();
hgs
parents:
diff changeset
   246
}
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
//update the deleted conversation client
hgs
parents:
diff changeset
   249
void TConversationEngine::NotifyDeleteConversationClientAndUpdateCLV()
hgs
parents:
diff changeset
   250
{
hgs
parents:
diff changeset
   251
    //update the deleted conversation client to summary model
hgs
parents:
diff changeset
   252
    TestConversationEngineStub::Instance()->UpdateDeletedConvClient();
hgs
parents:
diff changeset
   253
    
hgs
parents:
diff changeset
   254
    //emit the signal for validating the summary model
hgs
parents:
diff changeset
   255
    ConversationsEngine::instance()->emitConversationListModelPopulated();
hgs
parents:
diff changeset
   256
}
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
//get the conversation id from address
hgs
parents:
diff changeset
   259
void TConversationEngine::GetConversationIDFromAddress()
hgs
parents:
diff changeset
   260
{
hgs
parents:
diff changeset
   261
    //get the conversation client list
hgs
parents:
diff changeset
   262
    RPointerArray<CCsClientConversation>&  clientList 
hgs
parents:
diff changeset
   263
                = TestConversationEngineStub::Instance()->GetConversationClientList();
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
    //math the conversation id recieved from summary model
hgs
parents:
diff changeset
   266
    if (clientList.Count())
hgs
parents:
diff changeset
   267
    {
hgs
parents:
diff changeset
   268
         qint64 msgId = clientList[0]->GetConversationEntryId();
hgs
parents:
diff changeset
   269
         
hgs
parents:
diff changeset
   270
         QStandardItemModel* convModel = ConversationsEngine::instance()->
hgs
parents:
diff changeset
   271
                                                 getConversationsSummaryModel();
hgs
parents:
diff changeset
   272
  
hgs
parents:
diff changeset
   273
         //match convid in model, if not found raise error
hgs
parents:
diff changeset
   274
         QModelIndexList indexList = convModel->match(convModel->index(0, 0), 
hgs
parents:
diff changeset
   275
                  ConversationId, msgId, 1, Qt::MatchExactly);
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
         QVERIFY2(indexList.count(), "No item found in summary model");
hgs
parents:
diff changeset
   278
         
hgs
parents:
diff changeset
   279
         qint64 convID = ConversationsEngine::instance()->
hgs
parents:
diff changeset
   280
                         getConversationIdFromAddress(
hgs
parents:
diff changeset
   281
                         convModel->data(indexList[0], ConversationAddress).toString());
hgs
parents:
diff changeset
   282
         QCOMPARE(convID, msgId);
hgs
parents:
diff changeset
   283
    }
hgs
parents:
diff changeset
   284
}
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
//fetch more conversations from server
hgs
parents:
diff changeset
   287
void TConversationEngine::FetchMoreConversations()
hgs
parents:
diff changeset
   288
{
hgs
parents:
diff changeset
   289
    ConversationsEngine::instance()->fetchMoreConversations();
hgs
parents:
diff changeset
   290
}
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
//clear conversations from conversation view
hgs
parents:
diff changeset
   293
void TConversationEngine::ClearConversations()
hgs
parents:
diff changeset
   294
{
hgs
parents:
diff changeset
   295
    //clear the conversations
hgs
parents:
diff changeset
   296
    ConversationsEngine::instance()->clearConversations();
hgs
parents:
diff changeset
   297
    
hgs
parents:
diff changeset
   298
    //validate the conversation view, and raise the error if entry found
hgs
parents:
diff changeset
   299
    QStandardItemModel* convModel 
hgs
parents:
diff changeset
   300
                        =  ConversationsEngine::instance()->getConversationsModel();
hgs
parents:
diff changeset
   301
    QVERIFY2(convModel->rowCount() == 0, "conversation view not cleared");     
hgs
parents:
diff changeset
   302
}
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
//get the drafts model
hgs
parents:
diff changeset
   305
void TConversationEngine::GetDraftsModelFromConversationEngine()
hgs
parents:
diff changeset
   306
{
hgs
parents:
diff changeset
   307
    QStandardItemModel* convModel 
hgs
parents:
diff changeset
   308
                =  ConversationsEngine::instance()->getDraftsModel();
hgs
parents:
diff changeset
   309
    QVERIFY2(convModel, "Get Drafts Model Failed");
hgs
parents:
diff changeset
   310
}
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
void TConversationEngine::cleanup()
hgs
parents:
diff changeset
   313
{
hgs
parents:
diff changeset
   314
    //clean the resources for the current test case
hgs
parents:
diff changeset
   315
}
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
void TConversationEngine::cleanupTestCase()
hgs
parents:
diff changeset
   318
{
hgs
parents:
diff changeset
   319
    //delete the update handler
hgs
parents:
diff changeset
   320
    delete iConvUpdateHandler;
hgs
parents:
diff changeset
   321
    iConvUpdateHandler = NULL;
hgs
parents:
diff changeset
   322
    //delete the conversation engine variable
hgs
parents:
diff changeset
   323
    delete ConversationsEngine::instance();
hgs
parents:
diff changeset
   324
    //delete the stub data
hgs
parents:
diff changeset
   325
    delete TestConversationEngineStub::Instance();
hgs
parents:
diff changeset
   326
}
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
hgs
parents:
diff changeset
   329
//main entry point
hgs
parents:
diff changeset
   330
int main(int argc, char *argv[])
hgs
parents:
diff changeset
   331
    { 
hgs
parents:
diff changeset
   332
    int ret = -1;
hgs
parents:
diff changeset
   333
    QCoreApplication app(argc, argv);
hgs
parents:
diff changeset
   334
    QObject* tc = new TConversationEngine();
hgs
parents:
diff changeset
   335
    ret =  QTest::qExec(tc, argc, argv);
hgs
parents:
diff changeset
   336
	delete tc;
hgs
parents:
diff changeset
   337
    return ret;
hgs
parents:
diff changeset
   338
    }
hgs
parents:
diff changeset
   339