mtpfws/mtpfw/datatypes/src/cmtptypeserviceformat.cpp
changeset 0 d0791faffa3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpfw/datatypes/src/cmtptypeserviceformat.cpp	Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,222 @@
+// Copyright (c) 2006-2009 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:
+//
+
+/**
+@file
+@publishedPartner
+*/
+
+#include <mtp/tmtptypeflatbase.h>
+#include <mtp/cmtptypestring.h>
+#include <mtp/cmtptypeserviceformat.h>
+
+#include "mtpdatatypespanic.h"
+
+// Dataset constants
+
+const TUint CMTPTypeServiceFormatElement::KFlat1ChunkSize(18);
+const TUint CMTPTypeServiceFormatElement::KFlat2ChunkSize(2);
+
+
+const CMTPTypeCompoundBase::TElementInfo CMTPTypeServiceFormatElement::iElementMetaData[CMTPTypeServiceFormatElement::ENumElements] = 
+    {
+        {EIdFlat1Chunk,                      EMTPTypeFlat,   {EMTPTypeUINT16,    0,                  KMTPTypeUINT16Size}},   // EMTPServiceFormatCode
+        {EIdFlat1Chunk,                      EMTPTypeFlat,   {EMTPTypeUINT128,   2,                  KMTPTypeUINT128Size}},  // EMTPServiceFormatGUID
+        {EIdFormatNameChunk,				EMTPTypeString,	{EMTPTypeString,	KMTPNotApplicable,	KMTPNotApplicable}},	// EMTPServiceFormatName        
+        {EIdFlat2Chunk,						EMTPTypeFlat,	{EMTPTypeUINT16,	0,					KMTPTypeUINT16Size}},	// EMTPServiceFormatBase
+        {EIdFormatMIMETypeChunk,   	        EMTPTypeString, {EMTPTypeString,    KMTPNotApplicable,  KMTPNotApplicable}},    // EMTPServiceFormatMIMTType
+   };
+
+EXPORT_C CMTPTypeServiceFormatList* CMTPTypeServiceFormatList::NewL()
+    {
+    CMTPTypeServiceFormatList* self = CMTPTypeServiceFormatList::NewLC(); 
+    CleanupStack::Pop(self);
+    return self;  
+    }
+
+EXPORT_C CMTPTypeServiceFormatList* CMTPTypeServiceFormatList::NewLC()
+    {
+    CMTPTypeServiceFormatList* self = new(ELeave) CMTPTypeServiceFormatList();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CMTPTypeServiceFormatList::~CMTPTypeServiceFormatList()
+    {
+
+    }
+
+EXPORT_C void CMTPTypeServiceFormatList::AppendL(CMTPTypeServiceFormatElement* aElement)
+    {
+    CMTPTypeList::AppendL(aElement);
+    }
+
+CMTPTypeServiceFormatList::CMTPTypeServiceFormatList() :
+CMTPTypeList(EMTPTypeServiceFormatListDataset,EMTPTypeServiceFormatElementDataset)
+    {
+    }
+
+void CMTPTypeServiceFormatList::ConstructL()
+    {
+    InitListL();
+    }
+    
+EXPORT_C CMTPTypeServiceFormatElement& CMTPTypeServiceFormatList::ElementL(TUint aIndex) const
+    {
+    return static_cast<CMTPTypeServiceFormatElement&>( CMTPTypeList::ElementL(aIndex) );
+    }
+
+EXPORT_C CMTPTypeServiceFormatElement* CMTPTypeServiceFormatElement::NewL()
+    {
+    CMTPTypeServiceFormatElement* self = NewLC();
+    CleanupStack::Pop(self);
+    return self; 
+    }
+
+EXPORT_C CMTPTypeServiceFormatElement* CMTPTypeServiceFormatElement::NewLC()
+    {
+    CMTPTypeServiceFormatElement* self = new(ELeave) CMTPTypeServiceFormatElement();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+EXPORT_C CMTPTypeServiceFormatElement* CMTPTypeServiceFormatElement::NewL(const TUint16 aFormatCode,const TMTPTypeGuid& aFormatGUID,const TDesC& aFormatName,const TUint16 aFormatBase,const TDesC& aMIMEType)
+    {
+    CMTPTypeServiceFormatElement* self = NewLC( aFormatCode, aFormatGUID, aFormatName, aFormatBase, aMIMEType);
+    CleanupStack::Pop(self);
+    return self; 
+    }
+
+EXPORT_C CMTPTypeServiceFormatElement* CMTPTypeServiceFormatElement::NewLC(const TUint16 aFormatCode,const TMTPTypeGuid& aFormatGUID,const TDesC& aFormatName,const TUint16 aFormatBase,const TDesC& aMIMEType)
+    {
+    CMTPTypeServiceFormatElement* self = new (ELeave) CMTPTypeServiceFormatElement(); 
+	CleanupStack::PushL(self); 
+    self->ConstructL(aFormatCode, aFormatGUID, aFormatName, aFormatBase, aMIMEType);
+	return self;    
+    }
+
+/**
+Destructor.
+*/    
+EXPORT_C CMTPTypeServiceFormatElement::~CMTPTypeServiceFormatElement()
+    {    
+    iChunkFlat1.Close();
+    iChunkFlat2.Close();
+    delete iChunkFormatNameString;
+    delete iChunkMIMETypeString;
+    }
+
+
+
+EXPORT_C TUint CMTPTypeServiceFormatElement::Type() const
+    {
+    return EMTPTypeServiceFormatElementDataset;
+    }
+
+const CMTPTypeCompoundBase::TElementInfo& CMTPTypeServiceFormatElement::ElementInfo(TInt aElementId) const
+    {
+    return iElementInfo[aElementId];
+    }
+
+CMTPTypeServiceFormatElement::CMTPTypeServiceFormatElement() : 
+    CMTPTypeCompoundBase((!KJustInTimeConstruction), EIdNumChunks), 
+    iElementInfo(iElementMetaData, ENumElements),
+    iChunkFlat1(KFlat1ChunkSize, *this),
+    iChunkFlat2(KFlat2ChunkSize, *this)
+    {
+    
+    }
+
+void CMTPTypeServiceFormatElement::ConstructL()
+    {
+    for (TUint i(0); (i < ENumElements); i++)
+        {
+        const TElementInfo& info(iElementInfo[i]);
+        if (ChunkCount() <= info.iChunkId)
+            {
+            MMTPType* chunk(NULL);
+            
+            switch (info.iType)
+                {
+            case EMTPTypeFlat:
+            	chunk = NewFlatChunkL(info);
+            	break;  
+            case EMTPTypeString:
+            	chunk = NewStringChunkL(info);
+                break;
+            default:
+                break;
+                }
+                
+            __ASSERT_DEBUG(chunk, User::Invariant());
+            ChunkAppendL(*chunk);
+            }
+        }
+    }
+
+MMTPType* CMTPTypeServiceFormatElement::NewFlatChunkL(const TElementInfo& aElementInfo)
+    {
+    MMTPType* chunk(NULL);
+    if (aElementInfo.iChunkId == EIdFlat1Chunk)
+        {
+        iChunkFlat1.OpenL();
+        chunk = &iChunkFlat1;
+        }
+    else if ( aElementInfo.iChunkId == EIdFlat2Chunk )
+    	{
+    	iChunkFlat2.OpenL();
+    	chunk = &iChunkFlat2;
+    	}
+    else
+    	{}
+    __ASSERT_DEBUG(chunk, User::Invariant());
+    return chunk;
+    }
+
+MMTPType* CMTPTypeServiceFormatElement::NewStringChunkL(const TElementInfo& aElementInfo)
+	{
+    MMTPType* chunk(NULL);
+    if (aElementInfo.iChunkId == EIdFormatNameChunk)
+        {
+        iChunkFormatNameString = CMTPTypeString::NewL();
+        chunk = iChunkFormatNameString ;
+        }
+    else if ( aElementInfo.iChunkId == EIdFormatMIMETypeChunk )
+    	{
+    	iChunkMIMETypeString = CMTPTypeString::NewL();
+    	chunk = iChunkMIMETypeString ;
+    	}
+    else
+    	{}
+    __ASSERT_DEBUG(chunk, User::Invariant());
+    return chunk;
+	}
+
+void CMTPTypeServiceFormatElement::ConstructL(const TUint16 aFormatCode,const TMTPTypeGuid& aFormatGUID,const TDesC& aFormatName,const TUint16 aFormatBase,const TDesC& aMIMEType)
+    {
+
+    ConstructL();
+
+    // Set mandatory construction values.
+    SetUint16L(EFormatCode, aFormatCode);
+    SetL(EFormatGUID, aFormatGUID);
+    SetStringL(EFormatName,aFormatName);
+    SetUint16L(EFormatBase,aFormatBase);
+    
+    SetStringL(EFormatMIMEType,aMIMEType);
+
+    }