diff -r 000000000000 -r 7f656887cf89 libraries/qr3/src/propertywatcher.cpp --- /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 + +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(); + }