phoneclientserver/aiwdialdata/src/aiwinternaldialdata.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 17:13:17 +0300
branchRCL_3
changeset 9 71e7b994dff4
parent 0 ff3b6d0fd310
permissions -rw-r--r--
Revision: 201015 Kit: 201017

/*
* Copyright (c) 2005-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:  Methods for CAiwInternalDialData class.
*
*/


#include "aiwinternaldialdata.h"
#include "aiwdialdataext.h"

// CONSTANTS    

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

// ---------------------------------------------------------------------------
// 
// First phase constructor
// 
// --------------------------------------------------------------------------- 
//
EXPORT_C CAiwInternalDialData* CAiwInternalDialData::NewL()
    {
    CAiwInternalDialData* self = CAiwInternalDialData::NewLC();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// 
// First phase constructor
// 
// --------------------------------------------------------------------------- 
//
EXPORT_C CAiwInternalDialData* CAiwInternalDialData::NewLC()
    {
    CAiwInternalDialData* self = new( ELeave ) CAiwInternalDialData;
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

// ---------------------------------------------------------------------------
// 
// First phase constructor
// Initialises the member data from package.
// 
// --------------------------------------------------------------------------- 
//    
EXPORT_C CAiwInternalDialData* CAiwInternalDialData::NewL( 
    const TDesC8& aPackage )
    {
    CAiwInternalDialData* self = CAiwInternalDialData::NewLC( aPackage );
    CleanupStack::Pop( self );
    return self;
    }
    
// ---------------------------------------------------------------------------
// 
// First phase constructor
// Initialises the member data from package.
// 
// --------------------------------------------------------------------------- 
//
EXPORT_C CAiwInternalDialData* CAiwInternalDialData::NewLC(
    const TDesC8& aPackage )
    {
    CAiwInternalDialData* self = new( ELeave ) CAiwInternalDialData;
    CleanupStack::PushL( self );
    self->ConstructL( aPackage );
    return self;
    }

// ---------------------------------------------------------------------------
// 
// Destructor.
// 
// ---------------------------------------------------------------------------
//
CAiwInternalDialData::~CAiwInternalDialData()
    {
    delete iPhoneNumber;
    iPhoneNumber = NULL;
    delete iName;
    iName = NULL;
    delete iContactLink;
    iContactLink = NULL;
    delete iSubAddress;
    iSubAddress = NULL;
    delete iBearer;
    iBearer = NULL;
    delete iUUI;
    iUUI = NULL;
    }
    
// ---------------------------------------------------------------------------
// Fills the parameter list.
// ---------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::FillInParamListL( 
    CAiwGenericParamList& aInParamList )
    {
    HBufC8* package = PackLC();
    TAiwVariant variant( *package );
    TAiwGenericParam param( EGenericParamCallDialData, variant );
    aInParamList.AppendL( param );
    CleanupStack::PopAndDestroy( package );
    }
    
// ---------------------------------------------------------------------------
// Sets SAT call.
// ---------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::SetSATCall( TBool aIsSATCall ) 
    {
    iSATCall = aIsSATCall;
    }
   
// ---------------------------------------------------------------------------
// Sets SubAddress for SAT call.
// ---------------------------------------------------------------------------
EXPORT_C void CAiwInternalDialData::SetSubAddressL( 
    const TDesC& aSubAddress )
    {
    CheckDescriptorMaxLengthL( aSubAddress.Length(), 
                               AIWInternalDialData::KAiwSubAddressLength );
    CopyDescriptorToMemberDescriptorL( aSubAddress, iSubAddress );
    }
    
// ---------------------------------------------------------------------------
// Sets bearer.
// ---------------------------------------------------------------------------
EXPORT_C void CAiwInternalDialData::SetBearerL(
    const TDesC8& aBearer )
    {
    CheckDescriptorMaxLengthL( aBearer.Length(), 
                               AIWInternalDialData::KAiwBearerLength );
    CopyDescriptorToMemberDescriptorL( aBearer, iBearer );
    }

// ---------------------------------------------------------------------------
// Sets end other calls.
// ---------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::SetEndOtherCalls( 
    TBool aEndOtherCalls ) 
    {
    iEndOtherCalls = aEndOtherCalls;
    }

