diff -r 22de2e391156 -r 20ac952a623c remotecontrol/avrcp/remconbeareravrcp/src/avrcpadvancedcontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/remotecontrol/avrcp/remconbeareravrcp/src/avrcpadvancedcontrol.cpp Wed Oct 13 16:20:29 2010 +0300 @@ -0,0 +1,161 @@ +// Copyright (c) 2008-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 +#include +#include "avrcpinternalinterface.h" +#include "avrcplog.h" +#include "avrcputils.h" +#include "browsecommand.h" +#include "browsingframe.h" +#include "mediabrowse.h" +#include "nowplaying.h" + +TInt CBrowseCommand::HandleSetBrowsedPlayer() + { + LOG_FUNC + + TPtrC8 payload; + AvrcpBrowsing::BrowsingFrame::Payload(iFrame, payload); + if (payload.Length() < KMinLengthSetBrowsedPlayerPdu) + { + return KErrAvrcpAirInvalidCommand; + } + + iOperationId = ESetBrowsedPlayerOperationId; + iInterfaceUid = TUid::Uid(KRemConMediaBrowseApiUid); + + RRemConSetBrowsedPlayerRequest request; + request.iPlayerId = static_cast(payload[0]) << 8; + request.iPlayerId |= payload[1]; + request.iMaxResponse = iMaxResponse; + TBuf8 buf; + // Only reason for WriteL to leave is insufficently large buffer + TRAP_IGNORE(request.WriteL(buf)); + TInt err = AppendIncomingPayload(buf); + return (err == KErrNone) ? KErrAvrcpFurtherProcessingRequired : err; + } + +TInt CBrowseCommand::HandleGetFolderItems() + { + LOG_FUNC + + TPtrC8 payload; + AvrcpBrowsing::BrowsingFrame::Payload(iFrame, payload); + if (payload.Length() < KMinLengthGetFolderItemsPdu) + { + return KErrAvrcpAirInvalidCommand; + } + + TInt err = KErrAvrcpInvalidScope; + switch(iFrame[3]) + { + case AvrcpBrowsing::KMediaPlayerScope: + { + iOperationId = EAvrcpInternalGetFolderItems; + iInterfaceUid = TUid::Uid(KUidAvrcpInternalInterface); + err = (AppendIncomingPayload(payload) == KErrNone) ? KErrAvrcpInternalCommand : err; + break; + } + case AvrcpBrowsing::KVirtualFilesystemScope: + case AvrcpBrowsing::KSearchScope: + case AvrcpBrowsing::KNowPlayingScope: + { + iOperationId = EGetFolderItemsOperationId; + iInterfaceUid = TUid::Uid(KRemConMediaBrowseApiUid); + err = AppendIncomingPayload(payload); + break; + } + }; + + return err; + } + +TInt CBrowseCommand::HandleChangePath() + { + LOG_FUNC + + TPtrC8 payload; + AvrcpBrowsing::BrowsingFrame::Payload(iFrame, payload); + if (payload.Length() < KMinLengthChangePathPdu) + { + return KErrAvrcpAirInvalidCommand; + } + + iOperationId = EChangePathOperationId; + iInterfaceUid = TUid::Uid(KRemConMediaBrowseApiUid); + return AppendIncomingPayload(payload); + } + +TInt CBrowseCommand::HandleGetItemAttributes() + { + LOG_FUNC + + TPtrC8 payload; + AvrcpBrowsing::BrowsingFrame::Payload(iFrame, payload); + if (payload.Length() < KMinLengthGetItemAttributesPdu) + { + return KErrAvrcpAirInvalidCommand; + } + + iInterfaceUid = TUid::Uid(KRemConMediaBrowseApiUid); + iOperationId = EGetItemAttributesOperationId; + return AppendIncomingPayload(payload); + } + +TInt CBrowseCommand::HandleSearch() + { + LOG_FUNC + + TPtrC8 payload; + AvrcpBrowsing::BrowsingFrame::Payload(iFrame, payload); + if (payload.Length() < KMinLengthSearchPdu) + { + return KErrAvrcpAirInvalidCommand; + } + + iOperationId = ESearchOperationId; + iInterfaceUid = TUid::Uid(KRemConMediaBrowseApiUid); + return AppendIncomingPayload(payload); + } + +/** Allocate correct space and append the payload to iCommandData + */ +TInt CBrowseCommand::AppendIncomingPayload(const TPtrC8& aPayload) + { + iCommandData.Close(); + if (iCommandData.Create(aPayload.Length()) != KErrNone) + { + return KErrAvrcpAirInternalError; + } + + iCommandData.Append(aPayload); + + return KErrNone; + } + +TInt CBrowseCommand::HandleUnknownPdu() + { + iFrame.Close(); + TInt err = iFrame.CreateMax(KMinLengthGeneralReject); + if(!err) + { + iFrame[0] = AvrcpBrowsing::EGeneralReject; + iFrame[1] = (KMinLengthGeneralReject - AvrcpBrowsing::KHeaderLength) >> 8; + iFrame[2] = (KMinLengthGeneralReject - AvrcpBrowsing::KHeaderLength); + iFrame[3] = KErrAvrcpAirInvalidCommand - KErrAvrcpAirBase; + } + return err ? err : KErrAvrcpHandledInternallyRespondNow; + }