homescreenpluginsrv/hspsodt/src/hspsodt.cpp
branchRCL_3
changeset 19 502e5d91ad42
parent 18 bd874ee5e5e2
child 51 15e4dd19031c
--- a/homescreenpluginsrv/hspsodt/src/hspsodt.cpp	Fri Mar 12 15:43:54 2010 +0200
+++ b/homescreenpluginsrv/hspsodt/src/hspsodt.cpp	Mon Mar 15 12:41:53 2010 +0200
@@ -15,7 +15,6 @@
 *
 */
 
-
 #include "hspsodt.h"
 #include <s32strm.h>
 #include <s32mem.h>
@@ -23,9 +22,6 @@
 #include "hspsdomdocument.h"
 #include "hspsresource.h"
 
-/* Literal delim is used in separation of theme header and and other data in ODT-streaming. */
-_LIT(KDelim, "#");
-
 // ============================ MEMBER FUNCTIONS ===============================
 
 // -----------------------------------------------------------------------------
@@ -148,20 +144,16 @@
 // -----------------------------------------------------------------------------    
 EXPORT_C HBufC8* ChspsODT::MarshalHeaderL() const
     {
-    CBufFlat* buf = CBufFlat::NewL( KMaxHeaderDataLength8 );
-    CleanupStack::PushL( buf );
-    RBufWriteStream stream( *buf );     //stream over the buffer
-    CleanupClosePushL( stream );
+    HBufC8* buf = HBufC8::NewLC( HeaderSize() );
+    TPtr8 ptr = buf->Des();
+    RDesWriteStream stream( ptr );
+    stream.PushL();
     ExternalizeHeaderL( stream );
-    CleanupStack::PopAndDestroy( &stream );
+    stream.Pop();
+    stream.Close();
+    CleanupStack::Pop( buf );
     
-    //Create a heap descriptor from the buffer
-    HBufC8* des = HBufC8::NewL( buf->Size() );
-    TPtr8 ptr( des->Des() );
-    buf->Read( 0, ptr, buf->Size() );
-    CleanupStack::PopAndDestroy( buf );
-    
-    return des;
+    return buf;
     }
 
 // -----------------------------------------------------------------------------
