meetingui/meetingrequestviewers/src/MRHelpers.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:19 +0200
changeset 0 f979ecb2b13e
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2005 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:   Static helper methods
*
*/




// INCLUDE FILES
#include "MRHelpers.h"
#include "MREntryConsultant.h"
#include <caluser.h> // CCalUser
#include <miuthdr.h> // CImHeader
#include <msvapi.h> // CMsvSession
#include <msvuids.h> // KUidMsvMessageEntry
#include <miutpars.h> // TImMessageField
#include <bautils.h> // BaflUtils
#include <coemain.h> // CCoeEnv

// CONSTANTS

/// Unnamed namespace for local definitions
namespace {

_LIT( KMailtoMatchPattern, "mailto:*" ); // this is never localized
const TInt KMailtoLength = 7; // "mailto:" length

enum TPanicCode
    {
    EPanicNullMsvId = 1,
    EIllegalMsvEntryType,
    EPanicNoOrganizer
    };

_LIT( KPanicMsg, "MRHelpers" );

void Panic( TPanicCode aReason )
    {
    User::Panic( KPanicMsg, aReason );
    }
    
}  // namespace

// ============================ MEMBER FUNCTIONS ===============================

// ----------------------------------------------------------------------------
// MRHelpers::CopyAttendeeL
// ----------------------------------------------------------------------------
//    
CCalAttendee* MRHelpers::CopyAttendeeL( CCalAttendee& aSource )
	{
	CCalAttendee* copy = CopyAttendeeLC( aSource );
	CleanupStack::Pop( copy );
	return copy;
	}

// ----------------------------------------------------------------------------
// MRHelpers::CopyAttendeeLC
// ----------------------------------------------------------------------------
//    
CCalAttendee* MRHelpers::CopyAttendeeLC( CCalAttendee& aSource )
	{
	CCalAttendee* copy = CCalAttendee::NewL( aSource.Address(), 
	                                         aSource.SentBy() );
    CleanupStack::PushL( copy );
    copy->SetCommonNameL( aSource.CommonName() );
    copy->SetRoleL( aSource.RoleL() );
	copy->SetStatusL( aSource.StatusL() );
	copy->SetResponseRequested( aSource.ResponseRequested() );
	return copy;
	}

// ----------------------------------------------------------------------------
// MRHelpers::CopyUserL
// ----------------------------------------------------------------------------
//    
CCalUser* MRHelpers::CopyUserL( CCalUser& aSource )
	{
	CCalUser* copy = CopyUserLC( aSource );
	CleanupStack::Pop( copy );
	return copy;
	}

// ----------------------------------------------------------------------------
// MRHelpers::CopyUserLC
// ----------------------------------------------------------------------------
//    
CCalUser* MRHelpers::CopyUserLC( CCalUser& aSource )
	{
	CCalUser* copy = CCalUser::NewL( aSource.Address(), 
	                                 aSource.SentBy() );
    CleanupStack::PushL( copy );
    copy->SetCommonNameL( aSource.CommonName() );
	return copy;
	}

// ----------------------------------------------------------------------------
// MRHelpers::CopyEntryL
// ----------------------------------------------------------------------------
//          
CCalEntry* MRHelpers::CopyEntryL(
    const CCalEntry& aEntry,
    CCalEntry::TMethod aMethod,
    TCopyFields aCopyType )
    {
	CCalEntry* copy = CopyEntryLC( aEntry, aMethod, aCopyType );
	CleanupStack::Pop( copy );
	return copy;    
    }
	
// ----------------------------------------------------------------------------
// MRHelpers::CopyEntryLC
// ----------------------------------------------------------------------------
//          
CCalEntry* MRHelpers::CopyEntryLC(
    const CCalEntry& aEntry,
    CCalEntry::TMethod aMethod,
    TCopyFields aCopyType )
    {
    CCalEntry* copy = NULL;
    HBufC8* uid = aEntry.UidL().AllocLC();
    if ( MREntryConsultant::IsModifyingEntryL( aEntry ) )
        {
        copy = CCalEntry::NewL( aEntry.EntryTypeL(),
                                uid,
                                aMethod,
                                aEntry.SequenceNumberL(),
                                aEntry.RecurrenceIdL(),
                                aEntry.RecurrenceRangeL() );
        }    
    else
        {
        copy = CCalEntry::NewL( aEntry.EntryTypeL(),
                                uid,
                                aMethod,
                                aEntry.SequenceNumberL() );
        }
    CleanupStack::Pop( uid ); // ownership transferred to the copy entry
    CleanupStack::PushL( copy );

    CopyFieldsL( aEntry, *copy, aCopyType );
            
    return copy;
    } 