// ---------------------------------------------------------------------------
// Sets redial max duation time.
// ---------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::SetRedialMaximumDuration( 
    const TTimeIntervalSeconds aMaximumRedialDuration ) 
    {
    iRedialMaximumDuration = aMaximumRedialDuration;
    }
    

// -----------------------------------------------------------------------------
// Sets used service id.
// -----------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::SetServiceId( TUint32 aServiceId )
    {
    iServiceId = aServiceId;
    }


// -----------------------------------------------------------------------------
// Sets user to user information.
// -----------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::SetUUIL( const TDesC& aUUI )
    {
    CheckDescriptorMaxLengthL( aUUI.Length(), 
        AIWInternalDialData::KAiwUUILength );
    CopyDescriptorToMemberDescriptorL( aUUI, iUUI );
    }
    
// ---------------------------------------------------------------------------
// Sets phone number.
// ---------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::SetPhoneNumberL(
    const TDesC& aPhoneNumber )
    {
    CheckDescriptorMaxLengthL( aPhoneNumber.Length(), 
                            AIWInternalDialData::KMaximumPhoneNumberLength );
    CopyDescriptorToMemberDescriptorL( aPhoneNumber, iPhoneNumber );
    }
        
// ---------------------------------------------------------------------------
// Sets call type.
// ---------------------------------------------------------------------------
//   
EXPORT_C void CAiwInternalDialData::SetCallType( 
    CAiwDialData::TCallType aCallType ) 
    {
    iCallType = aCallType;
    }

// ---------------------------------------------------------------------------
// Set initiate call.
// ---------------------------------------------------------------------------
//    
EXPORT_C void CAiwInternalDialData::SetInitiateCall( TBool aInitCall )
    {
    iInitCall = aInitCall;
    }
   
// ---------------------------------------------------------------------------
// Set name.
// ---------------------------------------------------------------------------
//    
EXPORT_C void CAiwInternalDialData::SetNameL( const TDesC& aName ) 
    {
    CheckDescriptorMaxLengthL( aName.Length(), 
                               AIWInternalDialData::KMaximumNameLength );
    CopyDescriptorToMemberDescriptorL( aName, iName );
    }
    
// ---------------------------------------------------------------------------
// Sets window group.
// ---------------------------------------------------------------------------
//    
EXPORT_C void CAiwInternalDialData::SetWindowGroup( TInt aWindowGroup ) 
    {
    iWindowGroup = aWindowGroup;
    }
   
// ---------------------------------------------------------------------------
// Sets redial value.
// ---------------------------------------------------------------------------
//    
EXPORT_C void CAiwInternalDialData::SetRedial( TInt aRedial ) 
    {
    iRedial = aRedial;
    }
    
// ---------------------------------------------------------------------------
// Set show number.
// ---------------------------------------------------------------------------
//    
EXPORT_C void CAiwInternalDialData::SetShowNumber( TBool aShowNumber ) 
    {
    iShowNumber = aShowNumber;
    }
    
// ---------------------------------------------------------------------------
// Sets allow match.
// ---------------------------------------------------------------------------
//   
EXPORT_C void CAiwInternalDialData::SetAllowMatch( TBool aAllowMatch ) 
    {
    iAllowMatch = aAllowMatch;
    }
    
// ---------------------------------------------------------------------------
// Sets used contact link.
// ---------------------------------------------------------------------------
//
EXPORT_C void CAiwInternalDialData::SetContactLinkL( 
    const TDesC8& aContactLink ) 
    {
    CopyDescriptorToMemberDescriptorL( aContactLink, iContactLink );
    }
    
// ---------------------------------------------------------------------------
// Returns SAT call value.
// ---------------------------------------------------------------------------
//
EXPORT_C TBool CAiwInternalDialData::SATCall() const
    {
    return iSATCall;    
    }

// ---------------------------------------------------------------------------
// Returns subaddress.
// ---------------------------------------------------------------------------
//   
EXPORT_C const TDesC& CAiwInternalDialData::SubAddress() const
    {
    return *iSubAddress;
    }
    
// ---------------------------------------------------------------------------
// Returns end other calls value.
// ---------------------------------------------------------------------------
//
EXPORT_C TBool CAiwInternalDialData::EndOtherCalls() const
    {
    return iEndOtherCalls;
    }
    
