srsf/ttscommon/src/ttscommonbody.cpp
branchRCL_3
changeset 23 e36f3802f733
parent 0 bf1d17376201
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srsf/ttscommon/src/ttscommonbody.cpp	Wed Sep 01 12:29:17 2010 +0100
@@ -0,0 +1,424 @@
+/*
+* Copyright (c) 2004-2005 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:  Implementation of TtsCommon 
+*
+*/
+
+
+// INCLUDE FILES
+#include "srsfbldvariant.hrh"
+#include "ttscommonbody.h"
+#include "nssttscommon.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::CTtsParsedTextBody
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CTtsParsedTextBody::CTtsParsedTextBody() :
+    iText( NULL ),
+    iPhonemeSequence( NULL ),
+    iPhonemeNotation( NULL )
+    {
+    // nothing
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CTtsParsedTextBody::ConstructL(
+    const TDesC& aText, 
+    const TDesC8& aPhonemeSequence, 
+    const TDesC& aPhonemeNotation )
+    {
+    
+    if ( aText != KNullDesC )
+        {
+        // copy text 
+        iText = HBufC::NewL( aText.Length() );
+        TPtr tempPtr( iText->Des() );
+        tempPtr = aText;
+        }
+    
+    if ( aPhonemeSequence != KNullDesC8 )
+        {
+        // copy phoneme sequence
+        iPhonemeSequence = HBufC8::NewL( aPhonemeSequence.Length() );
+        TPtr8 tempPtr8( iPhonemeSequence->Des() );
+        tempPtr8 = aPhonemeSequence;
+        }
+    
+    if ( aPhonemeNotation != KNullDesC )
+        {
+        // copy phoneme notation 
+        iPhonemeNotation = HBufC::NewL( aPhonemeNotation.Length() );
+        TPtr tempPtr( iPhonemeNotation->Des() );
+        tempPtr = aPhonemeNotation;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CTtsParsedTextBody* CTtsParsedTextBody::NewL(
+    const TDesC& aText, 
+    const TDesC8& aPhonemeSequence, 
+    const TDesC& aPhonemeNotation )
+    {
+    CTtsParsedTextBody* self = new( ELeave ) CTtsParsedTextBody;
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aText, 
+                      aPhonemeSequence, 
+                      aPhonemeNotation );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+    
+// Destructor
+CTtsParsedTextBody::~CTtsParsedTextBody()
+    {
+    delete iText;
+    delete iPhonemeSequence;
+    delete iPhonemeNotation;
+    iSegmentArray.Reset();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::AddSegmentL
+// Add new segment to array
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTtsParsedTextBody::AddSegmentL( 
+    const TTtsSegment& aSegment,
+    TInt aIndex )
+    {
+    if ( aIndex < 0  )
+        {
+        User::Leave( KErrArgument ); // The index is negative
+        }
+    else if ( aIndex >= iSegmentArray.Count() )
+        {
+        // added to end
+        User::LeaveIfError( iSegmentArray.Append( aSegment ) );
+        }
+    else
+        {
+        // added into middle
+        User::LeaveIfError( iSegmentArray.Insert( aSegment, aIndex ) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::DeleteSegment
+// Delete segment
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTtsParsedTextBody::DeleteSegmentL( 
+    TInt aIndex )
+    {
+    if ( aIndex < 0 || aIndex >= iSegmentArray.Count() )
+        {
+        User::Leave( KErrArgument ); // The index is out of bounds.
+        }
+
+    iSegmentArray.Remove( aIndex );
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::IsValid
+// Checks that segments do not overlap or pointer outside.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTtsParsedTextBody::IsValid() const
+    {
+    TInt index( 0 );
+    
+    if ( iPhonemeSequence == NULL &&
+        iText == NULL &&
+        iSegmentArray.Count() > 0 )
+        {
+        // no phoneme sequence and no text but segments still exist
+        return EFalse;
+        }
+    
+    // check phoneme sequence part 
+    if ( iPhonemeSequence )
+        {
+        const TUint8* beginPhSeqPtr = iPhonemeSequence->Ptr();
+        const TUint8* endPhSeqPtr = iPhonemeSequence->Ptr() 
+            + iPhonemeSequence->Length() - 1;   
+        
+        for ( index = 0; index < iSegmentArray.Count(); index++ )
+            {
+            // check that pointers do not point outside
+            const TTtsSegment& segment = iSegmentArray[index];
+            const TDesC8& phSeq = segment.PhonemeSequencePtr();
+            if ( phSeq != KNullDesC8 )
+                {
+                const TUint8* phSeqPtr = phSeq.Ptr();
+                if ( phSeqPtr < beginPhSeqPtr || 
+                    phSeqPtr > endPhSeqPtr ||
+                    phSeqPtr + phSeq.Length() - 1 > endPhSeqPtr )
+                    {
+                    return EFalse;
+                    }
+                
+                
+                // check order and overlapping
+                if ( index > 0 )
+                    {
+                    const TDesC8& prevPhSeq
+                        = iSegmentArray[index - 1].PhonemeSequencePtr();
+                    if ( prevPhSeq == KNullDesC8 )
+                        {
+                        // all pointer must point to either null or valid data
+                        return EFalse;
+                        }
+                    
+                    const TUint8* prevEndPhSeqPtr 
+                        = prevPhSeq.Ptr() + prevPhSeq.Length() - 1;    
+                    if ( prevEndPhSeqPtr >= phSeqPtr )
+                        {
+                        return EFalse;
+                        }
+                    }
+                }
+            }
+        }
+    
+    // check phoneme sequence part 
+    if ( iText )
+        {
+        const TUint16* beginTextPtr = iText->Ptr();
+        const TUint16* endTextPtr = iText->Ptr() + iText->Length() - 1;
+        
+        for ( index = 0; index < iSegmentArray.Count(); index++ )
+            {
+            // check that pointers do not point outside
+            const TTtsSegment& segment = iSegmentArray[index];
+            const TDesC& text = segment.TextPtr();
+            if ( text != KNullDesC )
+                {
+                const TUint16* textPtr = text.Ptr();
+                if ( textPtr < beginTextPtr || 
+                    textPtr > endTextPtr ||
+                    textPtr + text.Length() - 1 > endTextPtr )
+                    {
+                    return EFalse;
+                    }
+                
+                // check order and overlapping
+                if ( index > 0 )
+                    {
+                    const TDesC& prevText = iSegmentArray[index - 1].TextPtr();
+                    if ( prevText == KNullDesC )
+                        {
+                        // all pointer must point to either null or valid data
+                        return EFalse;
+                        }
+                    const TUint16* prevEndTextPtr 
+                        = prevText.Ptr() + prevText.Length() - 1;    
+                    if ( prevEndTextPtr >= textPtr )
+                        {
+                        return EFalse;
+                        }
+                    }
+                }
+            }
+        }
+    
+    // all checks passed
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::NumberOfSegments
+// Return number of segments
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTtsParsedTextBody::NumberOfSegments() const
+    {
+    return iSegmentArray.Count();
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::PhonemeNotation
+// Returns phoneme notation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TDesC& CTtsParsedTextBody::PhonemeNotation() const
+    {
+    if ( iPhonemeNotation )
+        {
+        // Phoneme sequence has been set
+        return *iPhonemeNotation;
+        }
+    return KNullDesC;   
+    }
+	
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::PhonemeSequence
+// Returns phoneme sequence
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CTtsParsedTextBody::PhonemeSequence() const
+    {
+    if ( iPhonemeSequence )
+        {
+        // Phoneme sequence has been set
+        return *iPhonemeSequence;
+        }
+    return KNullDesC8;
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::SegmentL
+// Returns segment of given index
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TTtsSegment& CTtsParsedTextBody::SegmentL( 
+    TInt aIndex ) const
+    {
+    if ( aIndex < 0 || aIndex >= iSegmentArray.Count() )
+        {
+        User::Leave( KErrArgument );
+        }
+    return iSegmentArray[aIndex];
+    }
+	
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::SetPhonemeNotationL
+// Sets phoneme notation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTtsParsedTextBody::SetPhonemeNotationL( 
+    const TDesC& aPhonemeNotation )
+    {
+    if ( !iPhonemeNotation )
+        {
+        // copy phoneme notation 
+        iPhonemeNotation = HBufC::NewL( aPhonemeNotation.Length() );
+        TPtr tempPtr( iPhonemeNotation->Des() );
+        tempPtr = aPhonemeNotation;
+        }   
+    else
+        {
+        TPtr bufferPtr( iPhonemeNotation->Des() );
+        if ( aPhonemeNotation.Length() > bufferPtr.MaxLength() )
+            {
+            // new buffer does not fit into old one
+            iPhonemeNotation->ReAllocL( aPhonemeNotation.Length() );   
+            bufferPtr.Set( iPhonemeNotation->Des() );
+            }
+        bufferPtr = aPhonemeNotation;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::SetPhonemeSequenceL
+// Sets phoneme sequence
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTtsParsedTextBody::SetPhonemeSequenceL( 
+    const TDesC8& aPhonemeSequence )
+    {
+    
+    if ( !iPhonemeSequence )
+        {
+        // create new phoneme sequence
+        iPhonemeSequence = HBufC8::NewL( aPhonemeSequence.Length() );
+        TPtr8 tempPtr8( iPhonemeSequence->Des() );
+        tempPtr8 = aPhonemeSequence;
+        }
+    else
+        {
+        TPtr8 bufferPtr( iPhonemeSequence->Des() );
+        if ( aPhonemeSequence.Length() > bufferPtr.MaxLength() )
+            {
+            // new buffer does not fit into old one
+            iPhonemeSequence = iPhonemeSequence->ReAllocL( aPhonemeSequence.Length() );
+            bufferPtr.Set( iPhonemeSequence->Des() );
+            }
+        bufferPtr = aPhonemeSequence;
+        }
+     
+    }
+	
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::SetTextL
+// Sets text
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTtsParsedTextBody::SetTextL( 
+    const TDesC& aText )
+    {
+    if ( !iText )
+        {
+        // create new text 
+        iText = HBufC::NewL( aText.Length() );
+        TPtr tempPtr( iText->Des() );
+        tempPtr = aText;
+        }
+    else 
+        {
+        TPtr bufferPtr( iText->Des() );
+        if ( aText.Length() > bufferPtr.MaxLength() )
+            {
+            // new buffer does not fit into old one
+            iText = iText->ReAllocL( aText.Length() ); 
+            bufferPtr.Set( iText->Des() );
+            }
+        bufferPtr = aText;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTtsParsedTextBody::Text
+// Returns text
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TDesC& CTtsParsedTextBody::Text() const
+    {
+    if ( iText )
+        {
+        // text has been set
+        return *iText;
+        }
+    return KNullDesC;
+    }
+
+//  End of File