@@ -188,7 +180,6 @@
 // -----------------------------------------------------------------------------
 EXPORT_C void ChspsODT::UnMarshalHeaderL( const TDesC8& aStreamData )
     {
-
     RDesReadStream stream( aStreamData );
     CleanupClosePushL( stream );
     InternalizeHeaderL( stream );
@@ -215,9 +206,8 @@
 EXPORT_C void ChspsODT::InternalizeL( RReadStream& aStream )
     {
     InternalizeHeaderL( aStream );
-    // consumes header delimiter
-    aStream.ReadInt16L();
     InternalizeResourceListL( aStream );    
+
     delete iDomDocument;
     iDomDocument = NULL;
     iDomDocument = ChspsDomDocument::NewL( aStream );
@@ -229,88 +219,147 @@
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------    
 void ChspsODT::ExternalizeHeaderL( RWriteStream& aStream ) const
-    {
-    if ( iPackageVersion )
+    {    
+    const TDesC& packageVersion = PackageVersion();
+    aStream.WriteInt32L( packageVersion.Length() );
+    if( packageVersion.Length() > 0 )
+        {
+        aStream << packageVersion;
+        }
+        
+    aStream.WriteUint32L( iThemeUid );
+    
+    const TDesC& providerName = ProviderName();
+    aStream.WriteInt32L( providerName.Length() );
+    if( providerName.Length() > 0 )
+        {
+        aStream << providerName;
+        }         
+
+    const TDesC& themeFullName = ThemeFullName();
+    aStream.WriteInt32L( themeFullName.Length() );
+    if( themeFullName.Length() > 0 )
+        {
+        aStream << themeFullName;
+        }      
+    
+    const TDesC& themeShortName = ThemeShortName();
+    aStream.WriteInt32L( themeShortName.Length() );
+    if( themeShortName.Length() > 0 )
+        {
+        aStream << themeShortName;
+        }    
+
+    const TDesC& themeVersion = ThemeVersion();
+    aStream.WriteInt32L( themeVersion.Length() );
+    if( themeVersion.Length() > 0 )
         {
-        aStream << *iPackageVersion;
-        }
-    else
+        aStream << themeVersion;
+        }              
+        
+    const TDesC& description = Description();
+    aStream.WriteInt32L( description.Length() );
+    if( description.Length() > 0 )
+        {
+        aStream << description;
+        }            
+
+    const TDesC& logoFile = LogoFile();
+    aStream.WriteInt32L( logoFile.Length() );
+    if( logoFile.Length() > 0 )
+        {
+        aStream << logoFile;
+        }        
+
+    const TDesC& previewFile = PreviewFile();
+    aStream.WriteInt32L( previewFile.Length() );
+    if( previewFile.Length() > 0 )
         {
-        aStream << KNullDesC;
+        aStream << previewFile;
+        }            
+
+    aStream.WriteUint32L( iFamilyMask );    
+    aStream.WriteUint32L( iConfigurationType );    
+    aStream.WriteUint32L( iRootUid );    
+    aStream.WriteUint32L( iProviderUid );  
+    aStream.WriteUint32L( iFlags );
+    
+    aStream.WriteInt32L( iLanguage );    
+    aStream.WriteInt32L( iMultiInstance );    
+    }
+
+
+// -----------------------------------------------------------------------------
+// ChspsODT::HeaderSize
+// Calculate header size in bytes.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------    
+TInt ChspsODT::HeaderSize() const
+    {
+    TInt size = sizeof( TInt32 );
+    if( PackageVersion().Length() > 0 )
+        {         
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += PackageVersion().Size();
         }
     
-    aStream.WriteUint32L( iFamilyMask );
-    aStream.WriteUint32L( iConfigurationType );
-    aStream.WriteUint32L( iRootUid );
-    aStream.WriteUint32L( iProviderUid );
-    aStream.WriteUint32L( iThemeUid );
-    aStream.WriteInt32L( iMultiInstance );
+    size += sizeof( TUint32 ); // iThemeUid
     
-    if ( iDescription )
+    size += sizeof( TInt32 );
+    if( ProviderName().Length() > 0 )
         {
-        aStream << *iDescription;
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += ProviderName().Size();
         }    
-    else
+    
+    size += sizeof( TInt32 );
+    if( ThemeFullName().Length() > 0 )
         {
-        aStream << KNullDesC;
-        }
-    if ( iLogoFile )
-        {
-        aStream << *iLogoFile;
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += ThemeFullName().Size();
         }    
-    else
+    
+    size += sizeof( TInt32 );
+    if( ThemeShortName().Length() > 0 )
         {
-        aStream << KNullDesC;
-        }
-    if ( iPreviewFile )
-        {
-        aStream << *iPreviewFile;
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += ThemeShortName().Size();
         }    
-    else
-        {
-        aStream << KNullDesC;
-        }
-    if ( iProviderName )
+    
+    size += sizeof( TInt32 );
+    if( ThemeVersion().Length() > 0 )
         {
-        aStream << *iProviderName;
-        }
-    else
-        {
-        aStream << KNullDesC;
-        }
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += ThemeVersion().Size();
+        }    
     
-    if ( iThemeFullName )
+    size += sizeof( TInt32 );
+    if( Description().Length() > 0 )
         {
-        aStream << *iThemeFullName;
-        }
-    else 
-        {
-        aStream << KNullDesC;
-        }
-        
-    if ( iThemeShortName )
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += Description().Size();
+        }    
+    
+    size += sizeof( TInt32 );
+    if( LogoFile().Length() > 0 )
         {
-        aStream << *iThemeShortName;
-        }
-    else 
-        {
-        aStream << KNullDesC;
-        }
-        
-    if ( iThemeVersion )
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += LogoFile().Size();
+        }    
+    
+    size += sizeof( TInt32 );
+    if( PreviewFile().Length() > 0 )
         {
-        aStream << *iThemeVersion;
-        }
-    else
-        {
-        aStream << KNullDesC;
-        }
+        size += sizeof( TUint32 ); // String streaming insert also max. 32bit member of TCardinality.
+        size += PreviewFile().Size();
+        }    
     
-    aStream.WriteInt32L( iLanguage );
-    aStream.WriteUint32L( iFlags );
+    size += sizeof( TUint32 ) * 5; // iFamilyMask, iConfigurationType,
+                                   // iRootUid, iProviderUid, iFlags
+
+    size += sizeof( TInt32 ) * 2; // iLanguage, iMultiInstance                
     
-    // end of the header delimiter
-    aStream.WriteL( KDelim );
+    return size;
     }
 
 // -----------------------------------------------------------------------------
@@ -319,59 +368,111 @@
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------       
 EXPORT_C void ChspsODT::InternalizeHeaderL( RReadStream& aStream )