// ---------------------------------------------------------------------------
// Returns bearer.
// ---------------------------------------------------------------------------
//
EXPORT_C const TDesC8& CAiwInternalDialData::Bearer() const
    {
    return *iBearer;
    }

// ---------------------------------------------------------------------------
// Returns redial max duration.
// ---------------------------------------------------------------------------
//
EXPORT_C const TTimeIntervalSeconds 
    CAiwInternalDialData::RedialMaximumDuration() const
    {
    return iRedialMaximumDuration;
    }
    

// -----------------------------------------------------------------------------
// Returns used service id.
// -----------------------------------------------------------------------------
//
EXPORT_C TUint32 CAiwInternalDialData::ServiceId() const
    {
    return iServiceId;
    }

    
// ---------------------------------------------------------------------------
// Returns name.
// ---------------------------------------------------------------------------
//
EXPORT_C const TDesC& CAiwInternalDialData::Name() const 
    {
    return *iName;
    }      

// ---------------------------------------------------------------------------
// Returns initiate call.
// ---------------------------------------------------------------------------
//
EXPORT_C TBool CAiwInternalDialData::InitiateCall() const 
    {
    return iInitCall;
    } 
        
// ---------------------------------------------------------------------------
// Returns phone number.
// ---------------------------------------------------------------------------
//    
EXPORT_C const TDesC& CAiwInternalDialData::PhoneNumber() const 
    {
    return *iPhoneNumber;    
    }
    
// ---------------------------------------------------------------------------
// Returns call type.
// ---------------------------------------------------------------------------
//    
EXPORT_C CAiwDialData::TCallType CAiwInternalDialData::CallType() const 
    {
    return iCallType;
    }
        
// ---------------------------------------------------------------------------
// Return window group.
// ---------------------------------------------------------------------------
//    
EXPORT_C TInt CAiwInternalDialData::WindowGroup() const
    {
    return iWindowGroup;
    }
// ---------------------------------------------------------------------------
// Return redial value.
// ---------------------------------------------------------------------------
//    
EXPORT_C TInt CAiwInternalDialData::Redial() const 
    {
    return iRedial;
    }
// ---------------------------------------------------------------------------
// Returns show number.
// ---------------------------------------------------------------------------
//   
EXPORT_C TBool CAiwInternalDialData::ShowNumber() const 
    {
    return iShowNumber;
    }
    
// ---------------------------------------------------------------------------
// Return allow match.
// ---------------------------------------------------------------------------
//   
EXPORT_C TBool CAiwInternalDialData::AllowMatch() const 
    {
    return iAllowMatch;
    }
    
// ---------------------------------------------------------------------------
// Return contact link.
// ---------------------------------------------------------------------------
//    
EXPORT_C const TDesC8& CAiwInternalDialData::ContactLink() const 
    {
    return *iContactLink;
    }  
    
// ---------------------------------------------------------------------------
// Return user to user information
// ---------------------------------------------------------------------------
//   
EXPORT_C const TDesC& CAiwInternalDialData::UUI() const
    {
    return *iUUI;
    }
    
// ---------------------------------------------------------------------------
// 
// C++ constructor
// 
// ---------------------------------------------------------------------------
//
CAiwInternalDialData::CAiwInternalDialData() :
    iShowNumber( ETrue ),
    iAllowMatch( ETrue ),
    iServiceId( 0 )
    {
    }

// ---------------------------------------------------------------------------
// 
// Symbian OS constructor
// 
// ---------------------------------------------------------------------------
//
void CAiwInternalDialData::ConstructL()
    {
    iPhoneNumber = KNullDesC().AllocL();
    iName = KNullDesC().AllocL();
    iContactLink = KNullDesC8().AllocL();
    iSubAddress = KNullDesC().AllocL();
    iBearer = KNullDesC8().AllocL();
    iUUI = KNullDesC().AllocL();
    iCallType = CAiwDialData::EAIWVoice;
    iWindowGroup = AIWDialData::KAiwGoToIdle;
    iInitCall = EFalse;
    iRedial = AIWDialDataExt::KAIWRedialDefault;
    iShowNumber = ETrue;
    iAllowMatch = ETrue;
    iRedialMaximumDuration = NULL;
    iSATCall = EFalse;
    iEndOtherCalls = EFalse;
    }

