--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/test/tavsrcSock.cpp Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,221 @@
+// Copyright (c) 2007-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 "tavsrcSock.h"
+#include "tavsrc.h"
+
+#ifdef __WINS__
+static const TSize KReaderConsole(55,10);
+static const TSize KWriterConsole(55,12);
+#else
+static const TSize KReaderConsole(KConsFullScreen,KConsFullScreen);
+static const TSize KWriterConsole(KConsFullScreen,KConsFullScreen);
+#endif
+
+//
+// class CActivePacketDropIoctl
+//
+CActivePacketDropIoctl* CActivePacketDropIoctl::NewL(CActiveConsole* aLogConsole, RSocketArray aPendingSockets)
+ {
+ CActivePacketDropIoctl* self = new (ELeave) CActivePacketDropIoctl(aLogConsole, aPendingSockets);
+ return self;
+ }
+
+CActivePacketDropIoctl::CActivePacketDropIoctl(CActiveConsole* aLogConsole, RSocketArray aPendingSockets) : CActive(0)
+ {
+ iPendingSockets = aPendingSockets;
+ iLogConsole = aLogConsole;
+ CActiveScheduler::Add(this);
+ }
+
+CActivePacketDropIoctl::~CActivePacketDropIoctl()
+ {
+ }
+
+void CActivePacketDropIoctl::DoCancel()
+ {
+ Cancel();
+ }
+
+void CActivePacketDropIoctl::Start()
+ {
+ iPendingSockets[0].Ioctl(ENotifyAvdtpMediaPacketDropped, iStatus, &iPacketsLostPkgBuf, KSolBtAVDTPMedia);
+ SetActive();
+ }
+
+void CActivePacketDropIoctl::RunL()
+ {
+ __LOG(_L("\n**Packets Dropped Notification! %d packets lost.\n"), iPacketsLostPkgBuf());
+ }
+
+//
+// class CActiveSockReader
+//
+CActiveSockReader* CActiveSockReader::NewL(RSocket aSock, TAvdtpTransportSessionType aType)
+ {
+ CActiveSockReader* self = new (ELeave) CActiveSockReader(aSock);
+ CleanupStack::PushL(self);
+ self->ConstructL(aType);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CActiveSockReader::CActiveSockReader(RSocket aSock)
+: CActive(0), iSock(aSock), iBufferDes(NULL, NULL)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CActiveSockReader::Start()
+ {
+ iSock.Read(iBufferDes,iStatus);
+ SetActive();
+ }
+
+void CActiveSockReader::ConstructL(TAvdtpTransportSessionType aType)
+ {
+ iType = aType;
+ switch (aType)
+ {
+ case EMedia:
+ iConsole = Console::NewL(_L("Incoming Sink Data"),KReaderConsole);
+ break;
+ case EReporting:
+ iConsole = Console::NewL(_L("Incoming Reporting Channel Data"),KReaderConsole);
+ break;
+ case ERecovery:
+ iConsole = Console::NewL(_L("Incoming Recovery Channel Data"),KReaderConsole);
+ break;
+ }
+
+ iBuffer = HBufC8::NewL(40);
+ iBuffer->Des().SetMax();
+ iBufferDes.Set(iBuffer->Des());
+ }
+
+CActiveSockReader::~CActiveSockReader()
+ {
+ Cancel();
+ delete iConsole;
+ iSock.Close();
+ }
+
+void CActiveSockReader::DoCancel()
+ {
+ iSock.CancelAll();
+ }
+
+void CActiveSockReader::RunL()
+ {
+ if (iStatus.Int()==KErrNone)
+ {
+ iConsole->Printf(_L("length: [%04d]\n"),iBufferDes.Length());
+ for (TInt i=0;i<=iBufferDes.Length()-1;i++)
+ {
+ iConsole->Printf(_L("%c"),iBufferDes[i]);
+ }
+ iConsole->Printf(_L("\n\n"));
+ iBuffer->Des().SetMax();
+ iBufferDes.Set(iBuffer->Des());
+ iSock.Read(iBufferDes,iStatus);
+ SetActive();
+ }
+ else
+ {
+ iConsole->Printf(_L("SOCKET ERROR: %d"),iStatus.Int());
+ }
+
+ }
+
+//
+// class CActiveSockWriter
+//
+CActiveSockWriter* CActiveSockWriter::NewL(RSocket aSock,
+ TAvdtpTransportSessionType aType)
+ {
+ CActiveSockWriter* writer = new (ELeave) CActiveSockWriter(aSock);
+ CleanupStack::PushL(writer);
+ writer->ConstructL(aType);
+ CleanupStack::Pop();
+ return writer;
+ }
+
+CActiveSockWriter::~CActiveSockWriter()
+ {
+ delete iSendBuffer;
+ delete iConsole;
+ // test for normal shutdown on media socket
+ TRequestStatus stat;
+ iSock.Shutdown(RSocket::ENormal, stat);
+ User::WaitForRequest(stat);
+ iSock.Close();
+ }
+
+void CActiveSockWriter::Send()
+ {
+ // periodic callback to send from app
+ if (IsActive())
+ {
+ iConsole->Printf(_L("Info: Transport session %d tried to send, but active\n"), iType);
+ }
+ else
+ {
+ iSock.Write(*iSendBuffer, iStatus);
+ SetActive();
+ }
+ }
+
+CActiveSockWriter::CActiveSockWriter(RSocket aSock)
+: CActive(-1), iSock(aSock)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CActiveSockWriter::ConstructL(TAvdtpTransportSessionType aType)
+ {
+ // Writer console to be used in the future if necessary for debugging
+ // iConsole = Console::NewL(_L("Writer"), KWriterConsole);
+
+ iSendBuffer = HBufC8::NewL(512);
+ TPtr8 des = iSendBuffer->Des();
+ iType = aType;
+ switch (aType)
+ {
+ case EMedia:
+ des.Copy(_L("Media channel connected!"));
+ break;
+ case EReporting:
+ des.Copy(_L("Reporting channel connected!"));
+ break;
+ case ERecovery:
+ des.Copy(_L("Recovery channel connected!"));
+ break;
+ default:
+ des.Copy(_L("Unknown channel "));
+ des.AppendNum(aType);
+ des.Append(_L(" connected!"));
+ break;
+ }
+ }
+
+void CActiveSockWriter::DoCancel()
+ {
+ iSock.CancelWrite();
+ }
+
+void CActiveSockWriter::RunL()
+ {
+ // iConsole->Printf(_L("Info: Transport session %d SENT, result %d"), iType, iStatus.Int());
+ }