libraries/qr3/src/propertywatcher.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/qr3/src/propertywatcher.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,196 @@
+// propertywatcher.cpp
+// 
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+#include <fshell/qr3dll.h>
+
+EXPORT_C CPropertyManager* CPropertyManager::NewL(TCallBack aCallback)
+	{
+	CPropertyManager* self = new(ELeave) CPropertyManager(aCallback);
+	return self;
+	}
+
+EXPORT_C void CPropertyManager::SetPropertyFromStringL(const TDesC& /*aString*/)
+	{
+	}
+
+EXPORT_C HBufC* CPropertyManager::GetValueL()
+	{
+	if (!iProperty.Handle()) User::Leave(KErrNotReady);
+
+	TInt err = KErrNone;
+	if (iPropertyType == RProperty::ETypeLimit)
+		{
+		// First time called, need to figure out what type the property is
+		TInt propInt;
+		//TBuf8<1> propBuf8;
+		
+		err = iProperty.Get(propInt);
+		if (err == KErrNotFound)
+			{
+			return NULL;
+			}
+		if (err == KErrPermissionDenied)
+			{
+			User::Leave(err);
+			}
+
+		if (err != KErrArgument)
+			{
+			iPropertyType = RProperty::EInt;
+			}
+		else
+			{
+			//err = iProperty.Get(propBuf8);
+			//if (err == 
+			// Just assume it's binary, for now
+			iPropertyType = RProperty::EByteArray;
+			}
+		}
+
+	switch (iPropertyType)
+		{
+		case RProperty::EInt:
+			{
+			TInt val;
+			TInt err = iProperty.Get(val);
+			if (err == KErrNone)
+				{
+				HBufC* res = HBufC::NewL(15);
+				res->Des().Format(_L("%i"), val);
+				return res;
+				}
+			else if (err == KErrArgument)
+				{
+				// Someone's redefined the property as a different type
+				iPropertyType = RProperty::ETypeLimit;
+				return GetValueL();
+				}
+			else if (err == KErrNotFound)
+				{
+				// property deleted or undefined
+				return NULL;
+				}
+			else
+				{
+				User::Leave(err);
+				}
+			break;
+			}
+		case RProperty::EByteArray:
+			{
+			for (TInt size = 512; /*Nothing*/; size *= 2)
+				{
+				HBufC8* val = HBufC8::NewL(size);
+				TPtr8 ptr = val->Des();
+				TInt err = iProperty.Get(ptr);
+				if (err == KErrNone)
+					{
+
+					_LIT(KBinary, "Binary:");
+					CleanupStack::PushL(val);
+					HBufC* res = HBufC::NewL(val->Length() * 4 + KBinary().Length());
+					TPtr ptr = res->Des();
+					//ptr.Append(KBinary);
+					for (TInt i = 0; i < val->Length(); i++)
+						{
+						if (i % 8 == 0) ptr.Append('\n');
+						if (i % 4 == 0 && i != 0) ptr.Append(' ');
+						TBuf<2> numBuf;
+						numBuf.NumFixedWidthUC((*val)[i], EHex, 2);
+						ptr.Append(numBuf);
+						//ptr.AppendFormat(_L("%02x"), (TUint)(*val)[i]);
+						}
+					CleanupStack::PopAndDestroy(val);
+					return res;
+					}
+				else
+					{
+					delete val;
+					}
+
+				if (err == KErrOverflow)
+					{
+					// Try with bigger buffer
+					continue;
+					}
+				else if (err == KErrArgument)
+					{
+					// Someone's redefined the property as a different type
+					iPropertyType = RProperty::ETypeLimit;
+					return GetValueL();
+					}
+				else if (err == KErrNotFound)
+					{
+					// property deleted or undefined
+					return NULL;
+					}
+				else
+					{
+					User::Leave(err);
+					}
+				}
+			}
+		default:
+			break;
+		}
+	return NULL; // To satisfy compiler
+	}
+
+EXPORT_C TInt CPropertyManager::ChangeProperty(TUint aCategory, TUint aKey)
+	{
+	Cancel();
+	iPropertyType = RProperty::ETypeLimit;
+	iCat = aCategory;
+	iKey = aKey;
+
+	iProperty.Close();
+	TInt err = iProperty.Attach(TUid::Uid(aCategory), aKey);
+	if (!err)
+		{
+		Watch();
+		}
+	return err;
+	}
+
+void CPropertyManager::Watch()
+	{
+	if (!IsActive())
+		{
+		iProperty.Subscribe(iStatus);
+		SetActive();
+		}
+	}
+
+void CPropertyManager::RunL()
+	{
+	if (!iStatus.Int())
+		{
+		Watch();
+		}
+	iChangedFn.CallBack();
+	}
+
+void CPropertyManager::DoCancel()
+	{
+	iProperty.Cancel();
+	}
+
+CPropertyManager::CPropertyManager(TCallBack aCallback)
+	: CActive(CActive::EPriorityStandard), iPropertyType(RProperty::ETypeLimit), iChangedFn(aCallback)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CPropertyManager::~CPropertyManager()
+	{
+	Cancel();
+	iProperty.Close();
+	}