omadrm/drmengine/utils/src/Base64.cpp
changeset 0 95b198f216e5
child 18 8a03a285ab14
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/utils/src/Base64.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,208 @@
+/*
+* Copyright (c) 2002-2004 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:  ?Description
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include "base64.h"
+
+// LOCAL CONSTANTS AND MACROS
+LOCAL_C const TUint8* const KBase64Chars = 
+    _S8("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    "abcdefghijklmnopqrstuvwxyz"
+    "0123456789+/");
+
+// LOCAL FUNCTION PROTOTYPES
+LOCAL_C TUint8 FindBase64Char(
+    TUint aChar);
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ?function_name ?description.
+// ?description
+// Returns: ?value_1: ?description
+//          ?value_n: ?description_line1
+//                    ?description_line2
+// -----------------------------------------------------------------------------
+//
+LOCAL_C TUint8 FindBase64Char(
+    TUint aChar)
+    {
+    TUint8 i;
+
+    for (i = 0; i < 64; i++)
+        {
+        if (aChar == KBase64Chars[i]) break;
+        }
+    return i;
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// ?function_name implements...
+// ?implementation_description.
+// Returns: ?value_1: ?description
+//          ?value_n: ?description
+//                    ?description
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* Base64EncodeL(
+    const TDesC8& aInput)
+    {
+    HBufC8* ret;
+    TInt i = 0;
+    TInt j = 0;
+    TUint8 charArray3[3];
+    TUint8 charArray4[4];
+    TInt l = 0;
+    
+    ret = HBufC8::NewL((aInput.Length() * 4 + 1) / 3);
+    TPtr8 des = ret->Des();
+    while (l < aInput.Length())
+        {
+        charArray3[i++] = aInput[l];
+        l++;
+        if (i == 3)
+            {
+            charArray4[0] = static_cast<TUint8>((charArray3[0] & 0xfc) >> 2);
+            charArray4[1] = static_cast<TUint8>(
+                ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4));
+            charArray4[2] = static_cast<TUint8>(
+                ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6));
+            charArray4[3] = static_cast<TUint8>(charArray3[2] & 0x3f);
+        
+            for (i = 0; i <4; i++)
+                {
+                des.Append(KBase64Chars[charArray4[i]]);
+                }
+            i = 0;
+            }
+        }
+    
+    if (i != 0)
+        {
+        for (j = i; j < 3; j++)
+            {
+            charArray3[j] = '\0';
+            }
+        
+        charArray4[0] = static_cast<TUint8>((charArray3[0] & 0xfc) >> 2);
+        charArray4[1] = static_cast<TUint8>(
+            ((charArray3[0] & 0x03) << 4) +((charArray3[1] & 0xf0) >> 4));
+        charArray4[2] = static_cast<TUint8>(
+            ((charArray3[1] & 0x0f) << 2) +((charArray3[2] & 0xc0) >> 6));
+        charArray4[3] = static_cast<TUint8>(charArray3[2] & 0x3f);
+        
+        for (j = 0; j < i + 1; j++)
+            {
+            des.Append(KBase64Chars[charArray4[j]]);
+            }
+        
+        while ((i++ < 3))
+            {
+            des.Append('=');
+            }
+        }
+    
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// ?function_name implements...
+// ?implementation_description.
+// Returns: ?value_1: ?description
+//          ?value_n: ?description
+//                    ?description
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* Base64DecodeL(
+    const TDesC8& aInput)
+    {
+    TInt len = aInput.Length();
+    TInt i = 0;
+    TInt j = 0;
+    TInt in = 0;
+    TUint8 charArray4[4], charArray3[3];
+    HBufC8* ret;
+    
+    ret = HBufC8::NewL((aInput.Length() * 3 + 1) / 4);
+    TPtr8 des = ret->Des();
+    while (len-- && aInput[in] != '=')
+        {
+        if (FindBase64Char(aInput[in]) < 64)
+            {
+            charArray4[i++] = aInput[in]; in++;
+            }
+        else
+            {
+            in++;
+            }
+            
+        if (i == 4)
+            {
+            for (i = 0; i < 4; i++)
+                {
+                charArray4[i] = FindBase64Char(charArray4[i]);
+                }
+            
+            charArray3[0] = static_cast<TUint8>(
+                (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4));
+            charArray3[1] = static_cast<TUint8>(
+                ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2));
+            charArray3[2] = static_cast<TUint8>(
+            ((charArray4[2] & 0x3) << 6) + charArray4[3]);
+            
+            for (i = 0; i < 3; i++)
+                {
+                des.Append(charArray3[i]);
+                }
+            i = 0;
+            }
+        }
+    
+    if (i != 0)
+        {
+        for (j = i; j < 4; j++)
+            {
+            charArray4[j] = 0;
+            }
+    
+        for (j = 0; j < 4; j++)
+            {
+            charArray4[j] = FindBase64Char(charArray4[j]);
+            }
+    
+        charArray3[0] = static_cast<TUint8>(
+            (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4));
+        charArray3[1] = static_cast<TUint8>(
+            ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2));
+        charArray3[2] = static_cast<TUint8>(
+            ((charArray4[2] & 0x3) << 6) + charArray4[3]);
+    
+        for (j = 0; j < i - 1; j++)
+            {
+            des.Append(charArray3[j]);
+            }
+        }
+    
+    return ret;
+    }
+
+//  End of File