mobilemessaging/unieditor/model/src/UniTextObject.cpp
author hgs
Wed, 03 Nov 2010 22:55:44 +0530
changeset 80 8b14b30db193
parent 79 2981cb3aa489
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2005 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
*       CUniTextObject, Storage for single text attachment in presentation. 
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
// ========== INCLUDE FILES ================================
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include <e32def.h>     // for basic types
hgs
parents:
diff changeset
    24
#include <eikenv.h>     // for CBase
hgs
parents:
diff changeset
    25
#include <mtclbase.h>   // for CBaseMtm
hgs
parents:
diff changeset
    26
#include <msvstd.h>     // for TMsvId
hgs
parents:
diff changeset
    27
#include <msvids.h>     // for KMsvTempIndexEntryId
hgs
parents:
diff changeset
    28
#include <msvstore.h>
hgs
parents:
diff changeset
    29
#include <mmsvattachmentmanager.h>
hgs
parents:
diff changeset
    30
#include <cmsvattachment.h>
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#include <eikrted.h>    // CEikRichTextEditor
hgs
parents:
diff changeset
    33
#include <charconv.h>
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
#include <MsgAttachmentUtils.h>     // for CMsgAttachmentUtils
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
#include <msgtextutils.h>
hgs
parents:
diff changeset
    38
#include <MsgMediaInfo.h>
hgs
parents:
diff changeset
    39
#include <MsgTextInfo.h>
hgs
parents:
diff changeset
    40
#include <MsgMimeTypes.h>
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
#include "UniModelConst.h"
hgs
parents:
diff changeset
    43
#include "UniMimeInfo.h"
hgs
parents:
diff changeset
    44
#include "UniObject.h"
hgs
parents:
diff changeset
    45
#include "UniTextObject.h"
hgs
parents:
diff changeset
    46
#include "UniDataUtils.h"
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// ========== EXTERNAL DATA STRUCTURES =====================
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
// ========== EXTERNAL FUNCTION PROTOTYPES =================
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
// ========== CONSTANTS ====================================
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// ========== MACROS =======================================
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
// ========== LOCAL CONSTANTS AND MACROS ===================
hgs
parents:
diff changeset
    58
const TInt KMaxFilenameLenghtForAttachment = 20;   // Characters
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
const TInt KMaxCharSize = 3;
hgs
parents:
diff changeset
    61
const TInt KMinCharSize = 1;
hgs
parents:
diff changeset
    62
// Always count exact size
hgs
parents:
diff changeset
    63
// -> performance penalty with very long text files.
hgs
parents:
diff changeset
    64
const TInt KSyncInterval = 0;
hgs
parents:
diff changeset
    65
const TInt KForceSyncLength = KMaxTInt;
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
_LIT16( KExtTextPlain_16, ".txt" );
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
// ========== MODULE DATA STRUCTURES =======================
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
// ========== LOCAL FUNCTION PROTOTYPES ====================
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
// ========== LOCAL FUNCTIONS ==============================
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
// ========== MEMBER FUNCTIONS =============================
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------
hgs
parents:
diff changeset
    80
// CUniTextObject::NewLC
hgs
parents:
diff changeset
    81
//
hgs
parents:
diff changeset
    82
// Factory method.
hgs
parents:
diff changeset
    83
// ---------------------------------------------------------
hgs
parents:
diff changeset
    84
//
hgs
parents:
diff changeset
    85
EXPORT_C CUniTextObject* CUniTextObject::NewLC( RFs& aFs,
hgs
parents:
diff changeset
    86
                                               CBaseMtm& aMtm,
hgs
parents:
diff changeset
    87
                                               CUniDataUtils& aData,
hgs
parents:
diff changeset
    88
                                               CMsgTextInfo* aMedia,
hgs
parents:
diff changeset
    89
                                               MMsvAttachmentManager& aManager,
hgs
parents:
diff changeset
    90
                                               CMsvAttachment& aAttachment )
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
    CUniTextObject* self = 
hgs
parents:
diff changeset
    93
        new ( ELeave ) CUniTextObject( aFs, aMtm, aData, aMedia );
hgs
parents:
diff changeset
    94
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    95
    self->ConstructL();
