diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/subscribepe_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/subscribepe_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,163 @@ + + +
+ +00001 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +00002 // All rights reserved. +00003 // This component and the accompanying materials are made available +00004 // under the terms of "Eclipse Public License v1.0" +00005 // which accompanies this distribution, and is available +00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". +00007 // +00008 // Initial Contributors: +00009 // Nokia Corporation - initial contribution. +00010 // +00011 // Contributors: +00012 // +00013 // Description: +00014 // Demonstrates the pure event pattern of subscribing to an integer property +00015 // +00016 +00017 +00018 +00023 #include "subscribepe.h" +00024 +00025 LOCAL_D CConsoleBase* console; +00026 +00030 CIntPropertyWatch::CIntPropertyWatch():CActive(EPriority) +00031 { +00032 } +00033 +00038 void CIntPropertyWatch::ConstructL(CConsoleBase* aConsole) +00039 { +00040 User::LeaveIfError(iProperty.Attach(KMyPropertyCat,KMyPropertyName)); +00041 iConsole = aConsole; +00042 CActiveScheduler::Add(this); +00043 } +00044 +00050 CIntPropertyWatch* CIntPropertyWatch::NewL(CConsoleBase* aConsole) +00051 { +00052 CIntPropertyWatch* self = new (ELeave) CIntPropertyWatch; +00053 CleanupStack::PushL(self); +00054 self->ConstructL(aConsole); +00055 CleanupStack::Pop(self); +00056 return self; +00057 } +00058 +00062 CIntPropertyWatch::~CIntPropertyWatch() +00063 { +00064 iProperty.Close(); +00065 Cancel(); +00066 } +00067 +00071 void CIntPropertyWatch::DoCancel() +00072 { +00073 iProperty.Cancel(); +00074 } +00075 +00080 void CIntPropertyWatch::RunL() +00081 { +00082 // Receive a notification when a value is published +00083 // The RProperty::Get() function call can be omitted as the published value is of no importance in the pure event pattern +00084 TInt value; +00085 TInt err = iProperty.Get(value); +00086 if (err == KErrNotFound) +00087 { +00088 // No need to re-subscribe to the property as it has been deleted by the publisher +00089 CActiveScheduler::Stop(); +00090 } +00091 else if (err == KErrNone) +00092 { +00093 // Print the value of the property +00094 PrintProperty(value); +00095 // Re-subscribe to the property +00096 IssueRequest(); +00097 } +00098 else +00099 { +00100 // Leave the function in case of any other error +00101 CActiveScheduler::Stop(); +00102 User::Leave(err); +00103 } +00104 } +00105 +00110 void CIntPropertyWatch::PrintProperty(TInt aValue) +00111 { +00112 iConsole->Printf(KTxtValChange,aValue); +00113 } +00114 +00119 void CIntPropertyWatch::WatchL() +00120 { +00121 TInt value; +00122 // Checks if the property exists +00123 TInt res = iProperty.Get(value); +00124 if (res == KErrNotFound) +00125 { +00126 // Property not defined +00127 User::Leave(res); +00128 } +00129 // Prints the value of the property +00130 // This is only to illustrate that the value of the property is set by the publisher +00131 // This value has no significance as the pure event distribution pattern of publish and subscribe is being followed +00132 PrintProperty(value); +00133 IssueRequest(); +00134 } +00135 +00139 void CIntPropertyWatch::IssueRequest() +00140 { +00141 iProperty.Subscribe(iStatus); +00142 SetActive(); +00143 } +00144 +00145 void DoExampleL() +00146 { +00147 CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); +00148 CleanupStack::PushL(scheduler); +00149 CActiveScheduler::Install(scheduler); +00150 +00151 console->Printf(KTxtPESub); +00152 +00153 // Create the integer property watch active object +00154 CIntPropertyWatch* obj = CIntPropertyWatch::NewL(console); +00155 CleanupStack::PushL(obj); +00156 +00157 // Subscribe to the property and start the scheduler +00158 obj->WatchL(); +00159 CActiveScheduler::Start(); +00160 +00161 CleanupStack::PopAndDestroy(obj); +00162 CleanupStack::PopAndDestroy(scheduler); +00163 } +00164 +00165 GLDEF_C TInt E32Main() +00166 { +00167 __UHEAP_MARK; +00168 CTrapCleanup* cleanup = CTrapCleanup::New(); +00169 +00170 TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen,KConsFullScreen))); +00171 if (createError) +00172 return createError; +00173 +00174 TRAPD(mainError, DoExampleL()); +00175 if (mainError) +00176 console->Printf(KTextFailed, mainError); +00177 console->Printf(KTextPressAnyKey); +00178 console->Getch(); +00179 +00180 delete console; +00181 delete cleanup; +00182 __UHEAP_MARKEND; +00183 return KErrNone; +00184 } +