datacommsserver/esockserver/inc/es_availability.h
changeset 0 dfb7c4ff071f
child 78 dd4909eb54cd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/inc/es_availability.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,208 @@
+// Copyright (c) 2007-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
+ @publishedPartner
+ @released
+*/
+
+#ifndef SYMBIAN_AVAILABILITY_H
+#define SYMBIAN_AVAILABILITY_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_ESock_Availabili, "ESock_Availabili");
+#endif
+
+namespace ESock
+{
+
+/**
+Container for availability status. Used by availability plugins to pass availability information into the mesh machine.
+*/
+class TAvailabilityStatus
+	{
+public:
+	enum
+		{
+		EUnknownAvailabilityScore = -1,
+		EMinAvailabilityScore = 0,
+		EMaxAvailabilityScore = 100
+		};
+
+	TAvailabilityStatus()
+	:	iScore(EUnknownAvailabilityScore)
+		{
+		}
+
+	TAvailabilityStatus(TInt aScore)
+	:	iScore(aScore)
+		{
+		}
+
+	/**
+	@return ETrue if availability is known, EFalse otherwise.
+	*/
+	TBool IsKnown() const
+		{
+		return iScore >= EMinAvailabilityScore && iScore <= EMaxAvailabilityScore;
+		}
+
+	/**
+	@param aScore the availability score. Must be >= EMinAvailabilityScore and <= EMinAvailabilityScore.
+	*/
+	void SetScore(TInt aScore)
+		{
+		__ASSERT_DEBUG(aScore >= EMinAvailabilityScore && aScore <= EMaxAvailabilityScore, User::Panic(KSpecAssert_ESock_Availabili, 1));
+		iScore = aScore;
+		}
+
+	/**
+	Set the availability status to unknown
+	*/
+	void SetUnknown()
+		{
+		iScore = EUnknownAvailabilityScore;
+		}
+
+	/**
+	@return the availability score
+	*/
+	TInt Score() const { return iScore; }
+
+private:
+	TInt iScore;
+	};
+
+/**
+Collection of options used to register to availability notifications
+*/
+struct TAvailabilitySubscriptionOptions
+	{
+public:
+	/**
+	 Subscription option flags:
+	 ENotAnyChange    - the client is specifying availability score thresholds he wishes to be notified on crossing;
+	 EAnyChange       - the client is interestes in any change in the availability. Only change in calculated score will be reported.
+	 EAnyNestedChamge - the client is interested in any change in the availability even if it does not affect the calculated score
+	                    e.g.: one of many available access points ceases to be available (and doesn't affect the score calculated against the remaning access points) 
+	 */
+	enum TChangeScopeFlags
+		{
+		ENotAnyChange = 0,
+		EAnyChange,
+		EAnyNestedChange,
+		};
+	
+	/**
+	@param aAnyChange If ETrue, notify on all changes in the calculated availability. If EFalse, use following parameters to decide what to notify on.
+	@param aScoreExceeds Notify if availability score exceeds this
+	@param aScoreDropsBelow Notify if availability score drops below this
+	@param aScoreIncreasesByMoreThan Notify if availability score increased by more than this
+	@param aScoreDescreasesByMoreThan Notify if availability score decreased by more than this
+	*/
+	TAvailabilitySubscriptionOptions(TBool aAnyChange = ETrue,
+	                                 TUint aScoreExceeds = 0,
+	                                 TUint aScoreDropsBelow = 0,
+	                                 TUint aScoreIncreasesByMoreThan = 0,
+	                                 TUint aScoreDecreasesByMoreThan = 0)
+	:	iFlags(aAnyChange? EAnyChange : ENotAnyChange),
+		iScoreExceeds(aScoreExceeds),
+		iScoreDropsBelow(aScoreDropsBelow),
+		iScoreIncreasesByMoreThan(aScoreIncreasesByMoreThan),
+		iScoreDecreasesByMoreThan(aScoreDecreasesByMoreThan)
+		{
+		__ASSERT_DEBUG(aScoreExceeds >= TAvailabilityStatus::EMinAvailabilityScore && aScoreExceeds <= TAvailabilityStatus::EMaxAvailabilityScore, User::Panic(KSpecAssert_ESock_Availabili, 2));
+		__ASSERT_DEBUG(aScoreDropsBelow >= TAvailabilityStatus::EMinAvailabilityScore && aScoreDropsBelow <= TAvailabilityStatus::EMaxAvailabilityScore, User::Panic(KSpecAssert_ESock_Availabili, 3));
+		__ASSERT_DEBUG(aScoreIncreasesByMoreThan >= TAvailabilityStatus::EMinAvailabilityScore && aScoreIncreasesByMoreThan <= TAvailabilityStatus::EMaxAvailabilityScore, User::Panic(KSpecAssert_ESock_Availabili, 4));
+		__ASSERT_DEBUG(aScoreDecreasesByMoreThan >= TAvailabilityStatus::EMinAvailabilityScore && aScoreDecreasesByMoreThan <= TAvailabilityStatus::EMaxAvailabilityScore, User::Panic(KSpecAssert_ESock_Availabili, 5));
+		}
+	
+
+	
+	/**
+	@param aFlags, TChangeScopeFlags describing the subscrption.
+	@see TChangeScopeFlags.
+	*/
+	TAvailabilitySubscriptionOptions(TChangeScopeFlags aFlags)
+	:	iFlags(aFlags),
+		iScoreExceeds(0),
+		iScoreDropsBelow(0),
+		iScoreIncreasesByMoreThan(0),
+		iScoreDecreasesByMoreThan(0)
+		{
+		ASSERT(aFlags != ENotAnyChange); //illegal to ask for thersholds without specifying them.
+		}
+
+	/**
+	@param aReported Currently reported availability
+	@param aNew Newly reported availability
+	@return ETrue if the change is one which should be reported
+	*/
+	TBool IsChangeSignificant(const TAvailabilityStatus& aReported, const TAvailabilityStatus& aNew) const
+		{
+		__ASSERT_DEBUG(aNew.IsKnown(), User::Panic(KSpecAssert_ESock_Availabili, 6)); //Use only with known availability!
+		return ShouldNotifyAnyChange(aReported, aNew)
+			|| ShouldNotifyScoreExceeds(aReported, aNew)
+			|| ShouldNotifyScoreDropsBelow(aReported, aNew)
+			|| ShouldNotifyScoreIncreasesByMoreThan(aReported, aNew)
+			|| ShouldNotifyScoreDecreasesByMoreThan(aReported, aNew);
+		}
+
+private:
+	TBool ShouldNotifyAnyChange(const TAvailabilityStatus& aReported, const TAvailabilityStatus& aNew) const
+		{
+		return (iFlags == EAnyNestedChange) || 
+			   (iFlags == EAnyChange && aNew.Score() != aReported.Score());
+		}
+
+	TBool ShouldNotifyScoreExceeds(const TAvailabilityStatus& aReported, const TAvailabilityStatus& aNew) const
+		{
+		return iScoreExceeds != 0 && aNew.Score() > iScoreExceeds && aReported.Score() <= iScoreExceeds;
+		}
+
+	TBool ShouldNotifyScoreDropsBelow(const TAvailabilityStatus& aReported, const TAvailabilityStatus& aNew) const
+		{
+		return iScoreDropsBelow != 0 && aNew.Score() < iScoreDropsBelow && aReported.Score() >= iScoreDropsBelow;
+		}
+
+	TBool ShouldNotifyScoreIncreasesByMoreThan(const TAvailabilityStatus& aReported, const TAvailabilityStatus& aNew) const
+		{
+		return iScoreIncreasesByMoreThan != 0 && (aNew.Score() - aReported.Score()) > iScoreIncreasesByMoreThan;
+		}
+
+	TBool ShouldNotifyScoreDecreasesByMoreThan(const TAvailabilityStatus& aReported, const TAvailabilityStatus& aNew) const
+		{
+		return iScoreDecreasesByMoreThan != 0 && (aReported.Score() - aNew.Score()) > iScoreDecreasesByMoreThan;
+		}
+
+private:
+	TUint iScoreExceeds:7;
+	TUint iScoreDropsBelow:7;
+	TUint iScoreIncreasesByMoreThan:7;
+	TUint iScoreDecreasesByMoreThan:7;
+	TUint iFlags:4;
+	};
+
+
+} //namespace ESock
+
+
+
+#endif // SYMBIAN_AVAILABILITY_H
+
+