diff -r 7333d7932ef7 -r 8b7f4e561641 ncdengine/provider/deviceinteraction/src/ncddeviceserviceimpl.cpp --- a/ncdengine/provider/deviceinteraction/src/ncddeviceserviceimpl.cpp Tue Aug 31 15:21:33 2010 +0300 +++ b/ncdengine/provider/deviceinteraction/src/ncddeviceserviceimpl.cpp Wed Sep 01 12:22:02 2010 +0100 @@ -38,7 +38,7 @@ #endif #ifdef GET_DEVICE_ID_FROM_USERAGENT - #include + #include #endif #include "catalogs_device_config.h" @@ -681,16 +681,30 @@ return KCatalogsOverrideDeviceId().AllocLC(); #endif -#ifdef GET_DEVICE_ID_FROM_USERAGENT - - // Get model version. - TBuf< KSysVersionInfoTextLength > modelVersion; - User::LeaveIfError( SysVersionInfo::GetVersionInfo( - SysVersionInfo::EModelVersion, modelVersion ) ); - - // Create buffer. - HBufC* devId = HBufC::NewLC( modelVersion.Length() ); - devId->Des().Append( modelVersion ); +#ifdef GET_DEVICE_ID_FROM_USERAGENT + // Assume the device id begins with "Nokia" and ends with "/" + HBufC8* userAgent = UserAgentL(); + CleanupStack::PushL( userAgent ); + TInt offset = userAgent->Find( _L8( "Nokia" )); + if ( offset == KErrNotFound ) + { + DLTRACEOUT(("No Nokia")); + CleanupStack::PopAndDestroy( userAgent ); + return KNullDesC().AllocLC(); + } + TPtrC8 id = userAgent->Des().Mid( offset ); + offset = id.Locate( '/' ); + if ( offset == KErrNotFound ) + { + DLTRACEOUT(("no /")); + CleanupStack::PopAndDestroy( userAgent ); + return KNullDesC().AllocLC(); + } + TPtrC8 id2 = id.Left( offset ); + HBufC* devId = HBufC::NewL( id2.Length() ); + devId->Des().Copy( id2 ); + CleanupStack::PopAndDestroy( userAgent ); + CleanupStack::PushL( devId ); DLTRACEOUT(( _L("devId: %S"), devId )); return devId; @@ -737,16 +751,36 @@ if ( !iDeviceModel ) { - // Get model version. - TBuf< KSysVersionInfoTextLength > modelVersion; - User::LeaveIfError( SysVersionInfo::GetVersionInfo( - SysVersionInfo::EModelVersion, modelVersion ) ); - - // Create buffer. - iDeviceModel = HBufC::NewL( modelVersion.Length() ); - iDeviceModel->Des().Append( modelVersion ); + // Get manufacturer + HBufC8* manufacturer = Des16ToDes8LC( DeviceManufacturerL() ); + + HBufC8* userAgent = UserAgentL(); + CleanupStack::PushL( userAgent ); + + TInt offset = userAgent->FindF( *manufacturer ); + if ( offset == KErrNotFound ) + { + DLTRACEOUT(("Device manufacturer not found")); + CleanupStack::PopAndDestroy( 2, manufacturer ); // manufacturer, useragent + return KNullDesC(); + } + + // Strip manufacturer of the string + TPtrC8 id = userAgent->Des().Mid( offset + manufacturer->Length() ); + + // Locate the end of the device model + offset = id.Locate( '/' ); + if ( offset == KErrNotFound ) + { + DLTRACE(("no /")); + CleanupStack::PopAndDestroy( 2, manufacturer ); // manufacturer, useragent + return KNullDesC(); + } + TPtrC8 id2 = id.Left( offset ); + iDeviceModel = Des8ToDes16L( id2 ); + + CleanupStack::PopAndDestroy( 2, manufacturer ); // manufacturer, useragent } - DLTRACEOUT(( _L("device model: %S"), iDeviceModel )); return *iDeviceModel; #endif // CATALOGS_OVERRIDE_MODEL @@ -819,6 +853,30 @@ } return EAknsSrvPhone; } + + +// --------------------------------------------------------------------------- +// On SDK 3.0 UA looks like this: +// Mozilla/4.0 ( compatible; MSIE 5.0; Series60/3.0 Nokia6630/4.06.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 ) +// --------------------------------------------------------------------------- +#ifdef GET_DEVICE_ID_FROM_USERAGENT + +HBufC8* CNcdDeviceService::UserAgentL() const + { + DLTRACEIN(("")); +#ifndef CATALOGS_OVERRIDE_USERAGENT + CUserAgent* ua = CUserAgent::NewL(); + CleanupStack::PushL( ua ); + HBufC8* uas = ua->UserAgentL(); + CleanupStack::PopAndDestroy( ua ); + DLTRACEOUT(("UserAgent: %S", uas)); + return uas; +#else // CATALOGS_OVERRIDE_USERAGENT + return KCatalogsOverrideUserAgent().AllocL(); +#endif + } + +#endif // --------------------------------------------------------------------------- // GetPhoneLC