ncdengine/provider/server/src/ncdcontentdescriptor.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/src/ncdcontentdescriptor.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,520 @@
+/*
+* Copyright (c) 2007 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 CNcdContentDescriptor
+*
+*/
+
+
+#include "ncdcontentdescriptor.h"
+#include "catalogsconstants.h"
+#include "catalogsutils.h"
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+CNcdContentDescriptor* CNcdContentDescriptor::NewL()
+    {
+    CNcdContentDescriptor* self = NewLC();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+CNcdContentDescriptor* CNcdContentDescriptor::NewLC()
+    {
+    CNcdContentDescriptor* self = new (ELeave) CNcdContentDescriptor();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+            
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CNcdContentDescriptor::ConstructL()
+    {
+    iDescriptorType = KNullDesC().AllocL();
+    iDescriptor = KNullDesC().AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+CNcdContentDescriptor::~CNcdContentDescriptor()
+    {
+    ClearAllData();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CNcdContentDescriptor::SetDescriptorL( const TDesC& aDescriptorType, 
+                                            const TDesC16& aDescriptor )
+    {
+    DLTRACEIN((""));
+    ClearAllData();
+    
+    iDescriptorType = aDescriptorType.AllocL();
+    iDescriptor = aDescriptor.AllocL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CNcdContentDescriptor::SetDescriptorL( const TDesC& aDescriptorType, 
+                                            const TDesC8& aDescriptor )
+    {    
+    DLTRACEIN((""));
+    ClearAllData();
+    
+    iDescriptorType = aDescriptorType.AllocL();    
+    iDescriptor = ConvertUtf8ToUnicodeL( aDescriptor );
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+HBufC* CNcdContentDescriptor::ExtractDataL( const TDesC& aStartTag, 
+                                         const TDesC& aEndTag,
+                                         const TDesC& aPattern )
+    {
+    TInt beginningOfData = 0;
+    TInt dataLength = 0;
+    HBufC* extractedData = NULL;
+
+    if ( aEndTag.Length() > 0 )
+        {
+        // End tag has been given
+
+        // Find start tag
+        beginningOfData = iDescriptor->FindF( aStartTag );
+        User::LeaveIfError( beginningOfData );
+
+        // Get beginning of the data
+        beginningOfData += aStartTag.Length();
+
+        // Find end tag
+        dataLength = iDescriptor->FindF( aEndTag );
+        User::LeaveIfError( dataLength );
+        // Check validity of end tag position
+        if ( dataLength < beginningOfData )
+            {
+            User::Leave( KErrCorrupt );
+            }
+        // Set data length
+        dataLength -= beginningOfData;
+
+        // Get data
+        extractedData = iDescriptor->Mid( beginningOfData, 
+            dataLength ).AllocLC();
+        
+        // Check if pattern is given
+        if ( aPattern != KNullDesC )
+            {
+            // If pattern matches extracted mime type, try extract next tag
+            if ( extractedData->MatchF( aPattern ) != KErrNotFound )
+                {       
+                // Get the end of end tag
+                TInt endOfEndTag = beginningOfData + dataLength + 
+                    aEndTag.Length();
+                    
+                // Get the rest of iDescriptor to find the next tag
+                TPtrC16 restOfDescriptor = iDescriptor->Mid( endOfEndTag );
+                        
+                // Find start tag                       
+                beginningOfData = restOfDescriptor.FindF( aStartTag );
+                        
+                if ( beginningOfData != KErrNotFound )
+                    {       
+                    User::LeaveIfError( beginningOfData );
+
+                    // Get beginning of the data
+                    beginningOfData += aStartTag.Length();
+
+                    // Find end tag
+                    dataLength = restOfDescriptor.FindF( aEndTag );
+                    User::LeaveIfError( dataLength );
+                    // Check validity of end tag position
+                    if ( dataLength < beginningOfData )
+                        {
+                        User::Leave( KErrCorrupt );
+                        }
+                    // Set data length
+                    dataLength -= beginningOfData;
+
+                    CleanupStack::PopAndDestroy( extractedData );
+                                        
+                    // Get data
+                    extractedData = restOfDescriptor.Mid( 
+                        beginningOfData, dataLength ).AllocLC();
+                    }
+                }
+            }
+        }
+    else
+        {
+        // End tag was not given
+
+        // Find start tag
+        beginningOfData = iDescriptor->FindF( aStartTag );
+        User::LeaveIfError( beginningOfData );
+
+        // Get beginning of the data
+        beginningOfData += aStartTag.Length();
+
+        const TDesC& descriptor = iDescriptor->Des();
+
+        while ( 1 )
+            {
+            // Find end of the line
+            while ( descriptor[beginningOfData + dataLength] != 0x0A &&
+                   descriptor[beginningOfData + dataLength] != 0x0D &&
+                   descriptor[beginningOfData + dataLength] != 0x1A )
+                {
+                dataLength++;
+                // If end of the descriptor is reached,
+                // use that as end of the line
+                if ( beginningOfData + dataLength == iDescriptor->Length() )
+                    {
+                    break;
+                    }
+                }
+
+            // Check if we have some data extracted already
+            if ( extractedData == NULL )
+                {
+                // No previously extracted data found.
+                // Create new heap.
+                extractedData = iDescriptor->Mid( beginningOfData, 
+                    dataLength ).AllocLC();
+                }
+            else
+                {
+                // Some previously extracted data found.
+                // Realloc new heap and append new data into it.
+                HBufC* newBuffer = extractedData->ReAllocL( 
+                    extractedData->Length() + dataLength );
+                CleanupStack::Pop( extractedData );
+                extractedData = newBuffer;
+                CleanupStack::PushL( extractedData );
+                extractedData->Des().Append( 
+                    iDescriptor->Mid( beginningOfData, dataLength ) );
+                }
+
+            // If we are at the end of the file, we are done here
+            if ( beginningOfData + dataLength == iDescriptor->Length() )
+                {
+                break;
+                }
+
+            // Find start of the next line
+            while ( descriptor[beginningOfData + dataLength] == 0x0A ||
+                   descriptor[beginningOfData + dataLength] == 0x0D ||
+                   descriptor[beginningOfData + dataLength] == 0x1A )
+                {
+                dataLength++;
+                if ( beginningOfData + dataLength == iDescriptor->Length() )
+                    {
+                    // End of the descriptor reached
+                    break;
+                    }
+                }
+
+            // Check if data continues on the next line
+            if ( beginningOfData + dataLength == iDescriptor->Length() ||
+                descriptor[beginningOfData + dataLength] != 0x20 )
+                {
+                // Data doesn't continue on the next line
+                break;
+                }
+
+            // Data continues on the next line.
+            // Set beginning of the data.
+            beginningOfData += dataLength + 1;
+            dataLength = 0;
+            }
+        }
+
+    CleanupStack::Pop( extractedData );
+    return extractedData;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+const TDesC& CNcdContentDescriptor::DataUriL()
+    {
+    DLTRACEIN((""));
+    _LIT( KObjectUriStartTag, "<objecturi>" );
+    _LIT( KObjectUriEndTag, "</objecturi>" );
+
+    _LIT( KMidletJarUriStartTag, "midlet-jar-url: " );
+
+    // Dont parse data URI again, if it has been already parsed
+    if ( iDataUri != NULL )
+        {
+        DLTRACEOUT(( _L("DataUri already parsed: %S"), iDataUri ));
+        return *iDataUri;
+        }
+
+    if ( iDescriptorType->CompareF( KDescriptorTypeOdd ) == 0 )
+        {
+        // Descriptor type is DD
+
+        TRAPD( err, 
+               iDataUri = ExtractDataL( KObjectUriStartTag, 
+                                        KObjectUriEndTag ) );
+        if ( err != KErrNone )
+            {
+            return KNullDesC;
+            }
+
+        // Check validity of the URI
+        if ( iDataUri->MatchF( KHttpMatchString ) == 0 )
+            {
+            return *iDataUri;
+            }
+        else
+            {
+            // Data URI is invalid, clear data URI
+            delete iDataUri;
+            iDataUri = NULL;
+            iDataUri = KNullDesC().AllocL();
+            }
+        }
+    else if ( iDescriptorType->CompareF( KDescriptorTypeJad ) == 0 )
+        {
+        // Descriptor type is JAD
+
+        TRAPD( err, 
+               iDataUri = ExtractDataL( KMidletJarUriStartTag, 
+                                        KNullDesC ) );
+        if ( err != KErrNone )
+            {
+            return KNullDesC;
+            }
+
+        // Check validity of the URI
+        if ( iDataUri->MatchF( KHttpMatchString ) == 0 )
+            {
+            return *iDataUri;
+            }
+        else
+            {
+            // Data URI is invalid, clear data URI
+            delete iDataUri;
+            iDataUri = NULL;
+            iDataUri = KNullDesC().AllocL();
+            }
+        }
+    
+    DLTRACEOUT(("Not JAD nor DD"));
+    return KNullDesC;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+const TDesC& CNcdContentDescriptor::InstallNotificationUri()
+    {
+    DLTRACEIN((""));
+    _LIT( KInstNotifyUriStartTag, "<installnotifyuri>" );
+    _LIT( KInstNotifyUriEndTag, "</installnotifyuri>" );
+
+    _LIT( KMidletInstNotifyStartTag, "midlet-install-notify: " );
+
+    // Dont parse install notification URI again, if it has been already parsed
+    if ( iInstallNotificationUri )
+        {
+        DLTRACEOUT(( _L("Install notification URI: %S"), 
+            iInstallNotificationUri ));
+        return *iInstallNotificationUri;
+        }
+
+    if ( iDescriptorType->CompareF( KDescriptorTypeOdd ) == 0 )
+        {
+        // Descriptor type is DD
+
+        TRAPD( err, 
+               iInstallNotificationUri = ExtractDataL( KInstNotifyUriStartTag,
+                                                       KInstNotifyUriEndTag ) );
+        if ( err != KErrNone )
+            {
+            return KNullDesC;
+            }
+        DLTRACEOUT(( _L("Install notification URI: %S"), iInstallNotificationUri ));
+        return *iInstallNotificationUri;
+        }
+    else if ( iDescriptorType->CompareF( KDescriptorTypeJad ) == 0 )
+        {
+        // Descriptor type is JAD
+
+        TRAPD( err, 
+               iInstallNotificationUri = ExtractDataL( KMidletInstNotifyStartTag, 
+                                                       KNullDesC ) );
+        if ( err != KErrNone )
+            {
+            return KNullDesC;
+            }
+        DLTRACEOUT(( _L("Install notification URI: %S"), 
+            iInstallNotificationUri ));
+        return *iInstallNotificationUri;
+        }
+
+    return KNullDesC;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+const TDesC& CNcdContentDescriptor::FileName()
+    {
+    DLTRACEIN((""));
+    _LIT( KNameStartTag, "<name>" );
+    _LIT( KNameEndTag, "</name>" );
+
+    _LIT( KMidletNameStartTag, "midlet-name: " );
+
+    // Dont parse file name again, if it has been already parsed
+    if ( iFileName != NULL )
+        {
+        return *iFileName;
+        }
+
+    if ( iDescriptorType->CompareF( KDescriptorTypeOdd ) == 0 )
+        {
+        // Descriptor type is DD
+
+        TRAPD( err, iFileName = ExtractDataL( KNameStartTag, KNameEndTag ) );
+        if ( err != KErrNone )
+            {
+            return KNullDesC;
+            }
+        return *iFileName;
+        }
+    else if ( iDescriptorType->CompareF( KDescriptorTypeJad ) == 0 )
+        {
+        // Descriptor type is JAD
+
+        TRAPD( err, 
+               iFileName = ExtractDataL( KMidletNameStartTag, KNullDesC ) );
+        if ( err != KErrNone )
+            {
+            return KNullDesC;
+            }
+        return *iFileName;
+        }
+
+    return KNullDesC;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+const TDesC& CNcdContentDescriptor::MimeType()
+    {
+    DLTRACEIN((""));
+    _LIT( KTypeStartTag, "<type>" );
+    _LIT( KTypeEndTag, "</type>" );
+    _LIT( KMimeTypeDrmMessage, "application/vnd.oma.drm.message" );
+
+    // Dont parse mime type again, if it has been already parsed
+    if ( iMimeType != NULL )
+        {
+        return *iMimeType;
+        }
+
+    if ( iDescriptorType->CompareF( KDescriptorTypeOdd ) == 0 )
+        {
+        // Descriptor type is DD
+
+        TRAPD( err, 
+               iMimeType = ExtractDataL( KTypeStartTag, KTypeEndTag, 
+                KMimeTypeDrmMessage ) 
+            );
+        if ( err != KErrNone  )
+            {
+            return KNullDesC;
+            }
+
+        return *iMimeType;
+        }
+
+    return KNullDesC;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+const TDesC& CNcdContentDescriptor::Descriptor() const
+    {
+    return *iDescriptor;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+const TDesC& CNcdContentDescriptor::DescriptorType() const
+    {
+    return *iDescriptorType;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Clears all member variables
+// ---------------------------------------------------------------------------
+//    
+void CNcdContentDescriptor::ClearAllData()
+    {
+    delete iDescriptorType;
+    iDescriptorType = NULL;
+    delete iDescriptor;
+    iDescriptor = NULL;
+
+    delete iDataUri;
+    iDataUri = NULL;
+    
+    delete iInstallNotificationUri;
+    iInstallNotificationUri = NULL;
+    
+    delete iFileName;
+    iFileName = NULL;
+    
+    delete iMimeType;
+    iMimeType = NULL;    
+    }
+
+