// --------------------------------------------------------------------------- // Fails only on OOM case // --------------------------------------------------------------------------- // void CPosModulesSettings::ParseAttributedKeyL( const TDesC& aString, RModuleList& aList ) const { // The sequence in the buffer is "H{8},D+,D+[,...]" // which is "UID,status,cost" // H - hex digit, D - decimal digit, delimiter - comma // UID check is strict and fails with KErrCorrupt if something's wrong // Status and Cost checks a lazy, use default value if error // Status - inactive, cost - unknown // TLex uses whitespace as delimiter // Replace all commas with whitespace HBufC* string = aString.AllocLC(); ReplaceCommasWithWhitespace( string->Des() ); TLex lex( *string ); while ( !lex.Eos() ) { TPosModuleListItem item; // parse UID TPtrC token( lex.NextToken() ); if ( !token.Length() ) { break; // no more items found } item.iUid.iUid = 0; TInt err = ParseModuleUid( token, (TUint32&) item.iUid.iUid ); // parse status field token.Set( lex.NextToken() ); err |= TLex( token ).Val( (TUint&) item.iAvailable, EDecimal ); if ( item.iAvailable != EModuleAvailable && item.iAvailable != EModuleNotAvailable ) { err |= KErrCorrupt; } // parse cost field token.Set( lex.NextToken() ); err |= TLex( token ).Val( (TUint&) item.iCost, EDecimal ); // Avoid duplicate UIDs ( in both lists ) TPosModuleAttributes otherItem; if ( !err && !ModuleExists( item.iUid ) ) { // Add module list item to the list aList.AppendL( item ); } } CleanupStack::PopAndDestroy( string ); }
TBool CEmTubeVideoUploadDialog::OkToExitL(TInt aButtonId) { if (aButtonId == EAknSoftkeyDone) { SaveFormDataL(); if( iQueueEntry->Title().Length() == 0 ) { HBufC* message = StringLoader::LoadLC( R_DIALOG_TITLE_AND_DESCRIPTION_NEEDED_TXT ); CAknInformationNote* informationNote = new (ELeave) CAknInformationNote; informationNote->ExecuteLD( *message ); CleanupStack::PopAndDestroy( message ); return EFalse; } if( iQueueEntry->Description().Length() == 0 ) { HBufC* message = StringLoader::LoadLC( R_DIALOG_TITLE_AND_DESCRIPTION_NEEDED_TXT ); CAknInformationNote* informationNote = new (ELeave) CAknInformationNote; informationNote->ExecuteLD( *message ); CleanupStack::PopAndDestroy( message ); return EFalse; } TBool res = ETrue; if( iQueueEntry->Tags().Length() == 0 ) res = EFalse; TLex lex = TLex( iQueueEntry->Tags() ); TPtrC16 ptr( lex.NextToken() ); TInt tokenCount = 0; while( ptr.Length() && (tokenCount < 2) ) { tokenCount++; ptr.Set( lex.NextToken() ); } if( tokenCount < 2 ) res = EFalse; if( !res ) { HBufC* message = StringLoader::LoadLC( R_DIALOG_TWO_TAGS_NEEDED_TXT ); CAknInformationNote* informationNote = new (ELeave) CAknInformationNote; informationNote->ExecuteLD( *message ); CleanupStack::PopAndDestroy( message ); return EFalse; } return ETrue; } else { return CAknForm::OkToExitL(aButtonId); } }
/* * Creates an sql query to fetch contact item IDs for all the contact items * which may contain the specified telephone number in a telephone, fax * or SMS type field. * * The comparison method used is not exact. The number is compared starting from * the right side of the number and the method returns an array of candidate * matches. Punctuation (e.g. spaces) and other alphabetic characters are ignored * when comparing. * * Note that due to the way numbers are stored in the database, it is recommended * that at least 7 match digits are specified even when matching a number * containing fewer digits. Failure to follow this guideline may (depending on the * database contents) mean that the function will not return the expected Contact * IDs. */ void CntFilterDetail::createMatchPhoneNumberQuery( const QContactFilter& filter, QString& sqlQuery, QContactManager::Error* error) { if (!filterSupported(filter) ) { *error = QContactManager::NotSupportedError; return; } QContactDetailFilter detailFilter(filter); QString number((detailFilter.value()).toString()); TPtrC numberPtr(reinterpret_cast<const TUint16*>(number.utf16())); TInt matchLengthFromRight(KDefaultMatchLength); // no need to propagate error, we can use the default match length TRAP_IGNORE(getMatchLengthL(matchLengthFromRight)); TInt numLowerDigits = matchLengthFromRight; TInt numUpperDigits = 0; if (numLowerDigits > KLowerSevenDigits) { numLowerDigits = KLowerSevenDigits; numUpperDigits = matchLengthFromRight - KLowerSevenDigits; } else if (numLowerDigits == 0) { // best match phonenumbers numLowerDigits = KLowerSevenDigits; } TMatch phoneDigits = createPaddedPhoneDigits( numberPtr, numLowerDigits, numUpperDigits, error); if (*error == QContactManager::NoError) { // select fields for contacts that match phone lookup // SELECT contact_id FROM comm_addr // WHERE value = [value string] AND type = [type value]; // QString type = QString(" type = %1").arg(CntDbInfo::EPhoneNumber); QString value = QString(" value = %1").arg(phoneDigits.iLowerSevenDigits); QString whereClause = " WHERE" + value + " AND" + type; if (matchLengthFromRight <= KLowerSevenDigits) { // Matching 7 or less digits... sqlQuery = "SELECT contact_id FROM comm_addr" + whereClause; } else { // Checking the upper digits... // select fields for contacts that match phone lookup // SELECT contact_id, extra_value FROM comm_addr // WHERE value = [value string] AND type = [type value]; // QString type = QString(" type = %1").arg(CntDbInfo::EPhoneNumber); QString value = QString(" value = %1").arg(phoneDigits.iLowerSevenDigits); QString whereClause = " WHERE" + value + " AND" + type; sqlQuery = "SELECT contact_id, extra_value FROM comm_addr" + whereClause; QList<QPair<QContactLocalId, QString> > contactMatches = m_srvConnection.searchPhoneNumbers(sqlQuery, error); // Check if search query was successful if (*error != QContactManager::NoError) { return; } QStringList list; for (int i=0; i<contactMatches.count(); ++i) { // Check the upper digits... TInt32 storedUpperDigits(0); QString extraValue = contactMatches.at(i).second; TPtrC extValString(reinterpret_cast<const TUint16*>(extraValue.utf16())); if (TLex(extValString).Val(storedUpperDigits) == KErrNone) { const TInt KDigitsToRemove = KMaxPhoneMatchLength - KLowerSevenDigits - phoneDigits.iNumUpperDigits; for (TInt j = 0; j < KDigitsToRemove; ++j) { // repeatedly divide by 10 to lop off the appropriate number of digits from the right storedUpperDigits /= 10; } storedUpperDigits = TMatch::padOutPhoneMatchNumber(storedUpperDigits, KDigitsToRemove); if (phoneDigits.iUpperDigits == storedUpperDigits) { list.append(QString("%1").arg(contactMatches.at(i).first)); } } else { *error = QContactManager::UnspecifiedError; } } // Recreate query to fetch all match ids // SELECT DISTINCT contact_id FROM contact WHERE contact_id in ( // .. // ) QString ids = list.join(" ,"); sqlQuery = "SELECT DISTINCT contact_id FROM contact WHERE contact_id in ("; sqlQuery += ids; sqlQuery += ')'; } // refine search if (bestMatchingEnabled()) { QList<QContactLocalId> list = m_srvConnection.searchContacts(sqlQuery,error); QList<QContactLocalId> bestMatchingIds; if (*error == QContactManager::NoError) { TRAP_IGNORE( bestMatchingIds = getBestMatchPhoneNumbersL(number, list, error); ) if (bestMatchingIds.count()>0) { // recreate query QString selectQuery = " SELECT contact_id FROM comm_addr WHERE contact_id in ("; QString ids = QString("%1").arg(bestMatchingIds.at(0)); for(int i=1; i<bestMatchingIds.count(); ++i) { ids += QString(" ,%1").arg(bestMatchingIds.at(i)); } selectQuery += ids + ')'; sqlQuery = selectQuery; } else { // empty list QString selectQuery = " SELECT contact_id FROM comm_addr WHERE contact_id in (null)"; sqlQuery = selectQuery; } }
/** Returns an array of contact item IDs for all the contact items which may contain the specified telephone number in a telephone, fax or SMS type field. This is improved version of MatchPhoneNumberL method. The number is compared starting from the right side of the number and the method returns an array of candidate matches. Punctuation (e.g. spaces) and other alphabetic characters are ignored when comparing. Leading zeros are removed. Digits are compared up to the lenght of shorter number. @param aNumber Phone number string. @return Array of contact IDs which are candidate matches. */ CContactIdArray* CPplCommAddrTable::BestMatchingPhoneNumberL(const TDesC& aNumber) { const TInt KUpperMaxLength = KMaxPhoneMatchLength - KLowerSevenDigits; CContactIdArray* phoneMatchArray = CContactIdArray::NewLC(); TMatch phoneDigits = CreatePaddedPhoneDigitsL(aNumber, KLowerSevenDigits, KUpperMaxLength); if (phoneDigits.iNumLowerDigits + phoneDigits.iNumUpperDigits > 0) { // build statement RSqlStatement stmnt; CleanupClosePushL(stmnt); stmnt.PrepareL(iDatabase, iMatchSelectStmnt->SqlStringL()); const TInt KValueParamIndex(KFirstParam); // first parameter in query... const TInt KTypeParamIndex(KValueParamIndex + 1); // ...and the second. User::LeaveIfError(stmnt.BindInt(KValueParamIndex, phoneDigits.iLowerSevenDigits)); User::LeaveIfError(stmnt.BindInt(KTypeParamIndex, EPhoneNumber)); // fetch the list of any matching contact ids TInt err(KErrNone); const TInt KContactIdIdx(iMatchSelectStmnt->ParameterIndex( KCommAddrContactId())); const TInt KExtraValueIdx(iMatchSelectStmnt->ParameterIndex(KCommAddrExtraValue())); while ((err = stmnt.Next()) == KSqlAtRow) { // Check the upper digits... TInt32 number = phoneDigits.iUpperDigits; TPtrC extValString = stmnt.ColumnTextL(KExtraValueIdx); TInt32 storedUpperDigits; User::LeaveIfError(TLex(extValString).Val(storedUpperDigits)); TInt32 stored = storedUpperDigits; TBool nonZeroInStoredFound = EFalse; TBool nonZeroInNumberFound = EFalse; while ((number != 0) && (stored != 0)) { nonZeroInNumberFound |= (number % 10 != 0); nonZeroInStoredFound |= (stored % 10 != 0); if (nonZeroInStoredFound && nonZeroInNumberFound) { break; } number /= 10; stored /= 10; } if ( (phoneDigits.iUpperDigits == 0) || (storedUpperDigits == 0) || (number == stored) ) { phoneMatchArray->AddL(stmnt.ColumnInt(KContactIdIdx)); } } // leave if we didn't complete going through the results properly if (err != KSqlAtEnd) { User::Leave(err); } CleanupStack::PopAndDestroy(&stmnt); } CleanupStack::Pop(phoneMatchArray); return phoneMatchArray; }
/* * Returns an sql query to fetch contact item IDs for all the contact items which may contain * the specified telephone number in a telephone, fax or SMS type field. * * This is improved version of createMatchPhoneNumberQuery method. * The number is compared starting from the right side of the number and * the method returns an array of candidate matches. * Punctuation (e.g. spaces) and other alphabetic characters are ignored * when comparing. Leading zeros are removed. Digits are compared up to * the length of shorter number. */ void CntFilterDetail::bestMatchPhoneNumberQuery(const QContactFilter& filter, QString& sqlQuery, QContactManager::Error* error) { if (!filterSupported(filter) ) { *error = QContactManager::NotSupportedError; return; } QContactDetailFilter detailFilter(filter); QString number((detailFilter.value()).toString()); TPtrC numberPtr(reinterpret_cast<const TUint16*>(number.utf16())); const TInt KUpperMaxLength = KMaxPhoneMatchLength - KLowerSevenDigits; TMatch phoneDigits = createPaddedPhoneDigits(numberPtr, KLowerSevenDigits, KUpperMaxLength, error); if (*error == QContactManager::NoError) { // select fields for contacts that match phone lookup // SELECT contact_id, extra_value FROM comm_addr // WHERE value = [value string] AND type = [type value]; // QString type = QString(" type = %1").arg(CntDbInfo::EPhoneNumber); QString value = QString(" value = %1").arg(phoneDigits.iLowerSevenDigits); QString whereClause = " WHERE" + value + " AND" + type; sqlQuery = "SELECT contact_id, extra_value FROM comm_addr" + whereClause; QList<QPair<QContactLocalId, QString> > contactMatches = m_srvConnection.searchPhoneNumbers(sqlQuery, error); // Check if search query was successful if (*error != QContactManager::NoError) { return; } QStringList list; for (int i=0; i<contactMatches.count(); ++i) { // Check the upper digits... TInt32 number = phoneDigits.iUpperDigits; QString extraValue = contactMatches.at(i).second; TPtrC extValString(reinterpret_cast<const TUint16*>(extraValue.utf16())); TInt32 storedUpperDigits(0); if (TLex(extValString).Val(storedUpperDigits) == KErrNone) { TInt32 stored = storedUpperDigits; TBool nonZeroInStoredFound = EFalse; TBool nonZeroInNumberFound = EFalse; while ((number != 0) && (stored != 0)) { nonZeroInNumberFound |= (number % 10 != 0); nonZeroInStoredFound |= (stored % 10 != 0); if (nonZeroInStoredFound && nonZeroInNumberFound) { break; } number /= 10; stored /= 10; } if ((phoneDigits.iUpperDigits == 0) || (storedUpperDigits == 0) || (number == stored)) { list.append(QString("%1").arg(contactMatches.at(i).first)); } } else { *error = QContactManager::UnspecifiedError; return; } } // Recreate query to fetch all match ids // SELECT DISTINCT contact_id FROM contact WHERE contact_id in ( // .. // ) QString ids = list.join(" ,"); sqlQuery = "SELECT DISTINCT contact_id FROM contact WHERE contact_id in ("; sqlQuery += ids; sqlQuery += ')'; } }
/** Returns an array of contact item IDs for all the contact items which may contain the specified telephone number in a telephone, fax or SMS type field. The comparison method used is not exact. The number is compared starting from the right side of the number and the method returns an array of candidate matches. Punctuation (e.g. spaces) and other alphabetic characters are ignored when comparing. Additionally, if the Contacts Model Phone Parser (CNTPHONE.DLL) is available, then any DTMF digits are also excluded from the comparision. Note that due to the way numbers are stored in the database, it is recommended that at least 7 match digits are specified even when matching a number containing fewer digits. Failure to follow this guideline may (depending on the database contents) mean that the function will not return the expected Contact IDs. @param aNumber Phone number string. @param aMatchLengthFromRight Number of digits from the right of the phone number to use. Up to 15 digits can be specified, and it is recommended that at least 7 match digits are specified. @param aDatabase The database. @return Array of contact IDs which are candidate matches. */ CContactIdArray* CPplCommAddrTable::MatchPhoneNumberL(const TDesC& aNumber, const TInt aMatchLengthFromRight) { CContactIdArray* phoneMatchArray = CContactIdArray::NewLC(); TInt numLowerDigits = aMatchLengthFromRight; TInt numUpperDigits = 0; if(numLowerDigits > KLowerSevenDigits) { // New style matching. numLowerDigits = KLowerSevenDigits; numUpperDigits = aMatchLengthFromRight - KLowerSevenDigits; } TMatch phoneDigits = CreatePaddedPhoneDigitsL(aNumber, numLowerDigits, numUpperDigits); if (phoneDigits.iNumLowerDigits + phoneDigits.iNumUpperDigits > 0) { // build statement RSqlStatement stmnt; CleanupClosePushL(stmnt); stmnt.PrepareL(iDatabase, iMatchSelectStmnt->SqlStringL() ); const TInt KValueParamIndex(KFirstParam); // first parameter in query... const TInt KTypeParamIndex(KValueParamIndex + 1); // ...and the second. User::LeaveIfError(stmnt.BindInt(KValueParamIndex, phoneDigits.iLowerSevenDigits )); User::LeaveIfError(stmnt.BindInt(KTypeParamIndex, EPhoneNumber )); // fetch the list of any matching contact ids TInt err(KErrNone); const TInt KContactIdIdx(iMatchSelectStmnt->ParameterIndex(KCommAddrContactId() ) ); const TInt KExtraValueIdx(iMatchSelectStmnt->ParameterIndex(KCommAddrExtraValue() ) ); while ((err = stmnt.Next() ) == KSqlAtRow) { if (aMatchLengthFromRight <= KLowerSevenDigits) { // Matching 7 or less digits...we've already matched. phoneMatchArray->AddL(stmnt.ColumnInt(KContactIdIdx) ); } else { // Check the upper digits... TInt32 storedUpperDigits(0); TPtrC extValString = stmnt.ColumnTextL(KExtraValueIdx); User::LeaveIfError(TLex(extValString).Val(storedUpperDigits) ); const TInt KDigitsToRemove = KMaxPhoneMatchLength - KLowerSevenDigits - phoneDigits.iNumUpperDigits; for(TInt i = 0; i < KDigitsToRemove; ++i) { // repeatedly divide by 10 to lop off the appropriate number of digits from the right storedUpperDigits /= 10; } storedUpperDigits = TMatch::PadOutPhoneMatchNumber(storedUpperDigits, KDigitsToRemove); if (phoneDigits.iUpperDigits == storedUpperDigits) { phoneMatchArray->AddL(stmnt.ColumnInt(KContactIdIdx) ); } } } // leave if we didn't complete going through the results properly if(err != KSqlAtEnd) { User::Leave(err); } CleanupStack::PopAndDestroy(&stmnt); } CleanupStack::Pop(phoneMatchArray); return phoneMatchArray; }
/** Removes comm addresses from the 3 lists that are already in the database and have been updated. It takes the 3 lists in as parameters and modifies them accordingly. It also populates the list of comm address ids that are free to be recycled during updating. */ void CPplCommAddrTable::RemoveNonUpdatedAddrsL(RArray<TMatch>& aNewPhones, RArray<TPtrC>& aNewEmails, RArray<TPtrC>& aNewSips, RArray<TInt>& aFreeCommAddrIds, const TInt aItemId,CPplCommAddrTable::TCommAddrExtraInfoType aExtraInfoType ) { // build the RSqlStatement RSqlStatement stmnt; CleanupClosePushL(stmnt); stmnt.PrepareL(iDatabase, iWholeSelectStmnt->SqlStringL() ); const TInt KContactIdParamIndex(KFirstIndex); // first and only parameter in the query User::LeaveIfError(stmnt.BindInt(KContactIdParamIndex, aItemId) ) ; // fetch the results from the query and compare them with the new comm_addrs we have TInt err(KErrNone); while ((err = stmnt.Next() ) == KSqlAtRow) { const TInt KType(stmnt.ColumnInt(iWholeSelectStmnt->ParameterIndex(KCommAddrType() ) ) ); if (KType == EPhoneNumber) { TMatch phoneNumber; TPtrC valString = stmnt.ColumnTextL(iWholeSelectStmnt->ParameterIndex(KCommAddrValue() ) ); TPtrC extValString = stmnt.ColumnTextL(iWholeSelectStmnt->ParameterIndex(KCommAddrExtraValue() ) ); TInt extTypeInfoString = stmnt.ColumnInt(iWholeSelectStmnt->ParameterIndex(KCommAddrExtraTypeInfo() ) ); User::LeaveIfError(TLex(valString).Val(phoneNumber.iLowerSevenDigits) ); User::LeaveIfError(TLex(extValString).Val(phoneNumber.iUpperDigits) ); TInt matchIndex(aNewPhones.Find(phoneNumber, TIdentityRelation<TMatch>(&TMatch::Equals) ) ); // remove any phone numbers from the new list if we already // have them in the db and they haven't changed... if (matchIndex != KErrNotFound && (extTypeInfoString == aExtraInfoType)) { aNewPhones.Remove(matchIndex); } // ...and add any spare ids to the recycle list else { aFreeCommAddrIds.AppendL( stmnt.ColumnInt(iWholeSelectStmnt->ParameterIndex(KCommAddrId() ) ) ); } } else // is Email or SIP { TPtrC valString = stmnt.ColumnTextL(iWholeSelectStmnt->ParameterIndex(KCommAddrValue() ) ); TInt matchIndex(0); // remove any email and sip addresses from the new list if // we already have them in the db and they haven't changed... if (KType == EEmailAddress) { matchIndex = aNewEmails.Find(valString); if (matchIndex != KErrNotFound) { aNewEmails.Remove(matchIndex); } } else // SIP { matchIndex = aNewSips.Find(valString); if (matchIndex != KErrNotFound) { aNewSips.Remove(matchIndex); } } // ...and add any spare ids to the recycle list if (matchIndex == KErrNotFound) { aFreeCommAddrIds.AppendL( stmnt.ColumnInt(iWholeSelectStmnt->ParameterIndex(KCommAddrId() ) ) ); } } } // leave if we didn't complete going through the results properly if(err != KSqlAtEnd) { User::Leave(err); } CleanupStack::PopAndDestroy(&stmnt); }
TBool CDataWrapperBase::GetCommandStringParameterL(const TDesC& aSectName, const TDesC& aKeyName, TPtrC& aResult) { TBool ret=EFalse; if ( aSectName.Length()!=0 ) { ret=CDataWrapper::GetStringFromConfig(aSectName, aKeyName, aResult); for ( TInt index=iInclude.Count(); (index>0) && (!ret); ) { ret=iInclude[--index]->FindVar(aSectName, aKeyName, aResult); } } if ( ret ) { if ( aResult.Match(KMatch)!=KErrNotFound ) { // We have an entry of the format // entry =*{section,entry}* // where * is one or more characters // We need to construct this from other data in the ini file replacing {*,*} // with the data from // [section] // entry =some_value HBufC* buffer=HBufC::NewLC(aResult.Length()); buffer->Des().Copy(aResult); TInt startLength=KStart().Length(); TInt sparatorLength=KSeparator().Length(); TInt endLength=KEnd().Length(); TInt bufferLength; TInt start; TInt sparator; TInt end; TPtrC remaining; TLex lex; do { bufferLength=buffer->Length(); start=buffer->Find(KStart); remaining.Set(buffer->Des().Right(bufferLength-start-startLength)); sparator=remaining.Find(KSeparator); remaining.Set(remaining.Right(remaining.Length()-sparator-sparatorLength)); sparator += (start + startLength); end=remaining.Find(KEnd) + sparator + sparatorLength; TPtrC sectionName(buffer->Ptr()+start+startLength, sparator-start-startLength); TPtrC keyName(buffer->Ptr()+sparator+sparatorLength, end-sparator-sparatorLength); sectionName.Set(TLex(sectionName).NextToken()); keyName.Set(TLex(keyName).NextToken()); TInt entrySize=0; TPtrC entryData; TBool found=CDataWrapper::GetStringFromConfig(sectionName, keyName, entryData); for ( TInt index=iInclude.Count(); (index>0) && (!found); ) { found=iInclude[--index]->FindVar(sectionName, keyName, entryData); } if ( found ) { entrySize=entryData.Length(); } TInt newLength=start + bufferLength - end - endLength + entrySize; HBufC* bufferNew=HBufC::NewLC(newLength); bufferNew->Des().Copy(buffer->Ptr(), start); if ( entrySize>0 ) { bufferNew->Des().Append(entryData); } bufferNew->Des().Append(buffer->Ptr() + end + endLength, bufferLength - end - endLength); CleanupStack::Pop(bufferNew); CleanupStack::PopAndDestroy(buffer); buffer=bufferNew; CleanupStack::PushL(buffer); } while ( buffer->Match(KMatch)!=KErrNotFound ); iBuffer.Append(buffer); CleanupStack::Pop(buffer); aResult.Set(*buffer); INFO_PRINTF4(KDataRead, &aSectName, &aKeyName , &aResult); } } return ret; }
// // Draws the item, which might contain an icon and a text. // The format of the item text shall look like one of the following formats: // - "\ttext" (text only) // - "icon\ttext" (icon and text) // - "\theading\ttext" (heading and text) // - "icon\theading\ttext" (icon, heading and text) // void CMediaScreenListItemDrawer::DrawActualItem(TInt aItemIndex, const TRect& aActualItemRect, TBool aItemIsCurrent, TBool /*aViewIsEmphasized*/, TBool /*aViewIsDimmed*/, TBool aItemIsSelected) const { const MDesCArray* itemArray = iListBox.Model()->ItemTextArray(); if ((!itemArray) || (itemArray->MdcaCount() <= aItemIndex)) return; // Gets the item text if the conditions above are met. TPtrC itemText = itemArray->MdcaPoint(aItemIndex); // We have to find the position of tabs to decide the components // available in the item text (icon, heading and text). TInt tabPosition1 = itemText.Locate('\t'); TInt tabPosition2 = itemText.Mid(tabPosition1 + 1).Locate('\t'); if (tabPosition2 >= 0) { // We need to add tabPosition1 because the return value of // Locate() is relative to tabPosition1. tabPosition2 += tabPosition1 + 1; } TInt tabPosition3 = itemText.Mid(tabPosition2 + 1).Locate('\t'); if (tabPosition3 >= 0) { // We need to add tabPosition2 because the return value of // Locate() is relative to tabPosition2. tabPosition3 += tabPosition2 + 1; } TInt tabPosition4 = itemText.Mid(tabPosition3 + 1).Locate('\t'); if (tabPosition4 >= 0) { // We need to add tabPosition2 because the return value of // Locate() is relative to tabPosition2. tabPosition4 += tabPosition3 + 1; } // Sets the attributes to draw the icon. iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); if ((aItemIsCurrent) || (aItemIsSelected)) { iGc->SetBrushColor(iHighlightedBackColor); } else { iGc->SetBrushColor(iBackColor); } // Gets the icon index, i.e. the number in the text item before // the first tab. TInt iconIndex = 0; if (tabPosition1 > 0) { TLex(itemText.Mid(0, tabPosition1)).Val(iconIndex); } TRect aActualItemRect2 = aActualItemRect; aActualItemRect2.iBr.iX = aActualItemRect2.iBr.iX + 0; aActualItemRect2.iBr.iY = aActualItemRect2.iBr.iY + 0; aActualItemRect2.iTl.iX = aActualItemRect2.iTl.iX + 0; aActualItemRect2.iTl.iY = aActualItemRect2.iTl.iY + 10; if ((iIconArray) && (iIconArray->Count() > iconIndex) && (tabPosition1 > 0)) { // Draws the icon. CFbsBitmap* bitmap = (*iIconArray)[iconIndex]->Bitmap(); iGc->BitBltMasked( aActualItemRect2.iTl, bitmap, TRect(TPoint(0, 0), bitmap->Header().iSizeInPixels), (*iIconArray)[iconIndex]->Mask(), ETrue); // Draws the rectangle, just in case there are some icons that are // smaller than the height of item width and/or height. iGc->SetPenStyle(CGraphicsContext::ENullPen); if (bitmap->Header().iSizeInPixels.iHeight < aActualItemRect2.Height()) { TRect rect( aActualItemRect2.iTl.iX, aActualItemRect2.iTl.iY + bitmap->Header().iSizeInPixels.iHeight, aActualItemRect2.iTl.iX + iMaxIconSize.iWidth, aActualItemRect2.iBr.iY); TRect rect1( aActualItemRect2.iTl.iX, aActualItemRect2.iTl.iY - 10, aActualItemRect2.iTl.iX + iMaxIconSize.iWidth, aActualItemRect2.iBr.iY - 40 ); iGc->DrawRect(rect); iGc->DrawRect(rect1); } if (bitmap->Header().iSizeInPixels.iWidth < iMaxIconSize.iWidth) { TRect rect = TRect( aActualItemRect2.iTl.iX + bitmap->Header().iSizeInPixels.iWidth, aActualItemRect2.iTl.iY, aActualItemRect2.iTl.iX + iMaxIconSize.iWidth, aActualItemRect2.iBr.iY); iGc->DrawRect(rect); } } else { iGc->SetPenStyle(CGraphicsContext::ENullPen); TRect rect( aActualItemRect.iTl.iX, aActualItemRect.iTl.iY, aActualItemRect.iTl.iX + iMaxIconSize.iWidth, aActualItemRect.iBr.iY); iGc->DrawRect(rect); } // Sets the attributes to draw text, except the font. const CFont* font = Font(aItemIndex); iGc->SetPenStyle(CGraphicsContext::ESolidPen); iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); if ((aItemIsCurrent) || (aItemIsSelected)) { iGc->SetPenColor(iHighlightedTextColor); iGc->SetBrushColor(iHighlightedBackColor); } else { iGc->SetPenColor(iTextColor); iGc->SetBrushColor(iBackColor); } // If there is only one tab, it means we have to display single line item if (tabPosition2 < 0) { if (!font) { font = CEikonEnv::Static()->TitleFont(); } iGc->UseFont(font); TRect textRect( TPoint(aActualItemRect.iTl.iX + iMaxIconSize.iWidth, aActualItemRect.iTl.iY), aActualItemRect.iBr); TInt baseline = (textRect.iBr.iY - textRect.iTl.iY - font->HeightInPixels()) / 2 + font->AscentInPixels(); TBuf<2000> text; text.Copy(_L(" ")); if (tabPosition1 < 0) { text.Append(itemText); iGc->DrawText(text, textRect, baseline, CGraphicsContext::ELeft, 1); } else { text.Append(itemText.Mid(tabPosition1 + 1)); iGc->DrawText(text, textRect, baseline,CGraphicsContext::ELeft, 1); } } else { // If there are more than one tab, then we have to display double line // item text TRect textRect( TPoint(aActualItemRect.iTl.iX + iMaxIconSize.iWidth, aActualItemRect.iTl.iY), aActualItemRect.iBr); textRect.iBr.iY -= aActualItemRect.Height() / 2; // Draws the first line. if (!font) { font = CEikonEnv::Static()->LegendFont(); } iGc->UseFont(font); TInt baseline = (textRect.iBr.iY - textRect.iTl.iY - font->HeightInPixels()) / 2 + font->AscentInPixels(); TBuf<2000> text; text.Copy(_L(" ")); text.Append(itemText.Mid(tabPosition1 + 1, tabPosition2 - tabPosition1 - 1)); iGc->DrawText(text,textRect, baseline, CGraphicsContext::ELeft, 1); // Draws the second line. For the second line, we use normal font. font = CCoeEnv::Static()->NormalFont(); iGc->UseFont(font); textRect.Move(0, aActualItemRect.Height() / 2); baseline = (textRect.iBr.iY - textRect.iTl.iY - font->HeightInPixels()) / 2 + font->AscentInPixels();/// text.Copy(_L(" ")); //text.Append(itemText.Mid(tabPosition2 + 1)); text.Append(itemText.Mid(tabPosition2 + 1, tabPosition3 - tabPosition2 - 1)); iGc->DrawText(text, textRect, baseline, CGraphicsContext::ELeft, 1); //Loads 2nd bitmap TRect aActualItemRect1 = aActualItemRect; aActualItemRect1.iBr.iX = aActualItemRect1.iBr.iX + 0; aActualItemRect1.iBr.iY = aActualItemRect1.iBr.iY + 0; if (tabPosition4 >= 0) aActualItemRect1.iTl.iX = aActualItemRect1.iTl.iX + 160; else aActualItemRect1.iTl.iX = aActualItemRect1.iTl.iX + 180; aActualItemRect1.iTl.iY = aActualItemRect1.iTl.iY + 0; text.Copy(_L("")); text.Append(itemText.Mid((tabPosition3 + 1),1)); TInt type; TLex lex(text); lex.Val(type); // Draws the icon. CFbsBitmap* bitmap = (*iIconArray)[type]->Bitmap(); iGc->BitBltMasked(aActualItemRect1.iTl, bitmap,TRect(TPoint(0,0), bitmap->Header().iSizeInPixels), (*iIconArray)[type]->Mask(), ETrue); // Draws the rectangle, just in case there are some icons that are // smaller than the height of item width and/or height. iGc->SetPenStyle(CGraphicsContext::ENullPen); if (bitmap->Header().iSizeInPixels.iHeight < aActualItemRect1.Height()) { TRect rect( aActualItemRect1.iTl.iX, aActualItemRect1.iTl.iY + bitmap->Header().iSizeInPixels.iHeight, aActualItemRect1.iTl.iX + iMaxIconSize.iWidth, aActualItemRect1.iBr.iY); iGc->DrawRect(rect); } if (bitmap->Header().iSizeInPixels.iWidth < iMaxIconSize.iWidth) { TRect rect = TRect( aActualItemRect1.iTl.iX + bitmap->Header().iSizeInPixels.iWidth, aActualItemRect1.iTl.iY, aActualItemRect1.iTl.iX + iMaxIconSize.iWidth, aActualItemRect1.iBr.iY); iGc->DrawRect(rect); } if (tabPosition4 >= 0) { //load 3rd bitmap TRect aActualItemRect2 = aActualItemRect; aActualItemRect2.iBr.iX = aActualItemRect2.iBr.iX + 0; aActualItemRect2.iBr.iY = aActualItemRect2.iBr.iY + 0; aActualItemRect2.iTl.iX = aActualItemRect2.iTl.iX + 180; aActualItemRect2.iTl.iY = aActualItemRect2.iTl.iY + 0; text.Copy(_L("")); text.Append(itemText.Mid((tabPosition4 + 1),1)); type = 0; TLex lex1(text); lex1.Val(type); // Draws the icon. CFbsBitmap* bitmap1 = (*iIconArray)[type]->Bitmap(); iGc->BitBltMasked(aActualItemRect2.iTl, bitmap1,TRect(TPoint(0,0), bitmap1->Header().iSizeInPixels), (*iIconArray)[type]->Mask(), ETrue); // Draws the rectangle, just in case there are some icons that are // smaller than the height of item width and/or height. iGc->SetPenStyle(CGraphicsContext::ENullPen); if (bitmap1->Header().iSizeInPixels.iHeight < aActualItemRect2.Height()) { TRect rect( aActualItemRect2.iTl.iX, aActualItemRect2.iTl.iY + bitmap1->Header().iSizeInPixels.iHeight, aActualItemRect2.iTl.iX + iMaxIconSize.iWidth, aActualItemRect2.iBr.iY); iGc->DrawRect(rect); } if (bitmap1->Header().iSizeInPixels.iWidth < iMaxIconSize.iWidth) { TRect rect = TRect( aActualItemRect2.iTl.iX + bitmap1->Header().iSizeInPixels.iWidth, aActualItemRect2.iTl.iY, aActualItemRect2.iTl.iX + iMaxIconSize.iWidth, aActualItemRect2.iBr.iY); iGc->DrawRect(rect); } } } }
// ----------------------------------------------------------------------------- // CAknKeyRotatorImpl::GetKeyRotatorCompensationL // Parses wsini.ini to read key rotator compensation value. // ----------------------------------------------------------------------------- // TInt CAknKeyRotatorImpl::GetKeyRotatorCompensationL() { TInt result = 0; HBufC* wsiniText = GetWsiniLC(); // Now look for keyword const TInt pos = wsiniText->Find( KAknKeyRotatorKey ); if ( pos != KErrNotFound ) { // Keyword was found. Check that it is the beginning of line. // Three cases: // 1. Keyword could be at the beginning of the file. // 2. Keyword could be at the beginning of the file // after byte ordering marker. // 3. Previous character can be end of line marker. const TInt previousPos = pos - 1; if ( previousPos < 0 || ( !previousPos && IsByteOrderingMarker( (*wsiniText)[ previousPos ] ) ) || IsEndOfLine( (*wsiniText)[ previousPos ] ) ) { TLex text( wsiniText->Mid( pos + KAknKeyRotatorKey().Length() ) ); // First, there must be at least a space after keyword. TBool fail = !( SkipSpaces( text ) & EAknWasSpace ); // Case 1: Disabled TBool wasDisabled = EFalse; if ( !fail ) { wasDisabled = !text.Remainder().Left( KAknKeyRotatorDisabled().Length() ). CompareF( KAknKeyRotatorDisabled ); if ( wasDisabled ) { // wasDisabled == True, KAknKeyRotatorDisabled was prefix // of text. So skip over it text.Inc( KAknKeyRotatorDisabled().Length() ); } } // Case 2: Then follows a sequence of digits, optionally preceded by '-'. if ( !wasDisabled && !fail ) { // Check optional - TBool negate = EFalse; if ( !text.Eos() && text.Peek() == '-' ) { negate = ETrue; text.Inc(); } // Get digit sequence and convert to integer value. TPtrC token = GetDigits( text ); fail = !token.Length() || ( TLex( token ).Val( result ) != KErrNone ); // Handle negation if ( !fail && negate ) { result = -result; } } // That sequence of digits is followed by sequence of spaces until // end of line or end of file. fail = fail || ( SkipSpaces( text ) & EAknWasCharacter ); if ( !wasDisabled ) { // Finally, that sequence of digits must represent // one valid decimal value of the following: // -270, -180, -90, 0, 90, 180, 270. fail = fail || !CheckCompensationValue( result ); } // If any of above checks failed, use default value 0. if ( fail ) { result = 0; } else { if ( wasDisabled ) { result = KMaxTInt; } } } } CleanupStack::PopAndDestroy( wsiniText ); return result; }