diff -r f902e87c146f -r 748ec5531811 textrendering/texthandling/stext/TXTETEXT.CPP --- a/textrendering/texthandling/stext/TXTETEXT.CPP Wed Jun 09 11:40:52 2010 +0300 +++ b/textrendering/texthandling/stext/TXTETEXT.CPP Tue Aug 31 17:01:26 2010 +0300 @@ -41,6 +41,11 @@ #include "TXTRTPFL.H" #include "TXTCLIPBOARD.H" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "TXTETEXTTraces.h" +#endif + #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS #include "TXTETEXT_INTERNAL.H" #endif @@ -258,7 +263,15 @@ EXPORT_C void CEditableText::StartFepInlineEditL(TBool& aParagraphContainingStartPositionOfInlineTextHasChangedFormat,TInt& aNumberOfCharactersSuccessfullyDeleted,TInt& aNumberOfCharactersSuccessfullyInserted,TInt& aPositionOfInsertionPointInDocument,TInt aNewPositionOfInsertionPointInDocument,const TDesC& aInitialInlineText,TInt aPositionOfInlineTextInDocument,TInt aNumberOfCharactersToHide,MFepInlineTextFormatRetriever& aInlineTextFormatRetriever) /** @internalAll */ { + if (aPositionOfInlineTextInDocument<0 || aNumberOfCharactersToHide<0 || aPositionOfInlineTextInDocument+aNumberOfCharactersToHide>DocumentLength()) + { + OstTrace0( TRACE_DUMP, CEDITABLETEXT_STARTFEPINLINEEDITL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPositionOfInlineTextInDocument>=0 && aNumberOfCharactersToHide>=0 && aPositionOfInlineTextInDocument+aNumberOfCharactersToHide<=DocumentLength(),Panic(ECharPosBeyondDocument)); + if (InlineEditData()!=NULL) + { + OstTrace0( TRACE_DUMP, DUP1_CEDITABLETEXT_STARTFEPINLINEEDITL, "EAlreadyFepInlineEditing" ); + } __ASSERT_ALWAYS(InlineEditData()==NULL,Panic(EAlreadyFepInlineEditing)); aParagraphContainingStartPositionOfInlineTextHasChangedFormat=EFalse; aNumberOfCharactersSuccessfullyDeleted=0; @@ -295,12 +308,20 @@ /** @internalAll */ { CInlineEditData* const inlineEditData=InlineEditData(); + if (inlineEditData==NULL) + { + OstTrace0( TRACE_DUMP, CEDITABLETEXT_UPDATEFEPINLINETEXTL, "ENotCurrentlyFepInlineEditing" ); + } __ASSERT_ALWAYS(inlineEditData!=NULL,Panic(ENotCurrentlyFepInlineEditing)); aParagraphContainingStartPositionOfInlineTextHasChangedFormat=EFalse; aNumberOfCharactersSuccessfullyDeleted=0; aNumberOfCharactersSuccessfullyInserted=0; HBufC*& inlineText=inlineEditData->iInlineText; HBufC* oldInlineText=inlineText; + if (oldInlineText!=NULL && inlineEditData->iLengthOfInlineText!=oldInlineText->Length()) + { + OstTrace0( TRACE_DUMP, DUP1_CEDITABLETEXT_UPDATEFEPINLINETEXTL, "EDebug" ); + } __ASSERT_DEBUG(oldInlineText==NULL || inlineEditData->iLengthOfInlineText==oldInlineText->Length(),Panic(EDebug)); const TInt lengthOfNewInlineText=aNewInlineText.Length(); if (oldInlineText!=NULL && *oldInlineText==aNewInlineText) @@ -346,7 +367,15 @@ */ { const CInlineEditData* const inlineEditData=InlineEditData(); + if (inlineEditData==NULL) + { + OstTrace0( TRACE_FATAL, DUP1_CEDITABLETEXT_COMMITFEPINLINEEDITL, "ENotCurrentlyFepInlineEditing" ); + } __ASSERT_ALWAYS(inlineEditData!=NULL,Panic(ENotCurrentlyFepInlineEditing)); + if (inlineEditData->iInlineText!=NULL && inlineEditData->iLengthOfInlineText!=inlineEditData->iInlineText->Length()) + { + OstTrace0( TRACE_DUMP, CEDITABLETEXT_COMMITFEPINLINEEDITL, "EDebug" ); + } __ASSERT_DEBUG(inlineEditData->iInlineText==NULL || inlineEditData->iLengthOfInlineText==inlineEditData->iInlineText->Length(),Panic(EDebug)); aParagraphContainingStartPositionOfInlineTextHasChangedFormat=EFalse; const TInt lengthOfInlineText=inlineEditData->iLengthOfInlineText; @@ -370,6 +399,10 @@ { const TInt positionOfInlineTextInDocument=inlineEditData->iPositionOfInlineTextInDocument; const TInt lengthOfInlineText=inlineEditData->iLengthOfInlineText; + if (inlineEditData->iInlineText!=NULL && lengthOfInlineText!=inlineEditData->iInlineText->Length()) + { + OstTrace0( TRACE_DUMP, CEDITABLETEXT_CANCELFEPINLINEEDIT, "EDebug" ); + } __ASSERT_DEBUG(inlineEditData->iInlineText==NULL || lengthOfInlineText==inlineEditData->iInlineText->Length(),Panic(EDebug)); TRAPD(notUsed, if (lengthOfInlineText>0) @@ -381,6 +414,10 @@ const HBufC* const hiddenText=inlineEditData->iHiddenText; if (hiddenText!=NULL) { + if (hiddenText->Length()<=0) + { + OstTrace0( TRACE_DUMP, DUP1_CEDITABLETEXT_CANCELFEPINLINEEDIT, "EDebug" ); + } __ASSERT_DEBUG(hiddenText->Length()>0, Panic(EDebug)); InsertL(positionOfInlineTextInDocument,*hiddenText); aNumberOfCharactersSuccessfullyInserted=hiddenText->Length(); @@ -562,6 +599,10 @@ /** Allocates storage of CBufFlat or CBufSeg, according to the parameter aStorage. Creates & initializes the field set.*/ { + if (iByteStore!=NULL) + { + OstTrace0( TRACE_DUMP, CPLAINTEXT_DOCONSTRUCTL, "EConstructCalledTwice" ); + } __ASSERT_DEBUG(iByteStore==NULL,Panic(EConstructCalledTwice)); iByteStore=(aStorage==ESegmentedStorage) @@ -884,8 +925,20 @@ { __TEST_INVARIANT; TInt documentLength = DocumentLength(); + if (aPos < 0 || aPos > documentLength) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_DOCOPYTOSTOREL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos >= 0 && aPos <= documentLength,Panic(ECharPosBeyondDocument)); + if (aLength < 0) + { + OstTrace0( TRACE_FATAL, DUP1_CPLAINTEXT_DOCOPYTOSTOREL, "ECopyToStreamNegativeLength" ); + } __ASSERT_ALWAYS(aLength >= 0,Panic(ECopyToStreamNegativeLength)); + if (aPos + aLength > documentLength) + { + OstTrace0( TRACE_FATAL, DUP2_CPLAINTEXT_DOCOPYTOSTOREL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos + aLength <= documentLength,Panic(ECharPosBeyondDocument)); if (aLength == 0) @@ -924,8 +977,20 @@ { __TEST_INVARIANT; TInt documentLength = DocumentLength(); + if (aPos < 0 || aPos > documentLength) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_COPYTOSTREAML, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos >= 0 && aPos <= documentLength,Panic(ECharPosBeyondDocument)); + if (aLength < 0) + { + OstTrace0( TRACE_FATAL, DUP1_CPLAINTEXT_COPYTOSTREAML, "ECopyToStreamNegativeLength" ); + } __ASSERT_ALWAYS(aLength >= 0,Panic(ECopyToStreamNegativeLength)); + if (aPos + aLength > documentLength) + { + OstTrace0( TRACE_FATAL, DUP2_CPLAINTEXT_COPYTOSTREAML, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos + aLength <= documentLength,Panic(ECharPosBeyondDocument)); aStream.WriteInt32L(aLength); @@ -961,6 +1026,10 @@ TInt CPlainText::DoPasteFromStoreL(const CStreamStore& aStore,TStreamId aStreamId,TInt aPos) { + if (aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_DOPASTEFROMSTOREL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); TInt charsPasted=0; @@ -1007,6 +1076,7 @@ if (error != KErrNone) { DoPtDelete(aPos,chars_read); + OstTrace1( TRACE_FATAL, DUP1_CPLAINTEXT_PASTEFROMSTREAML, "Leave code=%d", error ); User::Leave(error); } @@ -1058,6 +1128,10 @@ /** Inserts the end-of-document character upon document construction.*/ { // ASSERT: The plain text component is empty. + if (DocumentLength()!=-1) + { + OstTrace0( TRACE_DUMP, DUP1_CPLAINTEXT_INSERTEODL, "ECorruptTextStore" ); + } __ASSERT_DEBUG(DocumentLength()==-1,Panic(ECorruptTextStore)); TBuf<1> content; content.Append(EParagraphDelimiter); @@ -1101,8 +1175,6 @@ {return ((iByteStore->Size()/sizeof(TText))-1);} - - EXPORT_C void CPlainText::InsertL(TInt aInsertPos,const TChar& aChar) /** Inserts either a single character or a descriptor into the text object at a specified document position. @@ -1115,13 +1187,34 @@ @param aBuf The descriptor to insert. */ { __TEST_INVARIANT; + if (aInsertPos<0 || aInsertPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_INSERTL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aInsertPos>=0 && aInsertPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); - TBuf<1> content; - content.Append(aChar); - DoPtInsertL(aInsertPos,content); + TInt contentLength = 1; + if (aChar < 0x10000) + { + TBuf<1> content; + content.Append(aChar); + DoPtInsertL(aInsertPos,content); + } + else + { + TText16 high = TChar::GetHighSurrogate(aChar); + TText16 low = TChar::GetLowSurrogate(aChar); + RDebug::Print(_L("CPlainText::InsertL(%d), %X expand to %X %X."), aInsertPos, TUint(aChar), high, low); + + TBuf<2> content; + contentLength = 2; + content.Append(high); + content.Append(low); + DoPtInsertL(aInsertPos,content); + } if (FieldSetPresent()) - iFieldSet->NotifyInsertion(aInsertPos,content.Length()); // length always 1 - optimise??? + iFieldSet->NotifyInsertion(aInsertPos,contentLength); + SetHasChanged(ETrue); __TEST_INVARIANT; @@ -1141,6 +1234,10 @@ Maintain field set.*/ { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_PTINSERTL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); DoPtInsertL(aPos,aBuf); @@ -1226,8 +1323,20 @@ EFalse, so no reformatting occurs.*/ { TInt documentLength=DocumentLength()+1; + if (aPos<0 || aPos>documentLength) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_DOPTDELETE, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=documentLength,Panic(ECharPosBeyondDocument)); + if (aLength<0) + { + OstTrace0( TRACE_FATAL, DUP1_CPLAINTEXT_DOPTDELETE, "EDeleteNegativeLength" ); + } __ASSERT_ALWAYS(aLength>=0,Panic(EDeleteNegativeLength)); + if (aPos+aLength>documentLength) + { + OstTrace0( TRACE_FATAL, DUP2_CPLAINTEXT_DOPTDELETE, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos+aLength<=documentLength,Panic(ECharPosBeyondDocument)); iByteStore->Delete(aPos*sizeof(TText),aLength*sizeof(TText)); @@ -1275,6 +1384,10 @@ file.Close(); file_session.Close(); } + if (error < 0) + { + OstTrace1( TRACE_FATAL, DUP1_CPLAINTEXT_IMPORTTEXTFILEL, "Leave code=%x", error ); + } User::LeaveIfError(error); return chars_inserted; } @@ -1299,6 +1412,10 @@ @param aMaxLineLength The maximum number of characters in each line, (only relevant if the text organisation is EOrganiseByLine). */ { + if (aTextOrganisation != EOrganiseByParagraph && aLineWrap <= 0) + { + OstTrace0( TRACE_DUMP, CPLAINTEXT_EXPORTASTEXTL, "EExportLineWrapInvalid" ); + } __ASSERT_DEBUG(aTextOrganisation == EOrganiseByParagraph || aLineWrap > 0,Panic(EExportLineWrapInvalid)); RFs file_session; TInt error = file_session.Connect(); @@ -1317,6 +1434,10 @@ file.Close(); file_session.Close(); } + if (error < 0) + { + OstTrace1( TRACE_FATAL, DUP2_CPLAINTEXT_EXPORTASTEXTL, "Leave code=%x", error ); + } User::LeaveIfError(error); } @@ -1470,6 +1591,10 @@ */ { __TEST_INVARIANT; + if (aStartPos<0 || aStartPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, DUP1_CPLAINTEXT_READ, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aStartPos>=0 && aStartPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); TPtr8 buf=iByteStore->Ptr(aStartPos*sizeof(TText)); @@ -1496,6 +1621,10 @@ */ { __TEST_INVARIANT; + if (aStartPos<0 || aStartPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_READ, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aStartPos>=0 && aStartPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); TPtr8 buf=iByteStore->Ptr(aStartPos*sizeof(TText)); @@ -1519,7 +1648,15 @@ { __TEST_INVARIANT; TInt documentLength=DocumentLength(); + if (aPos<0 || aPos>documentLength) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_EXTRACT, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=documentLength,Panic(ECharPosBeyondDocument)); + if (aBuf.MaxLength()=documentLength - aPos,Panic(EExtractBufferTooSmall)); DoExtract(aBuf,aPos,documentLength-aPos); @@ -1541,7 +1678,15 @@ @param aLength The number of characters to copy. */ { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, DUP2_CPLAINTEXT_EXTRACT, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); + if (aBuf.MaxLength()=aLength,Panic(EExtractBufferTooSmall)); DoExtract(aBuf,aPos,aLength); @@ -1551,6 +1696,10 @@ // inline text, depending on the flag. EXPORT_C void CPlainText::ExtractSelectively(TDes& aBuf,TInt aPos,TInt aLength,TUint aFlags) { + if (aPos < 0 || aPos > DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_EXTRACTSELECTIVELY, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos >= 0 && aPos <= DocumentLength(),Panic(ECharPosBeyondDocument)); DoExtract(aBuf,aPos,aLength,aFlags); } @@ -1641,6 +1790,10 @@ // { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()+1) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_UPDATEPAGETABLE, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength()+1,Panic(ECharPosBeyondDocument)); if (iPageTable) @@ -1657,6 +1810,10 @@ @return The page number containing document position aPos. */ { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_PAGECONTAININGPOS, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); if (!iPageTable || (iPageTable->Count()<1)) @@ -1710,7 +1867,15 @@ field types, see the UID values defined in flddef.h. */ { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_INSERTFIELDL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); + if (!aField) + { + OstTrace0( TRACE_FATAL, DUP1_CPLAINTEXT_INSERTFIELDL, "ENoTextField" ); + } __ASSERT_ALWAYS(aField,Panic(ENoTextField)); if (!FieldSetPresent()) @@ -1737,6 +1902,10 @@ position, or a panic occurs. */ { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_UPDATEFIELDL, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); if (!FieldSetPresent()) @@ -1801,6 +1970,10 @@ at aPos. */ { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_REMOVEFIELD, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); TBool fieldRemoved=EFalse; @@ -1887,6 +2060,10 @@ field located at aPos. */ { __TEST_INVARIANT; + if (aPos<0 || aPos>DocumentLength()) + { + OstTrace0( TRACE_FATAL, CPLAINTEXT_CONVERTFIELDTOTEXT, "ECharPosBeyondDocument" ); + } __ASSERT_ALWAYS(aPos>=0 && aPos<=DocumentLength(),Panic(ECharPosBeyondDocument)); TBool fieldConverted=EFalse;