--- /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 <f32file.h>
+#include <s32file.h>
+#include <etel.h>
+#include <etelmm.h>
+#include <sysutil.h>
+#include <data_caging_path_literals.hrh>
+#include <nsmlconstants.h>
+#include <nsmlphoneinfo.h>
+#include <nsmlunicodeconverter.h>
+
+// 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<KSysUtilVersionTextLength> 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 );
+ }
+