commands/sms/sms.cpp
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Sat, 31 Jul 2010 19:07:57 +0100
changeset 23 092bcc217d9d
parent 0 7f656887cf89
permissions -rw-r--r--
Tidied iocli exports, build macro tweaks. Removed 4 overloads of CCommandBase::RunCommand[L] that are no longer used at all, and changed one more to not be exported as it's only used internally to iocli.dll. fixed builds on platforms that don't support btrace or any form of tracing.

// 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);