diff -r 000000000000 -r b497e44ab2fc omaprovisioning/provisioning/ProvisioningEngine/Src/WPAdapterUtil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omaprovisioning/provisioning/ProvisioningEngine/Src/WPAdapterUtil.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,757 @@ +/* +* 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: WPAdapterUtil is a utility class for reading resource strings. +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include "CWPCharacteristic.h" +#include "WPAdapterUtil.h" +#include "TWPFindAccesspoint.h" +#include +#include "CWPInternetAPDB.h" + +#include +#include "ProvisioningDebug.h" +#include +#include +#include +#include +#include +#include +#include +#include "ProvisioningInternalCRKeys.h" +#include + +// LOCAL FUNCTION PROTOTYPES +typedef TBool (*TParseFunc)( TLex& aLex ); +LOCAL_C TBool DoOrReverse( TParseFunc aFunc, TLex& aLex ); +LOCAL_C TBool Star( TParseFunc aFunc, TLex& aLex ); +LOCAL_C TBool CheckIPv6Hex4( TLex& aLex ); +LOCAL_C TBool CheckIPv6ColonHex4( TLex& aLex ); +LOCAL_C TBool CheckIPv6HexSeq( TLex& aLex ); +LOCAL_C TBool CheckIPv6HexPart( TLex& aLex ); +LOCAL_C TBool CheckIPv4AddressPart( TLex& aLex ); +LOCAL_C TBool CheckIPv4Address( TLex& aLex ); +LOCAL_C TBool CheckIPv6Address( TLex& aLex ); +//Local functions for Internet Parameter handling +//Get Cenrep key (Operator value) +LOCAL_C void GetCenrepKeyL(TDes8& aValue); + +//Get Access Point ID from Database of Internet connection Methods +//or from Internet SNAP +LOCAL_C TUint GetAPIDFromDBorSNAPL(TDesC& aOrig); + +//Get the Latest Access Point ID from Internet SNAP +LOCAL_C TUint GetInternetSnapLatestAPIDL(RCmDestinationExt& InternetDestination); + +// Get the destination of purpose Internet +LOCAL_C void GetInternetSnapDestinationL(RCmManagerExt& aCmManager, RCmDestinationExt& InternetDestination); + +// Set the Internet Access point in Internet SNAP and +// Database of Internet connection Methods +LOCAL_C void SetAPtoDBandSNAPL(const TUint aAPID, const TDesC& aOriginator); + +using namespace CMManager; + +/// Default resource file suffix +_LIT( KResourceFileSuffix, ".rsc" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::AccesspointL +// ----------------------------------------------------------------------------- +// +EXPORT_C CWPCharacteristic* WPAdapterUtil::AccesspointL( + CWPCharacteristic& aCharacteristic ) + { + TWPFindAccesspoint finder; + aCharacteristic.AcceptL( finder ); + return finder.iNapDef; + } + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::ReadHBufCL +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC* WPAdapterUtil::ReadHBufCL( const TDesC& aDllPath, + const TDesC& aAdapterName, + TInt aResourceId ) + { + // Open a file server session + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + // Open the resource file + RResourceFile resourceFile; + FindAndOpenResourceFileLC(fs, aDllPath, aAdapterName, resourceFile); + + TResourceReader resReader; + resReader.SetBuffer( resourceFile.AllocReadLC( aResourceId ) ); + HBufC* text = resReader.ReadHBufCL(); + + CleanupStack::PopAndDestroy(3); // resourceFile, fs, aResourceId + + return text; + } + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::FindAndOpenResourceFileLC +// ----------------------------------------------------------------------------- +// +void WPAdapterUtil::FindAndOpenResourceFileLC( RFs& aFs, + const TDesC& aDllPath, + const TDesC& aAdapterName, + RResourceFile& aResFile ) + { + // Get the drive from DLL file name + TFileName fileName( aDllPath.Left( KMaxFileName ) ); + TParsePtrC parse( fileName ); + fileName = parse.Drive(); + + fileName.Append( KDC_RESOURCE_FILES_DIR ); + fileName.Append( aAdapterName ); + fileName.Append( KResourceFileSuffix ); + + // Retrieve the correct suffix + BaflUtils::NearestLanguageFile( aFs, fileName ); + + // Open the file + aResFile.OpenL( aFs, fileName ); + CleanupClosePushL( aResFile ); + } + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::CheckURI +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool WPAdapterUtil::CheckURI( const TDesC& aUrl ) + { + TUriParser16 uriParser; + TInt err = uriParser.Parse( aUrl ); + return err == KErrNone + && uriParser.IsPresent(EUriScheme) + && uriParser.IsPresent(EUriHost); + } + + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::CheckIPv4 +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool WPAdapterUtil::CheckIPv4( const TDesC& aIP ) + { + /* + * ABNF + * IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT + */ + + TLex lex( aIP ); + + return CheckIPv4Address( lex ); + } + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::CheckIPv6 +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool WPAdapterUtil::CheckIPv6( const TDesC& aIP ) + { + /* + * ABNF from RFC2373 + * IPv6address = hexpart [ ":" IPv4address ] + * IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT + * + * IPv6prefix = hexpart "/" 1*2DIGIT + * + * hexpart = hexseq | hexseq "::" [ hexseq ] | "::" [ hexseq ] + * hexseq = hex4 *( ":" hex4) + * hex4 = 1*4HEXDIG + */ + + TLex lex( aIP ); + TLex lexipv4( aIP ); + + if(!CheckIPv4Address( lexipv4 )) + return CheckIPv6Address( lex ); + else + return EFalse; + } + +// ---------------------------------------------------- +// CheckIPv6Address() +// IPv6address = hexpart [ ":" IPv4address ] +// ---------------------------------------------------- +// +LOCAL_C TBool CheckIPv6Address( TLex& aLex ) + { + TBool result( CheckIPv6HexPart( aLex ) ); + if( aLex.Peek() == '.' ) + { + while( aLex.Peek() != ':' && aLex.Offset() > 0 ) + { + aLex.UnGet(); + } + aLex.Inc(); + result = CheckIPv4Address( aLex ); + } + + return result && aLex.Eos(); + } + +// ---------------------------------------------------- +// CheckIPv4Address() +// IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT +// ---------------------------------------------------- +// +LOCAL_C TBool CheckIPv4Address( TLex& aLex ) + { + return CheckIPv4AddressPart( aLex ) + && aLex.Get() == '.' + && CheckIPv4AddressPart( aLex ) + && aLex.Get() == '.' + && CheckIPv4AddressPart( aLex ) + && aLex.Get() == '.' + && CheckIPv4AddressPart( aLex ) && aLex.Get() == '\0' ; + } + +// ---------------------------------------------------- +// CheckIPv4AddressPart() +// 1*3DIGIT +// ---------------------------------------------------- +// +LOCAL_C TBool CheckIPv4AddressPart( TLex& aLex ) + { + TBool result( aLex.Peek().IsDigit() ); + aLex.Inc(); + if( aLex.Peek().IsDigit() ) + { + aLex.Inc(); + if( aLex.Peek().IsDigit() ) + { + aLex.Inc(); + } + } + + return result; + } + +// ---------------------------------------------------- +// CheckIPv6HexPart() +// hexpart = hexseq | hexseq "::" [ hexseq ] | "::" [ hexseq ] +// ---------------------------------------------------- +// +LOCAL_C TBool CheckIPv6HexPart( TLex& aLex ) + { + TBool hexSeq( DoOrReverse( CheckIPv6HexSeq, aLex ) ); + TBool doubleSemiColon( EFalse ); + if( aLex.Peek() == ':' ) + { + aLex.Inc(); + if( aLex.Get() == ':' ) + { + doubleSemiColon = ETrue; + DoOrReverse( CheckIPv6HexSeq, aLex ); + } + } + + return hexSeq || doubleSemiColon; + } + +// ---------------------------------------------------- +// CheckIPv6HexSeq() +// hexseq = hex4 *( ":" hex4) +// ---------------------------------------------------- +// +LOCAL_C TBool CheckIPv6HexSeq( TLex& aLex ) + { + TBool result( CheckIPv6Hex4( aLex ) ); + if( result ) + { + Star( CheckIPv6ColonHex4, aLex ); + } + return result; + } + +// ---------------------------------------------------- +// CheckIPv6ColonHex4() +// ":" hex4 +// Used as a helper to give to Star() +// ---------------------------------------------------- +// +LOCAL_C TBool CheckIPv6ColonHex4( TLex& aLex ) + { + return aLex.Get() == ':' + && CheckIPv6Hex4( aLex ); + } + +// ---------------------------------------------------- +// CheckIPv6Hex4() +// hex4 = 1*4HEXDIG +// ---------------------------------------------------- +// +LOCAL_C TBool CheckIPv6Hex4( TLex& aLex ) + { + _LIT( KHexDigits, "0123456789ABCDEF" ); + + TPtrC hexDigits( KHexDigits ); + TBool foundOne( EFalse ); + while( hexDigits.LocateF( aLex.Peek() ) != KErrNotFound ) + { + foundOne = ETrue; + aLex.Inc(); + } + + return foundOne; + } + +// ---------------------------------------------------- +// DoOrReverse() +// Calls aFunc. If it fails, the lexer is returned to +// the state before calling DoOrReverse(). +// ---------------------------------------------------- +// +LOCAL_C TBool DoOrReverse( TParseFunc aFunc, TLex& aLex ) + { + TLexMark mark; + aLex.Mark( mark ); + if( (*aFunc)(aLex) ) + { + return ETrue; + } + else + { + aLex.UnGetToMark( mark ); + return EFalse; + } + } + +// ---------------------------------------------------- +// Star() +// Calls aFunc repeatedly until aFunc returns EFalse. +// The lexer is left to the state where it was after +// the last succesful aFunc call. Returns ETrue if +// at least one call to aFunc succeeded. +// ---------------------------------------------------- +// +LOCAL_C TBool Star( TParseFunc aFunc, TLex& aLex ) + { + TBool hasMore( ETrue ); + TBool hasOne( EFalse ); + while( hasMore ) + { + if( DoOrReverse( aFunc, aLex ) ) + { + hasOne = ETrue; + } + else + { + hasMore = EFalse; + } + } + + return hasOne; + } + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::SetAPDetailsL +// ----------------------------------------------------------------------------- + +EXPORT_C void WPAdapterUtil::SetAPDetailsL(TUint aAPId) + { + FLOG( _L( "[WPAdapterUtil] WPAdapterUtil::SetAPDetailsL:" ) ); + + TBuf8 Orig; + + //Get Originator from the Cenrep Key + GetCenrepKeyL(Orig); + //Convert to TBuf + TBuf Orig1; + Orig1.Copy(Orig); + + CCommsDatabase* commDb = CCommsDatabase::NewL(); + CleanupStack::PushL( commDb ); + CApUtils* aputils = CApUtils::NewLC( *commDb ); + + TUint32 apid = 0; + //Get IAP ID from WAPID + TRAPD( ERROR, apid = aputils->IapIdFromWapIdL( aAPId ) ); + User::LeaveIfError(ERROR); + + //Set AP to SNAP and DB + TRAPD(err,SetAPtoDBandSNAPL(apid, Orig1)); + User::LeaveIfError(err); + + CleanupStack::PopAndDestroy(2); //aputils, commDb + + FLOG( _L( "[Provisioning] WPAdapterUtil::SetAPDetailsL: done" ) ); + + } + +// ----------------------------------------------------------------------------- +// WPAdapterUtil::GetAPIDL +// ----------------------------------------------------------------------------- +EXPORT_C TUint WPAdapterUtil::GetAPIDL() + { + FLOG( _L( "[Provisioning] WPAdapterUtil::GetAPIDL:" ) ); + + TBuf8 Orig; + + //Get Originator from the P&S Key + GetCenrepKeyL(Orig); + + //Convert to TBuf + TBuf Orig1; + Orig1.Copy(Orig); + + TUint apid; + //Get the APID from DB or SNAP + apid = GetAPIDFromDBorSNAPL(Orig1); + + FLOG( _L( "[Provisioning] WPAdapterUtil::GetAPIDL:done" ) ); + return apid; + + } + +// ----------------------------------------------------------------------------- +//GetCenrepKeyL +// ----------------------------------------------------------------------------- +// +LOCAL_C void GetCenrepKeyL(TDes8& aValue) + { + FLOG( _L( "[Provisioning] WPAdapterUtil GetCenrepKeyL" ) ); + CRepository* rep = NULL; + TInt errorStatus = KErrNone; + + TRAPD( errVal, rep = CRepository::NewL(KCRUidOMAProvisioningLV)); + + if(errVal == KErrNone) + { + errorStatus = rep->Get( KOMAProvOriginatorContent ,aValue ); + } + else + { + errorStatus = errVal; + } + + if(rep) + { + delete rep; + } + + if(errorStatus != KErrNone ) + { + User::Leave(errorStatus); + } + FLOG( _L( "[Provisioning] WPAdapterUtil GetCenrepKeyL: done" ) ); + } + +// ----------------------------------------------------------------------------- +// GetAPIDFromDBorSNAPL +// ----------------------------------------------------------------------------- +// +LOCAL_C TUint GetAPIDFromDBorSNAPL(TDesC& aOrig) + { + FLOG( _L( "[Provisioning] WPAdapterUtil GetAPIDFromDBorSNAPL" ) ); + + RArray AccessPointItem; + RArray AccessPointItem2; + CWPInternetAPDB *db = CWPInternetAPDB::NewLC(); + RCmConnectionMethodExt connection; + + RCmManagerExt cmManager; + cmManager.OpenL(); + CleanupClosePushL( cmManager ); + + if (aOrig.Length()) + { + //Read the Accesspoint data from DB, for the same originator + db->ReadDbItemsForOrigL(AccessPointItem, aOrig); + + } + + //Read the Accesspoint data from DB, for all originators + db->ReadDbItemsL(AccessPointItem2); + + TInt APOrigCount = AccessPointItem.Count(); + TInt APCount = AccessPointItem2.Count(); + //Valid APID of same originator + TBool APIDofSameOrig = EFalse; + //Valid APID of same originator + TBool APIDofOtherOrig = EFalse; + + //HBufC *AccessPointName = NULL; + + TUint apid = 0; + TUint apid1; + + if (APOrigCount) + { + TInt i; + + for ( i = APOrigCount - 1; i >= 0; i-- ) + { + apid1 = AccessPointItem[i].iAPID; + TRAPD(err, connection = cmManager.ConnectionMethodL(apid1)); + if (err == KErrNone) + { + CleanupClosePushL( connection ); + + if (AccessPointItem[i].iBearerType == connection.GetIntAttributeL(ECmBearerType)) + { + //Valid access point of same originator is found + APIDofSameOrig = ETrue; + apid = apid1; + CleanupStack::PopAndDestroy(); + break; + } + + CleanupStack::PopAndDestroy(); + } + + } + + //No valid access points of same originator + //Get Access Point which is of other originator + if(!APIDofSameOrig) + { + + TInt j; + TBool InvalidAPIDofOrig; + for (i = APCount - 1; i >= 0; i-- ) + { + apid1 = AccessPointItem2[i].iAPID; + + for (InvalidAPIDofOrig = EFalse, j = APOrigCount - 1; j >= 0; j-- ) + { + if(apid1 == AccessPointItem[j].iAPID) + { + InvalidAPIDofOrig = ETrue; + break; + } + } + + TRAPD(err, connection = cmManager.ConnectionMethodL(apid1)); + if (err == KErrNone) + { + CleanupClosePushL( connection ); + if (!j && !InvalidAPIDofOrig && + AccessPointItem2[i].iBearerType == connection.GetIntAttributeL(ECmBearerType)) + + { + //Valid access point of Other originator is found + APIDofOtherOrig = ETrue; + apid = apid1; + CleanupStack::PopAndDestroy(); //connection + break; + } + CleanupStack::PopAndDestroy(); //connection + } + + } + } + } + + //No access points of same originator and valid + //Get Access Point of other originator + if (APCount && !APIDofSameOrig && !APIDofOtherOrig) + { + for (TInt i = APCount - 1; i >= 0; i-- ) + { + apid1 = AccessPointItem2[i].iAPID; + TRAPD(err, connection = cmManager.ConnectionMethodL(apid1)); + + if (err == KErrNone) + { + CleanupClosePushL( connection ); + if ( AccessPointItem2[i].iBearerType == connection.GetIntAttributeL(ECmBearerType)) + { + APIDofOtherOrig = ETrue; + apid = apid1; + CleanupStack::PopAndDestroy(); //connection + break; + } + + CleanupStack::PopAndDestroy(); //connection + } + } + + } + + //No valid access points of same originator and other originators + //Get Access Point from Internet SNAP + if (!APIDofSameOrig && !APIDofOtherOrig) + { + //Implementation to get the latest APID from Internet SNAP + RCmDestinationExt InternetDestination; + TRAPD(err, GetInternetSnapDestinationL(cmManager,InternetDestination )); + if (err == KErrNone) + { + CleanupClosePushL( InternetDestination ); + FLOG(_L(" CleanupClosePushL done" )); + //SIM provisioned, DM provisioned or user created access point + apid = GetInternetSnapLatestAPIDL(InternetDestination); + CleanupStack::PopAndDestroy(); // InternetDestination + } + + } + + CleanupStack::PopAndDestroy(2); //cmManager and db + AccessPointItem.Reset(); + AccessPointItem2.Reset(); + + FLOG( _L( "[Provisioning] WPAdapterUtil GetAPIDFromDBorSNAPL: done" ) ); + return apid; + } + +// ----------------------------------------------------------------------------- +// GetInternetSnapLatestAPIDL +// ----------------------------------------------------------------------------- +// +LOCAL_C TUint GetInternetSnapLatestAPIDL(RCmDestinationExt& InternetDestination) + { + FLOG( _L( "[Provisioning] WPAdapterUtil GetInternetSnapLatestAPIDL" ) ); + TInt APSNAPCount = InternetDestination.ConnectionMethodCount(); + TUint apid = 0; + + RCmConnectionMethodExt connection; + + //Return Connection method + if (APSNAPCount) + { + + connection = InternetDestination.ConnectionMethodL(APSNAPCount - 1); + CleanupClosePushL( connection ); + apid = connection.GetIntAttributeL( ECmIapId ); + CleanupStack::PopAndDestroy(); + + } + + FLOG( _L( "[Provisioning] WPAdapterUtil GetInternetSnapLatestAPIDL: done" ) ); + return apid; + } + +// ----------------------------------------------------------------------------- +// GetInternetSnapDestinationL +// ----------------------------------------------------------------------------- +// +LOCAL_C void GetInternetSnapDestinationL(RCmManagerExt& aCmManager,RCmDestinationExt& aDestination ) + { + FLOG( _L( "[Provisioning] WPAdapterUtil GetInternetSnapDestinationL" ) ); + RArray destinationIds; + + aCmManager.AllDestinationsL( destinationIds ); + const TInt destinationCount = destinationIds.Count(); + + RCmDestinationExt destination; + + TInt counter; + + for ( counter = 0; counter < destinationCount; counter++ ) + { + destination = aCmManager.DestinationL(destinationIds[counter] ); + CleanupClosePushL( destination ); + TSnapPurpose purpose; + purpose = (TSnapPurpose) (destination.MetadataL(CMManager::ESnapMetadataPurpose )); + + if (purpose == ESnapPurposeInternet) + { + aDestination = destination; + CleanupStack::PopAndDestroy(); // destination + break; + + } + CleanupStack::PopAndDestroy(); // destination + + } + + destinationIds.Reset(); // destinationIds + + if (counter == destinationCount ) + { + User::Leave(KErrNotFound); + } + + FLOG( _L( "[Provisioning] WPAdapterUtil GetInternetSnapDestinationL: done" ) ); + + } + +// ----------------------------------------------------------------------------- +// SetAPtoDBandSNAPL +// ----------------------------------------------------------------------------- +// +LOCAL_C void SetAPtoDBandSNAPL(const TUint aAPID, const TDesC& aOriginator) + { + FLOG( _L( "[Provisioning] WPAdapterUtil SetAPtoDBandSNAPL" ) ); + TInt ERROR; + RCmManagerExt cmManager; + TRAPD(err,cmManager.OpenL()); + User::LeaveIfError(err); + CleanupClosePushL( cmManager ); // CS:1 + + + RCmConnectionMethodExt connection = cmManager.ConnectionMethodL( aAPID ); + CleanupClosePushL( connection ); // CS:2 + + //Implementation to update the DB file with Access Point, Bearer Type + // and Originator + const TUint32 BearerType = connection.GetIntAttributeL(ECmBearerType); + + CWPInternetAPDB *db = CWPInternetAPDB::NewLC(); // CS:3 + + TInt Index; + TRAPD(err1, db->SaveToDatabaseL(Index, aAPID, BearerType, aOriginator )); + User::LeaveIfError(err1); + + RCmDestinationExt InternetDestination; + + TRAP(ERROR, GetInternetSnapDestinationL(cmManager,InternetDestination )); + + if (ERROR == KErrNone) + { + + CleanupClosePushL( InternetDestination ); // CS:4 + + TRAP(ERROR, InternetDestination.AddConnectionMethodL( connection )); + if (ERROR == KErrNone) + { + TRAP(ERROR, InternetDestination.UpdateL()); + } + + CleanupStack::PopAndDestroy(); + + } + + if (ERROR != KErrNone) + { + db->DeleteFromDatabaseL(aAPID); + User::LeaveIfError(ERROR); + } + + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy( &connection ); + CleanupStack::PopAndDestroy(); + + FLOG( _L( "[Provisioning] WPAdapterUtil SetAPtoDBandSNAPL: done" ) ); + } +// End of File