diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/qosextnapi/src/sblpextn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/qosextnapi/src/sblpextn.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,262 @@ +// Copyright (c) 2005-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: +// sblpapi.cpp - SBLP QoS API +// + +#include "sblpextn.h" +#include "qosextn_constants.h" +#include "qosextn_log.h" +#include + +// Buffer size +const TUint KSblpApiBufSize = 8192; +const TUint KNumberOfElementsPerFlowId = 2; +// Note that KAuthorizationTokenAdjustedStringLength value should be calculated +// very carefully to fit the string inside the config block used by the pfqoslib. +// if KAuthorizationTokenActualStringLength = 255, KAuthorizationTokenAdjustedStringLength should +// be 260. +const TUint KAuthorizationTokenActualStringLength = 255; +const TUint KAuthorizationTokenStringZeroTerminated = KAuthorizationTokenActualStringLength + 1; +const TUint KAuthorizationTokenAdjustedStringLength = KAuthorizationTokenStringZeroTerminated + 4; + + +EXPORT_C CSblpParameters::CSblpParameters() + { + iAuthorizationToken = KNullDesC8; + } + +EXPORT_C CSblpParameters::~CSblpParameters() + { + iFlowIds.Reset(); + } + +EXPORT_C CSblpParameters& CSblpParameters::operator= (const CSblpParameters& f) + { + if (this != &f) + { + SetMAT(f.iAuthorizationToken); + SetFlowIds(f.iFlowIds); + } + return *this; + } + +EXPORT_C TInt CSblpParameters::GetMAT(TAuthorizationToken &aAuthToken) const + { + aAuthToken = iAuthorizationToken; + return KErrNone; + } + +EXPORT_C void CSblpParameters::SetMAT(const TAuthorizationToken &aAuthToken ) + { + iAuthorizationToken = aAuthToken; + } + +EXPORT_C CSblpParameters::TFlowIdentifier& CSblpParameters::GetFlowId(TInt aIndex) + { + __ASSERT_DEBUG(aIndex &aFlowIds) + { + iFlowIds.Reset(); + TInt i; + for(i=0; iiFlowIds.Append(aFlowIds[i]); + } + } + +EXPORT_C TInt CSblpParameters::GetFlowIds(RArray& aFlowIds) + { + aFlowIds.Reset(); + TInt i; + for(i=0; iiFlowIds[i]); + } + return KErrNone; + } + +EXPORT_C TInt CSblpParameters::NrOfFlowIds() + { + return iFlowIds.Count(); + } + +// +// CSblpPolicy +// +EXPORT_C CSblpPolicy* CSblpPolicy::NewL() + { + CSblpPolicy* policy = new (ELeave) CSblpPolicy(); + CleanupStack::PushL(policy); + policy->ConstructL(); + CleanupStack::Pop(); + return policy; + } + +CSblpPolicy::CSblpPolicy() + { + iType = KPfqosExtensionSBLP; + } + +void CSblpPolicy::ConstructL() + { + iData = HBufC8::NewL(KSblpApiBufSize); + iSblp = new (ELeave) CSblpParameters; + } + +EXPORT_C CSblpPolicy::~CSblpPolicy() + { + delete iSblp; + //iData is deleted in the base + } + +static void SetIntValue(pfqos_configblock_int& data, TInt aValue, + const TDesC8& aName) + { + data.len = sizeof(pfqos_configblock_int)/8; + data.padding = data.reserved = 0; + data.type = KPfqosTypeInteger; + data.value = aValue; + Mem::FillZ(data.id, KPfqosMaxName); + Mem::Copy(data.id, aName.Ptr(), aName.Length()); + } + + + +static void SetStringBlockHeader(pfqos_configblock& data, + TDesC8& /*aValue*/, const TDesC8& aName) + { + data.len = (sizeof(pfqos_configblock) + KAuthorizationTokenAdjustedStringLength )/8; + data.padding = data.reserved = 0; + data.type = KPfqosTypeString; + Mem::FillZ(data.id, KPfqosMaxName); + Mem::Copy(data.id, aName.Ptr(), aName.Length()); + } + +EXPORT_C TDesC8& CSblpPolicy::Data() + { + TPtr8 bufPtr = iData->Des(); + bufPtr.SetLength(0); + const TInt byte_len = (sizeof(pfqos_configure)+ + sizeof(pfqos_extension)+ + sizeof(pfqos_configblock)+ + KAuthorizationTokenAdjustedStringLength+ + KNumberOfElementsPerFlowId * iSblp->NrOfFlowIds() * + sizeof(pfqos_configblock_int)); + + pfqos_configure header; + header.pfqos_configure_len = (TUint16)((byte_len + 7) / 8); + header.pfqos_ext_type = EPfqosExtExtension; + header.reserved = 0; + header.protocol_id = 0; + bufPtr.Append((TUint8*)&header, sizeof(pfqos_configure)); + + pfqos_extension extensionType; + extensionType.pfqos_ext_len = 0; + extensionType.pfqos_ext_type = EPfqosExtExtension; + extensionType.pfqos_extension_type = KPfqosExtensionSBLP; + bufPtr.Append((TUint8*)&extensionType, sizeof(pfqos_extension)); + + /* MAT + + MAT is a string + The string is put after pfqos_configblock + The pfqos_configblock length is the size of pfqos_configblock + plus the string length + */ + TAuthorizationToken authToken; + pfqos_configblock stringBlock; + iSblp->GetMAT(authToken); + SetStringBlockHeader(stringBlock,authToken,KDescSblpMediaAuthorizationToken); + bufPtr.Append((TUint8*)&stringBlock, sizeof(pfqos_configblock)); + // put the string now + authToken.ZeroTerminate(); + bufPtr.Append((TUint8*)authToken.Ptr(),KAuthorizationTokenAdjustedStringLength); + + + // Flowids + pfqos_configblock_int ext; + TInt i; + for(i=0; iNrOfFlowIds();i++) + { + CSblpParameters::TFlowIdentifier& flowId = iSblp->GetFlowId(i); + SetIntValue(ext,flowId.iMediaComponentNumber,KDescSblpMediaComponentNumber); + bufPtr.Append((TUint8*)&ext, sizeof(pfqos_configblock_int)); + SetIntValue(ext,flowId.iIPFlowNumber,KDescSblpIPFlowNumber); + bufPtr.Append((TUint8*)&ext, sizeof(pfqos_configblock_int)); + } + + bufPtr.AppendFill(0, header.pfqos_configure_len * 8 - byte_len); + return *iData; + } + +EXPORT_C TInt CSblpPolicy::ParseMessage(const TDesC8& /*aData*/) + { + return KErrNone; + } + +EXPORT_C CExtensionBase* CSblpPolicy::CreateL() + { + CSblpPolicy *extension = CSblpPolicy::NewL(); + return extension; + } + +EXPORT_C TInt CSblpPolicy::Copy(const CExtensionBase& aExtension) + { + if (aExtension.Type() != iType) + return KErrArgument; + const CSblpPolicy& policy = (CSblpPolicy&)aExtension; + policy.GetSblpParameters(*iSblp); + return KErrNone; + } + +EXPORT_C void CSblpPolicy::SetSblpParameters(const CSblpParameters& aSblp) + { + + *iSblp = aSblp; + + LOG( + // following code is to create logs + TAuthorizationToken authToken; + iSblp->GetMAT (authToken); + RArray flowIds; + iSblp->GetFlowIds(flowIds); + TBuf label; + label.Copy(authToken); + + Log::Printf(_L("<------------------------------------------------\n")); + Log::Printf(_L("CSblpPolicy::SetSblpParameters")); + Log::Printf(_L("\n")); + Log::Printf(_L("SBLP VALUES SUPPLIED BY CLIENT IS \n")); + Log::Printf(_L("\n")); + Log::Printf(_L("[MAT string : = %S]\n"),&label); + + TInt i; + for(i=0; i\n")); + flowIds.Close(); + ) + + } + +EXPORT_C void CSblpPolicy::GetSblpParameters(CSblpParameters& aSblp) const + { + aSblp = *iSblp; + }