--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unieditorutils/src/UniEditorGenUtils.cpp Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,481 @@
+/*
+ * 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()
+{
+
+}
+
+// ----------------------------------------------------
+// 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()
+{
+ TInt maxSize = KDefaultMaxSize;
+
+ CRepository* repository = CRepository::NewL( KCRUidMmsEngine );
+ CleanupStack::PushL( repository );
+
+ repository->Get( KMmsEngineMaximumSendSize, maxSize );
+
+ CleanupStack::PopAndDestroy( repository );
+
+ return maxSize;
+}
+
+// ----------------------------------------------------
+// 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()
+{
+ int maxLength = 0;
+ int lengthOne = 0;
+ int lengthMany = 0;
+
+ getSmsCharacterLimits(lengthOne, lengthMany);
+ maxLength = lengthOne;
+
+ int maxSmsParts = absoluteMaxSmsPartsL();
+ if(maxSmsParts > 1)
+ {
+ maxLength = maxSmsParts * lengthMany;
+ }
+
+ int maxSmsCharacters = absoluteMaxSmsCharactersL();
+ if(maxSmsCharacters > 0)
+ {
+ maxLength = maxSmsCharacters;
+ }
+ return maxLength;
+}
+
+// ----------------------------------------------------
+// UniEditorGenUtils::getSmsCharacterLimits
+// @see header
+// ----------------------------------------------------
+void UniEditorGenUtils::getSmsCharacterLimits(int& singlePartLength,
+ int& concatenatedPartLength)
+ {
+ if(unicodeCharacterMode())
+ {
+ singlePartLength = KFirstUnicodeSmsLength;
+ concatenatedPartLength = KUnicodeConcatenationInterval;
+ }
+ else
+ {
+ singlePartLength = KFirstNormalSmsLength;
+ concatenatedPartLength = KNormalConcatenationInterval;
+ }
+ }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::unicodeCharacterMode
+// @see header
+// ----------------------------------------------------
+bool UniEditorGenUtils::unicodeCharacterMode()
+ {
+ //TODO: this needs proper implementation
+ return false;
+ }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::absoluteMaxSmsPartsL
+// @see header
+// ----------------------------------------------------
+int UniEditorGenUtils::absoluteMaxSmsPartsL()
+ {
+ int absMaxConcatenatedSms = KDefaultMaxSmsSize;
+ CRepository* repository = CRepository::NewL( KCRUidSmum );
+ CleanupStack::PushL( repository );
+
+ if ( repository->Get( KSmumMaxSubMsgCount, absMaxConcatenatedSms ) ||
+ absMaxConcatenatedSms < 1 ||
+ absMaxConcatenatedSms > KMaxSmsSizeByStandard )
+ {
+ // Unreasonable count, change it back to 30 ( S60 default )
+ absMaxConcatenatedSms = KMaxSmsSizeByStandard;
+ }
+ CleanupStack::PopAndDestroy( repository );
+ return absMaxConcatenatedSms;
+ }
+
+// ----------------------------------------------------
+// UniEditorGenUtils::absoluteMaxSmsCharactersL
+// @see header
+// ----------------------------------------------------
+int UniEditorGenUtils::absoluteMaxSmsCharactersL()
+ {
+ int absMaxSmsCharacters = 0;
+
+ CRepository* repository = CRepository::NewL( KCRUidUniEditor );
+ CleanupStack::PushL( repository );
+ repository->Get( KUniEditorMaxSmsCharacterCount, absMaxSmsCharacters );
+ CleanupStack::PopAndDestroy( repository );
+
+ return absMaxSmsCharacters;
+ }
+
+// ---------------------------------------------------------
+// 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