diff -r 000000000000 -r 5a93021fdf25 dbcreator/commsdatcreator/Src/cdcdumptables.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dbcreator/commsdatcreator/Src/cdcdumptables.cpp Thu Dec 17 08:55:21 2009 +0200 @@ -0,0 +1,453 @@ +/* +* 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: Implementation of the class CProcessorCSD +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include + +#include "cdcdumptables.h" +#include "cdclogger.h" + +// DEFINES + +#define QUERY_HBUFC_FIELD( record, fieldId ) *STATIC_CAST(CommsDat::CMDBField*, record->GetFieldByIdL( fieldId )) +#define QUERY_HBUFC8_FIELD( record, fieldId ) *STATIC_CAST(CommsDat::CMDBField*, record->GetFieldByIdL( fieldId )) +#define QUERY_UINT32_FIELD( record, fieldId ) *STATIC_CAST(CommsDat::CMDBField*, record->GetFieldByIdL( fieldId )) +#define QUERY_INT_FIELD( record, fieldId ) *STATIC_CAST(CommsDat::CMDBField*, record->GetFieldByIdL( fieldId )) + + +// CONSTANTS + +// commons for CSV file creatin +_LIT16( KComma, "," ); +_LIT16( KNewLine, "\n" ); +_LIT16( KCRT, "\r" ); +_LIT16( KDQuote, "\"" ); + +// Table names for CSV file creation +_LIT16( KCDWlanServiceRecord, "CCDWlanService" ); +_LIT16( KCDWlanDeviceSettingsRecord, "CCDWlanDeviceSettings" ); +_LIT16( KCDWLANSecSSIDTable, "CCDWLANSecSSIDTable" ); +_LIT16( KCDDestNWTable, "CCDDestNWTable" ); +_LIT16( KCDVirtualIAPNextLayerRecord,"CCDVirtualIAPNextLayer" ); +_LIT16( KCDDataMobilitySelectionPolicyRecord, "CCDDataMobilitySelectionPolicy" ); +_LIT16( KCDSNAPMetadataRecord, "CCDSNAPMetadata" ); +_LIT16( KCDGlobalBearerTypePriorizationRecord, "CCDGlobalBearerTypePriorization" ); +_LIT16( KCDMIPServiceExtRecord, "CCDMIPServiceExt" ); +_LIT16( KCDIAPMetadataRecord, "CCDIAPMetadata" ); +_LIT16( KCDMIP4Record, "CCDMIP4" ); +_LIT16( KCDMIP6Record, "CCDMIP6" ); + + +// Little-endian Unicode file header. +const TUint16 KLittleEndianUnicodeHeader = 0xFEFF; +// Buffer length for number conversion +const TInt KFormatBufLen = 40; + + +// --------------------------------------------------------- +// CDumpTables::NewL +// --------------------------------------------------------- +// +CDumpTables* CDumpTables::NewL() + { + CDumpTables* self = NewLC(); + CleanupStack::Pop( self ); // self + return self; + } + +// --------------------------------------------------------- +// CDumpTables::NewLC +// --------------------------------------------------------- +// +CDumpTables* CDumpTables::NewLC() + { + CDumpTables* self = new ( ELeave ) CDumpTables(); + CleanupStack::PushL( self ); + + // From base class + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------- +// CDumpTables::~CDumpTables +// --------------------------------------------------------- +// +CDumpTables::~CDumpTables() + { + iRfs.Close(); + if (iSession) + { + iSession->Close(); + delete iSession; + } + } + +// --------------------------------------------------------- +// CDumpTables::ConstructL +// --------------------------------------------------------- +// +void CDumpTables::ConstructL() + { + iSession = CommsDat::CMDBSession::NewL( + CommsDat::CMDBSession::LatestVersion() ); + } + + +// --------------------------------------------------------- +// CDumpTables::CDumpTables +// --------------------------------------------------------- +// +CDumpTables::CDumpTables() + { + + } + +// --------------------------------------------------------- +// CDumpTables::DoDumpTablesL +// --------------------------------------------------------- +// +void CDumpTables::DoDumpTablesL( const TFileName& aOutFileName ) + { + + User::LeaveIfError( OpenFileL( aOutFileName ) ); + + + //checks if Wlan feature is supported + FeatureManager::InitializeLibL(); + TBool isWlanS( FeatureManager::FeatureSupported( KFeatureIdProtocolWlan ) ); + FeatureManager::UnInitializeLib(); + + if( isWlanS ) + { + // Dumps CCDWlanService Table + DumpTableL( &KCDWlanServiceRecord ); + + // Dumps CCDWlanDeviceSettings Table + DumpTableL( &KCDWlanDeviceSettingsRecord ); + + // Dumps CCDWLANSecSSID Table + DumpTableL( &KCDWLANSecSSIDTable ); + + // Dumps CCDDestNWTable Table + DumpTableL( &KCDDestNWTable ); + } + + // Dumps CCDVirtualIAPNextLayerRecord Table + DumpTableL( + &KCDVirtualIAPNextLayerRecord ); + + // Dumps CCDDataMobilitySelectionPolicyRecord Table + DumpTableL( + &KCDDataMobilitySelectionPolicyRecord ); + + // Dumps CCDSNAPMetadataRecord Table + DumpTableL( &KCDSNAPMetadataRecord ); + + // Dumps CCDGlobalBearerTypePriorizationRecord Table + DumpTableL( + &KCDGlobalBearerTypePriorizationRecord ); + + // Dumps CCDMIPServiceExtRecord Table + DumpTableL( &KCDMIPServiceExtRecord ); + + // Dumps CCDIAPMetadataRecord Table + DumpTableL( &KCDIAPMetadataRecord ); + + // Dumps CCDMIP4Record Table + DumpTableL( &KCDMIP4Record ); + + // Dumps CCDMIP6Record Table + DumpTableL( &KCDMIP6Record ); + + iFile.Close(); + } + + +// --------------------------------------------------------- +// CDumpTables::DumpTableL +// --------------------------------------------------------- +// +template void CDumpTables::DumpTableL( const TDesC* aTableName ) + { + + CLOG_WRITE_FORMAT( "Dump table: %S \n", aTableName ); + + iFile.WriteL( *aTableName ); + iFile.WriteL( KNewLine ); + + // Retreives the table the recordset and the recordinfo + TMDBElementId tableId = T::TableIdL( *iSession ); + + T* table = new (ELeave) T( tableId ); + + const SRecordTypeInfo* aRecordInfo = table->GetRecordInfo(); + + CommsDat::CMDBRecordSet* aRecordSet = + new (ELeave) CommsDat::CMDBRecordSet( tableId ); + + // Loads the table + TRAP_IGNORE( aRecordSet->LoadL( *iSession ) ); + + //The table has been loaded + TInt count = aRecordSet->iRecords.Count(); + CLOG_WRITE_FORMAT("Record count: %d", count ); + + + TBuf16 buf; + + // Goes throught the records + for ( TInt i = 0; i < count; i++ ) + { + // The closing (after last) field in the record has 0 iTypeId + // to indicate the end of the record. + for ( TInt j = 0; 0 < aRecordInfo[j].iTypeId; j++ ) + { + // Switch for different data types + switch( aRecordInfo[j].iValType ) + { + case EInt: + case EBool: + { + // Dumping TInt + TInt res( QUERY_INT_FIELD( + (*aRecordSet)[i], aRecordInfo[j].iTypeId ) ); + buf.Format( _L( "%d" ), res ); + iFile.WriteL ( buf ); + } + break; + + case EUint32: + case ELink: + { + // Dumping TUint32 + TUint32 res32( QUERY_UINT32_FIELD( + (*aRecordSet)[i], aRecordInfo[j].iTypeId ) ); + buf.Format( _L( "%d" ), res32 ); + iFile.WriteL ( buf ); + } + break; + + case EText: + case EMedText: + case ELongText: + { + // Dumping text16 + HBufC16* text16 = QUERY_HBUFC_FIELD( + (*aRecordSet)[i], aRecordInfo[j].iTypeId ); + WriteL ( text16 ); + } + break; + + case EDesC8: + { + // Dumping text8 + HBufC8* text8 = QUERY_HBUFC8_FIELD( + (*aRecordSet)[i], aRecordInfo[j].iTypeId ); + + WriteL ( text8 ); + } + break; + + default: + CLOG_WRITE_FORMAT("! warning: type not supported: %d", + aRecordInfo[j].iValType ); + break; + } + iFile.WriteL( KComma ); + + } + iFile.WriteL( KNewLine ); + } + } + +// --------------------------------------------------------- +// CDumpTables::OpenFileL +// --------------------------------------------------------- +// +TInt CDumpTables::OpenFileL( const TFileName& aFileName ) + { + ////CLOG_WRITE_FORMAT( "Output file name %S", aFileName ); + + TInt err = iRfs.Connect(); + + if( err == KErrNone ) + { + err = iFile.Replace( iRfs, aFileName, EFileStreamText | EFileWrite ); + } + + if( err == KErrNotFound ) + // file does not exist - create it + { + err=iFile.Create( iRfs, aFileName, EFileStreamText | EFileWrite ); + } + + if( err == KErrNone ) + { + // Write little-endian Unicode file header. + iFile.WriteUint16L( KLittleEndianUnicodeHeader ); + } + + if( err != KErrNone ) + { + iFile.Close(); + ////CLOG_WRITE_FORMAT( "!Error Output file cannot be opened: %S", aFileName ); + } + + return err; + } + + +// --------------------------------------------------------- +// CDumpTables::WriteL +// --------------------------------------------------------- +// +void CDumpTables::WriteL( HBufC8* aDes ) + { + + if( aDes ) + { + + CleanupStack::PushL( aDes ); + + HBufC16* text16 = HBufC16::NewL( aDes->Length() ); + text16->Des().Copy( aDes->Des() ); + + WriteL ( text16 ); + + CleanupStack::PopAndDestroy( aDes ); + } + + } + + +// --------------------------------------------------------- +// CDumpTables::WriteL +// --------------------------------------------------------- +// +void CDumpTables::WriteL( HBufC16* aDes ) + { + + if( aDes ) + { + CleanupStack::PushL( aDes ); + + TBool res = CheckCSVTransformNeedL( aDes ); + + // Need conversion + if( res ) + { + HBufC16* cvsFormat = TransformToCSVFormatLC( aDes ); + iFile.WriteL ( *cvsFormat ); + CleanupStack::PopAndDestroy( cvsFormat ); + } + else + { + iFile.WriteL ( *aDes ); + } + CleanupStack::PopAndDestroy( aDes ); + } + } + + +// --------------------------------------------------------- +// CDumpTables::TransformToCSVFormatLC +// --------------------------------------------------------- +// +HBufC16* CDumpTables::TransformToCSVFormatLC( const HBufC16* aField ) + { + CLOG_WRITE_FORMAT( "Transform needed: %S", aField ); + + // Length of the csv format string is calculated. + // "2" are the leading and trailing d.qquotes + TInt csvLen = aField->Length() + iNumOfDQuotes + 2; + HBufC16* csv = HBufC16::NewLC( csvLen ); + + TPtr16 ptr = csv->Des(); + + // Heading quote + ptr.Append( KDQuote ); + ptr.Append( *aField ); + + // Quotes might be duplicated + if( 0 < iNumOfDQuotes ) + { + // Heading quote step over + TInt pos = 1; + while( pos < ptr.Length() && pos != KErrNotFound ) + { + ptr = ptr.Mid( pos ); + pos = ptr.Find( KDQuote ); + if( pos != KErrNotFound ) + { + ptr.Insert( pos, KDQuote ); + pos+=2; + } + } + } + + // Tailing quote + ptr.Append( KDQuote ); + + CLOG_WRITE_FORMAT( "Transformed: %S", csv ); + + return csv; + } + + +// --------------------------------------------------------- +// CDumpTables::CheckCSVTransformNeedL +// --------------------------------------------------------- +// +TBool CDumpTables::CheckCSVTransformNeedL( HBufC16* aField ) + { + // Looks for comma, new line or carrige return characters. + // Only existance is necessary. If any of them exist the + // quoting is necessary + TInt cnrPos = aField->Find( KComma ); + if( cnrPos == KErrNotFound ) + { + cnrPos = aField->Find( KNewLine ); + if( cnrPos == KErrNotFound ) + { + cnrPos = aField->Find( KCRT ); + } + } + + // Serches for all dquote. Number is usefull for csv text creation + iNumOfDQuotes = 0; + TPtr16 ptr = aField->Des(); + + TInt quotePos = ptr.Find( KDQuote ); + while( quotePos != KErrNotFound ) + { + iNumOfDQuotes++; + ptr = ptr.Mid( quotePos+1 ); + quotePos = ptr.Find( KDQuote ); + } + + // csv file conversion necessary if comma... or quote is in the text. + return ( 0 < iNumOfDQuotes || cnrPos != KErrNotFound ); + }