commands/sms/sms.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/sms/sms.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,166 @@
+// sms.cpp
+// 
+// Copyright (c) 2008 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include "sms.h"
+
+CCmdSms* CCmdSms::NewLC()
+	{
+	CCmdSms* self = new (ELeave) CCmdSms();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CCmdSms::~CCmdSms()
+	{
+	delete iCompletionCallBack;
+	delete iWatch;
+	delete iSendMsg;
+	delete iMsgToSend;
+	delete iDestination;
+	delete iMessageFromStdin;
+	iMatchStrings.ResetAndDestroy();
+	}
+
+CCmdSms::CCmdSms():
+CCommandBase(CCommandBase::EManualComplete)
+	{
+	}
+
+const TDesC& CCmdSms::Name() const
+	{
+	_LIT(KName, "sms");	
+	return KName;
+	}
+
+//
+// CCmdSms::DoRunL
+//
+void CCmdSms::DoRunL()
+	{
+	iCompletionCallBack = new(ELeave) CAsyncCallBack(TCallBack(CompletionCallBack, this), CActive::EPriorityStandard);
+
+	switch (iOperation)
+		{
+	case ESend:
+			{
+			if (!iDestination)
+				{
+				LeaveIfErr(KErrArgument, _L("Option --destination not specified for send."));
+				}
+			if (!iMsgToSend)
+				{
+				iMessageFromStdin = CTextBuffer::NewL(160);
+				Stdin().SetReadMode(RIoReadHandle::EFull);
+				TBuf<0x100> buf;
+				while (Stdin().Read(buf) == KErrNone)
+					{
+					iMessageFromStdin->AppendL(buf);
+					}
+				
+				iSendMsg = CSmsSender::NewL(FsL(), *this, iMessageFromStdin->Descriptor(), *iDestination);
+				}
+			else
+				{
+				iSendMsg = CSmsSender::NewL(FsL(), *this, *iMsgToSend, *iDestination);
+				}
+			iSendMsg->StartL();
+			}
+		break;
+	case EReceive:
+			{
+			FsL(); // So that CSmsWatcher can call Fs() if it needs to
+			iWatch = CSmsWatcher::NewL(*this);
+			iWatch->WaitForMessage();
+			}
+		break;
+		};
+	}
+
+void CCmdSms::ArgumentsL(RCommandArgumentList& aArguments)
+	{
+	aArguments.AppendEnumL((TInt&)iOperation, _L("command"));
+	aArguments.AppendStringL(iMsgToSend, _L("message"));
+	}
+
+//
+// CCmdSms::OptionsL
+//
+void CCmdSms::OptionsL(RCommandOptionList& aOptions)
+	{
+	// send sms options
+	_LIT(KOptDestination, "destination");
+	aOptions.AppendStringL(iDestination, KOptDestination);
+	
+	// receive sms options
+	_LIT(KOptDebug, "no-delete");
+	aOptions.AppendBoolL(iDebug, KOptDebug);
+	
+	_LIT(KOptMatch, "match");
+	aOptions.AppendStringL(iMatchStrings, KOptMatch);
+	}
+
+//
+// CCmdSms::SendComplete
+// up-call from the underlying smssender to indicate
+// it has finished its task
+//
+void CCmdSms::SendComplete(TInt aError)
+	{
+	EventsFinished(aError);
+	}
+
+//
+// CCmdSms::EventsFinished
+// up-call from the underlying smswatcher to indicate
+// it has finished its task(s)
+//
+void CCmdSms::EventsFinished(const TInt aError)
+	{
+	iCompletionError = aError;
+	iCompletionCallBack->CallBack();
+	}
+
+//
+// CCmdSms::CompletionCallBack
+// static function called in the event the cmd has finished executing
+// 
+TInt CCmdSms::CompletionCallBack(TAny* aEvent)
+	{
+	CCmdSms* self = static_cast<CCmdSms*>(aEvent);
+	self->Cleanup();
+	return KErrNone;
+	}
+
+//
+// CCmdSms::Cleanup
+// 
+void CCmdSms::Cleanup()
+	{
+	if (iCompletionError)
+		PrintError(iCompletionError, _L("amsms.exe failure"));
+	else
+		{
+		if (iWatch)
+			{
+			// dump any underlying messages (if any!)
+			const TDesC& msg = iWatch->Message();
+			if (msg.Length() > 0)
+				Printf(_L("Message received: \r\n"), &msg); // dump the message to stdout
+			}
+		}
+	// complete the fshell command
+	Complete(iCompletionError);
+	}
+
+EXE_BOILER_PLATE(CCmdSms);
+