--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothapitest/bluetoothsvs/T_BTSdpAPI/src/T_DataSdpAgent.cpp Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,509 @@
+/*
+* 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:
+*
+*/
+
+#include "T_DataSdpAgent.h"
+#include "T_BTDevAddrData.h"
+#include "T_DataCSdpSearchPattern.h"
+#include "T_DataSdpAttrIdMatchList.h"
+#include "T_BTUtil.h"
+/*@{*/
+
+//CSdpAgent commands
+_LIT(KCmdNewL, "NewL");
+_LIT(KCmdNewLC, "NewLC");
+_LIT(KCmdSetRecordFilterL, "SetRecordFilterL");
+_LIT(KCmdSetAttributePredictorListL, "SetAttributePredictorListL");
+_LIT(KCmdNextRecordRequestL, "NextRecordRequestL");
+_LIT(KCmdAttributeRequestL, "AttributeRequestL");
+_LIT(KCmdCancel, "Cancel");
+_LIT(KCmdDestructor, "~");
+_LIT(KCmdMSAN_ExtensionInterfaceL, "MSAN_ExtensionInterfaceL");
+
+//CSdpAgent Parameters
+_LIT(KAttrid, "Attrid");
+_LIT(KTBTDevAddr, "tbtdevaddr");
+_LIT(KIntDevAddr, "integerdevaddr");
+_LIT(KTBTSearchPattern, "tbtsearchpattern");
+_LIT(KTBTAttrIdList, "tbtattridlist");
+_LIT(KAttrValListName, "tbtattrvaluelist");
+_LIT(KListType, "type");
+_LIT(KExpectedRecordsCount, "expectedServRecCount");
+
+const TInt KDefaultCount = -1;
+/*@}*/
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CT_DataSdpAgent* CT_DataSdpAgent::NewL()
+ {
+ CT_DataSdpAgent* ret=new (ELeave) CT_DataSdpAgent();
+ CleanupStack::PushL(ret);
+ ret->ConstructL();
+ CleanupStack::Pop(ret);
+ return ret;
+ }
+
+CT_DataSdpAgent::CT_DataSdpAgent()
+: iSdpAgent(NULL)
+, iAttrValueList(NULL)
+, iExpectedRecordsCount(KDefaultCount)
+, iAttrValArray()
+, iAttrReqIndex(0)
+, iNextRecReqIndex(0)
+ {
+ }
+
+void CT_DataSdpAgent::ConstructL()
+ {
+ }
+
+CT_DataSdpAgent::~CT_DataSdpAgent()
+ {
+ DestroyData();
+ }
+
+void CT_DataSdpAgent::SetObjectL(TAny* aAny)
+ {
+ DestroyData();
+ iSdpAgent = static_cast<CSdpAgent*> (aAny);
+ }
+
+void CT_DataSdpAgent::DisownObjectL()
+ {
+ iSdpAgent = NULL;
+ }
+
+void CT_DataSdpAgent::DestroyData()
+ {
+ delete iSdpAgent;
+ iSdpAgent=NULL;
+
+ // Do not delete these as we do not own them
+ iAttrValueList=NULL;
+ }
+
+inline TCleanupOperation CT_DataSdpAgent::CleanupOperation()
+ {
+ return CleanupOperation;
+ }
+
+void CT_DataSdpAgent::CleanupOperation(TAny* aAny)
+ {
+ CSdpAgent* agent=static_cast<CSdpAgent*>(aAny);
+ delete agent;
+ }
+
+void CT_DataSdpAgent::AttributeRequestComplete(TSdpServRecordHandle aHandle, TInt aError)
+ {
+ INFO_PRINTF2(_L("MSdpAttributeValueVisitor::AttributeRequestComplete Call: aHandle = %d"),aHandle);
+ DecOutstanding();
+ if ( aHandle!=iSSRHandle)
+ {
+ ERR_PRINTF2(_L("Service record handle not as expected: expected = %d"), iSSRHandle);
+ SetAsyncError(iAttrReqIndex, KErrGeneral);
+ }
+ if ( aError!=KErrNone)
+ {
+ ERR_PRINTF2(_L("AttributeRequestComplete Call failed: aError = %d"),aError);
+ SetAsyncError(iAttrReqIndex, aError);
+ }
+ }
+
+void CT_DataSdpAgent::AttributeRequestResult(TSdpServRecordHandle aHandle,
+ TSdpAttributeID /*aAttrID*/, CSdpAttrValue* aAttrValue)
+ {
+ INFO_PRINTF2(_L("MSdpAttributeValueVisitor::AttributeRequestResult Call: aHandle = %d"),aHandle);
+ if ( aHandle!=iSSRHandle)
+ {
+ ERR_PRINTF2(_L("Service record handle not as expected: expected = %d"), iSSRHandle);
+ SetAsyncError(iAttrReqIndex, KErrGeneral);
+ }
+ if (aAttrValue)
+ {
+ INFO_PRINTF1(_L("Append to Array!"));
+ iAttrValArray.Append(aAttrValue);
+ }
+ }
+
+void CT_DataSdpAgent::NextRecordRequestComplete(TInt aError,
+ TSdpServRecordHandle aHandle, TInt aTotalRecordsCount)
+ {
+ DecOutstanding();
+ INFO_PRINTF2(_L("MSdpAttributeValueVisitor::NextRecordRequestComplete Call ! Number of records: %d"),aTotalRecordsCount);
+ if (aError!=KErrNone)
+ {
+ ERR_PRINTF2(_L("Disconnected: %d"), aError);
+ SetAsyncError(iNextRecReqIndex, aError);
+ }
+ else
+ {
+ if(aTotalRecordsCount!=iExpectedRecordsCount && iExpectedRecordsCount!=KDefaultCount)
+ {
+ ERR_PRINTF2(_L("Number of service records not as expected: expected = %d"),iExpectedRecordsCount);
+ SetBlockResult(EFail);
+ }
+ if(aTotalRecordsCount!=0)
+ {
+ INFO_PRINTF1(_L("Found Service."));
+ iSSRHandle = aHandle;
+ }
+ }
+ }
+
+
+const RPointerArray<CSdpAttrValue>& CT_DataSdpAgent::GetAttrValArray()
+ {
+ return iAttrValArray;
+ }
+
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand The command to process
+ * @param aSection The section in the ini containing data for the command
+ * @param aAsyncErrorIndex Command index for async calls to return errors to
+ *
+ * @return ETrue if the command is processed
+ *
+ * @leave System wide error
+ */
+TBool CT_DataSdpAgent::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+ {
+ TBool ret = ETrue;
+
+ //-------------------------------------------------------------------------
+ // CSdpAgent
+ //-------------------------------------------------------------------------
+ if ( aCommand==KCmdNewL )
+ {
+ DoCmdNewL(aSection);
+ }
+ else if ( aCommand==KCmdNewLC )
+ {
+ DoCmdNewLC(aSection);
+ }
+ else if ( aCommand==KCmdSetRecordFilterL )
+ {
+ DoCmdSetRecordFilterL(aSection);
+ }
+ else if ( aCommand==KCmdNextRecordRequestL )
+ {
+ DoCmdNextRecordRequestL(aSection, aAsyncErrorIndex);
+ }
+ else if ( aCommand==KCmdSetAttributePredictorListL )
+ {
+ DoCmdSetAttributePredictorListL(aSection);
+ }
+ else if ( aCommand==KCmdAttributeRequestL )
+ {
+ DoCmdAttributeRequestL(aSection, aAsyncErrorIndex);
+ }
+ else if ( aCommand==KCmdCancel )
+ {
+ DoCmdCancel();
+ }
+ else if ( aCommand==KCmdDestructor )
+ {
+ DoCmdDestructor();
+ }
+ else if ( aCommand==KCmdMSAN_ExtensionInterfaceL )
+ {
+ DoCmdMSAN_ExtensionInterfaceL();
+ }
+ else
+ {
+ ret=EFalse;
+ }
+
+ return ret;
+ }
+//CSdpAgent helper methods
+
+void CT_DataSdpAgent::DoCmdNewL(const TDesC& aSection)
+ {
+ DestroyData();
+ TPtrC tBTDevAddrName;
+ TBool foundParameter=EFalse;
+ INFO_PRINTF1(_L("CSdpAgent NewL call"));
+ if( GetStringFromConfig(aSection, KTBTDevAddr(), tBTDevAddrName))
+ {
+ foundParameter=ETrue;
+ CT_BTDevAddrData* tBTDevAddrData=static_cast<CT_BTDevAddrData*>(GetDataWrapperL(tBTDevAddrName));
+ const TBTDevAddr* btDevAddr = tBTDevAddrData->GetAddress();
+ TRAPD(err, iSdpAgent = CSdpAgent::NewL(*this, *btDevAddr));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent NewL failed with error %d"), err);
+ SetError(err);
+ }
+ }
+ TInt intBtDevAddr=0;
+ if( GetIntFromConfig(aSection, KIntDevAddr(), intBtDevAddr))
+ {
+ foundParameter=ETrue;
+ const TBTDevAddr btDevAddr(intBtDevAddr);
+ TRAPD(err, iSdpAgent = CSdpAgent::NewL(*this, btDevAddr));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent NewL failed with error %d"), err);
+ SetError(err);
+ }
+ }
+
+ if( !foundParameter )
+ {
+ ERR_PRINTF2(_L("Missing parameter %S"), &KIntDevAddr());
+ SetBlockResult(EFail);
+ }
+ }
+
+void CT_DataSdpAgent::DoCmdNewLC(const TDesC& aSection)
+ {
+ DestroyData();
+ TPtrC tBTDevAddrName;
+ TBool foundParameter=EFalse;
+
+ if( GetStringFromConfig(aSection, KTBTDevAddr(), tBTDevAddrName))
+ {
+ foundParameter=ETrue;
+ CT_BTDevAddrData* tBTDevAddrData=static_cast<CT_BTDevAddrData*>(GetDataWrapperL(tBTDevAddrName));
+ TBTDevAddr btDevAddr = *tBTDevAddrData->GetAddress();
+ TBuf<KMaxSockAddrSize> tmpBuf2;
+ btDevAddr.GetReadable(tmpBuf2);
+
+ TRAPD(err, iSdpAgent = CSdpAgent::NewLC(*this, btDevAddr); CleanupStack::Pop(iSdpAgent));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent NewLC failed with error %d"), err);
+ SetError(err);
+ }
+ }
+
+ TInt intBtDevAddr=0;
+ if( GetIntFromConfig(aSection, KIntDevAddr(), intBtDevAddr))
+ {
+ foundParameter=ETrue;
+ const TBTDevAddr btDevAddr(intBtDevAddr);
+ TRAPD(err, iSdpAgent = CSdpAgent::NewLC(*this, btDevAddr));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent NewLC failed with error %d"), err);
+ SetError(err);
+ }
+ }
+
+ if( !foundParameter )
+ {
+ ERR_PRINTF2(_L("Missing parameter %S"), &KIntDevAddr());
+ SetBlockResult(EFail);
+ }
+ }
+
+void CT_DataSdpAgent::DoCmdSetRecordFilterL(const TDesC& aSection)
+ {
+ INFO_PRINTF1(_L("CSdpAgent SetRecordFilterL call"));
+ TPtrC searchPatternName;
+ if( GetStringFromConfig(aSection, KTBTSearchPattern(), searchPatternName))
+ {
+ CSdpSearchPattern* searchPattern = static_cast<CSdpSearchPattern*>(GetDataObjectL(searchPatternName));
+ // Set the search pattern on the agent
+ TRAPD(err, iSdpAgent->SetRecordFilterL(*searchPattern));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent SetRecordFilterL failed with error %d"), err);
+ SetError(err);
+ }
+ }
+ else
+ {
+ ERR_PRINTF2(_L("Missing parameter %S"), &KTBTSearchPattern());
+ SetBlockResult(EFail);
+ }
+ }
+
+void CT_DataSdpAgent::DoCmdNextRecordRequestL(const TDesC& aSection, const TInt aIndex)
+ {
+ INFO_PRINTF1(_L("CSdpAgent NextRecordRequestL call"));
+ iExpectedRecordsCount = KDefaultCount;
+ TRAPD(err, iSdpAgent->NextRecordRequestL());
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent NextRecordRequestL failed with error %d"), err);
+ SetError(err);
+ }
+ else
+ {
+ IncOutstanding();
+ iNextRecReqIndex = aIndex;
+ /*
+ The expected count is optional.
+ This API will be called in most of test cases and it's probably not neccessary to
+ check the count everytime. Especially when this class isn't the focus of testing.
+ */
+ GetIntFromConfig(aSection, KExpectedRecordsCount(), iExpectedRecordsCount);
+ }
+ }
+
+void CT_DataSdpAgent::DoCmdSetAttributePredictorListL(const TDesC& aSection)
+ {
+ INFO_PRINTF1(_L("CSdpAgent SetAttributePredictorListL call"));
+ TPtrC dataAttrIdListName;
+
+ if( GetStringFromConfig(aSection, KTBTAttrIdList(), dataAttrIdListName))
+ {
+ CSdpAttrIdMatchList* attrIdList = static_cast<CSdpAttrIdMatchList*>(GetDataObjectL(dataAttrIdListName));
+
+ TRAPD(err, iSdpAgent->SetAttributePredictorListL(*attrIdList));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent SetAttributePredictorListL failed with error %d"), err);
+ SetError(err);
+ }
+ }
+ else
+ {
+ ERR_PRINTF2(_L("Missing parameter %S"), &KTBTAttrIdList());
+ SetBlockResult(EFail);
+ }
+ }
+
+void CT_DataSdpAgent::DoCmdCancel()
+ {
+ iSdpAgent->Cancel();
+ }
+
+void CT_DataSdpAgent::DoCmdDestructor()
+ {
+ DestroyData();
+ }
+
+void CT_DataSdpAgent::DoCmdMSAN_ExtensionInterfaceL()
+ {
+ INFO_PRINTF1(_L("MSdpAgentNotifier MSAN_ExtensionInterfaceL call"));
+ void* tmpVoid;
+ TRAPD(err, this->MSAN_ExtensionInterfaceL(KNullUid, tmpVoid));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("MSdpAgentNotifier MSAN_ExtensionInterfaceL failed with error %d"), err);
+ SetError(err);
+ }
+ }
+
+void CT_DataSdpAgent::DoCmdAttributeRequestL(const TDesC& aSection, const TInt aIndex)
+ {
+ TInt attrId;
+ TPtrC attrValListName;
+ TPtrC theType;
+ TPtrC dataAttrIdListName;
+ TPtrC expectedAttrValListName;
+ CSdpAttrIdMatchList* attrIdList=NULL;
+ TBool ifAttrIdExist=EFalse;
+ TBool ifAttrValListExist=EFalse;
+ TBool ifAttrIdListExist=EFalse;
+
+
+ // Get AttrId from config (test data) file
+ if( GetIntFromConfig(aSection, KAttrid(), attrId) )
+ {
+ ifAttrIdExist=ETrue;
+ }
+
+ //Get dictionary name of AttrValueList Wrapper
+ if( GetStringFromConfig(aSection, KAttrValListName(), attrValListName) )
+ {
+ //Get the list type to cast to
+ if( GetStringFromConfig(aSection, KListType(), theType) )
+ {
+ ifAttrValListExist=ETrue;
+ iAttrValueList = CT_BTUtil::AttrValueListCastL(*this, attrValListName, theType);
+ }
+ }
+
+ //Get the dictionary name of AttrIdMatchList Wrapper
+ if( GetStringFromConfig(aSection, KTBTAttrIdList(), dataAttrIdListName) )
+ {
+ ifAttrIdListExist=ETrue;
+ attrIdList = static_cast<CSdpAttrIdMatchList*>(GetDataObjectL(dataAttrIdListName));
+ }
+
+ TInt err=KErrNone;
+ iAttrReqIndex = aIndex;
+ if(!ifAttrValListExist && ifAttrIdExist)
+ {
+ INFO_PRINTF1(_L("CSdpAgent AttributeRequestL(TSdpServRecordHandle, TSdpAttributeID) call"));
+ TRAP(err, iSdpAgent->AttributeRequestL(iSSRHandle, attrId));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent AttributeRequestL failed with error %d"), err);
+ SetError(err);
+ }
+ else
+ {
+ IncOutstanding();
+ }
+ }
+ else if(ifAttrValListExist && ifAttrIdExist)
+ {
+ INFO_PRINTF1(_L("CSdpAgent AttributeRequestL(MSdpElementBuilder, TSdpServRecordHandle, TSdpAttributeID) call"));
+ TRAP(err, iSdpAgent->AttributeRequestL(iAttrValueList, iSSRHandle, attrId));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent AttributeRequestL failed with error %d"), err);
+ SetError(err);
+ }
+ else
+ {
+ IncOutstanding();
+ }
+ }
+ else if(!ifAttrValListExist && ifAttrIdListExist)
+ {
+ INFO_PRINTF1(_L("CSdpAgent AttributeRequestL(TSdpServRecordHandle, const CSdpAttrIdMatchList&) call"));
+ TRAP(err, iSdpAgent->AttributeRequestL(iSSRHandle, *attrIdList));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent AttributeRequestL failed with error %d"), err);
+ SetError(err);
+ }
+ else
+ {
+ IncOutstanding();
+ }
+ }
+ else if(ifAttrValListExist && ifAttrIdListExist)
+ {
+ INFO_PRINTF1(_L("CSdpAgent AttributeRequestL(MSdpElementBuilder, TSdpServRecordHandle, const CSdpAttrIdMatchList&) call"));
+ TRAP(err, iSdpAgent->AttributeRequestL(iAttrValueList, iSSRHandle, *attrIdList));
+ if(err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSdpAgent AttributeRequestL failed with error %d"), err);
+ SetError(err);
+ }
+ else
+ {
+ IncOutstanding();
+ }
+ }
+ else
+ {
+ ERR_PRINTF2(_L("Missing parameter %S"), &KTBTAttrIdList());
+ SetBlockResult(EFail);
+ }
+ }