diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_m_classes1_8cpp-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_m_classes1_8cpp-source.html Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,199 @@ + +
+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 } +