diff -r 000000000000 -r d0791faffa3f mtpfws/mtpfw/src/cmtpdatacodegenerator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpfw/src/cmtpdatacodegenerator.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,258 @@ +// 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 + @internalComponent + */ +#include +#include + +#include "mtpservicecommon.h" +#include "rmtpframework.h" +#include "cmtpdatacodegenerator.h" +#include "cmtpservicemgr.h" + + + +// Class constants. +__FLOG_STMT(_LIT8(KComponent,"DataCodeGenerator");) + +const TUint16 KUndenfinedStartCode = EMTPCodeUndefined1Start + 1; +const TUint16 KUndenfinedEndCode = EMTPCodeUndefined1End; + + +CMTPDataCodeGenerator* CMTPDataCodeGenerator::NewL() + { + CMTPDataCodeGenerator* self = new (ELeave) CMTPDataCodeGenerator(); + CleanupStack::PushL ( self ); + self->ConstructL (); + CleanupStack::Pop ( self ); + return self; + } + +CMTPDataCodeGenerator::~CMTPDataCodeGenerator() + { + __FLOG(_L8("CMTPDataCodeGenerator::~CMTPDataCodeGenerator - Entry")); + + iSingletons.Close(); + + __FLOG(_L8("CMTPDataCodeGenerator::~CMTPDataCodeGenerator - Exit")); + + __FLOG_CLOSE; + } + +void CMTPDataCodeGenerator::ConstructL() + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("CMTPDataCodeGenerator::ConstructL - Entry")); + + iSingletons.OpenL (); + + __FLOG(_L8("CMTPDataCodeGenerator::ConstructL - Exit")); + } + +CMTPDataCodeGenerator::CMTPDataCodeGenerator() : + iUndefinedNextCode(KUndenfinedStartCode ), + iVendorExtFormatCode(EMTPFormatCodeVendorExtDynamicStart) + { + + } + +TInt CMTPDataCodeGenerator::IncServiceIDResource( const TUint aServiceType, TUint& aServiceID ) + { + __FLOG(_L8("CMTPDataCodeGenerator::IncServiceIDResource - Entry")); + if ( iUndefinedNextCode >= KUndenfinedEndCode ) + return KErrOverflow; + + switch ( aServiceType ) + { + case EMTPServiceTypeNormal: + { + aServiceID = ( ( ++iUndefinedNextCode ) | KNormalServiceTypeMask ); + } + break; + + case EMTPServiceTypeAbstract: + { + aServiceID = ( (++iUndefinedNextCode) | KAbstrackServiceTypeMask ); + } + break; + default: + { + __FLOG(_L8("CMTPDataCodeGenerator::IncServiceIDResource - Service Type not supported")); + } + } + __FLOG(_L8("CMTPDataCodeGenerator::IncServiceIDResource - Exit")); + return KErrNone; + } + +void CMTPDataCodeGenerator::DecServiceIDResource() + { + __FLOG(_L8("CMTPDataCodeGenerator::DecServiceIDResource - Entry")); + iUndefinedNextCode--; + __FLOG(_L8("CMTPDataCodeGenerator::DecServiceIDResource - Exit")); + } + +TBool CMTPDataCodeGenerator::IsValidServiceType( const TUint aServiceType ) const + { + return ( (EMTPServiceTypeNormal == aServiceType) || (EMTPServiceTypeAbstract == aServiceType) ); + } + +TInt CMTPDataCodeGenerator::AllocateServiceID(const TMTPTypeGuid& aPGUID, const TUint aServiceType, TUint& aServiceID ) + { + __FLOG(_L8("CMTPDataCodeGenerator::AllocateServiceID - Entry")); + + if( !IsValidServiceType(aServiceType) ) + return KErrArgument; + + TInt err(KErrNone); + TUint retID (KInvliadServiceID); + if( iSingletons.ServiceMgr().IsSupportedService(aPGUID) ) + { + if( iSingletons.ServiceMgr().ServiceTypeOfSupportedService(aPGUID) != aServiceType ) + return KErrArgument; + + err = iSingletons.ServiceMgr().GetServiceId(aPGUID , retID); + if( KErrNone != err ) + { + if((err = IncServiceIDResource( aServiceType, retID )) != KErrNone) + return err; + + err = iSingletons.ServiceMgr().EnableService( aPGUID, retID ); + if( KErrNone != err ) + { + DecServiceIDResource(); + return err; + } + } + + } + else + { + if((err = IncServiceIDResource( aServiceType, retID )) != KErrNone) + return err; + } + + aServiceID = retID; + iSingletons.ServiceMgr().InsertServiceId( retID ); + + __FLOG(_L8("CMTPDataCodeGenerator::AllocateServiceID - Exit")); + return KErrNone; + } + +TInt CMTPDataCodeGenerator::AllocateServicePropertyCode( const TMTPTypeGuid& aServicePGUID, const TMTPTypeGuid& aPKNamespace, const TUint aPKID, TUint16& aServicePropertyCode ) + { + __FLOG(_L8("CMTPDataCodeGenerator::AllocateServicePropertyCode - Entry")); + + TUint retID = KInvliadU16DataCode; + if( iSingletons.ServiceMgr().IsSupportedService(aServicePGUID) ) + { + TInt err = iSingletons.ServiceMgr().GetServicePropertyCode( aServicePGUID, aPKNamespace, aPKID, retID ); + if( KErrNone != err ) + return err; + + if(retID == KInvliadU16DataCode) + { + if ( iUndefinedNextCode >= KUndenfinedEndCode ) + return KErrOverflow; + + retID = ++iUndefinedNextCode; + iSingletons.ServiceMgr().SetServicePropertyCode( aServicePGUID, aPKNamespace, aPKID, retID); + } + } + else + { + if ( iUndefinedNextCode >= KUndenfinedEndCode ) + return KErrOverflow; + + retID = ++iUndefinedNextCode; + } + + aServicePropertyCode = retID; + + __FLOG(_L8("CMTPDataCodeGenerator::AllocateServicePropertyCode - Exit")); + return KErrNone; + } + +TInt CMTPDataCodeGenerator::AllocateServiceFormatCode( const TMTPTypeGuid& aServicePGUID, const TMTPTypeGuid& aGUID, TUint16& aServiceFormatCode ) + { + __FLOG(_L8("CMTPServiceConfig::AllocateServiceFormatCode - Entry")); + + TUint retID = KInvliadU16DataCode; + if( iSingletons.ServiceMgr().IsSupportedService(aServicePGUID) ) + { + TInt err = iSingletons.ServiceMgr().GetServiceFormatCode( aServicePGUID, aGUID, retID ); + if( KErrNone != err ) + return err; + + if(retID == KInvliadU16DataCode) + { + if ( iVendorExtFormatCode > EMTPFormatCodeVendorExtDynamicEnd ) + return KErrOverflow; + + retID = ++iVendorExtFormatCode; + iSingletons.ServiceMgr().SetServiceFormatCode( aServicePGUID, aGUID, retID); + } + } + else + { + if ( iVendorExtFormatCode > EMTPFormatCodeVendorExtDynamicEnd ) + return KErrOverflow; + + retID = ++iVendorExtFormatCode; + } + + aServiceFormatCode = retID; + + __FLOG(_L8("CMTPServiceConfig::AllocateServiceFormatCode - Exit")); + return KErrNone; + } + +TInt CMTPDataCodeGenerator::AllocateServiceMethodFormatCode( const TMTPTypeGuid& aServicePGUID, const TMTPTypeGuid& aGUID, TUint16& aMethodFormatCode ) + { + __FLOG(_L8("CMTPDataCodeGenerator::AllocateServiceMethodFormatCode - Entry")); + + TUint retID = KInvliadU16DataCode; + if( iSingletons.ServiceMgr().IsSupportedService(aServicePGUID) ) + { + TInt err = iSingletons.ServiceMgr().GetServiceMethodCode( aServicePGUID, aGUID, retID ); + if( KErrNone != err ) + return err; + + if(retID == KInvliadU16DataCode) + { + if ( iUndefinedNextCode > KUndenfinedEndCode ) + return KErrOverflow; + + retID = ++iUndefinedNextCode; + iSingletons.ServiceMgr().SetServiceMethodCode( aServicePGUID, aGUID, retID); + } + } + else + { + if ( iUndefinedNextCode > KUndenfinedEndCode ) + return KErrOverflow; + + retID = ++iUndefinedNextCode; + } + + aMethodFormatCode = retID; + + __FLOG(_L8("CMTPDataCodeGenerator::AllocateServiceMethodFormatCode - Exit")); + return KErrNone; + } + + +