mtpfws/mtpfw/datatypes/src/cmtptypeserviceinfo.cpp
changeset 0 d0791faffa3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpfw/datatypes/src/cmtptypeserviceinfo.cpp	Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,227 @@
+// 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/cmtptypeservicesection.h>
+#include <mtp/cmtptypeserviceinfo.h>
+#include <mtp/cmtptypeserviceprop.h>
+#include <mtp/cmtptypeserviceformat.h>
+#include <mtp/cmtptypeservicemethod.h>
+#include <mtp/cmtptypeserviceevent.h>
+#include <mtp/cmtptypestring.h>
+
+#include "mtpdatatypespanic.h"
+
+const TUint CMTPTypeServiceInfo::KFlat1ChunkSize(44);
+const TUint CMTPTypeServiceInfo::KFlat2ChunkSize(8);
+
+const CMTPTypeCompoundBase::TElementInfo CMTPTypeServiceInfo::iElementMetaData[CMTPTypeServiceInfo::ENumElements] = 
+    {
+        {EIdFlat1Chunk,                       EMTPTypeFlat,      {EMTPTypeUINT32,    0,                  KMTPTypeUINT32Size}},   // EMTPServiceID
+        {EIdFlat1Chunk,                       EMTPTypeFlat,      {EMTPTypeUINT32,    4,                  KMTPTypeUINT32Size}},   // EMTPServiceStorageID
+        {EIdFlat1Chunk,                       EMTPTypeFlat,      {EMTPTypeUINT128,   8,                  KMTPTypeUINT128Size}},  // EMTPServicePGUID
+        {EIdFlat1Chunk,                       EMTPTypeFlat,      {EMTPTypeUINT32,    24,                 KMTPTypeUINT32Size}},   // EMTPServiceVersion
+        {EIdFlat1Chunk,                       EMTPTypeFlat,      {EMTPTypeUINT128,   28,                 KMTPTypeUINT128Size}},  // EMTPServiceGUID
+        {EIdServiceNameChunk,                 EMTPTypeString,    {EMTPTypeString,    KMTPNotApplicable,  KMTPNotApplicable}},    // EMTPServiceName        
+        {EIdFlat2Chunk,                       EMTPTypeFlat,      {EMTPTypeUINT32,    0,                  KMTPTypeUINT32Size}},   // EMTPServiceType
+        {EIdFlat2Chunk,                       EMTPTypeFlat,      {EMTPTypeUINT32,    4,                  KMTPTypeUINT32Size}},   // EMTPBaseServiceID
+   };
+
+EXPORT_C CMTPTypeServiceInfo* CMTPTypeServiceInfo::NewL()
+    {
+    CMTPTypeServiceInfo* self = CMTPTypeServiceInfo::NewLC(); 
+    CleanupStack::Pop(self);
+    return self; 
+    }
+
+EXPORT_C CMTPTypeServiceInfo* CMTPTypeServiceInfo::NewLC()
+    {
+    CMTPTypeServiceInfo* self = new (ELeave) CMTPTypeServiceInfo(); 
+    CleanupStack::PushL(self); 
+    self->ConstructL();
+    return self;    
+    }
+
+EXPORT_C CMTPTypeServiceInfo::~CMTPTypeServiceInfo()
+    {   
+    iChunkFlat1.Close();
+    iChunkFlat2.Close();
+    delete iChunkString;
+    
+    delete iChunkUsedServices;
+    delete iChunkServiceDataBlock;
+    
+    delete iServicePropList;
+    delete iServiceFormatList;
+    delete iServiceMethodList;
+    delete iServiceEventList;
+    }
+
+EXPORT_C TUint32 CMTPTypeServiceInfo::NumberOfUsedServices() const
+    {
+    return iChunkUsedServices->NumElements();
+    }
+
+EXPORT_C void CMTPTypeServiceInfo::UsedServiceL( const TUint aIndex, TMTPTypeGuid& aUsedServiceGUID ) const
+    {
+    iChunkUsedServices->ElementL(aIndex, aUsedServiceGUID);
+    }
+
+EXPORT_C void CMTPTypeServiceInfo::AppendUsedServiceL( const TMTPTypeGuid& aElement )
+    {
+    iChunkUsedServices->AppendL( aElement );
+    }
+
+EXPORT_C TUint32 CMTPTypeServiceInfo::NumberOfServiceDataBlock() const
+    {
+    return iChunkServiceDataBlock->NumElements();
+    }
+
+EXPORT_C void CMTPTypeServiceInfo::SerivceDataBlockL( const TUint aIndex, TMTPTypeGuid& aGUID ) const
+    {
+    iChunkServiceDataBlock->ElementL(aIndex, aGUID);
+    }
+
+EXPORT_C void CMTPTypeServiceInfo::AppendServiceDataBlockL( const TMTPTypeGuid& aElement )
+    {
+    iChunkServiceDataBlock->AppendL( aElement );
+    }
+
+EXPORT_C TUint CMTPTypeServiceInfo::Type() const
+    {
+    return EMTPTypeServiceInfoDataset;
+    }
+
+const CMTPTypeCompoundBase::TElementInfo& CMTPTypeServiceInfo::ElementInfo(TInt aElementId) const
+    {
+    return iElementInfo[aElementId];
+    }
+
+TBool CMTPTypeServiceInfo::WriteableElementL(TInt aElementId) const
+    {
+    TBool ret(EFalse);
+    if(aElementId <= EBaseServiceID )
+        ret = ETrue;
+    
+    return ret;
+    }
+
+TBool CMTPTypeServiceInfo::ReadableElementL(TInt aElementId) const
+    {
+    TBool ret(EFalse);
+        if(aElementId <= EBaseServiceID )
+            ret = ETrue;
+        
+        return ret;
+    }
+
+CMTPTypeServiceInfo::CMTPTypeServiceInfo() : 
+    CMTPTypeCompoundBase((!KJustInTimeConstruction), EIdNumChunks), 
+    iElementInfo(iElementMetaData, ENumElements),
+    iChunkFlat1(KFlat1ChunkSize, *this),
+    iChunkFlat2(KFlat2ChunkSize, *this)
+    {
+    
+    }
+
+void CMTPTypeServiceInfo::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:
+                iChunkString = CMTPTypeString::NewL();
+                chunk = iChunkString ;
+                break;
+            default:
+                break;
+                }
+                
+            __ASSERT_DEBUG(chunk, User::Invariant());
+            ChunkAppendL(*chunk);
+            }
+        }
+    
+    iChunkUsedServices = CMTPTypeArray::NewL(EMTPTypeAUINT128, EMTPTypeUINT128,  KMTPTypeUINT128Size );
+    ChunkAppendL( *iChunkUsedServices );
+    
+    iServicePropList = CMTPTypeServicePropertyList::NewL();
+    iServiceFormatList = CMTPTypeServiceFormatList::NewL();
+    iServiceMethodList = CMTPTypeServiceMethodList::NewL();
+    iServiceEventList = CMTPTypeServiceEventList::NewL();
+    
+    ChunkAppendL(*iServicePropList);
+    ChunkAppendL(*iServiceFormatList);
+    ChunkAppendL(*iServiceMethodList);
+    ChunkAppendL(*iServiceEventList);
+    
+    iChunkServiceDataBlock = CMTPTypeArray::NewL(EMTPTypeAUINT128, EMTPTypeUINT128,  KMTPTypeUINT128Size );
+    ChunkAppendL( *iChunkServiceDataBlock );
+    
+    }
+
+
+MMTPType* CMTPTypeServiceInfo::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;
+    }
+
+EXPORT_C CMTPTypeServicePropertyList& CMTPTypeServiceInfo::ServicePropList()
+    {
+    return *iServicePropList;
+    }
+
+EXPORT_C CMTPTypeServiceFormatList& CMTPTypeServiceInfo::ServiceFormatList()
+    {
+    return *iServiceFormatList;
+    }
+
+EXPORT_C CMTPTypeServiceMethodList& CMTPTypeServiceInfo::ServiceMethodList()
+    {
+    return *iServiceMethodList;
+    }
+
+EXPORT_C CMTPTypeServiceEventList& CMTPTypeServiceInfo::ServiceEventList()
+    {
+    return *iServiceEventList;
+    }
+