diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/commsdataobjects/src/connectionqueryset.cpp --- /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 +#include + + +#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) +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(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 unused; + (void) unused; +#endif + } + + + +// -------- Individual Connection Queries -------- + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XConnectionQueryBase, XConnectionQuerySet::iUid, XConnectionQueryBase::ENull) + REGISTER_ATTRIBUTE(XConnectionQueryBase, iQueryFlags, TMeta) + REGISTER_ATTRIBUTE(XConnectionQueryBase, iError, TMetaNumber) + REGISTER_ATTRIBUTE(XConnectionQueryBase, iElementId, TMeta) + REGISTER_ATTRIBUTE(XConnectionQueryBase, iType, TMeta) +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) +END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XUintQuery, CConnectionQueryFactory::iUid, XConnectionQueryBase::EUint) + REGISTER_ATTRIBUTE(XUintQuery, iData, TMeta) +END_ATTRIBUTE_TABLE_BASE(XConnectionQueryBase, 0) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN(XIntQuery, CConnectionQueryFactory::iUid, XConnectionQueryBase::EInt) + REGISTER_ATTRIBUTE(XIntQuery, iData, TMeta) +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); + } +