datacommsserver/esockserver/commsdataobjects/src/connectionqueryset.cpp
changeset 0 dfb7c4ff071f
child 23 cbb19216b74d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/commsdataobjects/src/connectionqueryset.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,335 @@
+// 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
+ @internalTechnology
+*/
+
+#include "connectionqueryset.h"
+#include <commsdat.h>
+#include <comms-infras/ss_commsdataobject.h>
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_ESockCommDatObjc, "ESockCommDatObjc");
+#endif
+
+using namespace Meta;
+using namespace ESock;
+
+
+// -------- Connection Settings Query Set -------- 
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XConnectionQuerySet, CCommsDataObjectFactory::iUid, XConnectionQuerySet::iUid)
+	REGISTER_ATTRIBUTE(XConnectionQuerySet, iQueries, TMetaObject<XConnectionQuerySet::RMetaDataQueryContainer>)
+END_ATTRIBUTE_TABLE()
+
+
+EXPORT_C XConnectionQueryBase* XConnectionQuerySet::FindQuery(const XConnectionQueryBase& aQuery) const
+	{
+	XConnectionQueryBase* query = NULL;
+	TConnectionQueryIter iter(GetQueryIter(XConnectionQueryBase::ENotAnswered | XConnectionQueryBase::EAnswered));
+	query = iter++;
+	while (query) 
+		{
+		if (query->Match(aQuery)) 
+			{
+			return query;
+			}
+			
+		query = iter++;
+		}
+		
+	return NULL;
+	}
+	
+
+EXPORT_C XCommsDataObject::TProgressAction XConnectionQuerySet::DispatchL(TAny *aItfPtr, ESock::MPlatsecApiExt* aPlatsecItf)
+	{
+	MQueryConnSettingsApiExt* interface = reinterpret_cast<MQueryConnSettingsApiExt*>(aItfPtr);
+
+	TConnectionQueryIter iter = GetQueryIter(XConnectionQueryBase::ENotAnswered);
+	XConnectionQueryBase* query = iter++;
+	TInt queriesRemaining(0);
+	while (query) 
+		{
+		queriesRemaining++;
+		query->GetSetting(interface, aPlatsecItf);
+		if (query->IsQueryAnswered()) 
+			{
+			queriesRemaining--;
+			}
+		query = iter++;
+		}
+	
+	return (queriesRemaining > 0) ? XCommsDataObject::EContinue : XCommsDataObject::EComplete;
+	}
+
+EXPORT_C void XConnectionQuerySet::XNullQuery::GetSetting(MQueryConnSettingsApiExt* /*aItfPtr*/, MPlatsecApiExt* /*aPlatsecItf*/)
+	{
+	// Null Query has no value to get - impl here to satisfy abstract base class
+
+#ifdef __X86GCC__
+	// Ugly hack: GCC3.4 needs extra persuasion to unroll enough of the template; without this it won't link with a missing vtbl
+	RMetaDataContainer<ESock::XConnectionQueryBase> unused;
+	(void) unused;
+#endif
+	}
+
+
+
+// -------- Individual Connection Queries -------- 
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XConnectionQueryBase, XConnectionQuerySet::iUid, XConnectionQueryBase::ENull)
+	REGISTER_ATTRIBUTE(XConnectionQueryBase, iQueryFlags, TMeta<TUint32>)
+	REGISTER_ATTRIBUTE(XConnectionQueryBase, iError, TMetaNumber)
+	REGISTER_ATTRIBUTE(XConnectionQueryBase, iElementId, TMeta<CommsDat::TMDBElementId>)
+	REGISTER_ATTRIBUTE(XConnectionQueryBase, iType, TMeta<CommsDat::TCDFieldValueTypes>)
+END_ATTRIBUTE_TABLE()
+
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XConnectionQuerySet::XNullQuery, CConnectionQueryFactory::iUid, XConnectionQueryBase::ENull)
+END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0)
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XBoolQuery, CConnectionQueryFactory::iUid, XConnectionQueryBase::EBool)
+	REGISTER_ATTRIBUTE(XBoolQuery, iData, TMeta<TBool>)
+END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0)
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XUintQuery, CConnectionQueryFactory::iUid, XConnectionQueryBase::EUint)
+	REGISTER_ATTRIBUTE(XUintQuery, iData, TMeta<TUint32>)
+END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0)
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XIntQuery, CConnectionQueryFactory::iUid, XConnectionQueryBase::EInt)
+	REGISTER_ATTRIBUTE(XIntQuery, iData, TMeta<TInt>)
+END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0)
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XText8Query, CConnectionQueryFactory::iUid, XConnectionQueryBase::EText8)
+	REGISTER_ATTRIBUTE(XText8Query, iData, TMetaBuf8)
+END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0)
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XText16Query, CConnectionQueryFactory::iUid, XConnectionQueryBase::EText16)
+	REGISTER_ATTRIBUTE(XText16Query, iData, TMetaBuf16)
+END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0)
+
+
+
+EXPORT_C XConnectionQueryBase* XConnectionQueryBase::LoadL(TPtrC8& aDes)
+	{
+	// LoadL methods are expected to strip the type Id from the buffer
+	STypeId typeId = STypeId::CreateSTypeId(aDes); // This STypeId c'tor overload will adjust aDes
+	__ASSERT_DEBUG(typeId.iUid.iUid == CConnectionQueryFactory::iUid && typeId.iType != XConnectionQueryBase::ENull, User::Panic(KSpecAssert_ESockCommDatObjc, 1));
+	
+	XConnectionQueryBase* query = NULL;
+	switch (typeId.iType)
+		{
+		case XConnectionQueryBase::EBool:
+			query = new (ELeave)XBoolQuery();
+			break;
+			
+		case XConnectionQueryBase::EInt:
+			query = new (ELeave)XIntQuery();
+			break;
+			
+		case XConnectionQueryBase::EUint:
+			query = new (ELeave)XUintQuery();
+			break;
+			
+		case XConnectionQueryBase::EText8: 
+			query = new (ELeave)XText8Query();
+			break;
+			
+		case XConnectionQueryBase::EText16:
+			query = new (ELeave)XText16Query();
+			break;
+
+		default:
+			// Some unknown type in the descriptor
+			User::Leave(KErrCorrupt);
+		}
+	
+	CleanupStack::PushL(query);
+	TInt err = query->Load(aDes);
+	User::LeaveIfError(err);
+	CleanupStack::Pop(query);
+	return query;
+	}
+	
+
+
+EXPORT_C void XConnectionQueryBase::SetQueryAnswered()
+	{
+	SetFlags(EAnswered);
+	ClearFlags(ENotAttempted);
+	}
+	
+
+EXPORT_C void XConnectionQueryBase::SetFlags(TUint32 aFlags)
+	{
+	const TUint answeredFlags = ENotAnswered | EAnswered;
+	
+	// Can't be answered and not answered
+	__ASSERT_DEBUG((aFlags & answeredFlags) != answeredFlags, User::Panic(KSpecAssert_ESockCommDatObjc, 2));
+	
+	if (aFlags & EAnswered)
+		{
+		iQueryFlags &= ~ENotAnswered;	// Clear ENotAnswered
+		iQueryFlags |= EAnswered;		// Set EAnswered
+		}
+	else if (aFlags & ENotAnswered) 
+		{
+		iQueryFlags &= ~ EAnswered;		// Clear EAnswered
+		iQueryFlags |= ENotAnswered;	// Set ENotAnswered
+		}
+		
+	// Set flags except for EAnswered or ENotAnswered
+	iQueryFlags |= (aFlags & ~answeredFlags);
+	}
+
+
+EXPORT_C void XConnectionQueryBase::ClearFlags(TUint32 aFlags)
+	{
+	const TUint answeredFlags = ENotAnswered | EAnswered;
+	
+	// Can't be answered and not answered
+	__ASSERT_DEBUG((aFlags & answeredFlags) != answeredFlags, User::Panic(KSpecAssert_ESockCommDatObjc, 3));	
+	
+	if (aFlags & EAnswered)
+		{
+		iQueryFlags &= ~EAnswered;		// Clear EAnswered
+		iQueryFlags |= ENotAnswered;	// Set ENotAnswered
+		}
+	else if (aFlags & ENotAnswered) 
+		{
+		iQueryFlags &= ~ENotAnswered;	// Clear ENotAnswered
+		iQueryFlags |= EAnswered;		// Set EAnswered
+		}
+		
+	// Clear flags except for EAnswered or ENotAnswered
+	iQueryFlags &= (~aFlags | answeredFlags);
+	}
+
+
+EXPORT_C void XConnectionQueryBase::SetError(TInt aError)
+	{
+	iError = aError;
+	if (aError == KErrNone) 
+		{
+		ClearFlags(EFailed|ENotAttempted);
+		}
+	else
+		{
+		ClearFlags(ENotAttempted);
+		SetFlags(EFailed);
+		}
+	}
+
+
+EXPORT_C XConnectionQuerySet::~XConnectionQuerySet()
+	{
+	iQueries.ResetAndDestroy();
+	iQueries.Close();
+	}
+
+
+
+EXPORT_C XBoolQuery::~XBoolQuery()
+	{
+	}
+	
+EXPORT_C void XBoolQuery::GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf)
+	{
+	TInt err = aItfPtr->GetBool(ElementId(), iData, aPlatsecItf);
+	if (err == KErrNone)
+		{
+		SetQueryAnswered();
+		}
+	SetError(err);
+	}
+
+	
+EXPORT_C XUintQuery::~XUintQuery()
+	{
+	}
+
+EXPORT_C void XUintQuery::GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf)
+	{
+	TInt err = aItfPtr->GetInt(ElementId(), iData, aPlatsecItf);
+	if (err == KErrNone)
+		{
+		SetQueryAnswered();
+		}
+	SetError(err);
+	}
+	
+	
+EXPORT_C XIntQuery::~XIntQuery()
+	{
+	}
+
+EXPORT_C void XIntQuery::GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf)
+	{
+	TInt err = aItfPtr->GetInt(ElementId(), iData, aPlatsecItf);
+	if (err == KErrNone)
+		{
+		SetQueryAnswered();
+		}
+	SetError(err);
+	}
+	
+	
+EXPORT_C XText8Query::~XText8Query()
+	{
+	iData.Close();
+	}
+
+EXPORT_C void XText8Query::GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf)
+	{
+	HBufC8* data = NULL;
+	TInt err = aItfPtr->GetText(ElementId(), data, aPlatsecItf);
+	if (err == KErrNone)
+		{
+		iData.Close();
+		iData.Create(data->Des());
+
+		SetQueryAnswered();
+		}
+	delete data;
+	SetError(err);
+	}
+
+
+EXPORT_C XText16Query::~XText16Query()
+	{
+	iData.Close();
+	}
+
+EXPORT_C void XText16Query::GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf)
+	{
+	HBufC16* data = NULL;
+	TInt err = aItfPtr->GetText(ElementId(), data, aPlatsecItf);
+	if (err == KErrNone)
+		{
+		iData.Close();
+		iData.Create(data->Des());
+		
+		SetQueryAnswered();
+		}
+	delete data;
+	SetError(err);
+	}
+