diff -r 000000000000 -r 094583676ce7 wvuing/wvuiprocess/Src/CCARecordedChatsPC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiprocess/Src/CCARecordedChatsPC.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,842 @@ +/* +* Copyright (c) 2006 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: Interface for the Recorded chats UI to interact with the engine +* +*/ + + +#include "MCALoggerHeadersInterface.h" +#include "CCARecordedChatsPC.h" +#include "MCARecordedChatsArrayPC.h" +#include "ChatDefinitions.h" +#include "IMDialogUtils.h" +#include "IMUtils.h" +#include "CCAStorageManagerFactory.h" +#include "MCAStoredContacts.h" +#include "MCAMessagesWriteInterface.h" +#include "MCAStoredGroups.h" +#include "MCAStoredGroup.h" +#include "CCAServerContactsArrayPC.h" + +#include "MCALoggerMessageHeader.h" +#include "MCAMessagesReadInterface.h" + +#include // MDesCArray + +#include +#include + +#include +#include +#include +#include //CBufStore +#include +#include +#include +#include +#include + +#include +#include +#include + + +#ifdef RD_MULTIPLE_DRIVE + +#include "CCAProcessManagerFactory.h" +#include "MCAProcessManager.h" +#include "CCAEngine.h" + +#endif +_LIT( KCAHistoryTempDirectory, ":\\system\\temp\\IMTemp\\" ); + +_LIT( KLineFeedFormat, "%c" ); + +/* list of forbidden characters which which are removed when + * file name is created + */ +_LIT( KForbiddenCharacters, "\\/:*?\"<>|" ); + +/* + * This is for log names which are not good for filename + */ +_LIT( KGeneralSendFilename, "Badlogname" ); + +_LIT( KNotepadFileExtension, ".txt" ); + +_LIT( KFileFooterFormat, " ( %d )" ); + + +//CONSTANTS +const TInt KOneSelected = 1; +const TInt KFileFooterLength = 6; +const TInt KLengthOfPathEnd = 1; + +const TInt KFileCount = 2; + +//recommended minimimun amount of granularity for segmented buffer is 16 +const TInt KSegmentGranularity = 16; +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::CCARecordedChatsPC +// ----------------------------------------------------------------------------- +// +CCARecordedChatsPC::CCARecordedChatsPC( MCALoggerHeadersInterface& aLoggerHeadersInterface, + MCARecordedChatsArrayPC& aRecordedChatsArrayPC ) + : iLoggerHeadersInterface( aLoggerHeadersInterface ), + iRecordedChatsArrayPC( aRecordedChatsArrayPC ) + { + // since we can not appui fromave to pc + // hence codescanner warning can be ignored + iEikonEn = CEikonEnv::Static(); + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::~CCARecordedChatsPC +// ----------------------------------------------------------------------------- +// +CCARecordedChatsPC::~CCARecordedChatsPC() + { + delete iSendAppUi; + iItemsForDeletion.Close(); + delete iHistoryTempDir; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::NewL +// ----------------------------------------------------------------------------- +// +CCARecordedChatsPC* CCARecordedChatsPC::NewL( MCALoggerHeadersInterface& aLoggerHeadersInterface, + MCARecordedChatsArrayPC& aRecordedChatsArrayPC ) + { + CCARecordedChatsPC* self = new ( ELeave ) CCARecordedChatsPC( aLoggerHeadersInterface, + aRecordedChatsArrayPC ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::ConstructL +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::ConstructL() + { + + //To store the history on a temp file in D: drive + RFs &fileSession = iEikonEn->FsSession(); + TChar dDrive; + User::LeaveIfError( fileSession.DriveToChar( EDriveD, dDrive ) ); + // +1 for dirve letter + iHistoryTempDir = HBufC::NewL( 1 + KCAHistoryTempDirectory().Length() ); + TPtr ptr( iHistoryTempDir->Des() ); + ptr.Append( dDrive ); + ptr.Append( KCAHistoryTempDirectory ); + + TFileName historyTempDir; + historyTempDir.Copy( ( *iHistoryTempDir ).Left( historyTempDir.MaxLength() ) ); + + //Ensure, that there is no file named IMHistory beforehand. Ignore errors + fileSession.Delete( historyTempDir.Left( + historyTempDir.Length() - KLengthOfPathEnd ) ); + + TInt createDirError( fileSession.MkDirAll( historyTempDir ) ); + if ( createDirError != KErrNone && createDirError != KErrAlreadyExists ) + { + User::LeaveIfError( createDirError ); + } + } + + + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::DeleteRecordedChatContainerL +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::DeleteRecordedChatContainerL() + { + iLoggerHeadersInterface.DeleteRecordedChatContainerL(); + } + + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::DeleteHistoryFilesL +// Delete history file. One or many. +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::DeleteHistoryFilesL( TInt aIndex, TBool aDeleteCurrentChat ) + { + // This method is called from container, and container should initialize + // iSelectedItems. If not initialized, leave with KErrArgument + if ( !iSelectedItems ) + { + User::Leave( KErrArgument ); + } + + TInt markedCount( iSelectedItems->Count() ); + iRecordedChatsArrayPC.SetProgressCount( 0 ); + + InitDeleteArrayL(); + + if ( markedCount == 0 ) //one item + { + // If flag is on for current chat deletion. Change index. + // This can occur only when markedCount is 0, so check is not + // needed in else branch + if ( aDeleteCurrentChat ) + { + aIndex = iRecordedChatsArrayPC.GetCurrentItemIndex(); + } + else //This is for keeping track of current item. + { + iRecordedChatsArrayPC.SetCurrentItemIndex( aIndex ); + } + + __ASSERT_ALWAYS( aIndex >= 0, + User::Panic( KPanicText, EAccessArrayOutOfBounds ) ); + + __ASSERT_ALWAYS( aIndex <= iRecordedChatsArrayPC.MdcaCount(), + User::Panic( KPanicText, EAccessArrayOutOfBounds ) ); + + iRecordedChatsArrayPC.SetNextIndex( aIndex ); + } + else + { + TInt progressCount = iRecordedChatsArrayPC.GetProgressCount(); + if ( progressCount >= 0 && progressCount < iItemsForDeletion.Count() ) + { + iRecordedChatsArrayPC.SetNextIndex( iItemsForDeletion[ progressCount ] ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::DeleteHistoryFileL +// Delete one file and update index. +// ----------------------------------------------------------------------------- +// +TBool CCARecordedChatsPC::DeleteHistoryFileL( ) + { + // This method is called from container, and container should initialize + // iSelectedItems. If not initialized, leave with KErrArgument + if ( !iSelectedItems ) + { + User::Leave( KErrArgument ); + } + + TInt curItemIndex = iRecordedChatsArrayPC.GetCurrentItemIndex(); + TInt nextIndex = iRecordedChatsArrayPC.GetNextIndex(); + //Keep track of current item index + if ( ( curItemIndex > nextIndex || + curItemIndex == nextIndex && + curItemIndex == iLoggerHeadersInterface.HeaderCount() - 1 ) && + curItemIndex != 0 ) + { + iRecordedChatsArrayPC.SetCurrentItemIndex( curItemIndex - 1 ); + } + + iLoggerHeadersInterface.DeleteHistoryFileL( iRecordedChatsArrayPC.GetNextIndex() ); + TInt progressCount = iRecordedChatsArrayPC.GetProgressCount(); + iRecordedChatsArrayPC.SetProgressCount( progressCount + 1 ); + progressCount = iRecordedChatsArrayPC.GetProgressCount(); + if ( iItemsForDeletion.Count() <= progressCount ) + { + return EFalse; + } + + iRecordedChatsArrayPC.SetNextIndex( iItemsForDeletion[ progressCount ] ); + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::CheckAndCorrectMTMFilename +// Check and correct proposed filename for MTM sending purposes. +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::CheckAndCorrectMtmFilename( TFileName& aFilename, + MDesCArray& aArray ) + { + TBool successFlag; + + // remove forbidden characters + TInt len( aFilename.Length() ); + + // Start from end of data + for ( TInt i( len - 1 ); i >= 0; --i ) + { + // now all the specials get removed + TPtrC c = aFilename.Mid( i, 1 ); // next character + TInt position = ( KForbiddenCharacters() ).FindC( c ); + + if ( position != KErrNotFound ) + { + // the current character is a FORBIDDEN CHARACTER, + // remove it + aFilename.Delete( i, 1 ); + } + } + + // Sanity check. We removed characters, but still checking if there + // is anything in the string + if ( aFilename.Length() < 1 ) + { + aFilename.Append( KGeneralSendFilename ); + } + + // Insert path in begin of file + RFs &fileSession = iEikonEn->FsSession(); + + TFileName tempFileName; + tempFileName.Copy( ( *iHistoryTempDir ).Left( tempFileName.MaxLength() ) ); + tempFileName.Append( aFilename ); + + aFilename = tempFileName; + + //start from two, because there is one with same name + //filename -> filename ( 2 ) + TInt fileIndex( KFileCount ); + TInt arrayCount( aArray.MdcaCount() ); + do + { + successFlag = ETrue; + for ( TInt b( 0 ); b < arrayCount && successFlag; ++b ) + { + if ( tempFileName.CompareC( aArray.MdcaPoint( b ) ) == 0 ) + { + TBuf< KFileFooterLength > filenameFooter; + filenameFooter.Format( KFileFooterFormat, fileIndex++ ); + tempFileName = aFilename; + tempFileName.Append( filenameFooter ); + successFlag = EFalse; + } + } + } + while ( !successFlag ); + + aFilename = tempFileName; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::SelectedItemsCount +// ----------------------------------------------------------------------------- +// +TInt CCARecordedChatsPC::SelectedItemsCount() const + { + return iSelectedItems->Count(); + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::ValidSelectedItems +// ----------------------------------------------------------------------------- +// +TBool CCARecordedChatsPC::ValidSelectedItems() const + { + if ( iSelectedItems ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::PrepareArrayForSendingMtmL +// Prepares MTM launch component, if not yet prepared. +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::PrepareArrayForSendingMtmL() + { + if ( !iSendAppUi ) + { + //no meaning for command id for us in here so zero passed because + //command id is mandatory parameter for CSendUi::NewL method. + iSendAppUi = CSendUi::NewL(); + } + } +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::IsMarked +// Returns items marked status +// ----------------------------------------------------------------------------- +// +TBool CCARecordedChatsPC::IsMarked( TInt aIndex ) + { + __ASSERT_ALWAYS( aIndex >= 0, + User::Panic( KPanicText, EAccessArrayOutOfBounds ) ); + __ASSERT_ALWAYS( iRecordedChatsArrayPC.MdcaCount() > aIndex, + User::Panic( KPanicText, EAccessArrayOutOfBounds ) ); + + if ( !iSelectedItems ) + { + return EFalse; + } + + TInt markedCount( iSelectedItems->Count() ); + for ( TInt a( 0 ); a < markedCount; ++a ) + { + if ( aIndex == iSelectedItems->At( a ) ) + { + return ETrue; + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::SetSelectedItems +// Initialize or uninitialize selected items. NULL means uninitialization. +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::SetSelectedItems( const CArrayFix< TInt >* aArray ) + { + iSelectedItems = aArray; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::InitDeleteArrayL +// Init delete array, so we delete items in right order. +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::InitDeleteArrayL() + { + iItemsForDeletion.Reset(); + + RArray< TInt > tempArray; + CleanupClosePushL( tempArray ); + + TInt itemCount = iSelectedItems->Count(); + TInt index; + for ( index = 0; index < itemCount; ++index ) + { + User::LeaveIfError( tempArray.Append( iSelectedItems->At( index ) ) ); + } + tempArray.Sort(); + + for ( index = itemCount - 1; index >= 0; --index ) + { + if ( index >= 0 && index < tempArray.Count() ) //Bound checking + { + User::LeaveIfError( iItemsForDeletion.Append( tempArray[ index ] ) ); + } + } + //Codescanner warning ignored + CleanupStack::PopAndDestroy(); // tempArray.Close() + } + + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::SendMTML +// MTM editor launcher. +// Code Scanner warning to be ignored +// ----------------------------------------------------------------------------- +// +TInt CCARecordedChatsPC::SendMTML( TInt aIndex, TUid aTargetUid /*= KNullUid*/ ) + { + __ASSERT_ALWAYS( aIndex >= 0, + User::Panic( KPanicText, EAccessArrayOutOfBounds ) ); + __ASSERT_ALWAYS( iRecordedChatsArrayPC.MdcaCount() > aIndex, + User::Panic( KPanicText, EAccessArrayOutOfBounds ) ); + + if ( !iSendAppUi ) + { + // Leave after prepare. Prepare should have been called earlier. + // For some reason iSendAppUi is not ready for sending MTM messages + // if we try to use it right after creation. This is why leave is needed. + PrepareArrayForSendingMtmL(); + User::Leave( KErrNotReady ); + } + + if ( aTargetUid == KNullUid ) + { + // No target uid defined, show query + + // only one item in the array + CArrayFix* servicesToDim = new( ELeave )CArrayFixFlat( 1 ); + CleanupStack::PushL( servicesToDim ); + servicesToDim->AppendL( KSenduiMtmAudioMessageUid ); + + TRAPD( cancel, aTargetUid = iSendAppUi->ShowSendQueryL( NULL, + KCapabilitiesForAllServices, servicesToDim ) ); + CleanupStack::PopAndDestroy( servicesToDim ); + if ( cancel == KErrCancel || aTargetUid == KNullUid ) + { + // user cancelled + return KErrCancel; + } + User::LeaveIfError( cancel ); + } + + CDesCArray* attachments = NULL; + TBool fileSendFlag( EFalse ); + + TStreamId theId; + + //recommended minimimun amount of granularity for segmented buffer is 16 + CStreamStore* bufStore = CBufStore::NewLC( KSegmentGranularity ); + TInt maxMsgLength( IMUtils::MaxMsgLength() ); + + RStoreWriteStream outStream; + RStoreReadStream inStream; + + // this is done to get the Id for replacement in the for-loop + theId = outStream.CreateLC( *bufStore ); + //Codescanner warning ignored + CleanupStack::PopAndDestroy(); //outStream + + CRichText* text = + CRichText::NewL( iEikonEn->SystemParaFormatLayerL(), + iEikonEn->SystemCharFormatLayerL() ); + CleanupStack::PushL( text ); + + TInt markedCount; + if ( iSelectedItems ) + { + markedCount = iSelectedItems->Count(); + } + else + { + markedCount = KOneSelected; // Delete from recorded chat view. + } + + CMessageData* messageData = CMessageData::NewL(); + CleanupStack::PushL( messageData ); + +#ifdef RD_UNIFIED_EDITOR + // check sending capabilities + TSendingCapabilities capa; + iSendAppUi->ServiceCapabilitiesL( aTargetUid, capa ); + if ( capa.iFlags & TSendingCapabilities::ESupportsAttachments ) + { + // send as attachments + fileSendFlag = ETrue; + attachments = new( ELeave ) CDesCArraySeg( 1 ); + CleanupStack::PushL( attachments ); + } + else if ( ! ( capa.iFlags & TSendingCapabilities::ESupportsBodyText ) ) + { + // doesn't support attachments nor body text, can't do anything + User::Leave( KErrNotSupported ); + } + +#else // no RD_UNIFIED_EDITOR + + //History data is send as attachments for bt, ir and mms, and as message to + //sms + TUid smsUid = { KSenduiMtmSmsUidValue }; + if ( aTargetUid != smsUid ) + { + fileSendFlag = ETrue; + attachments = new( ELeave ) CDesCArraySeg( 1 ); + CleanupStack::PushL( attachments ); + } +#endif // RD_UNIFIED_EDITOR + + TInt arrayCount( Max( markedCount, KOneSelected ) ); + // Process all marked messages + for ( TInt a( 0 ); a < arrayCount; ++a ) + { + TInt index; + if ( iSelectedItems && markedCount != 0 ) + { + index = iSelectedItems->At( a ); + } + else + { + index = aIndex; // Delete from recorded chat view + } + + outStream.ReplaceLC( *bufStore, theId ); + GetMessageForSendingViaMTML( index, outStream ); + outStream.CommitL(); + + inStream.OpenLC( *bufStore, theId ); + + // First parameter is document position at which to insert the text. + // Must be a valid position, or a panic occurs. + // inStream is stream from which to read the text. + // Third parameter are import parameters, including the foreign + // encoding to convert from, whether to guess the foreign encoding + // and the maximum number of characters to import. + // EOrganiseByLine means when importing text from a text file, + // a single line feed or a line feed followed by a carriage return is + // converted into a space character. A line feed which is followed by + // another line feed is converted into a + // CEditableText::EParagraphDelimiter. + text->ImportTextL( 0, inStream, CPlainText::EOrganiseByLine ); + + if ( fileSendFlag ) + { + + TFileName filename; + filename.Append( iLoggerHeadersInterface.Name( aIndex ) ); + filename.Append( KNotepadFileExtension ); + + TPtr ptrDate( iRecordedChatsArrayPC.Time() ); + + // This hardly fails. And if it for some reason fails, + // it is not critical, because only thing what user notifies is + // missing end time of chat + iLoggerHeadersInterface.EndTime( aIndex ).FormatL( ptrDate, + iRecordedChatsArrayPC.GetDateFormat() ); + + CheckAndCorrectMtmFilename( filename, *attachments ); + + attachments->AppendL( filename ); + messageData->AppendAttachmentL( filename ); + + TInt deleteError( iEikonEn->FsSession().Delete( filename ) ); + if ( deleteError != KErrNotFound ) + { + User::LeaveIfError( deleteError ); + } + + text->ExportAsTextL( filename, + CPlainText::EOrganiseByLine, maxMsgLength ); + } + else + { + //launch MTM editor. + messageData->SetBodyTextL( text ); + iSendAppUi->CreateAndSendMessageL( aTargetUid, messageData ); + } + + text->Reset(); + + // outstream is destroyed with close, so it cannot be used + // as parameter for popanddestroy. Codescanner warning ignored + CleanupStack::PopAndDestroy( 2 ); //instream, outstream + } + + if ( fileSendFlag ) + { + // Send files as attachments. + iSendAppUi->CreateAndSendMessageL( aTargetUid, messageData ); + arrayCount = attachments->Count(); + for ( TInt a ( 0 ); a < arrayCount; ++a ) + { + User::LeaveIfError( iEikonEn->FsSession().Delete( + attachments->MdcaPoint( a ) ) ); + } + attachments->Reset(); + CleanupStack::PopAndDestroy( attachments ); + } + + //inStream, text, outstream, bufStore + //Codescanner warning ignored. + CleanupStack::PopAndDestroy( 3, bufStore ); //messagedata, text, bufStore + + //Return KErrNone as we are not interested + //in any other error code except KErrCancel + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::StoredContactsCount +// ----------------------------------------------------------------------------- +// +TInt CCARecordedChatsPC::StoredContactsCount() const + { + // contacts + MCAStoredContacts* contacts = NULL; + TRAPD( err, contacts = CCAStorageManagerFactory::ContactListInterfaceL() ); + if ( err != KErrNone ) + { + CActiveScheduler::Current()->Error( err ); + return EFalse; + } + if ( !contacts ) + { + return EFalse; + } + + TInt numContacts( contacts->ContactCount() ); + + return numContacts; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::ReadInterface +// ----------------------------------------------------------------------------- +// +MCAMessagesReadInterface& CCARecordedChatsPC::ReadInterfaceL() const + { + return iLoggerHeadersInterface.MessagesInterfaceL( iRecordedChatsArrayPC.GetCurrentItemIndex() ); + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::WriteInterface +// ----------------------------------------------------------------------------- +// +MCAMessagesWriteInterface& CCARecordedChatsPC::WriteInterfaceL() const + { + MCAMessagesWriteInterface* tmpMessagesWriteInterface = NULL; + return *tmpMessagesWriteInterface; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::GroupCountL +// Note: CodeScanner is likely to return false positives for this situation, +// because some returned TInt values will not be error codes. +// ----------------------------------------------------------------------------- +// +TInt CCARecordedChatsPC::GroupCountL( TBool aGroupsSupported ) const + { + TInt numGroups( 0 ); + numGroups = CCAStorageManagerFactory:: + GroupListInterfaceL()->GroupCount( aGroupsSupported ); + return numGroups; + } + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::GetPairArrayForServerContactsArrayLC +// ----------------------------------------------------------------------------- +// +MCAServerContactsArrayPC* CCARecordedChatsPC::GetPairArrayForServerContactsArrayLC() + { + + MCAStoredGroups* groups = CCAStorageManagerFactory::GroupListInterfaceL(); + RPointerArray groupList; + + //Array of current group names + CDesCArray* groupNames = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupNames ); + + //Array of current group ids + CDesCArray* groupIds = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupIds ); + + CleanupClosePushL( groupList ); + groups->PopulateGroupsListL( groupList ); + + + TInt count( groupList.Count() ); + //For each item in the group list get the groupname and group id + for ( TInt index( 0 ); index < count; index++ ) + { + groupNames->AppendL( groupList[ index ]->GroupName() ); + groupIds->AppendL( groupList[ index ]->GroupId() ); + } + //Codescanner warning ignored + CleanupStack::PopAndDestroy(); // groupList.Close() + + /*We are only popping these two arrays from the clean up stack. + But their ownership has been transferred to the CCAServerContactsArrayPC and + it will be deleted in that class. Codescanner warning ignored*/ + CleanupStack::Pop( 2, groupNames ); //groupNames, groupids + + CCAServerContactsArrayPC* pairsArray = + CCAServerContactsArrayPC::NewL( groupNames, groupIds, KNullDesC ); + + + + CleanupStack::PushL( pairsArray ); //pairsArray + + //Not owned. Transfer ownership of pairsArray to the caller. + //since we return as MCAServerContactsArrayPC object sliciing will happen + //so its better to push the original data onto stack + return pairsArray; + } + + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::GetMessageForSendingViaMTML +// Get recorded chat messages for sending via MTM. +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::GetMessageForSendingViaMTML( TInt aIndex, + RWriteStream& aStream ) + { + TBuf<1> lineFeed; + lineFeed.Format( KLineFeedFormat, CEditableText::ELineBreak ); + + HBufC* identification = NULL; + if ( iLoggerHeadersInterface.ChatType( aIndex ) == EPTOPChat ) + { + identification = + StringLoader::LoadLC( R_CHATCLIENT_HISTORY_IMESSAGES, + iLoggerHeadersInterface.Identification( aIndex ) ); + } + else + { + identification = + StringLoader::LoadLC( R_CHATCLIENT_HISTORY_GROUP_NAME, + iLoggerHeadersInterface.Identification( aIndex ) ); + } + + aStream.WriteL( *identification ); + CleanupStack::PopAndDestroy( identification ); + + aStream.WriteL( lineFeed ); + + TPtr ptrDate( iRecordedChatsArrayPC.Time() ); + + // This hardly fails. And if it for some reason fails, it is not critical, + // because only thing what user notifies is missing end time of chat + iLoggerHeadersInterface.StartTime( aIndex ).FormatL( ptrDate, + iRecordedChatsArrayPC.GetStartDateFormat() ); + AknTextUtils::LanguageSpecificNumberConversion( ptrDate ); + + + // Write start information to the file + aStream.WriteL( ptrDate ); + aStream.WriteL( lineFeed ); + + iLoggerHeadersInterface.GetMessageForSendingViaMTML( aIndex, aStream ); + + // Write end information to the file. + iLoggerHeadersInterface.EndTime( aIndex ).FormatL( ptrDate, + iRecordedChatsArrayPC.GetEndDateFormat() ); + AknTextUtils::LanguageSpecificNumberConversion( ptrDate ); + + aStream.WriteL( ptrDate ); + aStream.WriteL( lineFeed ); + } + +//fix - refer Ui Spec Approved Version 1.0 (Instant Messaging NG 001 151006.pdf) +//Section 10.2.10 Pg 131 - +//"In case user has saved the image already or sent it by himself, +// this option(save) is not available." + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::ReLoggingL +// ----------------------------------------------------------------------------- +// +void CCARecordedChatsPC::ReLoggingL() + { + iLoggerHeadersInterface.ReLoggingL( iRecordedChatsArrayPC.GetCurrentItemIndex() ); + } + + +// ----------------------------------------------------------------------------- +// CCARecordedChatsPC::ResetEngineLoggerL +// ----------------------------------------------------------------------------- +// + +void CCARecordedChatsPC::ResetEngineLoggerL() + { +#ifdef RD_MULTIPLE_DRIVE + MCAProcessManager* processManager = CCAProcessManagerFactory::InstanceL()->GetProcessManager(); + CCAEngine& engine ( *processManager->GetEngine() ); + engine.ResetLoggers(); +#endif + } + + + +// End of File + +