diff -r 000000000000 -r d0791faffa3f obex/obexprotocol/obex/test/tobex/serverpacketaccessui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/obex/obexprotocol/obex/test/tobex/serverpacketaccessui.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,456 @@ +// 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: +// + +#include "serverpacketaccessui.h" + +#include +#include +#include +#include +#include "serverhandlerbase.h" + + +CObexServerPacketAccessUi* CObexServerPacketAccessUi::NewL(CObexServerHandlerBase& aHandler, CObexServer& aServer) + { + CObexServerPacketAccessUi* self = new (ELeave) CObexServerPacketAccessUi(aHandler, aServer); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CObexServerPacketAccessUi::~CObexServerPacketAccessUi() + { + Cancel(); + + delete iPacketAccess; + delete iConsole; + } + +CObexServerPacketAccessUi::CObexServerPacketAccessUi(CObexServerHandlerBase& aHandler, CObexServer& aServer) + : CActive(EPriorityNormal), iHandler(aHandler), iServer(aServer) + { + CActiveScheduler::Add(this); + } + +void CObexServerPacketAccessUi::ConstructL() + { + TRAPD(err, iConsole = Console::NewL(_L("Request Packets"),TSize(50,40))); + if (err != KErrNone) + { + TRAPD(err, iConsole = Console::NewL(_L("Request Packets"),TSize(50,15))); + if (err != KErrNone) + { + // we had a problem creating the console, probably because it was too big + // so try again and make it full screen. If we leave this time then just + // go with it. + iConsole = Console::NewL(_L("Request Packets"),TSize(KConsFullScreen,KConsFullScreen)); + } + } + iPacketAccess = CObexServerPacketAccessExtension::NewL(iServer, *this); + + SetKeypressActive(); + } + +void CObexServerPacketAccessUi::RunL() + { + TRAPD(err, ProcessKeyPressL(TChar(iConsole->KeyCode()))); + if(err != KErrNone) + { + iConsole->Printf(_L("Error: %d\r\n"),err); + } + SetKeypressActive(); + } + +void CObexServerPacketAccessUi::DoCancel() + { + iConsole->ReadCancel(); + } + +void CObexServerPacketAccessUi::SetKeypressActive() + { + iConsole->Read(iStatus); + SetActive(); + } + +void CObexServerPacketAccessUi::ProcessKeyPressL(TChar aChar) + { + if (aChar == EKeyEscape) + { + iHandler.PacketAccessUiL(EFalse); + return; + } + + switch (aChar) + { + case 'E': case 'e': // Enable + { + delete iPacketAccess; + iPacketAccess = CObexServerPacketAccessExtension::NewL(iServer, *this); + } + break; + case 'D': case 'd': // Disable + { + delete iPacketAccess; + iPacketAccess = NULL; + } + break; + case 'I': case 'i': // Interactive mode toggle + { + iInteractive = !iInteractive; + } + break; + default: + { + iConsole->Printf(_L("Invalid Key - valid keys 'e','d','i','Esc'\r\n")); + } + break; + } + } + +TBool CObexServerPacketAccessUi::RequestPacket(TObexRequestCode aRequest, TObexResponse& aResponse) + { + TBool requestPacketResult(ETrue); + + iConsole->Printf(_L("Request code %d\r\n"), aRequest); + + // Use Packet Headers now + CObexHeaderSet* headerSet = NULL; + iServer.PacketHeaders(headerSet); + if (headerSet) + { + // Ensures that if the function leaves then the only option is to + // report a false operation. As RequestPacket function signiture is published partner + TRAPD(err,PrintHeadersL(*headerSet)); + if (err != KErrNone) + { + requestPacketResult = EFalse; + } + delete headerSet; + } + + if (requestPacketResult) + { + requestPacketResult = RequestPacketReturn(aResponse); + } + + // Provide function result to caller + return requestPacketResult; + } + +TBool CObexServerPacketAccessUi::RequestPacket(TObexRequestCode aRequest, TObexConnectInfo& aConnectInfo, TObexResponse& aResponse) + { + TBool requestPacketResult(ETrue); + + iConsole->Printf(_L("Request code %d - Connect\r\n"), aRequest); + iConsole->Printf(_L("\tMajor version=%d, Minor version=%d\r\n"), aConnectInfo.VersionMajor(), aConnectInfo.VersionMinor()); + iConsole->Printf(_L("\tConnection flags=0x%02x\r\n"), aConnectInfo.iFlags); + if (aConnectInfo.iWho.Length() > 0) + { + iConsole->Printf(_L("\tWho attribute=%S\r\n"), &(aConnectInfo.iWho)); + } + if (aConnectInfo.iTargetHeader.Length() > 0) + { + iConsole->Printf(_L("\tTarget header=%S\r\n"), &(aConnectInfo.iTargetHeader)); + } + + // Use Packet Headers now + CObexHeaderSet* headerSet = NULL; + iServer.PacketHeaders(headerSet); + if (headerSet) + { + // Ensures that if the function leaves then the only option is to + // report a false operation. As RequestPacket function signiture is published partner + TRAPD(err,PrintHeadersL(*headerSet)); + if (err != KErrNone) + { + requestPacketResult = EFalse; + } + delete headerSet; + } + + if (requestPacketResult) + { + requestPacketResult = RequestPacketReturn(aResponse); + } + + // Provide function result to caller + return requestPacketResult; + } + +TBool CObexServerPacketAccessUi::RequestPacket(TObexRequestCode aRequest, CObex::TSetPathInfo& aSetPathInfo, TObexResponse& aResponse) + { + TBool requestPacketResult(ETrue); + + iConsole->Printf(_L("Request code %d - SetPath\r\n"), aRequest); + iConsole->Printf(_L("\tParent=%d\r\n"), aSetPathInfo.Parent()); + iConsole->Printf(_L("\tSetPath flags=0x%02x, constants=0x%02x\r\n"), aSetPathInfo.iFlags, aSetPathInfo.iConstants); + if (aSetPathInfo.iNamePresent) + { + iConsole->Printf(_L("\tDestination directory=%S\r\n"), &(aSetPathInfo.iName)); + } + + // Use Packet Headers now + CObexHeaderSet* headerSet = NULL; + iServer.PacketHeaders(headerSet); + if (headerSet) + { + // Ensures that if the function leaves then the only option is to + // report a false operation. As RequestPacket function signiture is published partner + TRAPD(err,PrintHeadersL(*headerSet)); + if (err != KErrNone) + { + requestPacketResult = EFalse; + } + delete headerSet; + } + + if (requestPacketResult) + { + requestPacketResult = RequestPacketReturn(aResponse); + } + + // Provide function result to caller + return requestPacketResult; + } + +TBool CObexServerPacketAccessUi::RequestPacketReturn(TObexResponse& aResponse) + { + if (iInteractive) + { + TKeyCode key(EKeyNull); + TBuf<2> buf; + aResponse = ERespBadRequest; + + Cancel(); // cancel getting key presses will in "submenu" + + iConsole->Printf(_L("Adandon Packet? (y/n) ")); + while (key != 'y' && key != 'Y' && key != 'n' && key != 'N') + { + key = iConsole->Getch(); + } + iConsole->Printf(_L("%c"),key); + if (key == 'n' || key == 'N') + { + SetKeypressActive(); // reactivate key handling + iConsole->Printf(_L("\r\n")); + return ETrue; + } + + // If here then we are abandoning the packet + iConsole->Printf(_L("\r\nResponse to send? 0x")); + + while ((key = iConsole->Getch()) != EKeyEnter) + { + if (key == EKeyBackspace && buf.Length()!=0) + { + buf.SetLength(buf.Length()-1); + } + else if( buf.Length() < buf.MaxLength()) + { + buf.Append(key); + } + else + continue; + iConsole->Printf(_L("%c"),key); + } + iConsole->Printf(_L("\r\n")); + + TLex lex(buf); + TUint value; + TInt lex_err = lex.Val(value, EHex); + + if(lex_err == KErrNone) + { + aResponse = static_cast(value); + } + else + { + iConsole->Printf(_L("Input parsing failed, use ERespBadRequest as default response\r\n")); + } + SetKeypressActive(); // reactivate key handling + return EFalse; + } + else + { + return ETrue; + } + } + +CConsoleBase& CObexServerPacketAccessUi::Console() const + { + return *iConsole; + } + +void CObexServerPacketAccessUi::PrintHeadersL(CObexHeaderSet& aHeaderSet) const + { + CObexHeader* header = CObexHeader::NewL(); + CleanupStack::PushL(header); + + aHeaderSet.First(); + TInt err(aHeaderSet.This(header)); + if (err == KErrNone) + { + iConsole->Printf(_L("Packet header contents...\r\n")); + } + while (err == KErrNone) + { + // get the next header + err = aHeaderSet.This(header); + if (err != KErrNone) + { + break; + } + + PrintHeader(*header); + + err = aHeaderSet.Next(); + } + + CleanupStack::PopAndDestroy(header); + } + +void CObexServerPacketAccessUi::PrintHeader(CObexHeader& aHeader) const + { + // appropriately print the header + iConsole->Printf(_L("\tHI: %d\r\n"),aHeader.HI()); + + CObexHeader::THeaderType type = aHeader.Type(); + switch(type) + { + case CObexHeader::EUnicode: + { + const TDesC16& headerdes = aHeader.AsUnicode(); + const TUint8* bytes = reinterpret_cast(headerdes.Ptr()); + PrintHex(bytes, headerdes.Size()); + } + break; + case CObexHeader::EByteSeq: + { + const TDesC8& headerbyteseq = aHeader.AsByteSeq(); + PrintHex(headerbyteseq.Ptr(), headerbyteseq.Size()); + } + break; + case CObexHeader::EByte: + { + const TUint8 headerbyte = aHeader.AsByte(); + PrintHex(&headerbyte, 1); + } + break; + case CObexHeader::EFourByte: + { + const TUint32 headerbytes = aHeader.AsFourByte(); + const TUint8* bytes = reinterpret_cast(&headerbytes); + PrintHex(bytes, 4); + } + break; + default: + // panic here maybe?? + break; + } + } + +void CObexServerPacketAccessUi::PrintHex(const TUint8* aPtr, TInt aLength) const + { + // local constants + const TUint32 widthC = 8; + _LIT(KPrintHexByte, "%02x "); + _LIT(KPrintHexTab, "\t"); + _LIT(KPrintHexChar, "%c "); + _LIT(KPrintHexNonchar, ". "); + _LIT(KPrintHexNewline, "\r\n"); + _LIT(KPrintHex2Spaces, " "); + _LIT(KPrintHex3Spaces, " "); + + // function begins... + TInt length = 0; + TUint32 cursor = 0; + + TUint8 printArray[widthC]; + + while (length < aLength) + { + printArray[cursor] = *aPtr; + + // move along. + aPtr++; + length++; + cursor = length % widthC; + + if (cursor == 0) + { + // we have a full array so print it. + iConsole->Printf(KPrintHexTab()); + for (TUint i=0;iPrintf(KPrintHexByte(),printArray[i]); + } + iConsole->Printf(KPrintHexTab()); + for (TUint i=0;i= 32 && c <= 126) + { + iConsole->Printf(KPrintHexChar(), c); + } + else + { + iConsole->Printf(KPrintHexNonchar()); + } + } + iConsole->Printf(KPrintHexNewline()); + } + } + + // if we haven't completely finished a set -> finish it + if (cursor > 0) + { + iConsole->Printf(KPrintHexTab()); + for (TUint i=0;i= cursor) + { + iConsole->Printf(KPrintHex3Spaces()); + } + else + { + iConsole->Printf(KPrintHexByte(),printArray[i]); + } + } + iConsole->Printf(KPrintHexTab()); + for (TUint i=0;i= cursor) + { + iConsole->Printf(KPrintHex2Spaces()); + } + else + { + TUint8 c = printArray[i]; + if (c >= 32 && c <= 126) + { + iConsole->Printf(KPrintHexChar(), c); + } + else + { + iConsole->Printf(KPrintHexNonchar()); + } + } + } + iConsole->Printf(KPrintHexNewline()); + } + + // should be printed now + }