webservices/wsutils/src/senguidgen.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsutils/src/senguidgen.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,184 @@
+/*
+* Copyright (c) 2002-2005 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:        
+*
+*/
+
+
+
+
+
+
+
+
+// INCLUDE FILES
+#include <hash.h> 
+#include <e32math.h>
+#include <f32file.h> // TVolumeInfo
+#include "senguidgen.h"
+#include "sendebug.h"
+#include "senlogger.h"
+
+CSenGuidGen::CSenGuidGen()
+    {
+    TTime homeTime;
+    homeTime.HomeTime();
+    iSeed = homeTime.Int64();
+    }
+
+void CSenGuidGen::ConstructL()
+    {
+    TLSLOG_L(KSenUtilsLogChannel, KMinLogLevel, "CSenGuidGen::ConstructL");
+    // Get host name
+    //ipHostId = _L8("localhost").AllocL();
+    ipHostId = HBufC8::NewL( KSenUuidMaxHostIdLength );
+    TPtr8 hostID = ipHostId->Des();
+    
+    TInt error(KErrNone);
+
+    
+    RFs rfs;
+    User::LeaveIfError(rfs.Connect());
+#ifndef __WINS__ // only required in RELEASE builds    
+    TLSLOG_L(KSenUtilsLogChannel, KNormalLogLevel, "CSenGuidGen::ConstructL - about to call RFs.GetMediaSerialNumber()");
+    TMediaSerialNumber mediaID;
+    error = rfs.GetMediaSerialNumber(mediaID, EDriveC);
+    TLSLOG_FORMAT((KSenUtilsLogChannel, KMinLogLevel, _L8("CSenGuidGen::ConstructL - GetMediaSerialNumber() returned: %d"), error));
+    if( !error )
+        {
+        hostID.Append(mediaID);
+        }
+#else // WINS (emulator) environment
+    TLSLOG_L(KSenUtilsLogChannel, KNormalLogLevel, "CSenGuidGen::ConstructL - about to call RFs.Volume()");
+    TVolumeInfo info;
+    error = rfs.Volume(info);
+    TLSLOG_FORMAT((KSenUtilsLogChannel, KMinLogLevel, _L8("CSenGuidGen::ConstructL - Volume() returned: %d"), error));
+    if( !error )
+        {
+        hostID.AppendNum(info.iUniqueID);
+        }
+#endif    
+    rfs.Close();
+
+    if( error )
+        {
+        hostID.Append( _L8("localhost") );
+        }
+    TLSLOG_L(KSenUtilsLogChannel, KMinLogLevel, "CSenGuidGen::ConstructL - host ID:");
+    TLSLOG(KSenUtilsLogChannel, KMinLogLevel, hostID);
+    // Create hash generator
+    ipMd5HashGen = CMD5::NewL();
+    }
+
+CSenGuidGen::~CSenGuidGen()
+    {
+    delete ipMd5HashGen;
+    delete ipHostId;
+    }
+
+EXPORT_C CSenGuidGen* CSenGuidGen::NewLC()
+    {
+    CSenGuidGen* pNew = new (ELeave) CSenGuidGen;
+    CleanupStack::PushL(pNew);
+    pNew->ConstructL();
+    return pNew;
+    }
+
+EXPORT_C CSenGuidGen* CSenGuidGen::NewL()
+    {
+    CSenGuidGen* pNew = NewLC();
+    CleanupStack::Pop(); // pNew;
+    return pNew;
+    }
+
+EXPORT_C HBufC* CSenGuidGen::GetRandomGuidLC()
+    {
+#ifdef _UNICODE
+    return GetRandomGuid16LC();
+#else
+    return GetRandomGuid8LC();
+#endif
+    }
+
+
+EXPORT_C HBufC8* CSenGuidGen::GetRandomGuid8LC()
+    {
+    TPtrC8 hash = GetRandomHash();
+    HBufC8* pResult = HBufC8::NewLC(hash.Length() * KSenUuidHexWidth + KSenUuidNumOfSlashes + KSenUuidPrefix().Length());
+    TPtr8 result = pResult->Des();
+
+    // Ensure that resulting uuid is a URI as well as an NCName
+    result.Append(KSenUuidPrefix) ;
+
+    for (TInt i = 0; i < hash.Length(); i++)
+        {
+        if ((i == 4) || (i == 6) || (i == 8) || (i == 10)) // four slashes
+            {
+            result.Append('-');
+            }
+        result.AppendNumFixedWidth(hash[i], EHex, KSenUuidHexWidth); // hash[i] as hex!, doubles the hash length
+        }
+    result.UpperCase();
+    return pResult;
+    }
+
+
+EXPORT_C HBufC16* CSenGuidGen::GetRandomGuid16LC()
+    {
+    TPtrC8 hash = GetRandomHash();
+    HBufC16* pResult = HBufC16::NewLC(hash.Length() * KSenUuidHexWidth + KSenUuidNumOfSlashes + KSenUuidPrefix().Length());
+    TPtr16 result = pResult->Des();
+
+    // Ensure that resulting uuid is a URI as well as an NCName
+
+    TBuf16<KSenUuidPrefixLength> uuidPrefix16; // KSenUuidPrefixLength == KSenUuidPrefix().Length()
+    
+    uuidPrefix16.Copy(KSenUuidPrefix); // OK, since there are no Unicode characters in KSenUuidPrefix
+    result.Append(uuidPrefix16);
+    
+    for (TInt i = 0; i < hash.Length(); i++)
+        {
+        if ((i == 4) || (i == 6) || (i == 8) || (i == 10)) // four slashes
+            {
+            result.Append('-');
+            }
+        result.AppendNumFixedWidth(hash[i], EHex, KSenUuidHexWidth); // hash[i] as hex!, doubles the hash length
+        }
+    result.UpperCase();
+    return pResult;
+    }
+
+TPtrC8 CSenGuidGen::GetRandomHash()
+    {
+    TBuf8<KSenUuidMaxHashLength> valueBeforeMd5;
+
+    // Append host id
+    valueBeforeMd5.Append(*ipHostId);
+    valueBeforeMd5.Append(':');
+
+    // Append current system time
+    TTime homeTime;
+    homeTime.HomeTime();
+    valueBeforeMd5.AppendNum(homeTime.Int64());
+    valueBeforeMd5.Append(':');
+
+    // Append random number
+    valueBeforeMd5.AppendNum(Math::Rand(iSeed));
+
+    // Calculate hash
+    TPtrC8 hash = ipMd5HashGen->Hash(valueBeforeMd5);
+    return hash;
+    }
+
+// End of File