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