diff -r 82baf59ce8dd -r ecf06a08d4d9 mpengine/src/mpmpxharvesterframeworkwrapper_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpengine/src/mpmpxharvesterframeworkwrapper_p.cpp Mon May 03 12:29:20 2010 +0300 @@ -0,0 +1,327 @@ +/* +* Copyright (c) 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: Wrapper for mpx harvester framework utilities - private implementation. +* +*/ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "mpmpxharvesterframeworkwrapper.h" +#include "mpmpxharvesterframeworkwrapper_p.h" +#include "mptrace.h" + +/*! + \class MpMpxHarvesterFrameworkWrapperPrivate + \brief Wrapper for mpx harvester framework utilities - private implementation. + + This is a private implementation of the mpx harvester framework wrapper utilties interface. +*/ + +const int NoPreviousBroadCastMsg = -1; + +/*! + \internal + */ +MpMpxHarvesterFrameworkWrapperPrivate::MpMpxHarvesterFrameworkWrapperPrivate( MpMpxHarvesterFrameworkWrapper *wrapper ) + : q_ptr(wrapper), + iCollectionUtility(0), + iHarvesterUtility(0), + iNumItemsAdded(0), + iScanning( EFalse ), + iPreviousBroadCastMsg( NoPreviousBroadCastMsg ) +{ + TX_LOG +} + +/*! + \internal + */ +MpMpxHarvesterFrameworkWrapperPrivate::~MpMpxHarvesterFrameworkWrapperPrivate() +{ + TX_ENTRY + if ( iCollectionUtility ) { + iCollectionUtility->Collection().CancelRequest(); + iCollectionUtility->Close(); + } + + if ( iHarvesterUtility ) { + iHarvesterUtility->Close(); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::init( MpCommon::MpViewMode viewMode, TUid hostUid ) +{ + iViewMode = viewMode; + mHostUid = hostUid; + TRAPD( err, DoInitL() ); + if ( err != KErrNone ) { + TX_LOG_ARGS( "Error: " << err << "; should never get here." ); + } +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::scan() +{ + TRAPD( err, DoScanL() ); + if ( err != KErrNone ) { + TX_LOG_ARGS( "Error: " << err << "; should never get here." ); + } +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::cancelScan() +{ + TRAPD( err, DoCancelScanL() ); + if ( err != KErrNone ) { + TX_LOG_ARGS( "Error: " << err << "; should never get here." ); + } +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::checkForSystemEvents() +{ + TRAPD( err, DoCheckForSystemEventsL() ); + if ( err != KErrNone ) { + TX_LOG_ARGS( "Error: " << err << "; should never get here." ); + } +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::HandleOpenL( + const CMPXMedia& aEntries, + TInt aIndex, + TBool aComplete, + TInt aError ) +{ + Q_UNUSED( aIndex ); + Q_UNUSED( aComplete ); + Q_UNUSED( aError ); + Q_UNUSED( aEntries ); +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::HandleOpenL( + const CMPXCollectionPlaylist& aPlaylist, + TInt aError ) +{ + Q_UNUSED( aPlaylist ); + Q_UNUSED( aError ); +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::HandleCollectionMediaL( + const CMPXMedia& aMedia, + TInt aError ) +{ + Q_UNUSED( aMedia ); + Q_UNUSED( aError ); +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::HandleCollectionMessage( + CMPXMessage* aMsg, + TInt aErr ) +{ + TX_ENTRY_ARGS( "aErr=" << aErr ); + if ( aErr == KErrNone && aMsg ) { + TRAP_IGNORE( DoHandleCollectionMessageL(*aMsg) ); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::DoInitL() +{ + TX_ENTRY + if ( iViewMode == MpCommon::FetchView ) { + iCollectionUtility = MMPXCollectionUtility::NewL( this, mHostUid ); + } + else { + iCollectionUtility = MMPXCollectionUtility::NewL( this, KMcModeDefault ); + } + iHarvesterUtility = CMPXHarvesterFactory::NewL(); + iHarvesterUtility->CheckForSystemEventsL(); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::DoScanL() +{ + TX_ENTRY + iNumItemsAdded = 0; + iHarvesterUtility->ScanL(); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::DoCancelScanL() +{ + TX_ENTRY + // If harvester crashes, restart it. + TRAPD( err, iHarvesterUtility->CancelScanL() ); + if ( err != KErrNone ) { + iHarvesterUtility->Close(); + iHarvesterUtility = NULL; + iHarvesterUtility = CMPXHarvesterFactory::NewL(); + iHarvesterUtility->CheckForSystemEventsL(); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxHarvesterFrameworkWrapperPrivate::DoHandleCollectionMessageL( + const CMPXMessage& aMsg ) +{ + TX_ENTRY + TMPXMessageId id( aMsg.ValueTObjectL( KMPXMessageGeneralId ) ); + if ( KMPXMessageGeneral == id ) { + TInt event( aMsg.ValueTObjectL( KMPXMessageGeneralEvent ) ); + TInt type( aMsg.ValueTObjectL( KMPXMessageGeneralType ) ); + TInt data( aMsg.ValueTObjectL( KMPXMessageGeneralData ) ); + TX_LOG_ARGS( "event=" << event << ", type=" << type << ", data=" << data ); + + if ( event == TMPXCollectionMessage::EBroadcastEvent && + BroadcastEventFilter( type ) ) { + switch ( type ) { + case EMcMsgFormatStart: + emit q_ptr->diskEvent(DiskFormatStarted); + break; + case EMcMsgFormatEnd: + emit q_ptr->diskEvent(DiskFormatEnded); + break; + case EMcMsgDiskRemoved: + emit q_ptr->diskEvent(DiskRemoved); + break; + case EMcMsgDiskInserted: + emit q_ptr->diskEvent(DiskInserted); + break; + case EMcMsgUSBMassStorageStart: + emit q_ptr->usbEvent(UsbMassStorageStarted); + break; + case EMcMsgUSBMassStorageEnd: + emit q_ptr->usbEvent(UsbMassStorageEnded); + break; + case EMcMsgUSBMTPStart: + emit q_ptr->usbEvent(UsbMtpStarted); + break; + case EMcMsgUSBMTPEnd: + emit q_ptr->usbEvent(UsbMtpEnded); + break; + case EMcMsgUSBMTPNotActive: + emit q_ptr->usbEvent(UsbMtpNotActive); + break; + case EMcMsgRefreshStart: + iScanning = ETrue; + emit q_ptr->scanStarted(); + break; + case EMcMsgRefreshEnd: + iScanning = EFalse; + emit q_ptr->scanEnded( iNumItemsAdded, data ); + break; + default: + break; + } + } + } + else if( KMPXMessageIdItemChanged == id && iScanning ) { + if ( aMsg.IsSupported( KMPXMessageArrayContents ) ) { + // Loop through messages for arrays + const CMPXMessageArray* messageArray = + aMsg.Value( KMPXMessageArrayContents ); + User::LeaveIfNull( const_cast( messageArray ) ); + + for ( TInt i=0; iCount(); ++i ) { + HandleCollectionMessage( messageArray->AtL( i ), KErrNone ); + } + emit q_ptr->scanCountChanged( iNumItemsAdded ); + } + else { + // Single item + TMPXChangeEventType changeType( aMsg.ValueTObjectL( KMPXMessageChangeEventType ) ); + TMPXGeneralCategory cat( aMsg.ValueTObjectL( KMPXMessageMediaGeneralCategory ) ); + if( changeType == EMPXItemInserted && + ( cat == EMPXSong || cat == EMPXPlaylist || cat == EMPXPodcast ) ) { + iNumItemsAdded++; + } + } + } + TX_EXIT +} + +/*! + \internal + Returns false if same event has been received more than once + */ +TBool MpMpxHarvesterFrameworkWrapperPrivate::BroadcastEventFilter( TInt aMsg ) +{ + TX_ENTRY_ARGS( "New msg=" << aMsg << ", Prev. msg=" << iPreviousBroadCastMsg ); + if ( aMsg != iPreviousBroadCastMsg ) { + iPreviousBroadCastMsg = aMsg; + return true; + } + + return false; +} + +/*! + \internal + Request Harvester to check if there are any system events active. + */ +void MpMpxHarvesterFrameworkWrapperPrivate::DoCheckForSystemEventsL() +{ + TX_ENTRY + iPreviousBroadCastMsg = NoPreviousBroadCastMsg; + iHarvesterUtility->CheckForSystemEventsL(); + TX_EXIT +} +