diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/commsdataobjects/inc/connectionqueryset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/commsdataobjects/inc/connectionqueryset.h Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,733 @@ +// 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 +*/ + +#ifndef CONNECTIONQUERYSET_H +#define CONNECTIONQUERYSET_H + +#include +#include +#include +#include +#include +#include +#include + +#include + +const TUint KConnectionQuerySetUid = 0x10282FF4; +const TUint KTunnelConnQuerySetUid = 0x10285E07; +_LIT(KPanicIllegalLayer, "Illegal layer number"); + +namespace ESock +{ +class XConnectionQuerySet; +class MQueryConnSettingsApiExt; + +class XConnectionQueryBase : public Meta::SMetaDataECom + { + +public: + enum TQueryFlags + { + ENotAnswered = 0x01, // Either Not Attempted or Failed + EAnswered = 0x02, // Answered Successfully + EFailed = 0x04, // Attempted and Failed (see error code for reason) + ENotAttempted = 0x08, // The query has not been attempted (as in nothing has set failed or answered) + }; + + enum TQueryDataType + { + ENull = 0, + EBool, + EInt, + EUint, + EText8, + EText16, + }; + + IMPORT_C static XConnectionQueryBase* LoadL(TPtrC8& aDes); + + TBool Match(const XConnectionQueryBase& aQuery) const + { + return iElementId == aQuery.iElementId; + } + + inline CommsDat::TMDBElementId ElementId() const + { + return iElementId; + } + + inline TQueryDataType Type() const + { + return iType; + } + + inline TUint32 Flags() const + { + const TUint KSupportedFlags = (ENotAnswered | EAnswered | EFailed | ENotAttempted); + return iQueryFlags & KSupportedFlags; + } + + inline TInt Error() const + { + return iError; + } + + inline TBool IsQueryAnswered() const + { + return (iQueryFlags & EAnswered) == EAnswered; + } + + IMPORT_C virtual void GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf) = 0; + +protected: + XConnectionQueryBase() + : iQueryFlags(ENotAnswered|ENotAttempted), iError(KErrNone), + iElementId(0), iType(XConnectionQueryBase::ENull) + { + } + + XConnectionQueryBase(CommsDat::TMDBElementId aElementId, XConnectionQueryBase::TQueryDataType aType) + : iQueryFlags(ENotAnswered|ENotAttempted), iError(KErrNone), + iElementId(aElementId), iType(aType) + { + } + + inline void SetElementId(CommsDat::TMDBElementId aElementId) + { + iElementId = aElementId; + } + + void SetError(TInt aError); + void SetQueryAnswered(); + +private: + void SetFlags(TUint32 aFlags); + void ClearFlags(TUint32 aFlags); + +protected: + EXPORT_DATA_VTABLE_AND_FN + +private: + TUint32 iQueryFlags; + TInt iError; + TQueryDataType iType; + CommsDat::TMDBElementId iElementId; + }; + + + +class XBoolQuery : public XConnectionQueryBase + { + friend class CConnectionQueryFactory; + friend class XConnectionQueryBase; + +public: + static inline XBoolQuery* NewL(CommsDat::TMDBElementId aElementId); + static inline XBoolQuery* NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet); + + IMPORT_C virtual ~XBoolQuery(); + + inline const TBool Data() const + { + return iData; + } + +protected: + // From XConnectionQueryBase + IMPORT_C virtual void GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf); + +private: + inline XBoolQuery() + : XConnectionQueryBase(0, XConnectionQueryBase::EBool) + { + } + + inline XBoolQuery(CommsDat::TMDBElementId aElementId) + : XConnectionQueryBase(aElementId, XConnectionQueryBase::EBool) + { + } + + inline void SetData(TBool aData) + { + iData = aData; + } + +private: + EXPORT_DATA_VTABLE_AND_FN + +private: + TBool iData; + }; + + +class XUintQuery : public XConnectionQueryBase + { + friend class CConnectionQueryFactory; + friend class XConnectionQueryBase; + +public: + static inline XUintQuery* NewL(CommsDat::TMDBElementId aElementId); + static inline XUintQuery* NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet); + + IMPORT_C virtual ~XUintQuery(); + + inline const TUint32 Data() const + { + return iData; + } + +protected: + // From XConnectionQueryBase + IMPORT_C virtual void GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf); + +private: + inline XUintQuery() + : XConnectionQueryBase(0, XConnectionQueryBase::EUint) + { + } + + inline XUintQuery(CommsDat::TMDBElementId aElementId) + : XConnectionQueryBase(aElementId, XConnectionQueryBase::EUint) + { + } + + inline void SetData(TUint32 aData) + { + iData = aData; + } + +private: + EXPORT_DATA_VTABLE_AND_FN + +private: + TUint32 iData; + }; + + + +class XIntQuery : public XConnectionQueryBase + { + friend class CConnectionQueryFactory; + friend class XConnectionQueryBase; + +public: + static inline XIntQuery* NewL(CommsDat::TMDBElementId aElementId); + static inline XIntQuery* NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet); + + IMPORT_C virtual ~XIntQuery(); + + inline const TInt Data() const + { + return iData; + } + +protected: + // From XConnectionQueryBase + IMPORT_C virtual void GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf); + +private: + inline XIntQuery() + : XConnectionQueryBase(0, XConnectionQueryBase::EInt) + { + } + + inline XIntQuery(CommsDat::TMDBElementId aElementId) + : XConnectionQueryBase(aElementId, XConnectionQueryBase::EInt) + { + } + + inline void SetData(TInt aData) + { + iData = aData; + } + +private: + EXPORT_DATA_VTABLE_AND_FN + +private: + TInt iData; + }; + + +class XText8Query : public XConnectionQueryBase + { + friend class CConnectionQueryFactory; + friend class XConnectionQueryBase; + +public: + static inline XText8Query* NewL(CommsDat::TMDBElementId aElementId); + static inline XText8Query* NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet); + + IMPORT_C virtual ~XText8Query(); + + inline const TDesC8& Data() const + { + return iData; + } + +protected: + // From XConnectionQueryBase + IMPORT_C virtual void GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf); + +private: + inline XText8Query() + : XConnectionQueryBase(0, XConnectionQueryBase::EText8) + { + } + + inline XText8Query(CommsDat::TMDBElementId aElementId) + : XConnectionQueryBase(aElementId, XConnectionQueryBase::EText8) + { + } + + inline void SetData(const TDesC8& aData) + { + iData.Close(); + iData.Create(aData); + } + +private: + EXPORT_DATA_VTABLE_AND_FN + +private: + RBuf8 iData; + }; + + +class XText16Query : public XConnectionQueryBase + { + friend class CConnectionQueryFactory; + friend class XConnectionQueryBase; + +public: + static inline XText16Query* NewL(CommsDat::TMDBElementId aElementId); + static inline XText16Query* NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet); + + IMPORT_C virtual ~XText16Query(); + + inline const TDesC16& Data() const + { + return iData; + } + +protected: + // From XConnectionQueryBase + IMPORT_C virtual void GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf); + +private: + inline XText16Query() + : XConnectionQueryBase(0, XConnectionQueryBase::EText16) + { + } + + inline XText16Query(CommsDat::TMDBElementId aElementId) + : XConnectionQueryBase(aElementId, XConnectionQueryBase::EText16) + { + } + +private: + EXPORT_DATA_VTABLE_AND_FN + +private: + RBuf16 iData; + }; + + + +class TConnectionQueryIter + { +public: + explicit inline TConnectionQueryIter(const Meta::RMetaDataContainer& aQueries, TUint aFilter) + : iQueries(aQueries), iFilter(aFilter), iIndex(0) + { + } + + inline void SetToLast() + { + iIndex = iQueries.Count() - 1; + } + + inline XConnectionQueryBase* operator++(TInt /*aInd*/) //-postfix + { + XConnectionQueryBase* query = Find(iIndex, +1, 1); + iIndex++; + return query; + } + + inline XConnectionQueryBase* operator++() //-prefix + { + ++iIndex; + return Find(iIndex, +1, 1); + } + + inline XConnectionQueryBase* operator--(TInt /*aInd*/) //-postfix + { + XConnectionQueryBase* query = Find(iIndex, -1, 1); + iIndex--; + return query; + } + + inline XConnectionQueryBase* operator[](TInt aInd) + { + // assuming at present that array indices start from beginning of array + // rather than current location of iterator, and array access doesn't + // change location of iterator. + TInt prevIndex = iIndex; + TInt start = 0; + XConnectionQueryBase* query = Find(start, +1, aInd + 1); + iIndex = prevIndex; + return query; + } + + inline XConnectionQueryBase* operator*() + { + return Find(iIndex, +1, 0); + } + + +private: + XConnectionQueryBase* Find(TInt& aIndex, TInt aDirection, TInt aCount) + { + while (aIndex >= 0 && aIndex < iQueries.Count()) + { + XConnectionQueryBase* query = static_cast(iQueries[aIndex]); + if ((query->Flags() & iFilter) && (--aCount <= 0)) + { + iIndex = aIndex; + return query; + } + aIndex += aDirection; + } + return NULL; + } + + +private: + const Meta::RMetaDataContainer& iQueries; + TUint iFilter; + TInt iIndex; + }; + + + +class CConnectionQuerySet; +class XConnectionQuerySet : public XCommsDataObject + { + friend class CCommsDataObjectFactory; + friend class CCommsDataObject; + friend class CConnectionQueryFactory; + +private: + /** + Null query object used internally for finding a query with a particular + element id + @internalComponent + */ + class XNullQuery : public XConnectionQueryBase + { + friend class ESock::CConnectionQueryFactory; + friend class ESock::XConnectionQuerySet; + + public: + static inline XNullQuery* NewL(CommsDat::TMDBElementId aElementId) + { + XNullQuery* query = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::ENull))); + query->SetElementId(aElementId); + return query; + } + + protected: + // From XConnectionQueryBase + IMPORT_C virtual void GetSetting(MQueryConnSettingsApiExt* aItfPtr, MPlatsecApiExt* aPlatsecItf); + + private: + XNullQuery() + { + } + + XNullQuery(CommsDat::TMDBElementId aElementId) + : XConnectionQueryBase(aElementId, XConnectionQueryBase::ENull) + { + } + + private: + EXPORT_DATA_VTABLE_AND_FN + }; + +public: + enum + { + iUid = KConnectionQuerySetUid + }; + + typedef Meta::RMetaDataContainer RMetaDataQueryContainer; + + static inline XConnectionQuerySet* NewL() + { + return static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CCommsDataObjectFactory::iUid, KConnectionQuerySetUid))); + } + + inline TConnectionQueryIter GetQueryIter(TUint aFilter) const + { + return TConnectionQueryIter(iQueries, aFilter); + } + + inline void AddQueryL(XConnectionQueryBase* const aQuery) + { + if (!aQuery) + { + User::Leave(KErrArgument); + } + + iQueries.AppendL(aQuery); + } + + + inline void ResetAndDestroy() + { + iQueries.ResetAndDestroy(); + } + + + inline XConnectionQueryBase* FindQuery(CommsDat::TMDBElementId aElementId) const + { + return FindQuery(XNullQuery(aElementId)); + } + + IMPORT_C XConnectionQueryBase* FindQuery(const XConnectionQueryBase& aQuery) const; + + IMPORT_C virtual ~XConnectionQuerySet(); + + // From XCommsDataObject + IMPORT_C virtual TProgressAction DispatchL(TAny* aItfPtr, ESock::MPlatsecApiExt* aPlatsecItf); + +protected: + inline XConnectionQuerySet() + : XCommsDataObject( + (TUint)(XCommsDataObject::EGetSupported | XCommsDataObject::EProgressive), + (TUint) MQueryConnSettingsApiExt::KInterfaceId) + { + } + +protected: + TUint iFilter; + +private: + EXPORT_DATA_VTABLE_AND_FN +protected: + RMetaDataQueryContainer iQueries; + }; + + + + +class CConnectionQuerySet : public CCommsDataObject + { +protected: + inline CConnectionQuerySet(XConnectionQuerySet* aDataObject) + : CCommsDataObject(aDataObject) + { + } + }; + +// ---------------- Inline methods ---------------- +inline XBoolQuery* XBoolQuery::NewL(CommsDat::TMDBElementId aElementId) + { + XBoolQuery* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EBool))); + self->SetElementId(aElementId); + return self; + } + +inline XBoolQuery* XBoolQuery::NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet) + { + XBoolQuery* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EBool))); + self->SetElementId(aElementId); + CleanupDeletePushL(self); + aQuerySet.AddQueryL(self); + CleanupStack::Pop(); + return self; + } + + + +inline XUintQuery* XUintQuery::NewL(CommsDat::TMDBElementId aElementId) + { + XUintQuery* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EUint))); + self->SetElementId(aElementId); + return self; + } + +inline XUintQuery* XUintQuery::NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet) + { + XUintQuery* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EUint))); + self->SetElementId(aElementId); + CleanupDeletePushL(self); + aQuerySet.AddQueryL(self); + CleanupStack::Pop(); + return self; + } + + + +inline XIntQuery* XIntQuery::NewL(CommsDat::TMDBElementId aElementId) + { + XIntQuery* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EInt))); + self->SetElementId(aElementId); + return self; + } + +inline XIntQuery* XIntQuery::NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet) + { + XIntQuery* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EInt))); + self->SetElementId(aElementId); + CleanupDeletePushL(self); + aQuerySet.AddQueryL(self); + CleanupStack::Pop(); + return self; + } + + + +inline XText8Query* XText8Query::NewL(CommsDat::TMDBElementId aElementId) + { + XText8Query* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EText8))); + self->SetElementId(aElementId); + return self; + } + +inline XText8Query* XText8Query::NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet) + { + XText8Query* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EText8))); + self->SetElementId(aElementId); + CleanupDeletePushL(self); + aQuerySet.AddQueryL(self); + CleanupStack::Pop(); + return self; + } + + + +inline XText16Query* XText16Query::NewL(CommsDat::TMDBElementId aElementId) + { + XText16Query* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EText16))); + self->SetElementId(aElementId); + return self; + } + +inline XText16Query* XText16Query::NewL(CommsDat::TMDBElementId aElementId, XConnectionQuerySet& aQuerySet) + { + XText16Query* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CConnectionQueryFactory::iUid, XConnectionQueryBase::EText16))); + self->SetElementId(aElementId); + CleanupDeletePushL(self); + aQuerySet.AddQueryL(self); + CleanupStack::Pop(); + return self; + } + + +class CTunnelConnQuerySet; +/** +For connection data query in a tunnel comms stack +The default constructor is for query on the bottom connection +@internalComponent +*/ +class XTunnelConnQuerySet : public XConnectionQuerySet + { +friend class CCommsDataObject; + +private: + EXPORT_DATA_VTABLE_AND_FN + TInt iLayerNum; + +public: + enum TTunnelQuerySpecLayer + { + EBottomIAPLayer = -1, + }; + + enum TTunnelQueryPanics + { + ETunnelQueryInvalidLayer = 1, + }; + +public: + inline XTunnelConnQuerySet() : iLayerNum(EBottomIAPLayer) + { + }; + + // (aLayerNum - 1) means the number of layer(s) be skipped + // aLayerNum must be greater than zero + inline XTunnelConnQuerySet(TInt aLayerNum) : iLayerNum(aLayerNum) + { + __ASSERT_ALWAYS(((0 == aLayerNum || aLayerNum < EBottomIAPLayer)), User::Panic(KPanicIllegalLayer, ETunnelQueryInvalidLayer)); + }; + +public: + enum + { + iUid = KTunnelConnQuerySetUid + }; + // Default one, gets the bottom IAP + static inline XTunnelConnQuerySet* NewL() + { + XTunnelConnQuerySet* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CCommsDataObjectFactory::iUid, KTunnelConnQuerySetUid))); + return self; + }; + + // Get the aLayerNumTH layer IAP + static inline XTunnelConnQuerySet* NewL(TInt aLayerNum) + { + XTunnelConnQuerySet* self = static_cast(Meta::SMetaDataECom::NewInstanceL(Meta::STypeId::CreateSTypeId(CCommsDataObjectFactory::iUid, KTunnelConnQuerySetUid))); + self->SetLayerNum(aLayerNum); + return self; + }; + + IMPORT_C virtual TProgressAction DispatchL(TAny *aItfPtr, ESock::MPlatsecApiExt* aPlatsecItf); + +private: + void inline SetLayerNum(TInt aLayerNum) + { + iLayerNum = aLayerNum; + }; + }; + + +class CTunnelConnQuerySet : public CCommsDataObject +{ +protected: + /** + C'tor for the CCommsDataObject class. + @param aDataObject A ptr to the data object to take ownership of + */ + inline CTunnelConnQuerySet(XTunnelConnQuerySet* aDataObject); +}; + + // ---------------- Inline methods ---------------- + inline CTunnelConnQuerySet::CTunnelConnQuerySet(XTunnelConnQuerySet* aDataObject) + : CCommsDataObject(aDataObject) + {}; + +} // namespace ESock + +#endif +// CONNECTIONQUERYSET_H + +