textrendering/texthandling/stext/TXTETEXT.CPP
branchRCL_3
changeset 54 748ec5531811
parent 0 1fb32624e06b
child 55 336bee5c2d35
--- 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)
+	    {
+	    OstTrace0( TRACE_FATAL, DUP1_CPLAINTEXT_EXTRACT, "EExtractBufferTooSmall" );
+	    }
 	__ASSERT_ALWAYS(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)
+	    {
+	    OstTrace0( TRACE_FATAL, DUP3_CPLAINTEXT_EXTRACT, "EExtractBufferTooSmall" );
+	    }
 	__ASSERT_ALWAYS(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;