messagingapp/msgui/conversationview/src/msgcharcounter_p.cpp
changeset 23 238255e8b033
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgui/conversationview/src/msgcharcounter_p.cpp	Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2009 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:Implements Symbian functionality to get message pdu details.
+ *
+ */
+#include "msgcharcounter_p.h"
+
+#include <smuthdr.h>
+#include <gsmuset.h>
+#include <gsmumsg.h>
+#include <txtetext.h>
+#include <txtrich.h>
+
+#include "msgcharcounter.h"
+#include "s60qconversions.h"
+
+enum MsgCharSupport
+{
+    msgCharSupportFull = 0, msgCharSupportReduced
+};
+
+// ---------------------------------------------------------------------------
+// Default Constructor ( 1st phase )
+// ---------------------------------------------------------------------------
+//
+MsgCharCounterPrivate::MsgCharCounterPrivate(MsgCharCounter *msgCharCounter) :
+    q_ptr(msgCharCounter)
+{
+    // No implementation required
+}
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+MsgCharCounterPrivate::~MsgCharCounterPrivate()
+{
+    q_ptr = NULL;
+
+    if (mParaFormatLayer)
+    {
+        delete mParaFormatLayer;
+        mParaFormatLayer = NULL;
+    }
+
+    if (mCharFormatLayer)
+    {
+        delete mCharFormatLayer;
+        mCharFormatLayer = NULL;
+    }
+
+    if (mRichText)
+    {
+        delete mRichText;
+        mRichText = NULL;
+    }
+
+    if (mSmsHeader)
+    {
+        delete mSmsHeader;
+        mSmsHeader = NULL;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+MsgCharCounterPrivate* MsgCharCounterPrivate::newL(
+    MsgCharCounter *msgCharCounter)
+{
+    MsgCharCounterPrivate* self = new (ELeave) MsgCharCounterPrivate(
+        msgCharCounter);
+    CleanupStack::PushL(self);
+    self->constructL();
+    CleanupStack::Pop(); // self;
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// EPOC default constructor for performing 2nd stage construction
+// ---------------------------------------------------------------------------
+//
+void MsgCharCounterPrivate::constructL()
+{
+    mParaFormatLayer = CParaFormatLayer::NewL();
+    mCharFormatLayer = CCharFormatLayer::NewL();
+    mRichText = CRichText::NewL(mParaFormatLayer, mCharFormatLayer);
+
+    mSmsHeader = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *mRichText);
+}
+
+// ---------------------------------------------------------------------------
+// To Set encoding settings like encoding type, character support and
+// alternative encoding if any.
+// ---------------------------------------------------------------------------
+//
+void MsgCharCounterPrivate::setEncodingSettings(bool unicodeMode,
+    int alternativeEncodingType, int charSupportType)
+{
+    TSmsUserDataSettings smsSettings;
+    CSmsMessage& smsMsg = mSmsHeader->Message();
+
+    mUnicodeMode = unicodeMode;
+    mCharSupportType = charSupportType;
+    mAlternativeEncodingType = (TSmsEncoding) alternativeEncodingType;
+
+    if (mUnicodeMode)
+    {
+        smsSettings.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabetUCS2);
+    }
+    else
+    {
+        smsSettings.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabet7Bit);
+    }
+    smsSettings.SetTextCompressed(EFalse);
+    smsMsg.SetUserDataSettingsL(smsSettings);
+    //First try without any alternate encoding
+    smsMsg.SetAlternative7bitEncoding(ESmsEncodingNone);
+}
+
+// ---------------------------------------------------------------------------
+// To get PDU Info: extracts details of number of PDUs, number of remaining
+// chars in last PDU and encoding types used.
+// ---------------------------------------------------------------------------
+//
+void MsgCharCounterPrivate::getNumPDUs(const QString &buf,
+    int &numOfRemainingChars, int &numOfPDUs, bool &unicodeMode,
+    int &alternativeEncodingType)
+{
+    TInt numOfUnconvChars;
+    TInt numOfDowngradedChars;
+    TInt isAltEncSupported;
+    TSmsEncoding currentAlternativeEncodingType;
+
+    CSmsMessage& smsMsg = mSmsHeader->Message();
+
+    // need to set the input buffer to SMS buffer through iRichText
+    // (which is reference to SMS Buffer object)
+    HBufC* buffer = S60QConversions::qStringToS60Desc(buf);
+    CleanupStack::PushL(buffer);
+    mRichText->Reset();
+    mRichText->InsertL(0, *buffer);
+
+    //call SMS stack API to get PDU info
+    smsMsg.GetEncodingInfoL(numOfPDUs, numOfUnconvChars, numOfDowngradedChars,
+        numOfRemainingChars);
+
+    //Algo to switch to Unicode if required
+    while ( (numOfUnconvChars || numOfDowngradedChars) && !mUnicodeMode)
+    {
+        currentAlternativeEncodingType = smsMsg.Alternative7bitEncoding();
+        if (currentAlternativeEncodingType != mAlternativeEncodingType)
+        {
+            //try with this new alternative encoding type
+            isAltEncSupported = smsMsg.SetAlternative7bitEncoding(
+                mAlternativeEncodingType);
+            if (isAltEncSupported == KErrNotSupported)
+            {
+                // if required alternative encoding plugin is not supported,
+                // retain the existing encoding mechanism.
+                mAlternativeEncodingType = currentAlternativeEncodingType;
+                continue;
+            }
+        }
+        else if (numOfUnconvChars || (MsgCharSupport) mCharSupportType
+                == msgCharSupportFull)
+        {
+            //switch to Unicode
+            //mUnicodeMode = ETrue;
+            setEncodingSettings(ETrue, ESmsEncodingNone, mCharSupportType);
+        }
+        else
+        {
+            //Get out of while loop and return the results
+            break;
+        }
+        //get the PDU info with new settings
+        mRichText->Reset();
+        mRichText->InsertL(0, *buffer);
+        smsMsg.GetEncodingInfoL(numOfPDUs, numOfUnconvChars,
+            numOfDowngradedChars, numOfRemainingChars);
+    } // end of while
+
+    CleanupStack::PopAndDestroy(buffer);
+    unicodeMode = mUnicodeMode;
+    alternativeEncodingType = mAlternativeEncodingType;
+    if (mUnicodeMode)
+    {
+        // In case of Unicode mode, SMS Stack returns number of available free
+        // User Data units. Need to convert them w.r.t characters.
+        // Each char takse 2 UD units.
+        numOfRemainingChars = numOfRemainingChars / 2;
+    }
+}
+
+//EOF