diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_m_classes1_8cpp-source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_m_classes1_8cpp-source.html Tue Mar 30 11:56:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,199 +0,0 @@ - -
-00001 // Copyright (c) 2000-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 // Demonstrate use of M classes, or mixins - the -00015 // only use of multiple inheritance that has been -00016 // sanctioned by the E32 architecture team -00017 // This example shows how mixins can be used to -00018 // pass some protocol, and an associated object, from -00019 // a protocol provider to an protocol user. The user -00020 // is not supposed to know everything about the provider, -00021 // only about the protocol it's interested in. -00022 // In this specific example, the provider is derived -00023 // from a CProtocol class. -00024 // -00025 -00026 -00027 -00028 #include "CommonFramework.h" -00029 -00031 // -00032 // -----> CProtocol (definition) -00033 // -00034 // A protocol class for mixing in -00035 // -00037 class CProtocol : public CBase -00038 { -00039 public: -00040 virtual void HandleEvent(TInt aEventCode)=0; -00041 }; -00042 -00043 -00045 // -00046 // -----> CProtocolUser (definition) -00047 // -00048 // Define a protocol user which uses this protocol -00049 // -00051 class CProtocolUser : public CBase -00052 { -00053 public: -00054 // Construction -00055 static CProtocolUser* NewLC(); -00056 static CProtocolUser* NewL(); -00057 -00058 // Destruction -00059 ~CProtocolUser(); -00060 -00061 // Some function which uses a protocol -00062 void DoSomething(CProtocol* aProtocol); -00063 -00064 protected: -00065 // Construction assistance -00066 void ConstructL(); -00067 }; -00068 -00069 -00071 // -00072 // -----> CProtocolProvider (definition) -00073 // -00074 // A simple class which uses the mixin -00075 // -00077 class CProtocolProvider : public CProtocol -00078 { -00079 public: -00080 // Construction -00081 static CProtocolProvider* NewLC(); -00082 -00083 // Destruction -00084 ~CProtocolProvider(); -00085 -00086 // Calls the protocol user -00087 void CallProtocolUser(); -00088 -00089 // Implement the protocol (handles the protocol) -00090 void HandleEvent(TInt aEventCode); -00091 -00092 protected: -00093 // Construction assistance -00094 void ConstructL(); -00095 -00096 private: -00097 // data member defined by this class -00098 CProtocolUser* iProtocolUser; -00099 }; -00100 -00101 -00103 // -00104 // -----> CProtocolUser (implementation) -00105 // -00107 CProtocolUser* CProtocolUser::NewLC() -00108 { -00109 CProtocolUser* self=new(ELeave) CProtocolUser; -00110 CleanupStack::PushL(self); -00111 self->ConstructL(); -00112 return self; -00113 } -00114 -00115 CProtocolUser* CProtocolUser::NewL() -00116 { -00117 CProtocolUser* self=NewLC(); -00118 CleanupStack::Pop(); -00119 return self; -00120 } -00121 -00122 CProtocolUser::~CProtocolUser() -00123 { -00124 } -00125 -00126 void CProtocolUser::ConstructL() -00127 { -00128 } -00129 -00130 void CProtocolUser::DoSomething(CProtocol* aProtocol) -00131 { -00132 // Do something that requires a protocol -00133 _LIT(KTxtExtSystemDoing,"External system doing something\n"); -00134 console->Printf(KTxtExtSystemDoing); -00135 _LIT(KTxtInvokingProtocol,"invoking protocol - event 3\n"); -00136 console->Printf(KTxtInvokingProtocol); -00137 // Handle an event -00138 aProtocol->HandleEvent(3); -00139 } -00140 -00141 -00143 // -00144 // -----> CProtocolProvider (implementation) -00145 // -00147 CProtocolProvider* CProtocolProvider::NewLC() -00148 { -00149 CProtocolProvider* self=new(ELeave) CProtocolProvider; -00150 CleanupStack::PushL(self); -00151 self->ConstructL(); -00152 return self; -00153 }; -00154 -00155 CProtocolProvider::~CProtocolProvider() -00156 { -00157 delete iProtocolUser; -00158 } -00159 -00160 void CProtocolProvider::ConstructL() -00161 { -00162 iProtocolUser=CProtocolUser::NewL(); -00163 } -00164 -00165 void CProtocolProvider::CallProtocolUser() -00166 { -00167 // Call the protocol user to do some work -00168 _LIT(KTxtCallProtUser,"CProtocolProvider calling protocol user\n"); -00169 console->Printf(KTxtCallProtUser); -00170 iProtocolUser->DoSomething(this); -00171 -00172 // pass ourselves, disguised as our (unique) -00173 // base class, so the protocol can be called -00174 // back by the protocol user -00175 } -00176 -00177 void CProtocolProvider::HandleEvent(TInt aEventCode) -00178 { -00179 // A concrete implementation of the abstract protocol. -00180 // Handle an event in the protocol user -00181 _LIT(KFormat1,"CProtocolProvider handling event %d\n"); -00182 console->Printf(KFormat1,aEventCode); -00183 } -00184 -00185 -00187 // -00188 // Do the example -00189 // -00191 LOCAL_C void doExampleL() -00192 { -00193 // show use of mixin with simple class -00194 CProtocolProvider* simpleProvider=CProtocolProvider::NewLC(); -00195 // call protocol user -00196 simpleProvider->CallProtocolUser(); -00197 // Remove simpleProvider from cleanup stack and destroy -00198 CleanupStack::PopAndDestroy(); -00199 } -