diff -r f5050f1da672 -r 04becd199f91 javauis/mmapi_akn/audiostreaming/src.mmf/cmmastreamhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/mmapi_akn/audiostreaming/src.mmf/cmmastreamhandler.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2002-2007 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: Streams data from Java to controller +* +*/ + + +// INCLUDE FILES +#include +#include +#include + +#include "CMMAStreamHandler.h" +#include "CMMADataSourceStream.h" +#include "CMMAEventSource.h" + +CMMAStreamHandler* CMMAStreamHandler::NewL( + MMMAStreamHandlerListener& aListener, + RMMFController& aController) +{ + CMMAStreamHandler* self = new(ELeave) CMMAStreamHandler(aListener, + aController); + self->ConstructL(); + return self; +} + +CMMAStreamHandler::~CMMAStreamHandler() +{ + iRequests.ResetAndDestroy(); +} + +CMMAStreamHandler::CMMAStreamHandler(MMMAStreamHandlerListener& aListener, + RMMFController& aController): + iController(aController), + iListener(aListener) +{ + // ignore read/write completed before stream is prepared + iState = EMMAStreamPaused; +} + +void CMMAStreamHandler::ConstructL() +{ + // create requests + for (TInt i = 0; i < KMMAStreamHandlerBufferCount; i++) + { + CMMAStreamRequest* requestToAppend = CMMAStreamRequest::NewLC(this); + iRequests.AppendL(requestToAppend); + CleanupStack::Pop(requestToAppend); + } +} + +void CMMAStreamHandler::PrepareL() +{ + DEBUG_INT("MMA::CMMAStreamHandler::PrepareL state %d", iState); + iState = EMMAStreamPrepare; + + //reset request data for reading again from beginning + iRequests[0]->DataPtr().SetLength(0); + + // when read completes iListerner.PrepareComplete will be called + iSourceStream->Read(iRequests[ 0 ]); +} + +void CMMAStreamHandler::StartL() +{ + DEBUG_INT("MMA::CMMAStreamHandler::StartL state %d", iState); + DEBUG_INT("MMA::CMMAStreamHandler::StartL data source request=%d", + (TInt)iSourceStream->Request()); + + iState = EMMAStreamStart; + if (iSourceStream->Request()) + { // when read request is completed it will be written to server + iState = EMMAStreamStarted; + iListener.StartComplete(KErrNone); + return; + } + + TInt count = iRequests.Count(); + TBool started = EFalse; + for (TInt i = 0; i < count && !started; i++) + { + CMMAStreamRequest* r = iRequests[ i ]; + if (!r->IsActive() && r->DataPtr().Length() > 0) + { + DEBUG("MMA::CMMAStreamHandler::StartL write request to server"); + DEBUG_INT("MMA::CMMAStreamHandler::StartL request length=%d", + r->DataPtr().Length()); + DEBUG_INT("MMA::CMMAStreamHandler::StartL last buffer %d", + r->RequestBuffer()()); + + // data was not yet written to server + WriteRequest(r); + started = ETrue; + } + else if (r->IsActive()) // data is in server + { + DEBUG("MMA::CMMAStreamHandler::StartL data is in server"); + // atleast one request is not processed + started = ETrue; + } + } + if (started) // If allready started complete start + { + iListener.StartComplete(KErrNone); + iState = EMMAStreamStarted; + } + else + { + // Need to read data before start + iSourceStream->Read(iRequests[ 0 ]); + } +} + +void CMMAStreamHandler::Pause() +{ + // ignore read/write completes + iState = EMMAStreamPaused; +} + +TMMFMessageDestination& CMMAStreamHandler::MessageDestination() +{ + return iDataSourceHandle; +} + +void CMMAStreamHandler::SetSourceStream(CMMADataSourceStream* aSourceStream) +{ + iSourceStream = aSourceStream; +} + +void CMMAStreamHandler::WriteComplete(CMMAStreamRequest* aRequest) +{ + DEBUG_INT("MMA::CMMAStreamHandler::WriteComplete state=%d", iState); + DEBUG_INT("MMA::CMMAStreamHandler::WriteComplete request length=%d", + aRequest->DataPtr().Length()); + DEBUG_INT("MMA::CMMAStreamHandler::WriteComplete last buffer %d", + aRequest->RequestBuffer()()); + if (iState == EMMAStreamStarted) + { + if (aRequest->RequestBuffer()() == 1) + { + iState = EMMAStreamEof; + } + else + { + iSourceStream->Read(aRequest); + } + } + // else, all other states ignore write complete +} + +void CMMAStreamHandler::ReadComplete(CMMAStreamRequest* aRequest) +{ + if (iState == EMMAStreamPrepare) + { + WriteRequest(aRequest); + iListener.PrepareComplete(KErrNone); + iState = EMMAStreamPaused; + } + else if (iState == EMMAStreamStart) + { + iState = EMMAStreamStarted; + // write first request to server + WriteRequest(aRequest); + iListener.StartComplete(KErrNone); + } + else if (iState == EMMAStreamStarted) + { + WriteRequest(aRequest); + } + // else, all other states ignore read complete +} + +void CMMAStreamHandler::HandleError(CMMAStreamRequest* /*aRequest*/, + TInt aError) +{ + DEBUG_INT("MMA::CMMAStreamHandler::HandleError state=%d", iState); + if (iState == EMMAStreamPrepare) + { + iListener.PrepareComplete(aError); + iState = EMMAStreamPaused; + } + else if (iState == EMMAStreamStart) + { + iListener.StartComplete(aError); + iState = EMMAStreamStarted; + } + else + { + iListener.HandleError(aError); + } +} + +void CMMAStreamHandler::WriteRequest(CMMAStreamRequest* aRequest) +{ + if (aRequest->RequestBuffer()() == 1) + { + iState = EMMAStreamEof; + } + + if (!aRequest->IsActive()) + { + aRequest->SetActive(); + } + + // Send write request to server, HandleRequestCompleteL is called when finished + iController.CustomCommandAsync(iDataSourceHandle, + 1, /*EProcessBuffer*/ + aRequest->DataPtr(), + aRequest->RequestBuffer(), + aRequest->iStatus); +} +// END OF FILE