diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/syncagent/src/nsmlphoneinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/common/syncagent/src/nsmlphoneinfo.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,262 @@ +/* +* 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: Phone specific data +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// CONSTANTS +_LIT( KNSmlCommonAgentPanic, "NSmlCommonAgent" ); +#if defined( __WINS__ ) +_LIT( KNSmlIMEIFileName, "imei.txt"); +const TInt KNSmlMaxIMEIFileName = 256; +const TInt KNSmlIMEIFileDrive = EDriveC; +#endif + +// --------------------------------------------------------- +// CNSmlPhoneInfo::CNSmlPhoneInfo +// Constructor, nothing special in here. +// --------------------------------------------------------- +// +CNSmlPhoneInfo::CNSmlPhoneInfo() + { + } + +// --------------------------------------------------------- +// CNSmlPhoneInfo::ConstructL() +// Two-way construction. Constructor may leave in EPOC. +// --------------------------------------------------------- +// +void CNSmlPhoneInfo::ConstructL() + { + } + +// --------------------------------------------------------- +// CNSmlPhoneInfo::~CNSmlPhoneInfo() +// Destructor +// --------------------------------------------------------- +// + +CNSmlPhoneInfo::~CNSmlPhoneInfo() + { + delete iSwVersion; + } +// --------------------------------------------------------- +// CNSmlPhoneInfo::NewL() +// Creates new instance of CNSmlPhoneInfo. +// Does not leave instance pointer to CleanupStack. +// --------------------------------------------------------- +// +EXPORT_C CNSmlPhoneInfo* CNSmlPhoneInfo::NewL() + { + CNSmlPhoneInfo* self = CNSmlPhoneInfo::NewLC(); + CleanupStack::Pop(); + return( self ); + } + +// --------------------------------------------------------- +// CNSmlPhoneInfo::NewLC() +// Creates new instance of CNSmlPhoneInfo +// Leaves instance pointer to CleanupStack. +// --------------------------------------------------------- +// +EXPORT_C CNSmlPhoneInfo* CNSmlPhoneInfo::NewLC() + { + CNSmlPhoneInfo* self = new (ELeave) CNSmlPhoneInfo(); + CleanupStack::PushL( self ); + self->ConstructL(); + return( self ); + } +// --------------------------------------------------------- +// CNSmlPhoneInfo::PhoneDataL() +// Manufacturer, version and IMEI from phone service +// +// --------------------------------------------------------- +EXPORT_C void CNSmlPhoneInfo::PhoneDataL( TPhoneIdType aIdType, TDes& aId ) const + { + aId.Zero(); + HBufC* modelId; + modelId = KNSmlPhoneModelIdDefault().AllocLC(); + _LIT( KSmlPhoneManufacturer, "Unknown" ); +#if defined( __WINS__ ) +// phone services may work in emulator! + _LIT( KSmlPhoneRevisionId, "1.0" ); + switch ( aIdType ) + { + case EPhoneManufacturer: + aId = KSmlPhoneManufacturer; + break; + case EPhoneModelId: + aId = *modelId; + break; + case EPhoneRevisionId: + aId = KSmlPhoneRevisionId; + break; + case EPhoneSerialNumber: + RFs fileServer; + User::LeaveIfError(fileServer.Connect()); + CleanupClosePushL(fileServer); + HBufC* path = HBufC::NewLC(KNSmlMaxIMEIFileName); + TPtr pathPtr = path->Des(); + fileServer.CreatePrivatePath(KNSmlIMEIFileDrive); + User::LeaveIfError(fileServer.SetSessionToPrivate(KNSmlIMEIFileDrive)); + User::LeaveIfError(fileServer.SessionPath(pathPtr)); + TParse filename; + User::LeaveIfError(filename.Set(KNSmlIMEIFileName(), path, NULL)); + _LIT(KSmlImeiMask, "IMEI:%05d%05d%05d"); + RFile file; + TInt err = file.Open(fileServer, filename.FullName(), EFileShareAny); + if (err == KErrNotFound) + { + User::LeaveIfError(file.Create(fileServer, filename.FullName(), EFileShareAny|EFileWrite)); + RFileWriteStream writer(file, 0); + // practically unique IMEI for emulator use + aId.Format(KSmlImeiMask(), User::TickCount(), User::TickCount()*3, User::TickCount()*7); + writer << aId; + writer.CommitL(); + writer.Close(); + } + else if (err) + { + User::Leave(err); + } + else + { + RFileReadStream reader(file, 0); + reader >> aId; + reader.Close(); + } + CleanupClosePushL(file); + CleanupStack::PopAndDestroy(3); // fileServer, file, path + break; + default: + User::Panic( KNSmlCommonAgentPanic, KErrArgument ); + break; + } +#else + _LIT(KSmlImeiMask, "IMEI:%S"); + RTelServer server; + User::LeaveIfError(server.Connect()); + CleanupClosePushL(server); + TInt numPhones; + User::LeaveIfError(server.EnumeratePhones(numPhones)); + if( numPhones > 0 ) + { + RTelServer::TPhoneInfo phoneInfo; + User::LeaveIfError(server.GetPhoneInfo(0, phoneInfo)); // Query first phone + RMobilePhone phone; + User::LeaveIfError(phone.Open(server, phoneInfo.iName)); + CleanupClosePushL(phone); + User::LeaveIfError(phone.Initialise()); + TUint32 identityCaps; + phone.GetIdentityCaps( identityCaps ); + RMobilePhone::TMobilePhoneIdentityV1 id; + TRequestStatus status; + phone.GetPhoneId( status, id ); + User::WaitForRequest( status ); + User::LeaveIfError( status.Int() ); + switch ( aIdType ) + { + case EPhoneManufacturer: + if ( IsFlagSet( identityCaps, RMobilePhone::KCapsGetManufacturer ) ) + { + aId = id.iManufacturer; + } + else + { + aId = KSmlPhoneManufacturer; + } + break; + case EPhoneModelId: + if ( IsFlagSet( identityCaps, RMobilePhone::KCapsGetModel ) ) + { + aId = id.iModel; + } + else + { + aId = *modelId; + } + break; + case EPhoneRevisionId: + aId = id.iRevision; + break; + case EPhoneSerialNumber: + aId.Format(KSmlImeiMask(), &id.iSerialNumber); + break; + default: + User::Panic( KNSmlCommonAgentPanic, KErrArgument ); + break; + } + aId.TrimRight(); + if ( aId.Length() > 0 ) + { + if ( aId[aId.Length() - 1] == 0 ) + { + aId.SetLength( aId.Length() - 1 ); + } + } + CleanupStack::PopAndDestroy(); // phone + } + CleanupStack::PopAndDestroy(); // server +#endif // __WINS__ + CleanupStack::PopAndDestroy(); // modelID + } +// --------------------------------------------------------- +// CNSmlPhoneInfo::SwVersionL() +// +// --------------------------------------------------------- +EXPORT_C TPtrC8 CNSmlPhoneInfo::SwVersionL() + { + delete iSwVersion; + iSwVersion = NULL; + TBuf swName; + TChar separate('\n'); + SysUtil::GetSWVersion(swName); + TInt index = swName.Locate(separate); + + if (index != KErrNotFound) + { + swName = swName.Mid(0, index); + HBufC8* swVInUTF8 = NULL; + NSmlUnicodeConverter::HBufC8InUTF8LC( swName, swVInUTF8 ); + CleanupStack::Pop(); // swVInUTF8 + iSwVersion = swVInUTF8; + } + else + { + iSwVersion = HBufC8::NewL( 0 ); + } + + return iSwVersion->Des(); + } + +// --------------------------------------------------------- +// CNSmlPhoneInfo::IsFlagSet() +// +// --------------------------------------------------------- +TBool CNSmlPhoneInfo::IsFlagSet( const TUint& aValue, const TUint& aBit ) const + { + return( (aValue & aBit) == aBit ); + } +