hgs
parents:
diff changeset
    96
    self->ConstructFromAttachmentL( aManager, aAttachment );
hgs
parents:
diff changeset
    97
    return self;
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------
hgs
parents:
diff changeset
   101
// CUniTextObject::NewL
hgs
parents:
diff changeset
   102
//
hgs
parents:
diff changeset
   103
// Factory method.
hgs
parents:
diff changeset
   104
// ---------------------------------------------------------
hgs
parents:
diff changeset
   105
//
hgs
parents:
diff changeset
   106
EXPORT_C CUniTextObject* CUniTextObject::NewL( RFs& aFs,
hgs
parents:
diff changeset
   107
                                              CBaseMtm& aMtm,
hgs
parents:
diff changeset
   108
                                              CUniDataUtils& aData,
hgs
parents:
diff changeset
   109
                                              CMsgTextInfo* aMedia,
hgs
parents:
diff changeset
   110
                                              MMsvAttachmentManager& aManager,
hgs
parents:
diff changeset
   111
                                              CMsvAttachment& aAttachment )
hgs
parents:
diff changeset
   112
    {
hgs
parents:
diff changeset
   113
    CUniTextObject* self = NewLC( aFs, aMtm, aData, aMedia, aManager, aAttachment );
hgs
parents:
diff changeset
   114
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   115
    return self;
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
// ---------------------------------------------------------
hgs
parents:
diff changeset
   119
// CUniTextObject::NewLC
hgs
parents:
diff changeset
   120
//
hgs
parents:
diff changeset
   121
// Factory method.
hgs
parents:
diff changeset
   122
// ---------------------------------------------------------
hgs
parents:
diff changeset
   123
//
hgs
parents:
diff changeset
   124
EXPORT_C CUniTextObject* CUniTextObject::NewLC( RFs& aFs,
hgs
parents:
diff changeset
   125
                                               CBaseMtm& aMtm,
hgs
parents:
diff changeset
   126
                                               CUniDataUtils& aData,
hgs
parents:
diff changeset
   127
                                               CMsgTextInfo* aMedia )
hgs
parents:
diff changeset
   128
    {
hgs
parents:
diff changeset
   129
    CUniTextObject* self = 
hgs
parents:
diff changeset
   130
        new ( ELeave ) CUniTextObject( aFs, aMtm, aData, aMedia );
hgs
parents:
diff changeset
   131
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   132
    self->ConstructL();
hgs
parents:
diff changeset
   133
    self->CreateMimeInfoL();
hgs
parents:
diff changeset
   134
    return self;
hgs
parents:
diff changeset
   135
    }
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
// ---------------------------------------------------------
hgs
parents:
diff changeset
   138
// CUniTextObject::NewL
hgs
parents:
diff changeset
   139
//
hgs
parents:
diff changeset
   140
// Factory method.
hgs
parents:
diff changeset
   141
// ---------------------------------------------------------
hgs
parents:
diff changeset
   142
//
hgs
parents:
diff changeset
   143
EXPORT_C CUniTextObject* CUniTextObject::NewL( RFs& aFs,
hgs
parents:
diff changeset
   144
                                              CBaseMtm& aMtm,
hgs
parents:
diff changeset
   145
                                              CUniDataUtils& aData,
hgs
parents:
diff changeset
   146
                                              CMsgTextInfo* aMedia )
hgs
parents:
diff changeset
   147
    {
hgs
parents:
diff changeset
   148
    CUniTextObject* self = NewLC( aFs, aMtm, aData, aMedia );
hgs
parents:
diff changeset
   149
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   150
    return self;
hgs
parents:
diff changeset
   151
    }
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
// ---------------------------------------------------------
hgs
parents:
diff changeset
   154
// CUniTextObject::NewLC
hgs
parents:
diff changeset
   155
//
hgs
parents:
diff changeset
   156
// Factory method.
hgs
parents:
diff changeset
   157
// ---------------------------------------------------------
hgs
parents:
diff changeset
   158
//
hgs
parents:
diff changeset
   159
EXPORT_C CUniTextObject* CUniTextObject::NewLC( RFs& aFs,
hgs
parents:
diff changeset
   160
                                               CBaseMtm& aMtm,
hgs
parents:
diff changeset
   161
                                               CUniDataUtils& aData,
hgs
parents:
diff changeset
   162
                                               CEikRichTextEditor* aTextEditor )
hgs
parents:
diff changeset
   163
    {
hgs
parents:
diff changeset
   164
    RFile nullHandle;
hgs
parents:
diff changeset
   165
    TDataType mime( KMsgMimeTextPlain );
hgs
parents:
diff changeset
   166
    CMsgTextInfo* info = CMsgTextInfo::NewL(
hgs
parents:
diff changeset
   167
        nullHandle,
hgs
parents:
diff changeset
   168
        mime,
hgs
parents:
diff changeset
   169
        aFs );
hgs
parents:
diff changeset
   170
    info->SetCharacterSet( KCharacterSetMIBEnumUtf8 );
hgs
parents:
diff changeset
   171
    CleanupStack::PushL( info );
hgs
parents:
diff changeset
   172
    CUniTextObject* self = 
hgs
parents:
diff changeset
   173
        new ( ELeave ) CUniTextObject( aFs, aMtm, aData, info );
hgs
parents:
diff changeset
   174
    CleanupStack::Pop( info ); // ownership transferred
hgs
parents:
diff changeset
   175
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   176
    self->ConstructL();
hgs
parents:
diff changeset
   177
    self->ConstructFromTextL( aTextEditor );
hgs
parents:
diff changeset
   178
    self->SynchronizeSize();
hgs
parents:
diff changeset
   179
    return self;
hgs
parents:
diff changeset
   180
    }
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
// ---------------------------------------------------------
hgs
parents:
diff changeset
   183
// CUniTextObject::NewL
hgs
parents:
diff changeset
   184
//
hgs
parents:
diff changeset
   185
// Factory method.
hgs
parents:
diff changeset
   186
// ---------------------------------------------------------
hgs
parents:
diff changeset
   187
//
hgs
parents:
diff changeset
   188
EXPORT_C CUniTextObject* CUniTextObject::NewL( RFs& aFs,
hgs
parents:
diff changeset
   189
                                              CBaseMtm& aMtm,
hgs
parents:
diff changeset
   190
                                              CUniDataUtils& aData,
hgs
parents:
diff changeset
   191
                                              CEikRichTextEditor* aTextEditor )
hgs
parents:
diff changeset
   192
    {
hgs
parents:
diff changeset
   193
    CUniTextObject* self = NewLC( aFs, aMtm, aData, aTextEditor );
hgs
parents:
diff changeset
   194
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   195
    return self;
hgs
parents:
diff changeset
   196
    }
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
// ---------------------------------------------------------
hgs
parents:
diff changeset
   200
// CUniTextObject::CUniTextObject
hgs
parents:
diff changeset
   201
//
hgs
parents:
diff changeset
   202
// Constructor.
hgs
parents:
diff changeset
   203
// ---------------------------------------------------------
hgs
parents:
diff changeset
   204
//
hgs
parents:
diff changeset
   205
CUniTextObject::CUniTextObject( RFs& aFs,
hgs
parents:
diff changeset
   206
                               CBaseMtm& aMtm,
hgs
parents:
diff changeset
   207
                               CUniDataUtils& aData,
hgs
parents:
diff changeset
   208
                               CMsgTextInfo* aMedia )
hgs
parents:
diff changeset
   209
        : 
hgs
parents:
diff changeset
   210
        CUniObject( aFs, aMtm, aData, aMedia ),
hgs
parents:
diff changeset
   211
        iTextEditor( NULL )
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
// CUniTextObject::CUniTextObject
hgs
parents:
diff changeset
   218
//
hgs
parents:
diff changeset
   219
// Destructor.
hgs
parents:
diff changeset
   220
// ---------------------------------------------------------
hgs
parents:
diff changeset
   221
//
hgs
parents:
diff changeset
   222
CUniTextObject::~CUniTextObject()
hgs
parents:
diff changeset
   223
    {
hgs
parents:
diff changeset
   224
    if ( iEditFile )
hgs
parents:
diff changeset
   225
        {
hgs
parents:
diff changeset
   226
        iEditFile->Close();
hgs
parents:
diff changeset
   227
        delete iEditFile;
hgs
parents:
diff changeset
   228
        }
hgs
parents:
diff changeset
   229
    }
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
// ---------------------------------------------------------
hgs
parents:
diff changeset
   232
// CUniTextObject::Save
hgs
parents:
diff changeset
   233
// ---------------------------------------------------------
hgs
parents:
diff changeset
   234
//
hgs
parents:
diff changeset
   235
void CUniTextObject::Save( MUniObjectSaveObserver& aObserver,
hgs
parents:
diff changeset
   236
                           CMsvAttachment::TMsvAttachmentType aSaveType )
hgs
parents:
diff changeset
   237
    {
hgs
parents:
diff changeset
   238
    iTextSaveState = ETextSavingIdle;
hgs
parents:
diff changeset
   239
    CUniObject::Save( aObserver, aSaveType );
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
// ---------------------------------------------------------
hgs
parents:
diff changeset
   243
// CUniTextObject::DoSaveL
hgs
parents:
diff changeset
   244
// ---------------------------------------------------------
hgs
parents:
diff changeset
   245
//
hgs
parents:
diff changeset
   246
void CUniTextObject::DoSaveL()
hgs
parents:
diff changeset
   247
    {
hgs
parents:
diff changeset
   248
    switch ( iTextSaveState )
hgs
parents:
diff changeset
   249
        {
hgs
parents:
diff changeset
   250
        case ETextSavingIdle:
hgs
parents:
diff changeset
   251
            {
hgs
parents:
diff changeset
   252
            InitializeTextSaveL();
hgs
parents:
diff changeset
   253
            break;
hgs
parents:
diff changeset
   254
            }
hgs
parents:
diff changeset
   255
        case ETextCreatingAttachment:
hgs
parents:
diff changeset
   256
            {            
hgs
parents:
diff changeset
   257
            CreateTextAttachmentL();
hgs
parents:
diff changeset
   258
            break;
hgs
parents:
diff changeset
   259
            }
hgs
parents:
diff changeset
   260
        case ETextWritingToFile:
hgs
parents:
diff changeset
   261
            {
hgs
parents:
diff changeset
   262
            WriteToFileL();
hgs
parents:
diff changeset
   263
            break;
hgs
parents:
diff changeset
   264
            } 
hgs
parents:
diff changeset
   265
        default:
hgs
parents:
diff changeset
   266
            {
hgs
parents:
diff changeset
   267
            break;
hgs
parents:
diff changeset
   268
            }           
hgs
parents:
diff changeset
   269
        }
hgs
parents:
diff changeset
   270
    }
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
// ---------------------------------------------------------
hgs
parents:
diff changeset
   273
// CUniTextObject::Size
hgs
parents:
diff changeset
   274
//
hgs
parents:
diff changeset
   275
// Accessor.
hgs
parents:
diff changeset
   276
// ---------------------------------------------------------
hgs
parents:
diff changeset
   277
//
hgs
parents:
diff changeset
   278
TInt CUniTextObject::Size( TBool aWithoutHeaders )
hgs
parents:
diff changeset
   279
    {
hgs
parents:
diff changeset
   280
    if ( iTextEditor && iTextEditor->TextLength() )
hgs
parents:
diff changeset
   281
        {
hgs
parents:
diff changeset
   282
        TInt size = 0;
hgs
parents:
diff changeset
   283
        TInt length = iTextEditor->TextLength();
hgs
parents:
diff changeset
   284
        TInt change = length - iPrevLength;
hgs
parents:
diff changeset
   285
        if ( change )
hgs
parents:
diff changeset
   286
            {
hgs
parents:
diff changeset
   287
            //add absolute value
hgs
parents:
diff changeset
   288
            iSyncCounter += Max( change, -change );
hgs
parents:
diff changeset
   289
            iPrevLength = length;
hgs
parents:
diff changeset
   290
            }
hgs
parents:
diff changeset
   291
        if ( iSyncCounter > KSyncInterval ||
hgs
parents:
diff changeset
   292
            length <= KForceSyncLength )
hgs
parents:
diff changeset
   293
            {
hgs
parents:
diff changeset
   294
            size = SynchronizeSize();
hgs
parents:
diff changeset
   295
            }
hgs
parents:
diff changeset
   296
        else
hgs
parents:
diff changeset
   297
            {
hgs
parents:
diff changeset
   298
            TInt diff = length - iSyncLength;
hgs
parents:
diff changeset
   299
            TInt charSize = diff < 0
hgs
parents:
diff changeset
   300
                ? KMinCharSize
hgs
parents:
diff changeset
   301
                : KMaxCharSize;
hgs
parents:
diff changeset
   302
            size = iSyncSize + charSize * diff;
hgs
parents:
diff changeset
   303
            size = Max( size, 0 );
hgs
parents:
diff changeset
   304
            }
hgs
parents:
diff changeset
   305
        return ( aWithoutHeaders ? size : size + iMimeInfo->Size() );
hgs
parents:
diff changeset
   306
        }
hgs
parents:
diff changeset
   307
    else
hgs
parents:
diff changeset
   308
        {
hgs
parents:
diff changeset
   309
        return CUniObject::Size( aWithoutHeaders );
hgs
parents:
diff changeset
   310
        }
hgs
parents:
diff changeset
   311
    }
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
// ---------------------------------------------------------
hgs
parents:
diff changeset
   314
// CUniTextObject::SyncronizeSize
hgs
parents:
diff changeset
   315
//
hgs
parents:
diff changeset
   316
// Counts real buffer size and syncronizes internal
hgs
parents:
diff changeset
   317
// size variables.
hgs
parents:
diff changeset
   318
// ---------------------------------------------------------
hgs
parents:
diff changeset
   319
//
hgs
parents:
diff changeset
   320
EXPORT_C TInt CUniTextObject::SynchronizeSize()
hgs
parents:
diff changeset
   321
    {
hgs
parents:
diff changeset
   322
    iSyncCounter = 0;
hgs
parents:
diff changeset
   323
    if ( iTextEditor )
hgs
parents:
diff changeset
   324
        {
hgs
parents:
diff changeset
   325
        iSyncLength = iTextEditor->TextLength();
hgs
parents:
diff changeset
   326
        iPrevLength = iSyncLength;
hgs
parents:
diff changeset
   327
        TPtrC ptr = iTextEditor->Text()->Read( 0, iTextEditor->Text()->DocumentLength() );
hgs
parents:
diff changeset
   328
        iSyncSize = CUniDataUtils::UTF8Size( ptr );
hgs
parents:
diff changeset
   329
        }
hgs
parents:
diff changeset
   330
    else
hgs
parents:
diff changeset
   331
        {
hgs
parents:
diff changeset
   332
        iSyncSize = 0;
hgs
parents:
diff changeset
   333
        iSyncLength = 0;
hgs
parents:
diff changeset
   334
        iPrevLength = 0;
hgs
parents:
diff changeset
   335
        }
hgs
parents:
diff changeset
   336
    return iSyncSize;
hgs
parents:
diff changeset
   337
    }
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
// ---------------------------------------------------------
hgs
parents:
diff changeset
   340
// CUniTextObject::ConstructL
hgs
parents:
diff changeset
   341
//
hgs
parents:
diff changeset
   342
// 2nd phase constructor.
hgs
parents:
diff changeset
   343
// ---------------------------------------------------------
hgs
parents:
diff changeset
   344
//
hgs
parents:
diff changeset
   345
void CUniTextObject::ConstructL()
hgs
parents:
diff changeset
   346
    {
hgs
parents:
diff changeset
   347
    CUniObject::ConstructL();
hgs
parents:
diff changeset
   348
    }
hgs
parents:
diff changeset
   349
hgs
parents:
diff changeset
   350
// ---------------------------------------------------------
hgs
parents:
diff changeset
   351
// CUniTextObject::ConstructFromTextL
hgs
parents:
diff changeset
   352
//
hgs
parents:
diff changeset
   353
// 2nd phase constructor.
hgs
parents:
diff changeset
   354
// ---------------------------------------------------------
hgs
parents:
diff changeset
   355
//
hgs
parents:
diff changeset
   356
void CUniTextObject::ConstructFromTextL( CEikRichTextEditor* aTextEditor )
hgs
parents:
diff changeset
   357
    {
hgs
parents:
diff changeset
   358
    iAttachmentId = KMsvNullIndexEntryId;
hgs
parents:
diff changeset
   359
    iTextEditor = aTextEditor;
hgs
parents:
diff changeset
   360
    //iStoreState = EMmsStoreStateTemporary;
hgs
parents:
diff changeset
   361
    //Create MIME headers
hgs
parents:
diff changeset
   362
    CreateMimeInfoL();
hgs
parents:
diff changeset
   363
    }
hgs
parents:
diff changeset
   364
hgs
parents:
diff changeset
   365
// ---------------------------------------------------------
hgs
parents:
diff changeset
   366
// CreateFileName
hgs
parents:
diff changeset
   367
// ---------------------------------------------------------
hgs
parents:
diff changeset
   368
//
hgs
parents:
diff changeset
   369
void CUniTextObject::CreateFileName( TFileName& aFileName )
hgs
parents:
diff changeset
   370
    {
hgs
parents:
diff changeset
   371
    if ( iTextEditor && iTextEditor->Text()->DocumentLength() )
hgs
parents:
diff changeset
   372
        {
hgs
parents:
diff changeset
   373
    	HBufC *ptr = iTextEditor->GetTextInHBufL();
hgs
parents:
diff changeset
   374
        CleanupStack::PushL( ptr );
hgs
parents:
diff changeset
   375
        MsgAttachmentUtils::GetFileNameFromBuffer( 
hgs
parents:
diff changeset
   376
            aFileName, 
hgs
parents:
diff changeset
   377
            *ptr, 
hgs
parents:
diff changeset
   378
            KMaxFilenameLenghtForAttachment, 
hgs
parents:
diff changeset
   379
            &KExtTextPlain_16 );
hgs
parents:
diff changeset
   380
        CleanupStack::PopAndDestroy( ptr );
hgs
parents:
diff changeset
   381
        
hgs
parents:
diff changeset
   382
        }
hgs
parents:
diff changeset
   383
    if ( aFileName.Length() == 0 ||
hgs
parents:
diff changeset
   384
        !iFs.IsValidName( aFileName ) )
hgs
parents:
diff changeset
   385
        {
hgs
parents:
diff changeset
   386
        // No filename -> Use default
hgs
parents:
diff changeset
   387
        aFileName.Zero();
hgs
parents:
diff changeset
   388
        aFileName.Copy( iData.DefaultFileName() );
hgs
parents:
diff changeset
   389
        aFileName.Append( KExtTextPlain_16 );
hgs
parents:
diff changeset
   390
        }
hgs
parents:
diff changeset
   391
    }
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
// ---------------------------------------------------------
hgs
parents:
diff changeset
   394
// InitializeTextSaveL
hgs
parents:
diff changeset
   395
// ---------------------------------------------------------
hgs
parents:
diff changeset
   396
//
hgs
parents:
diff changeset
   397
void CUniTextObject::InitializeTextSaveL()
hgs
parents:
diff changeset
   398
    {
hgs
parents:
diff changeset
   399
    if ( !iTextEditor )
hgs
parents:
diff changeset
   400
        {
hgs
parents:
diff changeset
   401
        CUniObject::DoSaveL();
hgs
parents:
diff changeset
   402
        return;
hgs
parents:
diff changeset
   403
        }
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
    // Remove possibly already existing attachment from store
hgs
parents:
diff changeset
   406
    RemoveFromStoreL();
hgs
parents:
diff changeset
   407
hgs
parents:
diff changeset
   408
    if ( !iTextEditor->TextLength() )
hgs
parents:
diff changeset
   409
        {
hgs
parents:
diff changeset
   410
        //Nothing to save. (Shouldn't really get here
hgs
parents:
diff changeset
   411
        //since there shouldn't be "empty" text objects
hgs
parents:
diff changeset
   412
        //in the smil model.)
hgs
parents:
diff changeset
   413
        iObserver->ObjectSaveReady( KErrNone );
hgs
parents:
diff changeset
   414
        return;
hgs
parents:
diff changeset
   415
        }
hgs
parents:
diff changeset
   416
    iTextSaveState = ETextCreatingAttachment;
hgs
parents:
diff changeset
   417
    CompleteSelf();
hgs
parents:
diff changeset
   418
    }
hgs
parents:
diff changeset
   419
    
hgs
parents:
diff changeset
   420
// ---------------------------------------------------------
hgs
parents:
diff changeset
   421
// CreateTextAttachmentL
hgs
parents:
diff changeset
   422
// ---------------------------------------------------------
hgs
parents:
diff changeset
   423
//
hgs
parents:
diff changeset
   424
void CUniTextObject::CreateTextAttachmentL()
hgs
parents:
diff changeset
   425
    {
hgs
parents:
diff changeset
   426
    TFileName fileName;
hgs
parents:
diff changeset
   427
    CreateFileName( fileName );
hgs
parents:
diff changeset
   428
    
hgs
parents:
diff changeset
   429
    TFileName contentLocation( fileName );    
hgs
parents:
diff changeset
   430
    CMsgTextUtils::TrimAndRemoveNonAlphaDigit( contentLocation );
hgs
parents:
diff changeset
   431
    iMimeInfo->SetContentLocationL( contentLocation );
hgs
parents:
diff changeset
   432
    iMimeInfo->SetContentTypeL( KMsgMimeTextPlain );
hgs
parents:
diff changeset
   433
    iMimeInfo->SetCharset( KCharacterSetMIBEnumUtf8 );
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
    iEditStore = iMtm.Entry().EditStoreL();
hgs
parents:
diff changeset
   436
    iManager = &( iEditStore->AttachmentManagerL() );
hgs
parents:
diff changeset
   437
    CMsvAttachment* attachment = CMsvAttachment::NewL( CMsvAttachment::EMsvFile );
hgs
parents:
diff changeset
   438
    CleanupStack::PushL( attachment );
hgs
parents:
diff changeset
   439
    
hgs
parents:
diff changeset
   440
    attachment->SetMimeTypeL( KMsgMimeTextPlain );
hgs
parents:
diff changeset
   441
    attachment->SetSize( SynchronizeSize() );
hgs
parents:
diff changeset
   442
    //TODO: Set complete flag?
hgs
parents:
diff changeset
   443
    //attachment->SetComplete( EFalse );
hgs
parents:
diff changeset
   444
    
hgs
parents:
diff changeset
   445
    attachment->SetIntAttributeL( KUidAttachmentIndication, Attachment() );        
hgs
parents:
diff changeset
   446
    
hgs
parents:
diff changeset
   447
    iEditFile = new ( ELeave ) RFile;
hgs
parents:
diff changeset
   448
    iManager->CreateAttachmentL( fileName, *iEditFile, attachment, iStatus );
hgs
parents:
diff changeset
   449
    CleanupStack::Pop( attachment );
hgs
parents:
diff changeset
   450
    iAttachment = attachment;
hgs
parents:
diff changeset
   451
    iTextSaveState = ETextWritingToFile;
hgs
parents:
diff changeset
   452
    SetActive();
hgs
parents:
diff changeset
   453
    }
hgs
parents:
diff changeset
   454
    
hgs
parents:
diff changeset
   455
// ---------------------------------------------------------
hgs
parents:
diff changeset
   456
// WriteToFileL
hgs
parents:
diff changeset
   457
// ---------------------------------------------------------
hgs
parents:
diff changeset
   458
//
hgs
parents:
diff changeset
   459
void CUniTextObject::WriteToFileL()
hgs
parents:
diff changeset
   460
    {
hgs
parents:
diff changeset
   461
    RFileWriteStream writer( *iEditFile );
hgs
parents:
diff changeset
   462
    delete iEditFile;
hgs
parents:
diff changeset
   463
    iEditFile = NULL;
hgs
parents:
diff changeset
   464
hgs
parents:
diff changeset
   465
    // Write the text to a file
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
    // UTF-8 signature
hgs
parents:
diff changeset
   468
    // Taken out because not all terminals can deal with it.
hgs
parents:
diff changeset
   469
    // Maybe taken back into use in the future
hgs
parents:
diff changeset
   470
    //writer.WriteInt8L( 0xEF );
hgs
parents:
diff changeset
   471
    //writer.WriteInt8L( 0xBB );
hgs
parents:
diff changeset
   472
    //writer.WriteInt8L( 0xBF );
hgs
parents:
diff changeset
   473
hgs
parents:
diff changeset
   474
    HBufC* buffer = iTextEditor->GetTextInHBufL();
hgs
parents:
diff changeset
   475
    CleanupStack::PushL( buffer );
hgs
parents:
diff changeset
   476
hgs
parents:
diff changeset
   477
    // Convert the text to utf8
hgs
parents:
diff changeset
   478
    CCnvCharacterSetConverter* converter = CCnvCharacterSetConverter::NewLC();
hgs
parents:
diff changeset
   479
hgs
parents:
diff changeset
   480
    if ( converter->PrepareToConvertToOrFromL( KCharacterSetIdentifierUtf8, iFs )
hgs
parents:
diff changeset
   481
        != CCnvCharacterSetConverter::EAvailable )
hgs
parents:
diff changeset
   482
        {
hgs
parents:
diff changeset
   483
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   484
        }
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
    TBuf8<128> outputBuffer;
hgs
parents:
diff changeset
   487
    TPtrC16 remainderOfUnicodeText( *buffer );
hgs
parents:
diff changeset
   488
    FOREVER
hgs
parents:
diff changeset
   489
        {
hgs
parents:
diff changeset
   490
        TInt returnValue = converter->ConvertFromUnicode(
hgs
parents:
diff changeset
   491
            outputBuffer, remainderOfUnicodeText );
hgs
parents:
diff changeset
   492
        if ( returnValue == CCnvCharacterSetConverter::EErrorIllFormedInput )
hgs
parents:
diff changeset
   493
            {
hgs
parents:
diff changeset
   494
            User::Leave( KErrCorrupt );
hgs
parents:
diff changeset
   495
            }
hgs
parents:
diff changeset
   496
        else if ( returnValue<0 ) // future-proof against "TError" expanding
hgs
parents:
diff changeset
   497
            {
hgs
parents:
diff changeset
   498
            User::Leave( KErrGeneral );
hgs
parents:
diff changeset
   499
            }
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
        // ? - do something here with outputBuffer
hgs
parents:
diff changeset
   502
        writer.WriteL( outputBuffer );
hgs
parents:
diff changeset
   503
hgs
parents:
diff changeset
   504
        if ( returnValue == 0 )
hgs
parents:
diff changeset
   505
            {
hgs
parents:
diff changeset
   506
            break; // all of aUnicodeText has been converted and handled
hgs
parents:
diff changeset
   507
            }
hgs
parents:
diff changeset
   508
        remainderOfUnicodeText.Set( remainderOfUnicodeText.Right(
hgs
parents:
diff changeset
   509
            returnValue ) );
hgs
parents:
diff changeset
   510
        }
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
    CleanupStack::PopAndDestroy( 2, buffer ); //converter, buffer
hgs
parents:
diff changeset
   513
hgs
parents:
diff changeset
   514
    // Close handles
hgs
parents:
diff changeset
   515
    writer.Close();
hgs
parents:
diff changeset
   516
    //TInt fileSize( 0 );
hgs
parents:
diff changeset
   517
    //iEditFile->Size( fileSize );
hgs
parents:
diff changeset
   518
    //iAttachment->SetSize( fileSize );
hgs
parents:
diff changeset
   519
    //iEditFile->Close();
hgs
parents:
diff changeset
   520
    //delete iEditFile;
hgs
parents:
diff changeset
   521
    //iEditFile = NULL;
hgs
parents:
diff changeset
   522
    
hgs
parents:
diff changeset
   523
    // Closes & destroys other "attachment handling" members
hgs
parents:
diff changeset
   524
    // Sends callback to observer
hgs
parents:
diff changeset
   525
    FinalizeObjectSaveL();
hgs
parents:
diff changeset
   526
    }
hgs
parents:
diff changeset
   527
hgs
parents:
diff changeset
   528
hgs
parents:
diff changeset
   529
// End of file