messagingapp/msgutils/unieditorutils/editorgenutils/src/UniEditorGenUtils.cpp
changeset 25 84d9eb65b26f
child 27 e4592d119491
child 37 518b245aa84c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unieditorutils/editorgenutils/src/UniEditorGenUtils.cpp	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,485 @@
+/*
+ * 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: General utilities for unified editor and plugin
+ *
+ */
+
+// INCLUDE FILES
+#include <centralrepository.h>          // CRepository
+#include <CoreApplicationUIsSDKCRKeys.h>  // offline CR keys
+#include <rcustomerserviceprofilecache.h>
+#include <MmsEngineDomainCRKeys.h>
+#include <MsgMediaResolver.h>
+#include <DRMHelper.h>
+
+#include "MessagingVariant.hrh"
+#include "MessagingInternalCRKeys.h"  // Keys
+#include "UniEditorGenUtils.h"
+#include "s60qconversions.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------
+// UniEditorGenUtils::UniEditorGenUtils
+// @see header
+// ----------------------------------------------------
+UniEditorGenUtils::UniEditorGenUtils() :
+mAbsMaxConcatenatedSms(-1),
+mAbsMaxSmsCharacters(-1),
+mMaxMmsSize(-1)
+{
+
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::~UniEditorGenUtils
+// @see header
+// ----------------------------------------------------
+UniEditorGenUtils::~UniEditorGenUtils()
+{
+
+}
+// ----------------------------------------------------
+// UniEditorGenUtils::ReadEmailOverSmsSettingsL
+// @see header
+// ----------------------------------------------------
+TInt UniEditorGenUtils::ReadEmailOverSmsSettingsL(
+    TDes& aSmsc,
+    TDes& aDestinationAddress,
+    TBool& aModifiable )
+    {
+    // Create storage
+    CRepository* storage = CRepository::NewLC( KCRUidSmum );
+    storage->Get( KSumEmailSC, aSmsc );
+    storage->Get( KSumEmailGateway, aDestinationAddress );
+    storage->Get( KSumEmailModifiable, aModifiable );
+    CleanupStack::PopAndDestroy(); // storage
+    return KErrNone;
+    }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::WriteEmailOverSmsSettingsL
+// @see header
+// ----------------------------------------------------
+TInt UniEditorGenUtils::WriteEmailOverSmsSettingsL(
+    const TDes& aSmsc,
+    const TDes& aDestinationAddress,
+    const TBool& aModifiable )
+    {
+    // Create storage
+    CRepository* storage = CRepository::NewLC( KCRUidSmum );
+    storage->Set( KSumEmailSC, aSmsc );
+    storage->Set( KSumEmailGateway, aDestinationAddress );
+    storage->Set( KSumEmailModifiable, aModifiable );
+    CleanupStack::PopAndDestroy(); // storage
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// UniEditorGenUtils::IsPhoneOfflineL
+// @see header
+// ---------------------------------------------------------
+TBool UniEditorGenUtils::IsPhoneOfflineL()
+    {
+    TInt connAllowed ( 1 );
+    CRepository* repository ( CRepository::NewL( KCRUidCoreApplicationUIs ) );
+    TInt err = repository->Get( KCoreAppUIsNetworkConnectionAllowed, connAllowed );
+    delete repository;
+    repository = NULL;
+    if ( !err && !connAllowed )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::AcceptEmailAddressesL
+// @see header
+// ----------------------------------------------------
+TBool UniEditorGenUtils::AcceptEmailAddressesL()
+{
+	CRepository* repository ( CRepository::NewL( KCRUidMuiuVariation ) );
+	TInt features = 0;
+    TBool emailOverSmsVariationOn = false;
+    TBool acceptEmailAddresses = false;
+
+	 if ( repository->Get( KMuiuSmsFeatures, features ) == KErrNone )
+	         {
+	         if ( features & KSmsFeatureIdEmailOverSms )
+	             {
+	             emailOverSmsVariationOn = ETrue;
+	             }
+	         }
+
+	 delete repository;
+
+	 //TODO chk with Jerry if below is needed
+	 RCustomerServiceProfileCache* cspProfile = new (ELeave) RCustomerServiceProfileCache;
+     TInt error = cspProfile->Open();
+
+     if ( error == KErrNone )
+         {
+         if ( emailOverSmsVariationOn )
+             {
+
+             // EmailOverSms bit was variated ON so let's check the bit from SIM
+             // Get tele services flags from CSP
+             RMobilePhone::TCspValueAdded params;
+             // Read the CPHS bit so we know if EmailOverSms is supported
+             error = cspProfile->CspCPHSValueAddedServices( params );
+
+
+             if ( error == KErrNone &&
+                  params >= 0 &&
+                  params & RMobilePhone::KCspSMMOEmail )
+                 {
+                 // It's supported
+            	 acceptEmailAddresses= true;
+                 }
+             }
+         }
+     cspProfile->Close();
+     delete cspProfile;
+
+     return acceptEmailAddresses;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::VerifyEmailAddressesL
+// @see header
+// ----------------------------------------------------
+TBool UniEditorGenUtils::VerifyEmailAddressesL( ConvergedMessageAddressList addr)
+{
+  TBool emailAddrPresent =  EFalse;
+
+  for ( int i=0; i< addr.count(); i++)
+  {
+	  if( IsValidEmailAddress(addr[i]->address()) )
+	  {
+		  emailAddrPresent = ETrue;
+		  break;
+	  }
+  }
+
+  return emailAddrPresent;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::UTF8Size
+// @see header
+// ----------------------------------------------------
+TInt UniEditorGenUtils::UTF8Size( QString aText )
+    {
+    HBufC* text = S60QConversions::qStringToS60Desc(aText);
+    TPtrC ptr = text->Des();
+    
+    TInt count = 0;
+    TInt sizeInBytes = 0;
+    TUint16 charValue;
+    while ( count < ptr.Length() )
+        {
+        charValue = ptr[count];
+        if ( charValue < 0x80 )
+            {
+            sizeInBytes += 1;
+            }
+        else if ( charValue < 0x800 )
+            {
+            sizeInBytes += 2;
+            }
+        else //if ( charValue < 0x10000 )
+            {
+            sizeInBytes += 3;
+            }
+        count++;
+        }
+    return sizeInBytes;
+    }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::MaxSmsRecipientsL
+// @see header
+// ----------------------------------------------------
+TInt UniEditorGenUtils::MaxSmsRecipientsL()
+{
+	CRepository* repository ( CRepository::NewL( KCRUidUniEditor ) );
+	TInt maxSmsRecipients = KDefaultSmsRecipients;
+	
+    if ( (repository->Get( KUniEditorSoftLimitRecipientCount, maxSmsRecipients ) 
+    		!= KErrNone) ||	(maxSmsRecipients <= 0) )
+        {
+        // Unreasonable count, change it back to default value
+    	maxSmsRecipients = KDefaultSmsRecipients;
+        }
+    delete repository;
+    
+    return maxSmsRecipients;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::MaxMmsRecipientsL
+// @see header
+// ----------------------------------------------------
+TInt UniEditorGenUtils::MaxMmsRecipientsL()
+{
+	CRepository* repository ( CRepository::NewL( KCRUidUniEditor ) );
+	TInt maxMmsRecipients = KDefaultMmsRecipients;
+	
+    if ( (repository->Get( KUniEditorMaxRecipientCount, maxMmsRecipients )
+    		!= KErrNone) || (maxMmsRecipients <= 0))
+        {
+        // Unreasonable count, change it back to default value
+    	maxMmsRecipients = KDefaultMmsRecipients;
+        }
+    delete repository;
+
+    return maxMmsRecipients;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::IsValidEmailAddress
+// @see header
+// ----------------------------------------------------
+TBool UniEditorGenUtils::IsValidEmailAddress( QString addr )
+    { 
+    // valid email address contains at least 3 characters
+    if( addr.size() >= 3 )
+        {
+        // search for @ from the address. however, it can't be the first or the last item
+        for ( int i = 1; i < addr.size() - 1; i++ )
+            {
+            if ( addr.at(i) == '@' )
+                {
+                return ETrue;
+                }
+            }
+        }
+    return EFalse;
+    }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::MaxMmsMsgSizeL
+// @see header
+// ----------------------------------------------------
+TInt UniEditorGenUtils::MaxMmsMsgSizeL()
+{
+    // optimized, to read only once from CR
+    if(mMaxMmsSize == -1)
+    {// not read yet, so read it now
+        mMaxMmsSize = KDefaultMaxSize;
+    
+        CRepository* repository = CRepository::NewL( KCRUidMmsEngine );
+        CleanupStack::PushL( repository );
+    
+        repository->Get( KMmsEngineMaximumSendSize, mMaxMmsSize );
+    
+        CleanupStack::PopAndDestroy( repository );
+    }
+    
+    return mMaxMmsSize;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::getFileInfoL
+// @see header
+// ----------------------------------------------------
+void UniEditorGenUtils::getFileInfoL(QString filePath,
+                                    int& size,
+                                    QString& mimetype,
+                                    TMsgMediaType& mediaType)
+{
+    HBufC* filepath = S60QConversions::qStringToS60Desc(filePath);
+    int fileSize = 0;
+    
+	CMsgMediaResolver* mediaResolver;
+	
+    if(filepath)  
+    { 
+    CleanupStack::PushL(filepath);     
+    
+    mediaResolver = CMsgMediaResolver::NewLC();
+    
+    RFile file = mediaResolver->FileHandleL(*filepath);    
+    file.Size(fileSize);        
+    fileSize+= KEstimatedMimeHeaderSize;
+    size = fileSize;
+    TDataType datatype;
+    mediaResolver->RecognizeL( file, datatype );
+    mimetype = S60QConversions::s60Desc8ToQString(datatype.Des8());
+    mediaType = mediaResolver->MediaType(datatype.Des8());
+    
+    CleanupStack::PopAndDestroy(mediaResolver);
+    CleanupStack::PopAndDestroy(filepath);
+    }
+    
+    return;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::MaxSmsMsgSizeL
+// @see header
+// ----------------------------------------------------
+int UniEditorGenUtils::MaxSmsMsgSizeL(bool unicode)
+{
+    int maxLength = 0;
+    int lengthOne = 0;
+    int lengthMany = 0;
+    
+    getSmsCharacterLimits(lengthOne, lengthMany, unicode);
+    maxLength = lengthOne;
+
+    int maxSmsParts = absoluteMaxSmsPartsL();    
+    if(maxSmsParts > 1)
+        {
+        maxLength = maxSmsParts * lengthMany;
+        }
+/* UniEditor soft limit, may not be needed    
+    int maxSmsCharacters = absoluteMaxSmsCharactersL();
+    if(maxSmsCharacters > 0)
+        {
+        maxLength = maxSmsCharacters;
+        }
+*/
+    return maxLength;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::getSmsCharacterLimits
+// @see header
+// ----------------------------------------------------
+void UniEditorGenUtils::getSmsCharacterLimits(int& singlePartLength,
+                                        int& concatenatedPartLength,
+                                        bool unicode)
+    {
+    if(unicode)
+        {
+        singlePartLength = KFirstUnicodeSmsLength;
+        concatenatedPartLength = KUnicodeConcatenationInterval;
+        }
+    else
+        {
+        singlePartLength = KFirstNormalSmsLength;
+        concatenatedPartLength = KNormalConcatenationInterval;
+        }
+    }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::absoluteMaxSmsPartsL
+// @see header
+// ----------------------------------------------------
+int UniEditorGenUtils::absoluteMaxSmsPartsL()
+{
+    // optimized, to read only once from CR
+    if(mAbsMaxConcatenatedSms == -1)
+    { // not read yet, so read it now
+        mAbsMaxConcatenatedSms = KDefaultMaxSmsSize;
+        CRepository* repository = CRepository::NewL( KCRUidSmum );
+        CleanupStack::PushL( repository );
+
+        if ( repository->Get( KSmumMaxSubMsgCount, mAbsMaxConcatenatedSms ) ||
+                mAbsMaxConcatenatedSms < 1 || 
+                mAbsMaxConcatenatedSms > KMaxSmsSizeByStandard )
+        {
+            // Unreasonable count, change it back to 30 ( S60 default )
+            mAbsMaxConcatenatedSms = KMaxSmsSizeByStandard;
+        }
+        CleanupStack::PopAndDestroy( repository );
+    }
+    return mAbsMaxConcatenatedSms;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::absoluteMaxSmsCharactersL
+// @see header
+// ----------------------------------------------------
+int UniEditorGenUtils::absoluteMaxSmsCharactersL()
+{
+    // optimized, to read only once from CR
+    if(mAbsMaxSmsCharacters == -1)
+    {// not read yet, so read it now
+        CRepository* repository = CRepository::NewL( KCRUidUniEditor );
+        CleanupStack::PushL( repository );
+        repository->Get( KUniEditorMaxSmsCharacterCount, mAbsMaxSmsCharacters );
+        CleanupStack::PopAndDestroy( repository );    
+    }
+    return mAbsMaxSmsCharacters;
+}
+
+// ---------------------------------------------------------
+// UniEditorGenUtils::ConvertDigitsTo
+// @see header
+// ---------------------------------------------------------
+void UniEditorGenUtils::ConvertDigitsTo( TDes& aDes, TDigitType aDigitType )
+    {
+    TChar toArea = aDigitType;
+    TInt length = aDes.Length();
+    for(int i=0; i<length; i++)
+        {
+        TChar ch = aDes[i];
+        TChar base = NumberToBase(ch);
+        switch (base)
+            {
+            case EDigitTypeWestern:
+            case EDigitTypeArabicIndic:
+            case EDigitTypeEasternArabicIndic:
+            case EDigitTypeDevanagari:
+            case EDigitTypeThai:
+                ch += toArea - base;
+                aDes[i] = TUint16(ch);
+                break;
+            default:
+                break;
+            };
+        }
+    }
+
+// ---------------------------------------------------------
+// UniEditorGenUtils::NumberToBase
+// @see header
+// ---------------------------------------------------------
+TChar UniEditorGenUtils::NumberToBase(TChar ch)
+    {
+    TDigitType d[] = { EDigitTypeWestern, EDigitTypeArabicIndic, EDigitTypeEasternArabicIndic, EDigitTypeDevanagari, EDigitTypeThai };
+    TInt i = 0;
+    TInt num = sizeof(d)/sizeof(d[0]);
+    while(i<num)
+        {
+        if (ch>TChar(d[i]) && ch<TChar(d[i]+10)) { return d[i]; }
+        i++;
+        }
+    return ch;
+    }
+
+// ---------------------------------------------------------
+// UniEditorGenUtils::ReplaceCharacters
+// @see header
+// ---------------------------------------------------------
+void UniEditorGenUtils::ReplaceCharacters(TDes &aDes, const TDesC &aChars, TChar aReplacement)
+    {
+    TInt src = 0;
+    TInt srclength = aDes.Length();
+    while(src < srclength)
+        {
+    TChar c = aDes[src];
+    if (aChars.LocateF(c) != KErrNotFound)
+        aDes[src] = TUint16(aReplacement);
+    ++src;
+        }
+    }
+
+// End of file