--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omaprovisioning/provisioning/accesspointadapter/Src/CWPAPAdapter.cpp Thu Jan 07 13:15:03 2010 +0200
@@ -0,0 +1,452 @@
+/*
+* Copyright (c) 2002 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: Main class for handling provisioning accesspoint data
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "CWPAPAdapter.h" // Own header
+
+#include <CWPCharacteristic.h>
+#include <commdb.h>
+#include <WPAPAdapterResource.rsg>
+#include <featmgr.h> // Feature manager
+#include "WPAPUtil.h"
+#include "CWPAPAccesspointItem.h"
+#include "CWPAPNapdef.h"
+#include "CWPAPLogicalProxy.h"
+#include "WPAPAdapter.pan"
+#include "CWPLog.h"
+#include "ProvisioningDebug.h"
+#include "WPAPDefs.h"
+#include <cmmanagerext.h>
+#include <cmconnectionmethodext.h>
+#include <WPAdapterUtil.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::CWPAPAdapter
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CWPAPAdapter::CWPAPAdapter() : CWPAdapter(),
+ iLinks( KInitialArraySize ),
+ iDataItems( KInitialArraySize ),
+ iSaveItems( KInitialArraySize )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CWPAPAdapter::ConstructL()
+ {
+ FLOG( _L( "[AccesspointAdapter] CWPAPAdapter::ConstructL:" ) );
+
+ iTitle = WPAPUtil::ReadHBufCL( R_QTN_SM_WML_ACCESSPOINTS );
+ iDefaultName = WPAPUtil::ReadHBufCL( R_QTN_SM_WAPAP_NAME );
+
+ FeatureManager::InitializeLibL();
+
+ iCmManager = new RCmManagerExt;
+ iCmManager->OpenL();
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWPAPAdapter* CWPAPAdapter::NewL()
+ {
+ CWPAPAdapter* self = new(ELeave) CWPAPAdapter;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CWPAPAdapter::~CWPAPAdapter()
+ {
+ // Contents of iLinks array are not owned
+ iLinks.Close();
+
+ iDataItems.ResetAndDestroy();
+ iDataItems.Close();
+
+ iSaveItems.ResetAndDestroy();
+ iSaveItems.Close();
+ iAPValue.Reset();
+
+ delete iTitle;
+ delete iDefaultName;
+ delete iCommsDb;
+
+ if ( iCmManager != NULL )
+ {
+ iCmManager->Close();
+ delete iCmManager;
+ }
+
+ FeatureManager::UnInitializeLib();
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::ItemCount
+// -----------------------------------------------------------------------------
+//
+TInt CWPAPAdapter::ItemCount() const
+ {
+ LOG1("Number of Access points: %d", iSaveItems.Count() );
+ return iSaveItems.Count();
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::SummaryTitle
+// -----------------------------------------------------------------------------
+//
+const TDesC16& CWPAPAdapter::SummaryTitle(TInt aIndex) const
+ {
+ __ASSERT_DEBUG( aIndex >= 0 && aIndex < iSaveItems.Count(),
+ Panic( EIndexOutOfBounds ));
+ // The title is always the same.
+ return *iTitle;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::SummaryText
+// -----------------------------------------------------------------------------
+//
+const TDesC16& CWPAPAdapter::SummaryText(TInt aIndex) const
+ {
+ __ASSERT_DEBUG( aIndex >= 0 && aIndex < iSaveItems.Count(),
+ Panic( EIndexOutOfBounds ));
+ return iSaveItems[ aIndex ]->Name();
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::DetailsL
+// -----------------------------------------------------------------------------
+//
+TInt CWPAPAdapter::DetailsL( TInt /*aItem*/, MWPPairVisitor& /*aVisitor*/)
+ {
+ // Detail view is a feature for later release.
+ return KErrNotSupported;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::SaveL
+// -----------------------------------------------------------------------------
+//
+void CWPAPAdapter::SaveL( TInt aItem )
+ {
+ FLOG( _L( "[AccesspointAdapter] CWPAPAdapter::SaveL:" ) );
+
+ __ASSERT_DEBUG(aItem >= 0 &&
+ aItem < iSaveItems.Count(),
+ Panic( EPreConditionFail ));
+
+ TBool internetparmfound = EFalse;
+ TInt err1;
+
+ for (TInt i = 0; i < iAPValue.Count(); i++)
+ {
+ if (aItem == iAPValue[i])
+ {
+ internetparmfound = ETrue;
+ break;
+ }
+
+ }
+
+ // Create the commsdb when the save is initiated first time.
+ // This stays alive until the adapter is destroyed.
+ if ( !iCommsDb )
+ {
+ iCommsDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ }
+
+ if( iAlreadySavedOnce && aItem == 0 )
+ {
+ for( TInt i( 0 ); i < iSaveItems.Count(); i++ )
+ {
+ iSaveItems[i]->DeleteUidData();
+ }
+ }
+
+ // ********************************************************************************** //
+ // ***** check that the napdefs with a certain id are only saved once SKSS-79REKH *** //
+ // ********************************************************************************** //
+ TBool found = EFalse;
+ if (iSaveItems[ aItem ]->Characteristic() == KWPNapDef)
+ {
+
+ // Get the napdef pointer from the saved items and check that it is not NULL
+ CWPAPNapdef* napdef = static_cast<CWPAPNapdef*>(iSaveItems[ aItem ]->NapDef());
+
+ if ( napdef )
+ {
+ // Store the id of the NAP that is being saved now
+ TBufC<KNameMaxLength> napId = napdef->NapId();
+
+ // check whether napdef with same id has been already saved.
+ for ( TInt j( 0 ); j < aItem; j++ )
+ {
+ // If a napdef is not in question we can move to the next item
+ if ( iSaveItems[ j ]->Characteristic() != KWPNapDef)
+ {
+ continue;
+ }
+
+ // Store the pointer to to comparison napdef and make the nap id check if
+ // the pointer is other than NULL
+ CWPAPNapdef* tmpNap = static_cast<CWPAPNapdef*>(iSaveItems[ j ]->NapDef());
+
+ if ( tmpNap != NULL )
+ {
+ // If the id was found, the napdef with this id is already stored
+ if ( tmpNap->NapId() == napId )
+ {
+ found = ETrue;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // if access point is not already stored, then we store it
+ if ( !found )
+ {
+ TUint32 iap = 0;
+ if (internetparmfound)
+ {
+ // Give pointer to cm manager to access point item
+ iSaveItems[ aItem ]->SetCMManager(iCmManager);
+ TRAPD(err,iap = iSaveItems[ aItem ]->SaveL( *iCommsDb));
+ if(err!=KErrNone)
+ {
+ User::LeaveIfError(err);
+ }
+
+ TRAP(err1, WPAdapterUtil::SetAPDetailsL(iap));
+ if (err1 == KErrNone)
+ {
+ iAlreadySavedOnce = ETrue;
+ }
+ }
+
+ if (!internetparmfound || (internetparmfound && err1 != KErrNone))
+ {
+ // Give pointer to cm manager to access point item
+ iSaveItems[ aItem ]->SetCMManager(iCmManager);
+ TRAPD(err,iap = iSaveItems[ aItem ]->SaveL( *iCommsDb));
+ if(err!=KErrNone)
+ {
+ User::LeaveIfError(err);
+ }
+ iAlreadySavedOnce = ETrue;
+ }
+ }
+ FLOG( _L( "[AccesspointAdapter] CWPAPAdapter::SaveL: done" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::CanSetAsDefault
+// -----------------------------------------------------------------------------
+//
+TBool CWPAPAdapter::CanSetAsDefault( TInt /*aItem*/ ) const
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::SetAsDefault
+// -----------------------------------------------------------------------------
+//
+void CWPAPAdapter::SetAsDefaultL( TInt /*aItem*/ )
+ {
+ // This shouldn't be called because CanSetAsDefault
+ // always returns EFalse.
+ Panic( EPreConditionFail );
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::VisitL
+// -----------------------------------------------------------------------------
+//
+void CWPAPAdapter::VisitL( CWPCharacteristic& aCharacteristic )
+ {
+ FLOG( _L( "[AccesspointAdapter] CWPAPAdapter::VisitL:" ) );
+
+ TInt type = aCharacteristic.Type();
+
+ if ( type == KWPApplication )
+ {
+ FLOG( _L( "[AccesspointAdapter] CWPAPAdapter::VisitL: KWPApplication" ) );
+ aCharacteristic.AcceptL( *this );
+ }
+ // Check every NAPDEF characteristic. If it contains INTERNET
+ // parameter then new access point is created from NAPDEF data.
+ else if ( type == KWPNapDef && !IsAlreadyLinked( aCharacteristic ) )
+ {
+ FLOG( _L( "[AccesspointAdapter] CWPAPAdapter::VisitL: KWPNapDef" ) );
+ CWPAPNapdef* item = CWPAPNapdef::NewLC( EFalse,
+ *iDefaultName,
+ aCharacteristic,
+ aCharacteristic );
+ if( item->AddItemsL( iSaveItems, NULL, NULL ) > 0 )
+ {
+ User::LeaveIfError( iLinks.InsertInAddressOrder( &aCharacteristic ) );
+ }
+ User::LeaveIfError( iDataItems.Append( item ) );
+
+
+ TInt val = item->GetInternetIndicator();
+ if (val != -1)
+ {
+ iAPValue.Append(val);
+ }
+ CleanupStack::Pop( item );
+ }
+ FLOG( _L( "[AccesspointAdapter] CWPAPAdapter::VisitL:done" ) );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::VisitL
+// -----------------------------------------------------------------------------
+//
+void CWPAPAdapter::VisitL( CWPParameter& /*aParameter*/ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::VisitLinkL
+// -----------------------------------------------------------------------------
+//
+void CWPAPAdapter::VisitLinkL( CWPCharacteristic& aCharacteristic )
+ {
+ if( !IsAlreadyLinked( aCharacteristic ) )
+ {
+ switch( aCharacteristic.Type() )
+ {
+ // This is link in APPLICATION characteristic to certain NAPDEF or LOGICAL proxy
+ case KWPPxLogical:
+ {
+ CWPAPLogicalProxy* item = CWPAPLogicalProxy::NewLC(
+ *iDefaultName, aCharacteristic );
+ item->AddItemsL( iSaveItems, NULL, NULL );
+ User::LeaveIfError( iLinks.InsertInAddressOrder( &aCharacteristic ) );
+ User::LeaveIfError( iDataItems.Append( item ) );
+ CleanupStack::Pop( item );
+ break;
+ }
+ case KWPNapDef:
+ {
+ CWPAPNapdef* item = CWPAPNapdef::NewLC( ETrue,
+ *iDefaultName,
+ aCharacteristic,
+ aCharacteristic );
+ item->AddItemsL( iSaveItems, NULL, NULL );
+ User::LeaveIfError( iLinks.InsertInAddressOrder( &aCharacteristic ) );
+ User::LeaveIfError( iDataItems.Append( item ) );
+ CleanupStack::Pop( item );
+ break;
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::ContextExtension
+// -----------------------------------------------------------------------------
+//
+TInt CWPAPAdapter::ContextExtension( MWPContextExtension*& aContextExtension )
+ {
+ aContextExtension = this;
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::SaveDataL
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CWPAPAdapter::SaveDataL( TInt aIndex ) const
+ {
+ return iSaveItems[ aIndex ]->Uid();
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::DeleteL
+// -----------------------------------------------------------------------------
+//
+void CWPAPAdapter::DeleteL( const TDesC8& aSaveData )
+ {
+ if ( !iCommsDb )
+ {
+ iCommsDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ }
+
+ TPckgBuf<TUint32> uid;
+ if( aSaveData.Length() == uid.MaxLength() )
+ {
+ LOG1( "DeleteL: Deleting %08x", uid() );
+ uid.Copy( aSaveData );
+
+ // CMManager
+ TRAPD( err, iCmManager->ConnectionMethodL( uid()).DeleteL() );
+
+ LOG1( "DeleteL: Result: %d", err );
+ if( err == KErrLocked )
+ {
+ User::Leave( EWPCommsDBLocked );
+ }
+ else if ( err != KErrNone && err != KErrNotFound )
+ {
+ User::Leave( err );
+ }
+ }
+
+ //CleanupStack::PopAndDestroy( dataHandler );
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::Uid
+// -----------------------------------------------------------------------------
+//
+TUint32 CWPAPAdapter::Uid() const
+ {
+ return iDtor_ID_Key.iUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CWPAPAdapter::IsAlreadyLinked
+// -----------------------------------------------------------------------------
+//
+TBool CWPAPAdapter::IsAlreadyLinked( CWPCharacteristic& aCharacteristic )
+ {
+ return iLinks.FindInAddressOrder( &aCharacteristic ) >= 0;
+ }
+
+// End of File