// ---------------------------------------------------------------------------
// 
// Symbian OS constructor  
// Initialises the member data from package.
//
// ---------------------------------------------------------------------------
//
void CAiwInternalDialData::ConstructL(
    const TDesC8& aPackage ) 
    {
    RDesReadStream stream( aPackage );
    CleanupClosePushL( stream );
    
    ReadDescriptorFromStreamL( stream, iPhoneNumber );
    iCallType = static_cast<CAiwDialData::TCallType>( stream.ReadUint32L() );
    ReadDescriptorFromStreamL( stream, iName );
    iWindowGroup = stream.ReadInt32L();
    iRedial = stream.ReadInt32L();
    iShowNumber = stream.ReadInt32L();
    iAllowMatch = stream.ReadInt32L();
    ReadDescriptorFromStreamL( stream, iContactLink );
    iSATCall = stream.ReadInt32L();
    ReadDescriptorFromStreamL( stream, iSubAddress );
    iEndOtherCalls = stream.ReadInt32L();
    ReadDescriptorFromStreamL( stream, iBearer );
    iRedialMaximumDuration = stream.ReadInt32L();
    iInitCall = stream.ReadInt32L();
    iServiceId = stream.ReadInt32L();    
    ReadDescriptorFromStreamL( stream, iUUI );
    
    CleanupStack::PopAndDestroy( 1 ); // stream;
    }

// ---------------------------------------------------------------------------
// Calculates the size of all member data.
// ---------------------------------------------------------------------------
//
TInt CAiwInternalDialData::CalculatePackageSize() const
    {
    TInt packageSize = 0;
    packageSize += CalculateDescriptorSize( *iPhoneNumber );
    packageSize += sizeof( iCallType );
    packageSize += CalculateDescriptorSize( *iName );
    packageSize += sizeof( iWindowGroup );
    packageSize += sizeof( iRedial );
    packageSize += sizeof( iShowNumber );
    packageSize += sizeof( iAllowMatch );
    packageSize += CalculateDescriptorSize( *iContactLink );
    packageSize += sizeof( iSATCall );
    packageSize += CalculateDescriptorSize( *iSubAddress );
    packageSize += sizeof( iEndOtherCalls );
    packageSize += CalculateDescriptorSize( *iBearer );
    packageSize += sizeof( iRedialMaximumDuration );
    packageSize += sizeof( iInitCall );
    packageSize += sizeof( iServiceId );
    packageSize += CalculateDescriptorSize( *iUUI );
    
    return packageSize;
    }

// ---------------------------------------------------------------------------
// Calculates the size of descriptor in package. Note that to retreave 
// a descriptor from stream in ConstructL we need to know the size of a
// descriptor in order to allocate right size descriptor. This is the reason
// for adding sizeof( int ) to descriptor length.
// ---------------------------------------------------------------------------
// 
TInt CAiwInternalDialData::CalculateDescriptorSize( 
    const TDesC& aDescriptor ) const 
    {
    // sizeof( TInt ) is for the length of a descriptor.
    return sizeof( TInt ) + aDescriptor.Length() * 2; // unicode takes 2 bytes.
    }

// ---------------------------------------------------------------------------
// Calculates the size of descriptor in package. Note that to retreave 
// a descriptor from stream in ConstructL we need to know the size of a
// descriptor in order to allocate right size descriptor. This is the reason
// for adding sizeof( int ) to descriptor length.
// ---------------------------------------------------------------------------
// 
TInt CAiwInternalDialData::CalculateDescriptorSize( 
    const TDesC8& aDescriptor ) const 
    {
    // sizeof( TInt ) is for the length of a descriptor in stream
    return sizeof( TInt ) + aDescriptor.Length();
    }    

// ---------------------------------------------------------------------------
// Reads descriptor from stream.
// ---------------------------------------------------------------------------
//
void CAiwInternalDialData::ReadDescriptorFromStreamL( 
    RDesReadStream& aStream,
    HBufC*& aDescriptor 
    )
    {
    const TInt descLength( aStream.ReadInt32L() );
    
    // Not to cleanupstack, aDescriptor will be member variable
    aDescriptor = HBufC::NewL( descLength ); 
    TPtr16 ptr = aDescriptor->Des();
    aStream.ReadL( ptr, descLength );
    }
  
