syncmlfw/common/syncagent/src/nsmlphoneinfo.cpp
changeset 0 b497e44ab2fc
equal deleted inserted replaced
-1:000000000000 0:b497e44ab2fc
       
     1 /*
       
     2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Phone specific data
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <f32file.h>	
       
    20 #include <s32file.h>
       
    21 #include <etel.h>
       
    22 #include <etelmm.h>
       
    23 #include <sysutil.h>
       
    24 #include <data_caging_path_literals.hrh>
       
    25 #include <nsmlconstants.h>
       
    26 #include <nsmlphoneinfo.h>
       
    27 #include <nsmlunicodeconverter.h>
       
    28 
       
    29 // CONSTANTS
       
    30 _LIT( KNSmlCommonAgentPanic, "NSmlCommonAgent" );
       
    31 #if defined( __WINS__ )
       
    32 _LIT( KNSmlIMEIFileName, "imei.txt");
       
    33 const TInt KNSmlMaxIMEIFileName = 256;
       
    34 const TInt KNSmlIMEIFileDrive = EDriveC;
       
    35 #endif
       
    36 
       
    37 // ---------------------------------------------------------
       
    38 // CNSmlPhoneInfo::CNSmlPhoneInfo
       
    39 // Constructor, nothing special in here.
       
    40 // ---------------------------------------------------------
       
    41 //
       
    42 CNSmlPhoneInfo::CNSmlPhoneInfo()
       
    43 	{
       
    44 	}
       
    45 
       
    46 // ---------------------------------------------------------
       
    47 // CNSmlPhoneInfo::ConstructL()
       
    48 // Two-way construction. Constructor may leave in EPOC.
       
    49 // ---------------------------------------------------------
       
    50 //
       
    51 void CNSmlPhoneInfo::ConstructL()
       
    52 	{
       
    53 	}
       
    54 
       
    55 // ---------------------------------------------------------
       
    56 // CNSmlPhoneInfo::~CNSmlPhoneInfo()
       
    57 // Destructor
       
    58 // ---------------------------------------------------------
       
    59 //
       
    60 
       
    61 CNSmlPhoneInfo::~CNSmlPhoneInfo()
       
    62 	{
       
    63 	delete iSwVersion;
       
    64 	}
       
    65 // ---------------------------------------------------------
       
    66 // CNSmlPhoneInfo::NewL()
       
    67 // Creates new instance of CNSmlPhoneInfo. 
       
    68 // Does not leave instance pointer to CleanupStack.
       
    69 // ---------------------------------------------------------
       
    70 //
       
    71 EXPORT_C CNSmlPhoneInfo* CNSmlPhoneInfo::NewL()
       
    72 	{
       
    73 	CNSmlPhoneInfo* self = CNSmlPhoneInfo::NewLC();
       
    74 	CleanupStack::Pop();
       
    75 	return( self );
       
    76 	}
       
    77 
       
    78 // ---------------------------------------------------------
       
    79 // CNSmlPhoneInfo::NewLC()
       
    80 // Creates new instance of CNSmlPhoneInfo 
       
    81 // Leaves instance pointer to CleanupStack.
       
    82 // ---------------------------------------------------------
       
    83 //
       
    84 EXPORT_C CNSmlPhoneInfo* CNSmlPhoneInfo::NewLC()
       
    85 	{
       
    86 	CNSmlPhoneInfo* self = new (ELeave) CNSmlPhoneInfo();
       
    87 	CleanupStack::PushL( self );
       
    88 	self->ConstructL();
       
    89 	return( self );
       
    90 	}
       
    91 // ---------------------------------------------------------
       
    92 // CNSmlPhoneInfo::PhoneDataL()
       
    93 // Manufacturer, version and IMEI from phone service
       
    94 //
       
    95 // ---------------------------------------------------------
       
    96 EXPORT_C void CNSmlPhoneInfo::PhoneDataL( TPhoneIdType aIdType, TDes& aId ) const
       
    97 	{
       
    98 	aId.Zero();
       
    99 	HBufC* modelId;
       
   100 	modelId = KNSmlPhoneModelIdDefault().AllocLC();
       
   101 	_LIT( KSmlPhoneManufacturer, "Unknown" );
       
   102 #if defined( __WINS__ )
       
   103 // phone services may work in emulator!
       
   104 	_LIT( KSmlPhoneRevisionId, "1.0" );
       
   105 	switch ( aIdType )
       
   106 		{
       
   107 		case EPhoneManufacturer:
       
   108 			aId = KSmlPhoneManufacturer;
       
   109 			break;
       
   110 		case EPhoneModelId:
       
   111 			aId = *modelId;
       
   112 			break;
       
   113 		case EPhoneRevisionId:
       
   114 			aId = KSmlPhoneRevisionId;
       
   115 			break;
       
   116 		case EPhoneSerialNumber:
       
   117 		    RFs fileServer;
       
   118 			User::LeaveIfError(fileServer.Connect());
       
   119 			CleanupClosePushL(fileServer);
       
   120 		    HBufC* path = HBufC::NewLC(KNSmlMaxIMEIFileName);
       
   121 		    TPtr pathPtr = path->Des();
       
   122 		    fileServer.CreatePrivatePath(KNSmlIMEIFileDrive);
       
   123             User::LeaveIfError(fileServer.SetSessionToPrivate(KNSmlIMEIFileDrive));
       
   124             User::LeaveIfError(fileServer.SessionPath(pathPtr));
       
   125             TParse filename;
       
   126             User::LeaveIfError(filename.Set(KNSmlIMEIFileName(), path, NULL));
       
   127 			_LIT(KSmlImeiMask, "IMEI:%05d%05d%05d");
       
   128 			RFile file;
       
   129 			TInt err = file.Open(fileServer, filename.FullName(), EFileShareAny);
       
   130 			if (err == KErrNotFound)
       
   131 				{
       
   132 				User::LeaveIfError(file.Create(fileServer, filename.FullName(), EFileShareAny|EFileWrite));
       
   133 				RFileWriteStream writer(file, 0);
       
   134 				// practically unique IMEI for emulator use
       
   135 				aId.Format(KSmlImeiMask(), User::TickCount(), User::TickCount()*3, User::TickCount()*7);
       
   136 				writer << aId;
       
   137 				writer.CommitL();
       
   138 				writer.Close();
       
   139 				}
       
   140 			else if (err)
       
   141 			    {
       
   142 			    User::Leave(err);
       
   143 			    }
       
   144 			else
       
   145 				{
       
   146 				RFileReadStream reader(file, 0);
       
   147 				reader >> aId;
       
   148 				reader.Close();
       
   149 				}
       
   150 			CleanupClosePushL(file);
       
   151 			CleanupStack::PopAndDestroy(3); // fileServer, file, path
       
   152 			break;
       
   153 		default:
       
   154 			User::Panic( KNSmlCommonAgentPanic, KErrArgument );
       
   155 			break;
       
   156 		}
       
   157 #else
       
   158 	_LIT(KSmlImeiMask, "IMEI:%S");
       
   159 	RTelServer server;
       
   160     User::LeaveIfError(server.Connect()); 
       
   161 	CleanupClosePushL(server);
       
   162 	TInt numPhones;
       
   163 	User::LeaveIfError(server.EnumeratePhones(numPhones));
       
   164 	if( numPhones > 0 )
       
   165 		{
       
   166 		RTelServer::TPhoneInfo phoneInfo;
       
   167 		User::LeaveIfError(server.GetPhoneInfo(0, phoneInfo)); // Query first phone
       
   168 		RMobilePhone phone;
       
   169 		User::LeaveIfError(phone.Open(server, phoneInfo.iName));
       
   170 		CleanupClosePushL(phone);
       
   171 		User::LeaveIfError(phone.Initialise());	
       
   172 		TUint32 identityCaps;
       
   173 		phone.GetIdentityCaps( identityCaps );
       
   174 		RMobilePhone::TMobilePhoneIdentityV1 id;
       
   175 		TRequestStatus status;
       
   176 		phone.GetPhoneId( status, id );
       
   177 		User::WaitForRequest( status );
       
   178 		User::LeaveIfError( status.Int() );
       
   179 		switch ( aIdType )
       
   180 			{
       
   181 			case EPhoneManufacturer:
       
   182 				if ( IsFlagSet( identityCaps, RMobilePhone::KCapsGetManufacturer ) )
       
   183 					{
       
   184 					aId = id.iManufacturer;
       
   185 					}
       
   186 				else
       
   187 					{
       
   188 					aId = KSmlPhoneManufacturer;
       
   189 					}
       
   190 				break;
       
   191 			case EPhoneModelId:
       
   192 				if ( IsFlagSet( identityCaps, RMobilePhone::KCapsGetModel ) )
       
   193 					{
       
   194 					aId = id.iModel;
       
   195 					}
       
   196 				else
       
   197 					{
       
   198 					aId = *modelId;
       
   199 					}
       
   200 				break;
       
   201 			case EPhoneRevisionId:
       
   202 				aId = id.iRevision;
       
   203 				break;
       
   204 			case EPhoneSerialNumber:
       
   205 				aId.Format(KSmlImeiMask(), &id.iSerialNumber);
       
   206 				break;
       
   207 			default:
       
   208 				User::Panic( KNSmlCommonAgentPanic, KErrArgument );
       
   209 				break;	
       
   210 			}
       
   211 		aId.TrimRight();
       
   212 		if ( aId.Length() > 0 )
       
   213 			{
       
   214 			if ( aId[aId.Length() - 1] == 0 )
       
   215 				{
       
   216 				aId.SetLength( aId.Length() - 1 );
       
   217 				}	
       
   218 			}
       
   219 		CleanupStack::PopAndDestroy(); // phone
       
   220 		}
       
   221 	CleanupStack::PopAndDestroy(); // server
       
   222 #endif // __WINS__
       
   223 	CleanupStack::PopAndDestroy(); // modelID
       
   224 	}
       
   225 // ---------------------------------------------------------
       
   226 // CNSmlPhoneInfo::SwVersionL()
       
   227 // 
       
   228 // ---------------------------------------------------------
       
   229 EXPORT_C TPtrC8 CNSmlPhoneInfo::SwVersionL()
       
   230 	{
       
   231 	delete iSwVersion;
       
   232 	iSwVersion = NULL;
       
   233     TBuf<KSysUtilVersionTextLength> swName;
       
   234 	TChar separate('\n');
       
   235 	SysUtil::GetSWVersion(swName);
       
   236 	TInt index = swName.Locate(separate);
       
   237 	
       
   238 	if (index != KErrNotFound)
       
   239 		{
       
   240 		swName = swName.Mid(0, index);
       
   241 		HBufC8* swVInUTF8 = NULL;
       
   242 		NSmlUnicodeConverter::HBufC8InUTF8LC( swName, swVInUTF8 );
       
   243 		CleanupStack::Pop();   // swVInUTF8
       
   244 		iSwVersion = swVInUTF8;
       
   245 		}
       
   246 	else
       
   247 		{
       
   248 		iSwVersion = HBufC8::NewL( 0 );
       
   249 		}
       
   250 	
       
   251 	return iSwVersion->Des();
       
   252 	}
       
   253 
       
   254 // ---------------------------------------------------------
       
   255 // CNSmlPhoneInfo::IsFlagSet()
       
   256 // 
       
   257 // ---------------------------------------------------------
       
   258 TBool CNSmlPhoneInfo::IsFlagSet( const TUint& aValue, const TUint& aBit ) const
       
   259 	{
       
   260 	return( (aValue & aBit) == aBit );
       
   261 	}
       
   262