--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/testing/examplecode/mmexample1/src/mmexample1.cpp Fri Mar 12 15:49:41 2010 +0200
@@ -0,0 +1,165 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>
+#include <e32def.h>
+
+#include <elements/cftransport.h>
+#include <elements/nm_common.h>
+#include <elements/nm_node.h>
+#include <elements/nm_log.h>
+#include <elements/nm_address.h>
+#include <elements/nm_signatures.h>
+#include <elements/nm_messages_base.h>
+#include <elements/nm_interfaces.h>
+
+#include <elements/mm_node.h>
+#include <elements/mm_activities.h>
+
+#include <MMExample1states.h>
+
+class TMyWorkerThreadRegister;
+LOCAL_D CConsoleBase* console;
+
+_LIT8(KLoggingTag, "MMExample1");
+
+_LIT(KJunctionPanicCat, "Junction");
+
+const TInt KPanicUnknownMessage = 1;
+
+/**
+ This classes records information about a worker thread, which is useful
+ when nodemessages is running across multiple threads. In this example,
+ nodemessages is running in a single thread.
+
+ Most users of node messages will never need to use this as they will be
+ using node messages from within serverden which does all this setup for
+ you.
+ */
+class TMyWorkerThreadRegister : public CommsFW::MWorkerThreadRegister
+ {
+public:
+ CommsFW::TWorkerId SelfWorkerId() const
+ { return 1; }
+ CommsFW::TWorkerId UpperBoundWorkerId() const
+ { return 1; }
+
+ RAllocator& WorkerHeap(CommsFW::TWorkerId /*aWorkerId*/) const
+ {
+ return User::Allocator();
+ }
+
+ void PanicWorker(CommsFW::TWorkerId /*aWorkerId*/, const TDesC& aCategory, TInt aReason) const
+ {
+ User::Panic(aCategory, aReason);
+ }
+ };
+
+_LIT(KNorth, "North");
+_LIT(KSouth, "South");
+_LIT(KEast, "East");
+_LIT(KWest, "West");
+
+LOCAL_C void MainL ()
+ {
+ /**
+ Setup the environment for passing messages.
+ */
+ TMyWorkerThreadRegister workerregister;
+ Messages::CGlobals* globals = &Messages::TlsGlobals::InstallGlobalsL();
+
+ CommsFW::CCommsTransport* transport = CommsFW::CCommsTransport::NewL(workerregister, globals->VirtualCtor(), NULL);
+ globals->SetTransportSender(&transport->GetSender());
+ globals->SetTransportReceiver(&transport->GetReceiver());
+ CleanupStack::PushL(transport);
+
+ CClock* clock = new(ELeave)CClock();
+ CleanupStack::PushL(clock);
+
+ CController* controller = new(ELeave)CController();
+ CleanupStack::PushL(controller);
+
+ CTrafficLight* north = new(ELeave)CTrafficLight(console, KNorth());
+ CleanupStack::PushL(north);
+ north->AddClientL(clock->Id(), Messages::TClientType(EClock));
+ clock->AddClientL(north->Id(), Messages::TClientType(ETrafficLight));
+ north->AddClientL(controller->Id(), Messages::TClientType(EController));
+ controller->AddClientL(north->Id(), Messages::TClientType(ETrafficLight, ENorth));
+
+ CTrafficLight* south = new(ELeave)CTrafficLight(console, KSouth());
+ CleanupStack::PushL(south);
+ south->AddClientL(clock->Id(), Messages::TClientType(EClock));
+ clock->AddClientL(south->Id(), Messages::TClientType(ETrafficLight));
+ south->AddClientL(controller->Id(), Messages::TClientType(EController));
+ controller->AddClientL(south->Id(), Messages::TClientType(ETrafficLight, ESouth));
+
+ CTrafficLight* east = new(ELeave)CTrafficLight(console, KEast());
+ CleanupStack::PushL(east);
+ east->AddClientL(clock->Id(), Messages::TClientType(EClock));
+ clock->AddClientL(east->Id(), Messages::TClientType(ETrafficLight));
+ east->AddClientL(controller->Id(), Messages::TClientType(EController));
+ controller->AddClientL(east->Id(), Messages::TClientType(ETrafficLight, EEast));
+
+ CTrafficLight* west = new(ELeave)CTrafficLight(console, KWest());
+ CleanupStack::PushL(west);
+ west->AddClientL(clock->Id(), Messages::TClientType(EClock));
+ clock->AddClientL(west->Id(), Messages::TClientType(ETrafficLight));
+ west->AddClientL(controller->Id(), Messages::TClientType(EController));
+ controller->AddClientL(west->Id(), Messages::TClientType(ETrafficLight, EWest));
+
+ Messages::RNodeInterface::OpenPostMessageClose(controller->Id(), controller->Id(), TGo().CRef());
+ CActiveScheduler::Start();
+ CleanupStack::PopAndDestroy(7, transport);
+
+ Messages::TlsGlobals::UnInstallGlobals();
+ }
+
+LOCAL_C void DoStartL ()
+ {
+ CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+ CleanupStack::PushL (scheduler);
+ CActiveScheduler::Install (scheduler);
+
+ MainL ();
+
+ CleanupStack::PopAndDestroy (scheduler);
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+
+ TRAPD(createError, console = Console::NewL(_L("Mesh Machine Junction Example"), TSize(KConsFullScreen,KConsFullScreen)));
+ if (createError)
+ {
+ return createError;
+ }
+
+ TRAPD(mainError, DoStartL());
+ if (mainError)
+ {
+ console->Printf(_L(" failed, leave code = %d"), mainError);
+ }
+ console->Printf(_L(" [press any key]\n"));
+ console->Getch();
+
+ delete console;
+ delete cleanup;
+ __UHEAP_MARKEND;
+ return KErrNone;
+ }
+