// ----------------------------------------------------------------------------
// MRHelpers::CopyFieldsL
// ----------------------------------------------------------------------------
//   
void MRHelpers::CopyFieldsL(
    const CCalEntry& aSource,
    CCalEntry& aTarget,
    TCopyFields aCopyType )
    {
    if ( aCopyType == ECopyFull )
        {
        CCalEntry::TMethod tmpMethod( aTarget.MethodL() );    
        aTarget.CopyFromL( aSource );
        // We must re-set the method to the original value
        aTarget.SetMethodL( tmpMethod );
        }
    else
        {
        if ( aCopyType == ECopyOrganizer )
            {
            __ASSERT_DEBUG( aSource.OrganizerL(), Panic( EPanicNoOrganizer ) );
            CCalUser* organizer = CopyUserLC( *( aSource.OrganizerL() ) );
            aTarget.SetOrganizerL( organizer );
            CleanupStack::Pop(); // ownership transferred
            }
        
        // these are required for entries (start and end time actually not
        // for cancels and responses, but won't do any harm either):
        aTarget.SetStartAndEndTimeL( aSource.StartTimeL(), aSource.EndTimeL() );
        aTarget.SetDTStampL( aSource.DTStampL() );
        }
    }
    
// ----------------------------------------------------------------------------
// MRHelpers::SenderAddressLC
// ----------------------------------------------------------------------------
//    
HBufC* MRHelpers::SenderAddressLC(
    CMsvSession& aSession,
    TMsvId aMsgId,
    TBool aStripAlias )
    {
	__ASSERT_DEBUG( aMsgId != KMsvNullIndexEntryId, Panic( EPanicNullMsvId ) );
    CMsvEntry* entry = aSession.GetEntryL( aMsgId );
    __ASSERT_ALWAYS( entry->Entry().iType == KUidMsvMessageEntry,
                     Panic( EIllegalMsvEntryType ) );

    // Read sender from the message headers and allocate heap descriptor:

    CleanupStack::PushL( entry );
    CMsvStore* store = entry->ReadStoreL();
    CleanupStack::PushL( store );
    CImHeader* header = CImHeader::NewLC();
    header->RestoreL( *store );    
    TPtrC senderPtr( header->From() );
    if ( aStripAlias )
        {
        TImMessageField addrParser;
        senderPtr.Set(
            addrParser.GetValidInternetEmailAddressFromString( senderPtr ) );
        }
    HBufC* senderAddr = senderPtr.AllocL();
    CleanupStack::PopAndDestroy( 3, entry ); // header, store, entry
    CleanupStack::PushL( senderAddr );            
    return senderAddr;
    }

// ----------------------------------------------------------------------------
// MRHelpers::AddressWithoutMailtoPrefix
// ----------------------------------------------------------------------------
//    
TPtrC MRHelpers::AddressWithoutMailtoPrefix( const TDesC& aAddress )
	{
	TPtrC addrWithoutPrefix;
    if ( aAddress.MatchF( KMailtoMatchPattern ) != KErrNotFound )
    	{
        addrWithoutPrefix.Set( aAddress.Mid( KMailtoLength ) );
        }
    else
    	{
        addrWithoutPrefix.Set( aAddress );
        }
    return addrWithoutPrefix;
	}
	
// ----------------------------------------------------------------------------
// MRHelpers::GetCorrectDllDriveL
// ----------------------------------------------------------------------------
//    
void MRHelpers::GetCorrectDllDriveL( TFileName& aDriveName )
    {
    TParse parse;
    Dll::FileName( aDriveName );
	User::LeaveIfError( parse.Set( aDriveName, NULL, NULL ) );
    aDriveName = parse.Drive(); // contains drive, e.g. "c:"
    }

// ----------------------------------------------------------------------------
// MRHelpers::LoadResourceL
// ----------------------------------------------------------------------------
//    
TInt MRHelpers::LoadResourceL(
    const TDesC& aResourceFile,
    const TDesC& aResourcePath )
    {
    TFileName pathAndFile;
    MRHelpers::GetCorrectDllDriveL( pathAndFile ); // contains drive, e.g. "c:"    
    pathAndFile.Append( aResourceFile ); // e.g. "c:MyResource.rsc"
    
    TParse parse;
    parse.Set( pathAndFile, &aResourcePath, NULL );
    pathAndFile = parse.FullName(); // now we have full (unlocalized) file name
    
    // Find the resource file for the nearest language
    BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(),
                                    pathAndFile );
    TInt offset = CCoeEnv::Static()->AddResourceFileL( pathAndFile );
    return offset;
    }

//  End of File