diff -r f902e87c146f -r 748ec5531811 textrendering/texthandling/stext/TXTINDEX.CPP --- a/textrendering/texthandling/stext/TXTINDEX.CPP Wed Jun 09 11:40:52 2010 +0300 +++ b/textrendering/texthandling/stext/TXTINDEX.CPP Tue Aug 31 17:01:26 2010 +0300 @@ -27,6 +27,11 @@ #include "TXTSTYLE.H" #include "TXTINDEX.H" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "TXTINDEXTraces.h" +#endif + #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS #include "TXTFMLYR_INTERNAL.H" #include "TXTSTYLE_INTERNAL.H" @@ -70,6 +75,10 @@ // ASSERT: The basedOn link is valid. CFormatLayer* thisLayer=(*iParaIx)[para].iParaAttribs->iParaFormat; CFormatLayer* base=CONST_CAST(CFormatLayer*,thisLayer->SenseBase()); + if (base==NULL) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DBGTESTINVARIANT, "base==NULL" ); + } __ASSERT_DEBUG(base!=NULL,User::Invariant()); if ((*iParaIx)[para].iParaAttribs->iRefCount>0) numberOfReferencesToSharedList++; @@ -83,7 +92,15 @@ const RPhraseAttribsEntry* phrase=&(*iPhraseIx)[currentPhraseElement]; CCharFormatLayer* charFormatLayer=phrase->CharFormat(); // ASSERT: The basedOn link is valid. + if (charFormatLayer->SenseBase()==NULL) + { + OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_DBGTESTINVARIANT, "charFormatLayer->SenseBase()==NULL" ); + } __ASSERT_DEBUG(charFormatLayer->SenseBase()!=NULL,User::Invariant()); + if (TInt(charFormatLayer->SenseBase())<=0x1000) + { + OstTrace0( TRACE_DUMP, DUP2_CRICHTEXTINDEX_DBGTESTINVARIANT, "TInt(charFormatLayer->SenseBase())<=0x1000" ); + } __ASSERT_DEBUG(TInt(charFormatLayer->SenseBase())>0x1000,User::Invariant()); sumOfPhraseLengths+=(*iPhraseIx)[currentPhraseElement].Length(); if ((*iPhraseIx)[currentPhraseElement].Length()==0) @@ -94,16 +111,34 @@ { CCharFormatLayer* charFormatLayer=(*iParaIx)[para].iParaAttribs->iCharFormat; // ASSERT: The basedOn link is valid. + if (charFormatLayer->SenseBase()==NULL) + { + OstTrace0( TRACE_DUMP, DUP3_CRICHTEXTINDEX_DBGTESTINVARIANT, "charFormatLayer->SenseBase()==NULL" ); + } __ASSERT_DEBUG(charFormatLayer->SenseBase()!=NULL,User::Invariant()); sumOfPhraseLengths+=(*iParaIx)[para].iLength; } } + if (sumOfPhraseLengths!=paragraphLength) + { + OstTrace0( TRACE_DUMP, DUP4_CRICHTEXTINDEX_DBGTESTINVARIANT, "sumOfPhraseLengths!=paragraphLength" ); + } __ASSERT_DEBUG(sumOfPhraseLengths==paragraphLength,User::Invariant()); } // ASSERT: We have no unexpected phrases left over + if (currentPhraseElement!=-1 && + currentPhraseElement!=iPhraseIx->Count()) + { + OstTrace0( TRACE_DUMP, DUP5_CRICHTEXTINDEX_DBGTESTINVARIANT, "We have no unexpected phrases left over" ); + } __ASSERT_DEBUG(currentPhraseElement==-1 || currentPhraseElement==iPhraseIx->Count(),User::Invariant()); // ASSERT: There is either zero(0) or one(1) zero length phrase in the whole index + if (!((zeroLengthPhraseCount==0) || + (zeroLengthPhraseCount==1 && iPendingNewPhrasePos!=EInsertCharFormatReset))) + { + OstTrace0( TRACE_DUMP, DUP6_CRICHTEXTINDEX_DBGTESTINVARIANT, "There is either zero(0) or one(1) zero length phrase in the whole index" ); + } __ASSERT_DEBUG( (zeroLengthPhraseCount==0) || (zeroLengthPhraseCount==1 && iPendingNewPhrasePos!=EInsertCharFormatReset), User::Invariant()); @@ -117,6 +152,11 @@ while ((currentSharedPara=iterator++)!=NULL) totalReferenceCount+=currentSharedPara->iRefCount; } + if ((numberOfReferencesToSharedList!=totalReferenceCount) && + (numberOfReferencesToSharedList!=totalReferenceCount-1)) + { + OstTrace0( TRACE_DUMP, DUP7_CRICHTEXTINDEX_DBGTESTINVARIANT, "Invariant" ); + } __ASSERT_DEBUG((numberOfReferencesToSharedList==totalReferenceCount) || (numberOfReferencesToSharedList==totalReferenceCount-1),User::Invariant()); // ASSERT: iPictureCount corresponds to the number of pictures in the stored in the index. @@ -126,6 +166,10 @@ picCount+=((*iPhraseIx)[item].IsPicturePhrase()) ? 1 : 0; + if (iPictureCount!=picCount) + { + OstTrace0( TRACE_DUMP, DUP8_CRICHTEXTINDEX_DBGTESTINVARIANT, "Invariant" ); + } __ASSERT_DEBUG(iPictureCount==picCount,User::Invariant()); #endif } @@ -186,6 +230,10 @@ TInt count; if (iPhraseIx) {// Destroy the phrase index and its contents. + if (!iParaIx) + { + OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_CRICHTEXTINDEX, "EPhraseIxPresentWithNoParaIx" ); + } __ASSERT_ALWAYS(iParaIx,Panic(EPhraseIxPresentWithNoParaIx)); count=iPhraseIx->Count(); for (TInt offset=0;offset iterator(iSharedParaQueHead); while ((currentSharedPara=iterator++)!=NULL) currentSharedPara->Release(currentSharedPara->iRefCount); + if (!iSharedParaQueHead.IsEmpty()) + { + OstTrace0( TRACE_FATAL, DUP1_CRICHTEXTINDEX_CRICHTEXTINDEX, "ERichTextIndexIntegrityErr" ); + } __ASSERT_ALWAYS(iSharedParaQueHead.IsEmpty(),Panic(ERichTextIndexIntegrityErr)); } @@ -397,6 +449,10 @@ {// For each para inserted between the fist and last TParaAttribsEntry& para=(*iParaIx)[pastePos.iParaElement+paraItem]; TInt length=ParaLengthFromBuffer(buf)+1; + if (length==KErrNotFound) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_INSERTL, "EInsertEmbeddedParaErr" ); + } __ASSERT_DEBUG(length!=KErrNotFound,Panic(EInsertEmbeddedParaErr)); para.iLength=length; buf.Set(buf.Right(buf.Length()-length)); @@ -452,6 +508,10 @@ current.iPhrase->AdjustLength(-1); // collapse phrase by right amount if (insertPendingPos!=EInsertCharFormatReset) { + if (current.iPhrase->Length()!=0) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SPLITPARAGRAPHATPASTEPOSL, "Invariant" ); + } __ASSERT_DEBUG(current.iPhrase->Length()==0,User::Invariant()); iPendingNewPhrasePos=insertPendingPos; } @@ -459,9 +519,14 @@ { RemoveFromPhraseIx(iPos.iPhraseElement,1); current.iParaAttribs->iPhraseCount--; + if (current.iParaAttribs->PhraseCount()<=1) + { + OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_SPLITPARAGRAPHATPASTEPOSL, "Invariant" ); + } __ASSERT_DEBUG(current.iParaAttribs->PhraseCount()>1,User::Invariant()); } } + OstTrace1( TRACE_DUMP, DUP2_CRICHTEXTINDEX_SPLITPARAGRAPHATPASTEPOSL, "Leave code=%d", ret ); User::Leave(ret); } if (insertPendingPos != EInsertCharFormatReset) @@ -490,8 +555,16 @@ RebalanceIndex(); // ASSERT: A valid picture header, referencing a valid picture has been inserted. + if (!aPicHdr.iPicture.IsPtr() || aPicHdr.iPicture.AsPtr()==NULL) + { + OstTrace0( TRACE_FATAL, DUP1_CRICHTEXTINDEX_INSERTL, "EInsertNullPicHdrData" ); + } __ASSERT_ALWAYS(aPicHdr.iPicture.IsPtr() && aPicHdr.iPicture.AsPtr()!=NULL,Panic(EInsertNullPicHdrData)); // ASSERT: The current insert pos hasn't been changed without cancelling SetInsertCharFormat. + if ((iPendingNewPhrasePos!=EInsertCharFormatReset) && (aPos!=iPendingNewPhrasePos)) + { + OstTrace0( TRACE_FATAL, DUP2_CRICHTEXTINDEX_INSERTL, "ESetInsertCharFormatIntegrityErr" ); + } __ASSERT_ALWAYS((iPendingNewPhrasePos==EInsertCharFormatReset) || (aPos==iPendingNewPhrasePos), Panic(ESetInsertCharFormatIntegrityErr)); if (iPendingNewPhrasePos!=EInsertCharFormatReset) @@ -516,6 +589,10 @@ } GetCurrentRecords(current); // ASSERT: The reclaim succeeded. We must always end up with a PhraseIx-not constant char format. + if (current.iPhrase==NULL) + { + OstTrace0( TRACE_DUMP, DUP3_CRICHTEXTINDEX_INSERTL, "EReclaimShareError" ); + } __ASSERT_DEBUG(current.iPhrase!=NULL,Panic(EReclaimShareError)); TRAPD(ret1, SplitPhraseL(aPos)); // Phrase may not be split if at boundary. @@ -771,6 +848,10 @@ CancelInsertCharFormat(); ScanToPosition(aPos,EScanToPositionAbsolute,&iLastUsed); + if (iPos.iParaElementOffset!=0) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DELETEPARAGRAPH, "EDeleteParagraphInvalidStartValue" ); + } __ASSERT_DEBUG(iPos.iParaElementOffset==0,Panic(EDeleteParagraphInvalidStartValue)); TIndexDeleteInfo info; @@ -813,6 +894,10 @@ TInt startParaLength=current.iParaEntry->iLength; TInt lengthRemainingInPara=startParaLength-iPos.iParaElementOffset; + if (aLength>=lengthRemainingInPara) + { + OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_DELETEFROMPARAGRAPH, "EDeleteFromParagraphInvalidRange" ); + } __ASSERT_ALWAYS(aLengthIsShared()) + { + OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_REBALANCEINDEX, "EParaAttribsNotInSharedList" ); + } __ASSERT_ALWAYS(iRollbackParaAttribsHandle->IsShared(),Panic(EParaAttribsNotInSharedList)); iRollbackParaAttribsHandle->Release(); iRollbackParaAttribsHandle=NULL; @@ -1154,6 +1260,10 @@ */ TBool CRichTextIndex::DeleteInsertCharFormat() { + if (!InsertCharFormatIsActive()) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DELETEINSERTCHARFORMAT, "Invariant" ); + } __ASSERT_DEBUG(InsertCharFormatIsActive(), User::Invariant()); ScanToPosition(iPendingNewPhrasePos,EScanToPositionMatchLeft); TCurrentIndexRecords current; @@ -1455,6 +1565,10 @@ void CRichTextIndex::SplitPhraseL(TInt aPhrase,TInt anOffset,RPhraseAttribsEntry& aPhraseAttribs,CParaAttribs& aParaAttribs) { + if (anOffset<=0 || anOffset>=aPhraseAttribs.Length()) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SPLITPHRASEL, "Invariant" ); + } __ASSERT_DEBUG(anOffset>0 && anOffsetiPhraseCount!=1) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SHARE, "Invariant" ); + } __ASSERT_DEBUG(paraAttribs->iPhraseCount==1,User::Invariant()); RPhraseAttribsEntry& phraseAttribs=iPhraseIx->At(aPhrase); + if (phraseAttribs.IsPicturePhrase()) + { + OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_SHARE, "Invariant" ); + } __ASSERT_DEBUG(!phraseAttribs.IsPicturePhrase(),User::Invariant()); CParaAttribs* share=GetParaAttribs(paraAttribs,*phraseAttribs.CharFormat()); @@ -1522,6 +1644,10 @@ TInt phrase=iPos.iPhraseElement; TInt base=iPos.iParaBasePhraseElement; + if (phrase=base+paraAttribs->iPhraseCount) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPLYCHARFORMATROLLBACK, "Invariant" ); + } __ASSERT_DEBUG(phrase>=base && phraseiPhraseCount,User::Invariant()); if (phraseiPhraseCount-1) // merge to the right MergePhrases(phrase+1,iPhraseIx->At(phrase+1),*paraAttribs); @@ -1537,6 +1663,10 @@ // aPos to aPos+(aLength-1). // { + if (aLength<0) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(aLength>=0,User::Invariant()); __TEST_INVARIANT; @@ -1590,6 +1720,10 @@ do { + if (phrase>=iPos.iParaBasePhraseElement+paraAttribs->iPhraseCount) + { + OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(phraseiPhraseCount,User::Invariant()); // RPhraseAttribsEntry* phraseAttribs=&iPhraseIx->At(phrase); @@ -1627,6 +1761,10 @@ phraseAttribs=&iPhraseIx->At(phrase); // SplitPhraseL modifies the index array, we must do this! } + if (phraseAttribs->Length()!=len) + { + OstTrace0( TRACE_DUMP, DUP2_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(phraseAttribs->Length()==len,User::Invariant()); // STEP 2.3 Change the format of the current phrase layer @@ -1647,6 +1785,10 @@ charsToFormat-=len; } while (charsToFormat); + if (phrase!=iPos.iParaBasePhraseElement+paraAttribs->iPhraseCount && aLength!=0) + { + OstTrace0( TRACE_DUMP, DUP3_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(phrase==iPos.iParaBasePhraseElement+paraAttribs->iPhraseCount || aLength==0,User::Invariant()); // STEP 3 Reduce the paragraph attributes back to canonical form @@ -1672,9 +1814,25 @@ iPos.iParaBasePhraseElement=phrase; #ifdef _DEBUG ScanToPosition(aPos,EScanToPositionAbsolute); + if (iPos.iDocPos!=aPos) + { + OstTrace0( TRACE_DUMP, DUP4_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(iPos.iDocPos==aPos,User::Invariant()); + if (iPos.iPhraseElement!=phrase) + { + OstTrace0( TRACE_DUMP, DUP5_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(iPos.iPhraseElement==phrase,User::Invariant()); + if (iPos.iParaElementOffset!=paraOffset) + { + OstTrace0( TRACE_DUMP, DUP6_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(iPos.iParaElementOffset==paraOffset,User::Invariant()); + if (iPos.iPhraseElementOffset!=phraseOffset) + { + OstTrace0( TRACE_DUMP, DUP7_CRICHTEXTINDEX_APPLYCHARFORMATL, "Invariant" ); + } __ASSERT_DEBUG(iPos.iPhraseElementOffset==phraseOffset,User::Invariant()); __TEST_INVARIANT; #endif @@ -2227,6 +2385,10 @@ else {// No match, so piece together new shared paraAttribs and add to shared para list sourceParaAttribs->iRefCount=1; + if (sourcePhrase->IsPicturePhrase()) + { + OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_GETPARAATTRIBS, "EReleasCharFormatLayerOwnershipCalledOnPicturePhrase" ); + } __ASSERT_ALWAYS(!sourcePhrase->IsPicturePhrase(),Panic(EReleasCharFormatLayerOwnershipCalledOnPicturePhrase)); sourceParaAttribs->iCharFormat=sourcePhrase->ReleaseCharFormatLayerOwnership(); sourcePhrase->Discard(); @@ -2356,6 +2518,10 @@ } else { + if (iPos.iParaBasePhraseElement!=phraseElement) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_SCANTOPOSITION, "EDebug" ); + } __ASSERT_DEBUG(iPos.iParaBasePhraseElement==phraseElement,Panic(EDebug)); } iPos.iPhraseElement=phraseElement; @@ -2460,6 +2626,10 @@ return; // aSplitPos on a phrase boundary; urgo no split. TCurrentIndexRecords current; GetCurrentRecords(current); // ASSERT: This function set can only be called on CParaAttribs that specific char format. + if (current.iPhrase==NULL) + { + OstTrace0( TRACE_FATAL, DUP1_CRICHTEXTINDEX_SPLITPHRASEL, "ESplitPhraseCalledOnSharedPara" ); + } __ASSERT_ALWAYS(current.iPhrase!=NULL,Panic(ESplitPhraseCalledOnSharedPara)); DoSplitPhraseL(*current.iPhrase,iPos.iPhraseElementOffset,current.iParaAttribs); } @@ -2489,6 +2659,10 @@ // { // ASSERT: Cannot split a picture phrase. + if (aCurrentPhrase.IsPicturePhrase()) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_DOSPLITPHRASEL, "ESplitPhraseCalledOnPicturePhrase" ); + } __ASSERT_DEBUG(!aCurrentPhrase.IsPicturePhrase(),Panic(ESplitPhraseCalledOnPicturePhrase)); CCharFormatLayer* layer=CCharFormatLayer::NewCopyBaseL(aCurrentPhrase.CharFormat()); CleanupStack::PushL(layer); @@ -2520,6 +2694,10 @@ return ETrue; // TInt sharedParaCount=SharedParaCount(this); + if (sharedParaCount<1 && (sharedParaCount!=0 || phraseCount<=0)) + { + OstTrace0( TRACE_FATAL, CRICHTEXTINDEX_HASMARKUPDATA, "ERichTextIndexIntegrityErr" ); + } __ASSERT_ALWAYS(sharedParaCount>=1 || (sharedParaCount==0 && phraseCount>0),Panic(ERichTextIndexIntegrityErr)); if (sharedParaCount>1) return ETrue; @@ -2592,6 +2770,10 @@ if (sParaAttribs->IsShared()) { tParaAttribs=map->Item(sParaAttribs); + if (tParaAttribs==NULL) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPENDPARAINDEXL, "ESharedFormatsMapIntegrityError" ); + } __ASSERT_DEBUG(tParaAttribs!=NULL,Panic(ESharedFormatsMapIntegrityError)); tParaAttribs->iRefCount++; } @@ -2625,6 +2807,10 @@ CParaAttribs* currentSharedPara; while ((currentSharedPara=iterator++)!=NULL) { + if (!currentSharedPara->IsShared()) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPENDSHAREDFORMATSL, "Invariant" ); + } __ASSERT_DEBUG(currentSharedPara->IsShared(),User::Invariant()); CParaFormatLayer* sPl=currentSharedPara->iParaFormat; @@ -2689,10 +2875,18 @@ { TInt jj=pictureMap->At(kk); TPictureHeader* sHeader=(*aSource->iPhraseIx)[jj].PictureHeaderPtr(); + if (!sHeader) + { + OstTrace0( TRACE_DUMP, CRICHTEXTINDEX_APPENDPHRASEINDEXL, "Invariant" ); + } __ASSERT_DEBUG(sHeader,User::Invariant()); if (sHeader->iPicture.IsPtr()) { // transfer picture to us TPictureHeader* tHeader=(*iPhraseIx)[jj+originalPhraseCount].PictureHeaderPtr(); + if (!tHeader) + { + OstTrace0( TRACE_DUMP, DUP1_CRICHTEXTINDEX_APPENDPHRASEINDEXL, "Invariant" ); + } __ASSERT_DEBUG(tHeader,User::Invariant()); tHeader->iPicture=sHeader->iPicture.AsPtr(); sHeader->iPicture=NULL; @@ -2842,6 +3036,10 @@ { #ifdef _DEBUG // ASSERT: iLength is +ve (applying to character formatting, or is set to indicate a picture phrase. + if (iLength<0 && !IsPicturePhrase()) + { + OstTrace0( TRACE_DUMP, RPHRASEATTRIBSENTRY_DBGTESTINVARIANT, "Invariant" ); + } __ASSERT_DEBUG(iLength>=0 || IsPicturePhrase(),User::Invariant()); #endif } @@ -2925,6 +3123,11 @@ { // ASSERT: The length of a picture phrase may only be altered by deleting it, in which case // the only adjustment made will be an increment of -1 (EPictureIndicator). + if (IsPicturePhrase() && (!IsPicturePhrase() || aIncrement!=EPictureIndicator) + && (!IsPicturePhrase() || aIncrement!=0) ) + { + OstTrace0( TRACE_DUMP, RPHRASEATTRIBSENTRY_ADJUSTLENGTH, "EModifiedPicturePhraseLength" ); + } __ASSERT_DEBUG(!IsPicturePhrase() || (IsPicturePhrase() && aIncrement==EPictureIndicator) || (IsPicturePhrase() && aIncrement==0) ,Panic(EModifiedPicturePhraseLength));