diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/subscribespec_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/subscribespec_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,173 @@ + + +
+ +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 speculative pattern of subscribing to a byte-array property +00015 // +00016 +00017 +00018 +00023 #include "subscribe.h" +00024 LOCAL_D CConsoleBase* console; +00025 +00029 CArrayPropertyWatch::CArrayPropertyWatch():CActive(EPriority) +00030 { +00031 } +00032 +00037 void CArrayPropertyWatch::ConstructL(CConsoleBase* aConsole) +00038 { +00039 User::LeaveIfError(iProperty.Attach(KMyPropertyCat,KMyPropertyName)); +00040 iConsole = aConsole; +00041 CActiveScheduler::Add(this); +00042 } +00043 +00049 CArrayPropertyWatch* CArrayPropertyWatch::NewL(CConsoleBase* aConsole) +00050 { +00051 CArrayPropertyWatch* self = new (ELeave) CArrayPropertyWatch; +00052 CleanupStack::PushL(self); +00053 self->ConstructL(aConsole); +00054 CleanupStack::Pop(self); +00055 return self; +00056 } +00057 +00061 CArrayPropertyWatch::~CArrayPropertyWatch() +00062 { +00063 iProperty.Close(); +00064 // Delete the property as it is no longer required by the subscriber +00065 RProperty::Delete(KMyPropertyCat, KMyPropertyName); +00066 Cancel(); +00067 } +00068 +00072 void CArrayPropertyWatch::DoCancel() +00073 { +00074 iProperty.Cancel(); +00075 } +00076 +00081 void CArrayPropertyWatch::RunL() +00082 { +00083 // Get the value of the property +00084 TBuf16<KArraySize> buf; +00085 TInt err = iProperty.Get(buf); +00086 if(err == KErrNotFound) +00087 { +00088 // Leave the function if the property is not defined +00089 CActiveScheduler::Stop(); +00090 User::Leave(err); +00091 } +00092 else +00093 { +00094 // Print the value of the property +00095 PrintProperty(buf); +00096 if(buf == KStop) +00097 { +00098 CActiveScheduler::Stop(); +00099 } +00100 else +00101 { +00102 // Re-subscribe to the property +00103 iProperty.Subscribe(iStatus); +00104 SetActive(); +00105 } +00106 } +00107 } +00108 +00113 void CArrayPropertyWatch::PrintProperty(TDes16& aBuf) +00114 { +00115 iConsole->Printf(KTxtArray); +00116 TInt bufLength = aBuf.Length(); +00117 for(TInt ix = 0; ix < bufLength;ix++) +00118 { +00119 iConsole->Printf(KTxtArrayElement,aBuf[ix]); +00120 } +00121 iConsole->Printf(KTxtNewLine); +00122 } +00123 +00127 void CArrayPropertyWatch::DefinePropertyL() +00128 { +00129 iConsole->Printf(KTxtDefine); +00130 // Define the property +00131 TInt err = RProperty::Define(KMyPropertyCat, KMyPropertyName,RProperty::EByteArray,KAllowAllPolicy,KAllowAllPolicy,KArraySize); +00132 if(err == KErrAlreadyExists || err == KErrNone) +00133 { +00134 // Ignore the KErrAlreadyExists error code +00135 TBuf16<KArraySize> buf; +00136 // Returns the default value of the property +00137 // Ignore this value +00138 err = iProperty.Get(buf); +00139 User::LeaveIfError(err); +00140 // Subscribe to the property and maintain an outstanding request +00141 iProperty.Subscribe(iStatus); +00142 SetActive(); +00143 } +00144 else +00145 { +00146 // Leave in case of errors other than KErrAlreadyExists +00147 User::Leave(err); +00148 } +00149 } +00150 +00151 void DoExampleL() +00152 { +00153 CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); +00154 CleanupStack::PushL(scheduler); +00155 CActiveScheduler::Install(scheduler); +00156 +00157 console->Printf(KTxtSpecSub); +00158 +00159 // Create the byte-array property watch active object +00160 CArrayPropertyWatch* obj = CArrayPropertyWatch::NewL(console); +00161 CleanupStack::PushL(obj); +00162 +00163 // Subscribe to the property and start the scheduler +00164 obj->DefinePropertyL(); +00165 CActiveScheduler::Start(); +00166 +00167 CleanupStack::PopAndDestroy(obj); +00168 CleanupStack::PopAndDestroy(scheduler); +00169 } +00170 +00171 GLDEF_C TInt E32Main() +00172 { +00173 __UHEAP_MARK; +00174 CTrapCleanup* cleanup = CTrapCleanup::New(); +00175 +00176 TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen,KConsFullScreen))); +00177 if (createError) +00178 return createError; +00179 +00180 TRAPD(mainError, DoExampleL()); +00181 if (mainError) +00182 console->Printf(KTextFailed, mainError); +00183 console->Printf(KTextPressAnyKey); +00184 console->Getch(); +00185 +00186 delete console; +00187 delete cleanup; +00188 __UHEAP_MARKEND; +00189 return KErrNone; +00190 } +