ncdengine/provider/deviceinteraction/src/ncddeviceserviceimpl.cpp
branchRCL_3
changeset 66 8b7f4e561641
parent 65 7333d7932ef7
--- 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 <sysversioninfo.h>
+    #include <cuseragent.h>
 #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