webengine/wmlengine/src/hed/src/TextReverse.cpp
changeset 0 dd21522fd290
child 68 92a765b5b3e7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/wmlengine/src/hed/src/TextReverse.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2003 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:  Reverse ISO-8859-8 text
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <e32base.h>
+#include "textreverse.h"
+#include <BidiVisual.h>
+#include "nwx_settings.h"
+#include "nwx_statuscodeconvert.h"
+#include "BrsrStatusCodes.h"
+
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+void ReverseTextL(NW_String_t* toString, NW_String_t* fromString)
+    {
+    const TInt additionalCharsLen = 4;
+    NW_ASSERT(toString != NULL);
+    NW_ASSERT(fromString != NULL);
+    // Get the storage we know it is UCS2 encoded
+    TUint16* stringToReverse = (TUint16*)NW_String_getStorage(fromString);
+    TUint stringLen = NW_String_getByteCount(fromString) / (sizeof (TUint16));
+    if (stringToReverse[stringLen - 1] == 0) 
+        {
+        stringLen--;
+        }
+    if (stringLen > 0)
+        {
+        TPtrC fromStringPtr(stringToReverse, stringLen);
+        TUint16* reversedString = new(ELeave) TUint16 [stringLen + additionalCharsLen];
+        CleanupStack::PushL(reversedString);
+        TPtr reversedStringPtr(reversedString, stringLen + additionalCharsLen);
+    
+        TBidirectionalState::TRunInfo aRunInfoArray;
+        TBidirectionalState::TRunInfo *mRunInfoArray = NULL;
+        TBidiLogicalToVisual *bdLtoV = new(ELeave) TBidiLogicalToVisual(fromStringPtr, &aRunInfoArray, 1);
+        TInt runArrayCount = bdLtoV->Reorder();
+        delete bdLtoV;
+
+        mRunInfoArray = new(ELeave) TBidirectionalState::TRunInfo [runArrayCount];
+        CleanupStack::PushL(mRunInfoArray);
+        bdLtoV = new TBidiLogicalToVisual(fromStringPtr, mRunInfoArray, runArrayCount);
+        CleanupStack::PushL(bdLtoV);
+        bdLtoV->Reorder();
+
+        bdLtoV->GetVisualLine(reversedStringPtr, 0, stringLen, 0xFFFF);
+        reversedStringPtr.ZeroTerminate();
+
+        if (StatusCodeConvert(NW_String_ucs2CharToString (toString, reversedString, HTTP_iso_10646_ucs_2)) != KBrsrSuccess)
+            {
+            User::Leave(KErrNoMemory);
+            }
+
+        CleanupStack::PopAndDestroy(3); // bdLtoV, mRunInfoArray, reversedString
+        }
+    else
+        {
+        // transfer ownership
+        NW_String_shallowCopy(toString, fromString);
+        NW_String_clearUserOwnsStorage(fromString);
+        }
+    }
+
+
+TBrowserStatusCode ReverseText(NW_String_t* string)
+    {
+    NW_ASSERT(string != NULL);
+    NW_String_t toString;
+    TBrowserStatusCode status = KBrsrSuccess;
+    // Try to reverse only iso-8859-8
+    if (NW_Settings_GetOriginalEncoding() == HTTP_iso_8859_8)
+        {
+        NW_String_initialize (&toString, NULL, 0);
+        TRAPD(ret, ReverseTextL(&toString, string));
+        if (ret != KErrNone)
+            {
+            status = KBrsrOutOfMemory;
+            }
+        else
+            {
+                //transfer ownership back to the original string
+                if (NW_String_getUserOwnsStorage(string))
+                    {
+                    NW_String_deleteStorage(string);
+                    }
+
+                NW_String_shallowCopy(string, &toString);
+                NW_String_clearUserOwnsStorage(&toString);
+            }
+        }
+    return status;
+    }
+
+
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File