diff -r 000000000000 -r dd21522fd290 browserutilities/webutils/src/CUserAgent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/webutils/src/CUserAgent.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,724 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implementation of class CUserAgent. +* +*/ + + +// INCLUDE FILES +#include +#include +#include + +#include +#include "webUtilsCommon.h" +#include "CUserAgent.h" +#include "WebUtilsLogger.h" + +#include "WebUtilsInternalCRKeys.h" + + +#define KPlaceHolderMozillaVer _L("Mozilla/5.0") +#define KPlaceHolderSecurity _L("U;") +#define KPlaceHolderComponent _L("AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525") +#define KPlaceHolderBrowserNG _L("BrowserNG") + +#define KPlaceHolderSlash _L("/") +#define KPlaceHolderSymbianOS _L("SymbianOS") +#define KPlaceHolderSeries60 _L("Series60") + +#define KPlaceHolderOpen _L("(") +#define KPlaceHolderClose _L(")") +#define KPlaceHolderSemiColon _L(";") +#define KPlaceHolderPeriod _L(".") + +const TInt KMaxUserAgentStringLength = 256; +const TInt KMaxBrowserVersionStringLength = 20; +const TInt KMaxBrowserNameLength = 20; + +// Space character. +LOCAL_D const TUint8 KSpaceChar = ' '; + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CUserAgent::CUserAgent() +// Constructor with parent +// --------------------------------------------------------- +// +CUserAgent::CUserAgent() + { + LOG_CREATE + LOG_WRITE( "CUserAgent::CUserAgent" ); + } + +// --------------------------------------------------------- +// CUserAgent::~CUserAgent() +// Destructor +// --------------------------------------------------------- +// +CUserAgent::~CUserAgent() + { + LOG_WRITE( "CUserAgent::~CUserAgent" ); + + delete iRepository; + + delete iBrowserCenrepStr; + delete iMMSCenrepStr; + + delete iUAProfURL; + delete iUAProfURL3G; + delete iBrowserVersionStr; + delete iBrowserNameAndVersionStr; + + LOG_DELETE + } + +// --------------------------------------------------------- +// CUserAgent* CUserAgent::NewL() +// --------------------------------------------------------- +// +EXPORT_C CUserAgent* CUserAgent::NewL() + { + CUserAgent* self = new (ELeave) CUserAgent; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CUserAgent::ConstructL() +// Symbian constructor +// --------------------------------------------------------- +// +void CUserAgent::ConstructL() + { + LOG_ENTERFN("CUserAgent::ConstructL()"); + + iBrowserCenrepStr = iMMSCenrepStr = NULL; + iUAProfURL = iUAProfURL3G = NULL; + iRepository = NULL; + + iRepository = CRepository::NewL(KCRUidWebUtils); + iUAStrQueried = iMMSUAStrQueried = iURLUAProfQueried = FALSE; + GetBrowserVersionL(); + GetBrowserNameAndVersionL(); + + LOG_LEAVEFN("CUserAgent::ConstructL()"); + } + +// --------------------------------------------------------- +// CUserAgent::UserAgentL() +// Returns complete constructed user agent string. +// --------------------------------------------------------- +// +EXPORT_C HBufC8* CUserAgent::UserAgentL() +{ + LOG_ENTERFN("CUserAgent::UserAgent()"); + TRAPD( ErrorCode,ReadUserAgentStringL()); + if(ErrorCode != KErrNone) + { + LOG_WRITE_FORMAT("ERROR: ReadUserAgentStringL failed! (%d) Returning NULL",ErrorCode); + LOG_LEAVEFN("CUserAgent::UserAgent()"); + return NULL; + } + + HBufC8 *UAStringBuf = HBufC8::NewL(KMaxUserAgentStringLength); + TPtr8 UAStringPtr = UAStringBuf->Des(); + UAStringPtr.Copy(iBrowserCenrepStr->Des()); + + LOG_LEAVEFN("CUserAgent::UserAgent()"); + return UAStringBuf; +} + +// --------------------------------------------------------- +// CUserAgent::MMSUserAgentL() +// Returns complete constructed MMS user agent string. +// --------------------------------------------------------- +EXPORT_C HBufC8* CUserAgent::MMSUserAgentL() +{ + LOG_ENTERFN("CUserAgent::MMSUserAgent()"); + + TRAPD( ErrorCode,ReadMMSUserAgentStringL()); + if(ErrorCode != KErrNone) + { + LOG_WRITE_FORMAT("ERROR: ReadMMSUserAgentStringL failed! (%d) Returning NULL",ErrorCode); + LOG_LEAVEFN("CUserAgent::MMSUserAgent()"); + return NULL; + } + + HBufC8 *MMSUAStringBuf = HBufC8::NewL(KMaxUserAgentStringLength); + TPtr8 UAStringPtr = MMSUAStringBuf->Des(); + UAStringPtr.Copy(iMMSCenrepStr->Des()); + + LOG_LEAVEFN("CUserAgent::MMSUserAgent()"); + return MMSUAStringBuf; +} + +// --------------------------------------------------------- +// CUserAgent::URLToUserAgentProfileL() +// Fetches URL to UA profile. +// --------------------------------------------------------- +EXPORT_C TInt CUserAgent::URLToUserAgentProfileL(TDes8 &aUAProfURL, TDes8 &aUAProfURL3G) +{ + LOG_ENTERFN("CUserAgent::URLToUserAgentProfileL()"); + + TRAPD( ErrorCode,ReadURLUserAgentProfileL()); + if(ErrorCode != KErrNone) + { + LOG_WRITE_FORMAT("ERROR: ReadURLUserAgentProfileL failed! (%d) Returning NULL",ErrorCode); + LOG_LEAVEFN("CUserAgent::URLToUserAgentProfileL()"); + return ErrorCode; + } + + aUAProfURL.Copy(iUAProfURL->Des()); + aUAProfURL3G.Copy(iUAProfURL3G->Des()); + + LOG_LEAVEFN("CUserAgent::URLToUserAgentProfileL()"); + + return ErrorCode; +} + +// --------------------------------------------------------- +// CUserAgent::ReadUserAgentStringL() +// Reads the UA string from cenrep +// --------------------------------------------------------- +void CUserAgent::ReadUserAgentStringL() + { + LOG_ENTERFN("CUserAgent::ReadUserAgentStringL()"); + TInt retCode (KErrNotReady); + + // If the string queried already, dont read again + if(iUAStrQueried) + { + LOG_WRITE("UA String already in cache. No read will be performed."); + LOG_LEAVEFN("CUserAgent::ReadUserAgentDataL()"); + return; + } + + if(!iRepository) + { + LOG_WRITE("Error: Repository doesn't exit or currupt!"); + LOG_LEAVEFN("CUserAgent::ReadUserAgentDataL()"); + User::Leave(KErrNotReady); + } + + /* ---------------- Read default UA string ---------------- */ + LOG_WRITE("Reading default UA string from cenrep."); + if(!iBrowserCenrepStr) + { + iBrowserCenrepStr = HBufC::NewL(KMaxUserAgentStringLength); + } + + TPtr tempPtr = iBrowserCenrepStr->Des(); + + retCode = iRepository->Get(EDefaultUserAgentString, tempPtr); + if(retCode != KErrNone) + { + LOG_WRITE_FORMAT("Error: Reading default UA string from cenrep failed! (%d)",retCode); + LOG_LEAVEFN("CUserAgent::ReadUserAgentDataL()"); + User::Leave(retCode); + } + + if(!IsUAStringEmpty(tempPtr)) + { + LOG_WRITE("Successfully read default UA string from cenrep, can use this as UA string"); + + iUAStrQueried = TRUE; + + LOG_LEAVEFN("CUserAgent::ReadUserAgentDataL()"); + return; + } + + ReadAndCreateUAStringL(tempPtr); + LOG_WRITE("Successfully created a new UA string."); + + // Mark the flag to indicate successful read + iUAStrQueried = TRUE; + + LOG_LEAVEFN("CUserAgent::ReadUserAgentDataL()"); + return; + } + +// --------------------------------------------------------- +// CUserAgent::IsUAStringEmpty() +// Checks if the UA string is empty or "NONE" +// --------------------------------------------------------- +bool CUserAgent::IsUAStringEmpty(const TPtr &aUAString) + { + return (aUAString.Compare(_L("NONE")) == 0 || aUAString.Length() == 0); + } + + +// --------------------------------------------------------- +// CUserAgent::ReadMMSUserAgentStringL() +// Reads the MMS UA string from cenrep +// --------------------------------------------------------- + +void CUserAgent::ReadMMSUserAgentStringL() + { + LOG_ENTERFN("CUserAgent::ReadMMSUserAgentStringL()"); + TInt retCode (KErrNotReady); + + // If the string queried already, dont read again + if(iMMSUAStrQueried) + { + LOG_WRITE("MMS UA String already in cache. No read will be performed."); + LOG_LEAVEFN("CUserAgent::ReadMMSUserAgentStringL()"); + return; + } + + if(!iRepository) + { + LOG_WRITE("Error: Repository doesn't exit or currupt!"); + LOG_LEAVEFN("CUserAgent::ReadMMSUserAgentStringL()"); + + User::Leave(KErrNotReady);// -1; // Error code ? + } + + /* ---------------- Read MMS default UA string ---------------- */ + if(!iMMSCenrepStr) + { + iMMSCenrepStr = HBufC::NewL(KMaxUserAgentStringLength); + } + + LOG_WRITE("Default MMS UA string is to be read from cenrep"); + TPtr tempPtr = iMMSCenrepStr->Des(); + + retCode = iRepository->Get(EDefaultMMSUserAgentString, tempPtr); + if(retCode != KErrNone) + { + LOG_WRITE("Error: Reading default MMS UA string from cenrep failed!"); + LOG_LEAVEFN("CUserAgent::ReadMMSUserAgentStringL()"); + User::Leave(retCode); + } + + if(!IsUAStringEmpty(tempPtr)) + { + LOG_WRITE("Successfully read default MMS UA string from cenrep, can use this as MMS UA string"); + + iMMSUAStrQueried = TRUE; + LOG_LEAVEFN("CUserAgent::ReadMMSUserAgentStringL()"); + return; + } + + /* ---------------- Read all variant fragments and build a UA string ---------------- */ + ReadAndCreateUAStringL(tempPtr); + + LOG_WRITE("Successfully created a new MMS UA string."); + + iMMSUAStrQueried = TRUE; + LOG_LEAVEFN("CUserAgent::ReadMMSUserAgentStringL()"); + return; +} + +// --------------------------------------------------------- +// CUserAgent::GetFragmentsL() +// Gets all required fragments from CenRep +// --------------------------------------------------------- +TInt CUserAgent::GetCenRepFragment(TUserAgentStringKeys aFragmentType, TDes& fragmentValue) + { + TInt retCode(iRepository->Get(aFragmentType, fragmentValue)); + + if(fragmentValue.Length() <= 0) + { + retCode = KErrNotReady; + } + + return retCode; + } + +// --------------------------------------------------------- +// CUserAgent::GetFragmentsL() +// Gets all required fragments from OSExt APIs/CenRep +// --------------------------------------------------------- +void CUserAgent::GetFragmentsL() + { + +#ifdef BRDO_BROWSER_50_FF + TInt osExtFailed(0); + TRAP(osExtFailed, GetFragmentsFromOSExtL()); +#endif + + if(iSymbianVersion.Length() <= 0) + { + LOG_WRITE("Reading SymbianVersion from osext extended api or cenrep."); + User::LeaveIfError(GetCenRepFragment(ESymbianOSVersion, iSymbianVersion)); + } + + if(iS60Version.Length() <= 0) + { + LOG_WRITE("Reading S60Version from osext extended api or cenrep."); + User::LeaveIfError(GetCenRepFragment(ES60Version, iS60Version)); + } + + if(iHardwareType.Length() <= 0) + { + LOG_WRITE("Reading HardwareVersion from osext extended api or cenrep."); + User::LeaveIfError(GetCenRepFragment(EHardwareType, iHardwareType)); + } + + if(iMIDPCLDCVersion.Length() <= 0) + { + LOG_WRITE("Reading MIDPCLDCVersion from osext extended api or cenrep."); + User::LeaveIfError(GetCenRepFragment(EMIDP_CLDCVersion, iMIDPCLDCVersion)); + } + } + +// --------------------------------------------------------- +// CUserAgent::ReadAndCreateUAStringL() +// Reads verious fragments from OSExt APIs/CenRep and crates the UA string +// --------------------------------------------------------- +void CUserAgent::ReadAndCreateUAStringL(TPtr &aUAStringPtr) + { + GetFragmentsL(); + + // + // Mozilla/5.0 ( U; [en]; ) AppleWebKit/413 (KHTML, like Gecko) Safari/413 + // + + aUAStringPtr.Copy(KPlaceHolderMozillaVer); + aUAStringPtr.Append(KSpaceChar); + + aUAStringPtr.Append(KPlaceHolderOpen); + + aUAStringPtr.Append(iSymbianVersion); + aUAStringPtr.Append(KSpaceChar); + + aUAStringPtr.Append(KPlaceHolderSecurity); + aUAStringPtr.Append(KSpaceChar); + + aUAStringPtr.Append(iS60Version); + aUAStringPtr.Append(KSpaceChar); + + aUAStringPtr.Append(iHardwareType); + + aUAStringPtr.Append(KSpaceChar); + aUAStringPtr.Append(iMIDPCLDCVersion); + aUAStringPtr.Append(KSpaceChar); + aUAStringPtr.Append(KPlaceHolderClose); + + aUAStringPtr.Append(KSpaceChar); + aUAStringPtr.Append(KPlaceHolderBrowserNG); + aUAStringPtr.Append(KSpaceChar); + aUAStringPtr.Append(iBrowserVersionStr->Des()); + + aUAStringPtr.Append(KSpaceChar); + aUAStringPtr.Append(KPlaceHolderComponent); + } + +// --------------------------------------------------------- +// CUserAgent::ReadURLUserAgentProfileL() +// Reads the URL to UA profile from cenrep +// --------------------------------------------------------- + +void CUserAgent::ReadURLUserAgentProfileL() +{ + LOG_ENTERFN("CUserAgent::ReadURLUserAgentProfileL()"); + + // If the string queried already, dont read again + if(iURLUAProfQueried) + { + LOG_WRITE("URL to UA profile already in cache. No read will be performed."); + LOG_LEAVEFN("CUserAgent::ReadURLUserAgentProfileL()"); + return; + } + + if(!iRepository) + { + LOG_WRITE("Error: Repository doesn't exit or currupt!"); + LOG_LEAVEFN("CUserAgent::ReadURLUserAgentProfileL() - repository not instantiated"); + User::Leave(KErrNotReady); + } + + /* ---------------- Read URL to 2G UA profile ---------------- */ + if(!iUAProfURL) + { + iUAProfURL = HBufC::NewL(KMaxUserAgentStringLength); + } + + TPtr TempPtr2G = iUAProfURL->Des(); + TInt RetCode = iRepository->Get(EURLUAProfile, TempPtr2G); + if(RetCode != KErrNone) + { + LOG_WRITE("Error: Reading URL to 2G UA profile from cenrep failed!"); + LOG_LEAVEFN("CUserAgent::ReadURLUserAgentProfileL()"); + User::Leave(RetCode); + } + + + /* ---------------- Read URL to 3G UA profile ---------------- */ + if(!iUAProfURL3G) + { + iUAProfURL3G = HBufC::NewL(KMaxUserAgentStringLength); + } + + TPtr TempPtr3G = iUAProfURL3G->Des(); + RetCode = iRepository->Get(EURL3GUAProfile, TempPtr3G); + if(RetCode != KErrNone) + { + delete iUAProfURL; + iUAProfURL = NULL; + + LOG_WRITE("Error: Reading URL to 3G UA profile from cenrep failed!"); + LOG_LEAVEFN("CUserAgent::ReadURLUserAgentProfileL()"); + User::Leave(RetCode); + } + + iURLUAProfQueried = TRUE; + LOG_LEAVEFN("CUserAgent::ReadURLUserAgentProfileL()"); + User::Leave(KErrNone); +} + + +#ifdef BRDO_BROWSER_50_FF + +// --------------------------------------------------------- +// CUserAgent::GetFragmentsL() +// Gets all required fragments from OSExt +// --------------------------------------------------------- +void CUserAgent::GetFragmentsFromOSExtL() + { + RFs fs; + CleanupClosePushL< RFs >( fs ); + User::LeaveIfError( fs.Connect() ); + + if(iSymbianVersion.Length() <= 0) + { + GetOSExtFragment(ESymbianOSVersion, iSymbianVersion, fs); + } + + if(iS60Version.Length() <= 0) + { + GetOSExtFragment(ES60Version, iS60Version, fs); + } + + if(iHardwareType.Length() <= 0) + { + GetOSExtFragment(EHardwareType, iHardwareType, fs); + } + CleanupStack::PopAndDestroy(); // fs + } + + +// --------------------------------------------------------- +// CUserAgent::GetOSExtFragment() +// Gets various fragments from OS Ext APIs +// --------------------------------------------------------- +TInt CUserAgent::GetOSExtFragment(TUserAgentStringKeys aFragmentType, TDes& fragmentValue, RFs& fs) + { + TInt retCode(0); + + switch(aFragmentType) + { + case ESymbianOSVersion: + retCode = GetOSVersion( fragmentValue,fs ); + break; + + case ES60Version: + retCode = GetS60Version( fragmentValue,fs ); + break; + + case EHardwareType: + retCode = GetHardwareVersion( fragmentValue,fs ); + break; + + default: + retCode = KErrNotFound; + break; + } + if(fragmentValue.Length() <= 0) + { + retCode = KErrNotReady; + } + + return retCode; + } + +// --------------------------------------------------------- +// CUserAgent::GetOSVersion() +// Gets the Symbian OS Version +// --------------------------------------------------------- +TInt CUserAgent::GetOSVersion(TDes& osVersion,RFs& aFs ) + { + LOG_ENTERFN("CUserAgent::GetOSVersion"); + + SysVersionInfo::TSymbianOSVersion os; + + TInt retCode (SysVersionInfo::GetVersionInfo( os, aFs )); + if(retCode != KErrNone) + { + LOG_LEAVEFN("CUserAgent::GetOSVersion"); + return retCode; + } + + osVersion.Append(KPlaceHolderSymbianOS); + osVersion.Append(KPlaceHolderSlash); + osVersion.AppendNum(os.iMajorVersion); + osVersion.Append('.'); + osVersion.AppendNum(os.iMinorVersion); + osVersion.Append(';'); + + LOG_LEAVEFN("CUserAgent::GetOSVersion"); + return retCode; + } + +// --------------------------------------------------------- +// CUserAgent::GetS60Version() +// Gets the S60 Version +// --------------------------------------------------------- +TInt CUserAgent::GetS60Version(TDes& s60Version, RFs& aFs) + { + VersionInfo::TPlatformVersion pVersion; + + TInt retCode (VersionInfo::GetVersion(pVersion,aFs)); + if(retCode != KErrNone) + { + return retCode; + } + s60Version.Append(KPlaceHolderSeries60); + s60Version.Append(KPlaceHolderSlash); + s60Version.AppendNum(pVersion.iMajorVersion); + s60Version.Append('.'); + s60Version.AppendNum(pVersion.iMinorVersion); + return retCode; + } + + +// ----------------------------------------------------------------------------- +// CUserAgent::GetHardwareVersion() +// Gets the Hardware Version including Manufacture, Model names with revision +// ------------------------------------------------------------------------------- + +TInt CUserAgent::GetHardwareVersion( TDes& aHardwareType, RFs& aFs ) + { + SysVersionInfo::TProductVersion pVersion; + + TInt retCode(SysVersionInfo::GetVersionInfo( pVersion,aFs )); + if(retCode != KErrNone) + { + return retCode; + } + aHardwareType.Append(pVersion.iManufacturer); + aHardwareType.Append(pVersion.iModel); + aHardwareType.Append(KPlaceHolderSlash); + aHardwareType.Append(pVersion.iProduct); + aHardwareType.Append(pVersion.iRevision); + aHardwareType.Append(KPlaceHolderSemiColon); + + return retCode; +} + +// ------------------------------------------------------------------------ +// CUserAgent::GetVersion() +// This method gets the requested version information as string. +// @param aType A version information type specified by TVersionInfoType. +// @param aValue Stores version information. +// @return System wide error code. +// This api is implemented for future use, not used currently +// ------------------------------------------------------------------------- +TInt CUserAgent::GetVersion(const SysVersionInfo::TVersionInfoType aType, TDes& aValue) + { + aValue.Zero(); + + /* To get the firmware version that is composed of the version info of multiple images (core + variants images), + To get the customer software version. This identifies the user friendly version of e.g. operator/country/regional variant image. + or To get the model version depending on aType EFWVersion/EOPVersion/EModelVersion.*/ + + TInt ret( SysVersionInfo::GetVersionInfo( aType , aValue) ); + //ret will return KErrNotSupported if osext extended api failed. + + return ret; + } + +#endif //#ifdef BRDO_BROWSER_50_FF + +// ----------------------------------------------------------------------------- +// CUserAgent::BrowserNameAndVersionL() +// Returns the Browser version +// ------------------------------------------------------------------------------- + +EXPORT_C HBufC* CUserAgent::BrowserVersionL() + { + return iBrowserVersionStr; + } + +// ----------------------------------------------------------------------------- +// CUserAgent::BrowserNameAndVersionL() +// Returns the Browser name and version +// ------------------------------------------------------------------------------- + +EXPORT_C HBufC* CUserAgent::BrowserNameAndVersionL() + { + return iBrowserNameAndVersionStr; + } + + +// ----------------------------------------------------------------------------- +// CUserAgent::GetBrowserVersionL() +// Gets the Browser Version including major version, minor version and SVN rev +// ------------------------------------------------------------------------------- +void CUserAgent::GetBrowserVersionL() +{ + + TInt ret(0); + TBuf<64> BrowserVersionMajor(0); + TBuf<64> BrowserVersionMinor(0); + TBuf<64> BrowserVersionSVNRev(0); + + iBrowserVersionStr = HBufC::NewL(KMaxBrowserVersionStringLength); + + TPtr BrowserVersionPtr = iBrowserVersionStr->Des(); + + + ret = iRepository->Get(KWebUtilsBrowserVersionMajor, BrowserVersionMajor); + if(ret == KErrNone) + { + ret = iRepository->Get(KWebUtilsBrowserVersionMinor, BrowserVersionMinor); + if(ret == KErrNone) + { + ret = iRepository->Get(KWebUtilsBrowserVersionSVNRev, BrowserVersionSVNRev); + if(ret == KErrNone) + { + BrowserVersionPtr.Append(BrowserVersionMajor); + BrowserVersionPtr.Append(KPlaceHolderPeriod); + BrowserVersionPtr.Append(BrowserVersionMinor); + BrowserVersionPtr.Append(KPlaceHolderPeriod); + BrowserVersionPtr.Append(BrowserVersionSVNRev); ; + } + } + } + + if(ret != KErrNone) + { + LOG_WRITE("Error: Reading default Browser Version from cenrep failed!"); + LOG_LEAVEFN("CUserAgent::BrowserVersion()"); + } +} + +// ----------------------------------------------------------------------------- +// CUserAgent::GetBrowserNameAndVersionL() +// Gets the Browser Version including the Browser name, major version, minor version, SVN rev +// ------------------------------------------------------------------------------- +void CUserAgent::GetBrowserNameAndVersionL() +{ + TInt length = KMaxBrowserVersionStringLength + KMaxBrowserNameLength; + iBrowserNameAndVersionStr = HBufC::NewL( length); + + iBrowserNameAndVersionStr->Des().Append(KPlaceHolderBrowserNG); + iBrowserNameAndVersionStr->Des().Append(KSpaceChar); // add a gap + iBrowserNameAndVersionStr->Des().Append( *iBrowserVersionStr ); +} +// End of file