syncmlfw/common/syncagent/src/nsmlphoneinfo.cpp
changeset 0 b497e44ab2fc
--- /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 );
+	}
+