First public contribution.
1 // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #include "t_property.h"
18 class CPropBroadcastSlave : public CBase
21 static TInt LoopThreadEntry(TAny*);
23 CPropBroadcastSlave(CPropBroadcast* aProg, TUid aCategory, TUint aMasterKey, TUint aSlaveKey);
24 void Create(TThreadPriority);
28 CPropBroadcast* iProg;
35 TRequestStatus iStatus;
37 CPropBroadcastSlave* iNext;
42 CPropBroadcastSlave::CPropBroadcastSlave(CPropBroadcast* aProg, TUid aCategory, TUint aMasterKey, TUint aSlaveKey) :
43 iProg(aProg), iCategory(aCategory), iMasterKey(aMasterKey), iSlaveKey(aSlaveKey)
47 void CPropBroadcastSlave::Create(TThreadPriority aPrio)
49 TInt r = iProp.Define(iCategory, iSlaveKey, RProperty::EInt, KPassPolicy, KPassPolicy);
50 TF_ERROR_PROG(iProg, r, r == KErrNone);
51 r = iProp.Attach(iCategory, iSlaveKey);
52 TF_ERROR_PROG(iProg, r, r == KErrNone);
54 r = iThread.Create(KNullDesC, LoopThreadEntry, 0x2000, NULL, this);
55 TF_ERROR_PROG(iProg, r, r == KErrNone);
56 iThread.Logon(iStatus);
57 iThread.SetPriority(aPrio);
61 void CPropBroadcastSlave::Delete()
63 iThread.Kill(EExitKill);
65 User::WaitForRequest(iStatus);
66 TF_ERROR_PROG(iProg, iStatus.Int(), iStatus.Int() == EExitKill);
68 TInt r = iProp.Delete(iCategory, iSlaveKey);
69 TF_ERROR_PROG(iProg, r, r == KErrNone);
75 TInt CPropBroadcastSlave::LoopThreadEntry(TAny* ptr)
77 CPropBroadcastSlave* self = (CPropBroadcastSlave*) ptr;
82 void CPropBroadcastSlave::Loop()
85 TInt r = mProp.Attach(iCategory, iMasterKey, EOwnerThread);
86 TF_ERROR_PROG(iProg, r, r == KErrNone);
89 r = sProp.Attach(iCategory, iSlaveKey, EOwnerThread);
90 TF_ERROR_PROG(iProg, r, r == KErrNone);
95 TRequestStatus status;
96 mProp.Subscribe(status);
99 TF_ERROR_PROG(iProg, r, r == KErrNone);
101 User::WaitForRequest(status);
103 r = mProp.Get(value);
104 TF_ERROR_PROG(iProg, r, r == KErrNone);
108 _LIT(KPropBroadcastName, "RProperty Broadcast");
110 CPropBroadcast::CPropBroadcast(TUid aCategory, TUint aMasterKey,
111 TUint aSlaveKeySlot, TUint aSlaveCount, TUint aFirstHighPriority) :
112 CTestProgram(KPropBroadcastName), iCategory(aCategory), iMasterKey(aMasterKey),
113 iSlaveKeySlot(aSlaveKeySlot), iSlaveCount(aSlaveCount), iFirstHighPriority(aFirstHighPriority)
118 void CPropBroadcast::Run(TUint aCount)
121 TInt r = mProp.Define(iCategory, iMasterKey, RProperty::EInt, KPassPolicy, KPassPolicy);
122 TF_ERROR(r, r == KErrNone);
123 r = mProp.Attach(iCategory, iMasterKey);
124 TF_ERROR(r, r == KErrNone);
126 for (TUint j = 0; j < iSlaveCount; ++j)
128 CPropBroadcastSlave* slave = new CPropBroadcastSlave(this, iCategory, iMasterKey, iSlaveKeySlot + j);
129 slave->Create((j < iFirstHighPriority) ? EPriorityLess : EPriorityMore);
131 slave->iNext = iSlaveList;
135 for (TUint i = 1; i < aCount; ++i)
137 CPropBroadcastSlave* slave = iSlaveList;
140 TRequestStatus status;
141 slave->iProp.Subscribe(status);
143 r = slave->iProp.Get(value);
144 TF_ERROR(r, r == KErrNone);
145 if (value == (TInt) i)
147 slave->iProp.Cancel();
149 User::WaitForRequest(status);
150 TF_ERROR(status.Int(), (status.Int() == KErrCancel) || (status.Int() == KErrNone));
151 r = slave->iProp.Get(value);
152 TF_ERROR(r, r == KErrNone);
153 TF_ERROR(value, value == (TInt) i);
154 slave = slave->iNext;
161 CPropBroadcastSlave* slave = iSlaveList;
162 if (slave == NULL) break;
163 iSlaveList = slave->iNext;
167 mProp.Delete(iCategory, iMasterKey);