// ---------------------------------------------------------------------------
// Reads descriptor from stream.
// ---------------------------------------------------------------------------
//  
void CAiwInternalDialData::ReadDescriptorFromStreamL( 
    RDesReadStream& aStream,
    HBufC8*& aDescriptor 
    )
    {
    const TInt descLength( aStream.ReadInt32L() );
    
    // Not to cleanupstack, aDescriptor is member variable
    aDescriptor = HBufC8::NewL( descLength ); 
    TPtr8 ptr = aDescriptor->Des();
    aStream.ReadL( ptr, descLength );
    }    
   
// ---------------------------------------------------------------------------
// Writes descriptor to stream.
// ---------------------------------------------------------------------------
//  
void CAiwInternalDialData::WriteDescriptorToStreamL( 
    RDesWriteStream& aStream, 
    const TDesC& aDescriptor ) 
    {
    aStream.WriteInt32L( aDescriptor.Length() );
    aStream.WriteL( aDescriptor );
    }

// ---------------------------------------------------------------------------
// Writes descriptor to stream.
// ---------------------------------------------------------------------------
//  
void CAiwInternalDialData::WriteDescriptorToStreamL( 
    RDesWriteStream& aStream, 
    const TDesC8& aDescriptor ) 
    {
    aStream.WriteInt32L( aDescriptor.Length() );
    aStream.WriteL( aDescriptor );
    }
   
// ---------------------------------------------------------------------------
// Copies aSource descriptor to aMemberDescriptor. This quarantees that member
// descriptor will be valid even if the allocation fails.
// ---------------------------------------------------------------------------
//   
void CAiwInternalDialData::CopyDescriptorToMemberDescriptorL( 
    const TDesC& aSource, 
    HBufC*& aMemberDescriptor )
    {
    HBufC* temp = aSource.AllocL();
    delete aMemberDescriptor;
    aMemberDescriptor = temp;
    }

// ---------------------------------------------------------------------------
// Copies aSource descriptor to aMemberDescriptor. This quarantees that member
// descriptor will be valid even if the allocation fails.
// ---------------------------------------------------------------------------
//       
void CAiwInternalDialData::CopyDescriptorToMemberDescriptorL( 
    const TDesC8& aSource, 
    HBufC8*& aMemberDescriptor )
    {
    HBufC8* temp = aSource.AllocL();
    delete aMemberDescriptor;
    aMemberDescriptor = temp;
    }

// ---------------------------------------------------------------------------
// Checks that descriptorLength is not longer than maximum allowed descriptor
// length.
// ---------------------------------------------------------------------------
//   
void CAiwInternalDialData::CheckDescriptorMaxLengthL( 
    TInt aDescriptorLength, TInt aMaxAllowedDescriptorLength ) const
    {
    if( aDescriptorLength > aMaxAllowedDescriptorLength )
        {
        User::Leave( KErrArgument );
        }
    }

// ---------------------------------------------------------------------------
// Packs the member data to descriptor. Ownershipd of returned descriptor
// is given for caller.
// ---------------------------------------------------------------------------
//  
HBufC8* CAiwInternalDialData::PackLC() 
    {
    HBufC8* package = HBufC8::NewLC( CalculatePackageSize() );
    
    TPtr8 des = package->Des();
    RDesWriteStream stream( des );
    CleanupClosePushL( stream );
    
    WriteDescriptorToStreamL( stream, *iPhoneNumber );
    stream.WriteInt32L( iCallType );
    WriteDescriptorToStreamL( stream, *iName );
    stream.WriteInt32L( iWindowGroup );
    stream.WriteInt32L( iRedial );
    stream.WriteInt32L( iShowNumber );
    stream.WriteInt32L( iAllowMatch );
    WriteDescriptorToStreamL( stream, *iContactLink );
    stream.WriteInt32L( iSATCall );
    WriteDescriptorToStreamL( stream, *iSubAddress );
    stream.WriteInt32L( iEndOtherCalls );
    WriteDescriptorToStreamL( stream, *iBearer );
    stream.WriteInt32L( iRedialMaximumDuration.Int() );
    stream.WriteInt32L( iInitCall );
    stream.WriteUint32L( iServiceId );
    WriteDescriptorToStreamL( stream, *iUUI );
        
    stream.CommitL();
    
    CleanupStack::PopAndDestroy( 1 ); // stream
    
    return package;
    }

//  End of File