diff -r 000000000000 -r 7f656887cf89 commands/rcomm/rcomm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commands/rcomm/rcomm.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,276 @@ +// rcomm.cpp +// +// Copyright (c) 2007 - 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 +#include + +using namespace IoUtils; + +class CCmdRcomm : public CCommandBase + { +public: + static CCommandBase* NewLC(); + ~CCmdRcomm(); +private: + CCmdRcomm(); + void ReadL(); + void WriteL(); +private: // From CCommandBase. + virtual const TDesC& Name() const; + virtual void DoRunL(); + virtual void ArgumentsL(RCommandArgumentList& aArguments); + virtual void OptionsL(RCommandOptionList& aOptions); +private: + HBufC* iCsyName; + HBufC* iPortName; + HBufC* iMode; + TCommAccess iCommAccess; + TUint iBufSize; + TBool iRaw; + TBool iVerbose; + RCommServ iCommServ; + RComm iComm; + }; + + +CCommandBase* CCmdRcomm::NewLC() + { + CCmdRcomm* self = new(ELeave) CCmdRcomm(); + CleanupStack::PushL(self); + self->BaseConstructL(); + return self; + } + +CCmdRcomm::~CCmdRcomm() + { + delete iCsyName; + delete iPortName; + delete iMode; + iComm.Close(); + iCommServ.Close(); + } + +CCmdRcomm::CCmdRcomm() + : iCommAccess(ECommShared), iBufSize(1024) + { + } + +const TDesC& CCmdRcomm::Name() const + { + _LIT(KName, "rcomm"); + return KName; + } + +void CCmdRcomm::DoRunL() + { + User::LeaveIfError(iCommServ.Connect()); + + if (iCsyName) + { + TInt err = iCommServ.LoadCommModule(*iCsyName); + if (err && (err != KErrAlreadyExists)) + { + PrintError(err, _L("Unable to load comm module \'%S\'"), iCsyName); + User::Leave(err); + } + } + else + { + TInt numPorts; + User::LeaveIfError(iCommServ.NumPorts(numPorts)); + for (TInt i = 0; i < numPorts; ++i) + { + TName moduleName; + TSerialInfo serialInfo; + TInt err = iCommServ.GetPortInfo(i, moduleName, serialInfo); + if (err == KErrNone) + { + Printf(_L("%S:\r\n\tPort name: \'%S\'\r\n\tLow unit: %d\r\n\tHigh unit: %d\r\n\tDescription: %S\r\n\r\n"), &moduleName, &serialInfo.iName, serialInfo.iLowUnit, serialInfo.iHighUnit, &serialInfo.iDescription); + } + else + { + PrintWarning(_L("Couldn't get info for port %d, err=%d"), i, err); + } + } + return; + } + + if (iPortName) + { + TInt err = iComm.Open(iCommServ, *iPortName, iCommAccess); + LeaveIfErr(err, _L("Unable to open port \'%S\'"), iPortName); + } + else + { + TSerialInfo serialInfo; + _LIT(KCsy, ".csy"); + TPtrC csyName(*iCsyName); + if (csyName.Right(KCsy().Length()).CompareF(KCsy) == 0) + { + // Remove the trailing '.csy' because otherwise C32 won't find the module. + csyName.Set(csyName.Left(csyName.Length() - KCsy().Length())); + } + TInt err = iCommServ.GetPortInfo(csyName, serialInfo); + LeaveIfErr(err, _L("Couldn't get port info for CSY '%S'"), &csyName); + Printf(_L("Port name: \'%S\'\r\nLow unit: %d\r\nHigh unit: %d\r\nDescription: %S\r\n"), &serialInfo.iName, serialInfo.iLowUnit, serialInfo.iHighUnit, &serialInfo.iDescription); + return; + } + + + _LIT(KModeRead, "read"); + _LIT(KModeWrite, "write"); + if (iMode) + { + if (*iMode == KModeRead) + { + ReadL(); + } + else if (*iMode == KModeWrite) + { + WriteL(); + } + else + { + PrintError(KErrArgument, _L("Invalid mode: \'%S\'"), iMode); + } + } + } + +void CCmdRcomm::ReadL() + { + if (iRaw) + { + HBufC8* readBuf = HBufC8::NewLC(iBufSize); + TPtr8 readBufPtr(readBuf->Des()); + TInt err = KErrNone; + while (err == KErrNone) + { + TRequestStatus status; + iComm.ReadOneOrMore(status, readBufPtr); + User::WaitForRequest(status); + err = status.Int(); + if (err == KErrNone) + { + TPtrC writePtr((TUint16*)readBuf->Ptr(), readBuf->Length() / 2); + Write(writePtr); + } + else if (iVerbose) + { + PrintWarning(_L("RComm::ReadOneOrMore failed with %d"), err); + } + } + CleanupStack::PopAndDestroy(readBuf); + } + else + { + HBufC8* readBuf = HBufC8::NewLC(iBufSize); + TPtr8 readBufPtr(readBuf->Des()); + HBufC* writeBuf = HBufC::NewLC(iBufSize / 2); + TPtr writeBufPtr(writeBuf->Des()); + TInt err = KErrNone; + while (err == KErrNone) + { + TRequestStatus status; + iComm.ReadOneOrMore(status, readBufPtr); + User::WaitForRequest(status); + err = status.Int(); + if (err == KErrNone) + { + writeBufPtr.Copy(*readBuf); + Write(*writeBuf); + } + else if (iVerbose) + { + PrintWarning(_L("RComm::ReadOneOrMore failed with %d"), err); + } + } + CleanupStack::PopAndDestroy(2, readBuf); + } + } + +void CCmdRcomm::WriteL() + { + RIoConsoleReadHandle& stdin = Stdin(); + User::LeaveIfError(stdin.SetReadMode(RIoReadHandle::EOneOrMore)); + + if (iRaw) + { + HBufC* readBuf = HBufC::NewLC(iBufSize / 2); + TPtr readBufPtr(readBuf->Des()); + TInt err = KErrNone; + while (err == KErrNone) + { + err = stdin.Read(readBufPtr); + if (err == KErrNone) + { + TPtrC8 writePtr((TUint8*)readBuf->Ptr(), readBuf->Size()); + TRequestStatus status; + iComm.Write(status, writePtr); + User::WaitForRequest(status); + LeaveIfErr(status.Int(), _L("RComm::Write failed with %d"), status.Int()); + } + } + CleanupStack::PopAndDestroy(readBuf); + } + else + { + HBufC* readBuf = HBufC::NewLC(iBufSize / 2); + TPtr readBufPtr(readBuf->Des()); + HBufC8* writeBuf = HBufC8::NewLC(iBufSize); + TPtr8 writeBufPtr(writeBuf->Des()); + TInt err = KErrNone; + while (err == KErrNone) + { + err = stdin.Read(readBufPtr); + if (err == KErrNone) + { + writeBufPtr.Copy(*readBuf); + TRequestStatus status; + iComm.Write(status, *writeBuf); + User::WaitForRequest(status); + LeaveIfErr(status.Int(), _L("RComm::Write failed with %d"), status.Int()); + } + } + CleanupStack::PopAndDestroy(2, readBuf); + } + } + +void CCmdRcomm::ArgumentsL(RCommandArgumentList& aArguments) + { + _LIT(KArg1, "csy_name"); + aArguments.AppendStringL(iCsyName, KArg1); + + _LIT(KArg2, "port_name"); + aArguments.AppendStringL(iPortName, KArg2); + + _LIT(KArg3, "mode"); + aArguments.AppendStringL(iMode, KArg3); + } + +void CCmdRcomm::OptionsL(RCommandOptionList& aOptions) + { + _LIT(KOption1, "access"); + aOptions.AppendUintL((TUint&)iCommAccess, KOption1); + + _LIT(KOption2, "buffer"); + aOptions.AppendUintL(iBufSize, KOption2); + + _LIT(KOption3, "raw"); + aOptions.AppendBoolL(iRaw, KOption3); + + _LIT(KOption4, "verbose"); + aOptions.AppendBoolL(iVerbose, KOption4); + } + + +EXE_BOILER_PLATE(CCmdRcomm) +