testexecfw/tef/pipslogger/src/server.cpp
changeset 0 3e07fef1e154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecfw/tef/pipslogger/src/server.cpp	Mon Mar 08 15:03:44 2010 +0800
@@ -0,0 +1,207 @@
+/*
+* Copyright (c) 2005-2009 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:  
+* Main log server engine.
+* Process log requests from multiple clients simultaneously.
+*
+*/
+
+
+
+/**
+ @file server.cpp
+*/
+#include "server.h"
+#include <unistd.h>
+#include <fcntl.h>
+
+CLogServer* CLogServer::NewL()
+/**
+ * @return - Instance of the log server
+ */
+	{
+	CLogServer * server = new (ELeave) CLogServer();
+	CleanupStack::PushL(server);
+	server->ConstructL();
+	// CServer base class call
+	server->StartL(KTestExecutePIPSLogServerName);
+	CleanupStack::Pop(server);
+	return server;
+	}
+
+void CLogServer::ConstructL()
+/**
+ * Second phase construction
+ */
+	{
+	}
+
+
+CLogServer::CLogServer() : CServer2(EPriorityStandard,ESharableSessions)
+/**
+ * Constructor
+ */
+	{
+	}
+
+CLogServer::~CLogServer()
+/**
+ * Destructor
+ */
+	{
+	// Close the array of control structures
+	LogControl().Close();
+	//Fs().Close();
+	}
+
+
+CSession2* CLogServer::NewSessionL(const TVersion& /*aVersion*/,const RMessage2& /*aMessage*/) const
+/**
+ * @param RMessage - RMessage for the session open
+ */
+	{
+	// Just create the session
+	CLogSession* session = new (ELeave) CLogSession();
+	return session;
+	}
+
+void CLogServer::ControlComplete(CLogSession& aControl)
+/**
+ * @param aControl - Logfile control class reference
+ *
+ * Checks to see if this control session can be removed 
+ */
+	{
+	if(aControl.SessionCount())
+		return;
+
+	// There are no subsessions mapped to the logfile control class and
+	// no data buffers on its write queue
+	// Loop through the server's control array and remove it then delete it
+	TInt i;
+	for(i=0;i<LogControl().Count();i++)
+		{
+		if(&aControl == LogControl()[i])
+			{
+			// Done
+			LogControl().Remove(i);
+			delete &aControl;
+			break;
+			}
+		}
+	// If it's the last one then exit the server
+	if(!LogControl().Count())
+		CActiveScheduler::Stop();
+	}
+
+
+///////
+
+CLogSession::CLogSession()
+:iFileDes(-1)
+/**
+ * Constructor
+ */
+	{
+	}
+
+CLogSession::~CLogSession()
+/**
+ * Destructor
+ */
+	{
+	// Check for null
+	// Session close without a createlog call leaves iControl null
+	// A logfile control structure can have multiple server sessions
+	// decrement its server session count
+	RemoveSession();
+	CLogServer* p=(CLogServer*) Server();
+	// Shuts Down the server if this is the last open session
+	p->ControlComplete(*this);
+	}
+
+void CLogSession::ServiceL(const RMessage2& aMessage)
+/**
+ * @param aMessage - Function and data for the session
+ */
+	{
+	switch(aMessage.Function())
+		{
+//		case RTestExecutePIPSLogServ::ECreateLog :
+//			{}
+		// One of the API write calls
+		case RTestExecutePIPSLogServ::EWriteLog :
+			{
+			// Data can be any size
+			// Get the length from second argument
+			TInt bufferLength = aMessage.Int1();
+			// Get a heap buffer of the right size
+			HBufC8* buffer = HBufC8::NewLC(bufferLength);
+			TPtr8 ptr(buffer->Des());
+			// read the data
+			aMessage.ReadL(0,ptr);			
+			// Get a buffer control class contructed with the heap data
+			// takes ownership
+			//CLogBuffer* logBuffer = new (ELeave) CLogBuffer(*buffer);
+			CleanupStack::Pop(buffer);
+			//get the name of the pipe we want to dump the logs to
+			TInt pipeNameLen = aMessage.Int3();
+			// Get a heap buffer of the right size
+			HBufC8* pipebuffer = HBufC8::NewLC(pipeNameLen);
+			TPtr8 pipePtr(pipebuffer->Des());
+			// read the data
+			aMessage.ReadL(2,pipePtr);			
+			// Get a buffer control class contructed with the heap data
+			// takes ownership
+			CleanupStack::Pop(pipebuffer);
+			
+			if((iFileDes == -1)  || (!iPipeName ) || (iPipeName->CompareF(pipePtr))  )
+				{
+				iPipeName = new TPtr8(pipePtr) ; 
+				//iPipeName.Set(pipePtr) ;  
+				
+				char arr[KMaxPath];
+				int var;
+				for (var = 0; var < pipePtr.Length(); ++var) {
+					arr[var]=pipePtr[var];
+				}
+				arr[var]='\0';
+				
+				iFileDes = open( arr, O_WRONLY);
+				}
+			
+			const char *printsomething = (const char *)ptr.Ptr() ;
+			// incases when the pipe name given was empty / incorrect
+			// or unavailable for some reason, the open is expected
+			// to return -1, and then we do nothing
+			if(iFileDes != -1 ) 
+				{
+				write(iFileDes , printsomething, bufferLength) ; 
+				aMessage.Complete(KErrNone);
+				}
+			else
+				{
+				aMessage.Complete(KErrNotFound);
+				}
+			// apparently closing the pipe is an issue with named pipes
+			// so let be for now
+			//close(aFileDes); 
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+