-    {
-    HBufC* version = HBufC::NewL( aStream, KMaxFileName );
-    CleanupStack::PushL( version );
-    if ( iPackageVersion && version->Des().Compare( iPackageVersion->Des() ) != 0 )
+    {    
+    TInt len = aStream.ReadInt32L();
+    HBufC* version = NULL;
+    if( len > 0 )
+        {
+        version = HBufC::NewL( aStream, len );
+        }
+    CleanupStack::PushL( version );    
+    
+    // Check version request.
+    if( iPackageVersion )
         {
-        // Package version check requested (iPackageVersion defined) 
-        // and package version not supported
-        User::Leave( KErrNotSupported );
+        TBool supported = ETrue;
+        if( version == NULL )
+            {
+            supported = EFalse;
+            }
+        else if( version &&
+                 version->Compare( *iPackageVersion ) != 0 )
+            {
+            supported = EFalse;
+            }    
+    
+        if( !supported )
+            {
+            // Package version check requested (iPackageVersion defined) 
+            // and package version not supported
+            User::Leave( KErrNotSupported );
+            }
         }
-    if ( !iPackageVersion && version->Length() )
+    
+    if( version )
         {
-        // Package version check not requested
+        delete iPackageVersion;
+        iPackageVersion = NULL;    
         iPackageVersion = version->AllocL();
         }
     CleanupStack::PopAndDestroy( version );
-    
-    iFamilyMask = aStream.ReadUint32L();    
-    iConfigurationType = aStream.ReadUint32L();
-    iRootUid = aStream.ReadUint32L();
-    iProviderUid = aStream.ReadUint32L();
+
     iThemeUid = aStream.ReadUint32L();
-    iMultiInstance = aStream.ReadInt32L();
-    
-    delete iDescription;
-    iDescription = NULL;
-    iDescription = HBufC::NewL(aStream, KMaxDescLength );
-    
-    delete iLogoFile;
-    iLogoFile = NULL;
-    iLogoFile = HBufC::NewL(aStream, KMaxFileName );
-    
-    delete iPreviewFile;
-    iPreviewFile = NULL;
-    iPreviewFile = HBufC::NewL(aStream, KMaxFileName );
-        
+          
     delete iProviderName;
     iProviderName = NULL;
-    iProviderName = HBufC::NewL(aStream, KMaxFileName );
+    len = aStream.ReadInt32L();
+    if( len > 0 )
+        {
+        iProviderName = HBufC::NewL( aStream, len );
+        }
     
     delete iThemeFullName;
     iThemeFullName = NULL;
-    iThemeFullName = HBufC::NewL(aStream, KMaxFileName );
+    len = aStream.ReadInt32L();
+    if( len > 0 )
+        {
+        iThemeFullName = HBufC::NewL( aStream, len );
+        }
     
     delete iThemeShortName;
     iThemeShortName = NULL;
-    iThemeShortName = HBufC::NewL(aStream, KMaxFileName );
-    
+    len = aStream.ReadInt32L();
+    if( len > 0 )
+        {    
+        iThemeShortName = HBufC::NewL( aStream, len );
+        }
+
     delete iThemeVersion;
     iThemeVersion = NULL;
-    iThemeVersion = HBufC::NewL(aStream, KMaxFileName );
-        
+    len = aStream.ReadInt32L();
+    if( len > 0 )
+        {    
+        iThemeVersion = HBufC::NewL( aStream, len );
+        }
+
+    delete iDescription;
+    iDescription = NULL;
+    len = aStream.ReadInt32L();
+    if( len > 0 )
+        {    
+        iDescription = HBufC::NewL( aStream, len );
+        }
+
+    delete iLogoFile;
+    iLogoFile = NULL;
+    len = aStream.ReadInt32L();
+    if( len > 0 )
+        {    
+        iLogoFile = HBufC::NewL( aStream, len );
+        }
+
+    delete iPreviewFile;
+    iPreviewFile = NULL;
+    len = aStream.ReadInt32L();
+    if( len > 0 )
+        {    
+        iPreviewFile = HBufC::NewL( aStream, len );
+        }
+    
+    iFamilyMask = aStream.ReadUint32L();     
+    iConfigurationType = aStream.ReadUint32L();    
+    iRootUid = aStream.ReadUint32L();    
+    iProviderUid = aStream.ReadUint32L();    
+    iFlags = aStream.ReadUint32L();
+    
     iLanguage = aStream.ReadInt32L();
-    iFlags = aStream.ReadUint32L();
+    iMultiInstance = aStream.ReadInt32L();        
     }
 
 // -----------------------------------------------------------------------------
@@ -583,9 +684,16 @@
 // -----------------------------------------------------------------------------
 EXPORT_C void ChspsODT::SetProviderNameL( const TDesC& aName )
     {
-    delete iProviderName;
-    iProviderName = NULL;
-    iProviderName = aName.AllocL();
+    if( iProviderName )
+        {
+        delete iProviderName;
+        iProviderName = NULL;
+        }
+    
+    if( aName.Length() != 0 )
+        {        
+        iProviderName = aName.AllocL();
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -612,9 +720,16 @@
 // -----------------------------------------------------------------------------
 EXPORT_C void ChspsODT::SetThemeFullNameL( const TDesC& aName )
     {
-    delete iThemeFullName;
-    iThemeFullName = NULL;
-    iThemeFullName = aName.AllocL();
+    if( iThemeFullName )
+        {
+        delete iThemeFullName;
+        iThemeFullName = NULL;
+        }
+    
+    if( aName.Length() != 0 )
+        {        
+        iThemeFullName = aName.AllocL();
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -641,9 +756,16 @@
 // -----------------------------------------------------------------------------    
 EXPORT_C void ChspsODT::SetThemeShortNameL( const TDesC& aName )
     {
-    delete iThemeShortName;
-    iThemeShortName = NULL;
-    iThemeShortName = aName.AllocL();
+    if( iThemeShortName )
+        {
+        delete iThemeShortName;
+        iThemeShortName = NULL;
+        }
+    
+    if( aName.Length() != 0 )
+        {        
+        iThemeShortName = aName.AllocL();
+        }    
     }
 
 // -----------------------------------------------------------------------------
@@ -670,9 +792,16 @@
 // -----------------------------------------------------------------------------    
 EXPORT_C void ChspsODT::SetThemeVersionL( const TDesC& aVersion )
     {
-    delete iThemeVersion;
-    iThemeVersion = NULL;
-    iThemeVersion = aVersion.AllocL();
+    if( iThemeVersion )
+        {
+        delete iThemeVersion;
+        iThemeVersion = NULL;
+        }
+    
+    if( aVersion.Length() != 0 )
+        {        
+        iThemeVersion = aVersion.AllocL();
+        }    
     }
 
 // -----------------------------------------------------------------------------
@@ -804,9 +933,16 @@
 // -----------------------------------------------------------------------------    
 EXPORT_C void ChspsODT::SetPackageVersionL( const TDesC& aVersion )
     {
-    delete iPackageVersion;
-    iPackageVersion = NULL;
-    iPackageVersion = aVersion.AllocL();
+    if( iPackageVersion )
+        {
+        delete iPackageVersion;
+        iPackageVersion = NULL;
+        }
+    
+    if( aVersion.Length() != 0 )
+        {        
+        iPackageVersion = aVersion.AllocL();
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -867,9 +1003,16 @@
 // -----------------------------------------------------------------------------
 EXPORT_C void ChspsODT::SetDescriptionL( const TDesC& aDesc )
     {    
-    delete iDescription;
-    iDescription = NULL;
-    iDescription = aDesc.AllocL();
+    if( iDescription )
+        {
+        delete iDescription;
+        iDescription = NULL;
+        }
+    
+    if( aDesc.Length() != 0 )
+        {        
+        iDescription = aDesc.AllocL();
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -891,10 +1034,17 @@
 // ChspsODT::SetLogoFileL
 // -----------------------------------------------------------------------------
 EXPORT_C void ChspsODT::SetLogoFileL( const TDesC& aPath )
-    {    
-    delete iLogoFile;
-    iLogoFile = NULL;
-    iLogoFile = aPath.AllocL();
+    {
+    if( iLogoFile )
+        {
+        delete iLogoFile;
+        iLogoFile = NULL;
+        }
+    
+    if( aPath.Length() != 0 )
+        {        
+        iLogoFile = aPath.AllocL();
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -916,10 +1066,17 @@
 // ChspsODT::SetPreviewFileL
 // -----------------------------------------------------------------------------
 EXPORT_C void ChspsODT::SetPreviewFileL( const TDesC& aPath )
-    {    
-    delete iPreviewFile;
-    iPreviewFile = NULL;
-    iPreviewFile = aPath.AllocL();
+    {
+    if( iPreviewFile )
+        {
+        delete iPreviewFile;
+        iPreviewFile = NULL;
+        }
+    
+    if( aPath.Length() != 0 )
+        {        
+        iPreviewFile = aPath.AllocL();
+        }
     }
 
 // -----------------------------------------------------------------------------