videocollection/videocollectionwrapper/src/videocollectionlistener.cpp
changeset 30 4f111d64a341
child 34 bbb98528c666
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videocollection/videocollectionwrapper/src/videocollectionlistener.cpp	Thu Apr 01 22:38:49 2010 +0300
@@ -0,0 +1,499 @@
+/*
+* 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:   VideoCollectionClient class implementation
+* 
+*/
+
+// INCLUDE FILES
+
+#include <mpxmediageneraldefs.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxmessage2.h>
+#include <mpxcollectionmessagedefs.h>
+#include <mpxcollectionmessage.h>
+#include <mpxmessagecontainerdefs.h>
+#include <mpxmediacontainerdefs.h>
+#include <mpxcommandgeneraldefs.h>
+#include <mpxcollectioncommanddefs.h>
+#include <vcxmyvideosdefs.h>
+#include <vcxmyvideosuids.h>
+
+#include "videocollectionlistener.h"
+#include "videocollectionclient.h"
+#include "videocollectionutils.h"
+
+// -----------------------------------------------------------------------------
+// VideoCollectionListener
+// -----------------------------------------------------------------------------
+//
+VideoCollectionListener::VideoCollectionListener(VideoCollectionClient &collectionClient) : 
+mCollectionClient(collectionClient),
+mVideoUtils(VideoCollectionUtils::instance()),
+mNewArrayRequest(true)
+{
+
+}
+
+// -----------------------------------------------------------------------------
+// ~VideoCollectionListener
+// -----------------------------------------------------------------------------
+//
+VideoCollectionListener::~VideoCollectionListener()
+{
+
+}
+
+// -----------------------------------------------------------------------------
+// HandleCollectionMediaL
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::HandleCollectionMediaL( 
+        const CMPXMedia& /*aMedia*/,
+        TInt /*aError*/)
+{
+   // NOP
+}
+
+// -----------------------------------------------------------------------------
+// setRequestNewMediaArray
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::setRequestNewMediaArray(bool request)
+{
+    mNewArrayRequest = request;
+}
+
+
+// -----------------------------------------------------------------------------
+// HandleOpenL
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::HandleOpenL( 
+        const CMPXMedia& aEntries,
+        TInt /*aIndex*/,
+        TBool /*aComplete*/,
+        TInt aError)
+{
+    if(aError != KErrNone)
+    {
+        return;
+    }
+
+    int level = mCollectionClient.getCollectionLevel();
+    
+    if((level != VideoCollectionClient::ELevelVideos) &&
+	   (level != VideoCollectionClient::ELevelCategory))
+    {
+        return;
+    }
+    CMPXMediaArray *array =
+                    mVideoUtils.mediaValuePtr<CMPXMessageArray>(&aEntries, KMPXMediaArrayContents);
+
+    if(!array)
+    {
+        // no videos!
+        return;
+    }
+    // if there's item's, compare gotten items' level to wanted level. 
+    // If they do not match, do nothing
+    if(array->Count() > 0)
+    {
+        TMPXItemId id( 0, 0 );
+        mVideoUtils.mediaValue<TMPXItemId>((*array)[0], KMPXMediaGeneralId, id );
+        if((id.iId2 == 1 && level != VideoCollectionClient::ELevelCategory) ||
+            id.iId2 != 1 && level != VideoCollectionClient::ELevelVideos)  
+        {
+            return;
+        }
+        
+    }
+    if(mNewArrayRequest)
+    {
+       emit newVideoList(array);
+       mNewArrayRequest = false;
+    }
+    else
+    {
+        emit videoListAppended(array);
+    }
+ }
+
+// -----------------------------------------------------------------------------
+// HandleOpenL
+// -----------------------------------------------------------------------------
+//                      
+void VideoCollectionListener::HandleOpenL( 
+        const CMPXCollectionPlaylist& /*aPlaylist*/,
+        TInt /*aError*/)
+{
+    // NOP
+}
+
+// -----------------------------------------------------------------------------
+// HandleCommandComplete
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::HandleCommandComplete( 
+        CMPXCommand* aCommandResult, 
+        TInt aError)
+{
+    if(aError != KErrNone || !aCommandResult)
+    {
+        return;
+    }
+    int commandId = -1;
+    
+    if(mVideoUtils.mediaValue<int>(aCommandResult, KVcxMediaMyVideosCommandId, commandId))
+    {
+        if(commandId == KVcxCommandMyVideosGetMediaFullDetailsByMpxId)
+        {
+            handleGetVideoDetailsResp(aCommandResult);
+        }
+    }
+}
+
+// -----------------------------------------------------------------------------
+// HandleCollectionMessage
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::HandleCollectionMessage( 
+        CMPXMessage* aMessage,
+        TInt aError )
+{
+    if(aError)
+    {
+        return;
+    }  
+
+    TMPXMessageId mainMessageId;
+    if(!mVideoUtils.mediaValue<TMPXMessageId>(aMessage, KMPXMessageGeneralId, mainMessageId))
+    {
+        return;
+    }  
+    
+    if(mCollectionClient.getOpenStatus() == VideoCollectionClient::ECollectionOpened )
+    {
+        // after colletion has been opened we handle messages from our collection plugin only
+        TUid collectionUid;
+        bool status = mVideoUtils.mediaValue<TUid>(aMessage, KMPXMessageCollectionId, collectionUid);
+        if(!status || collectionUid.iUid != KVcxUidMyVideosMpxCollection)
+        {
+            return;
+        }
+    }
+    else
+    {
+        // before opening we're just excepting general messages
+        if(mainMessageId == KMPXMessageGeneral)
+        {
+            handleGeneralMPXMessage(aMessage);
+        }
+        return;
+    }
+           
+    if( mainMessageId == KVcxCommandIdMyVideos)
+    {        
+        int myVideosMainMsgId = -1; 
+
+        if(!mVideoUtils.mediaValue<int>(aMessage, KVcxMediaMyVideosCommandId, myVideosMainMsgId ))
+        {
+            return;
+        }
+
+        if ( myVideosMainMsgId == KVcxMessageMyVideosMessageArray )
+        {
+            handleMyVideosMessageArray(aMessage); 
+        }
+        else
+        {
+            handleMyVideosMPXMessage(myVideosMainMsgId, aMessage);
+        }
+    }
+    else
+    {
+        handleMPXMessage(mainMessageId, aMessage);
+    }
+}
+
+// -----------------------------------------------------------------------------
+// handleMyVideosMessageArray
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleMyVideosMessageArray(CMPXMessage *aMessage)
+{   
+    CMPXMessageArray* messageArray = NULL;
+    
+    messageArray = mVideoUtils.mediaValuePtr<CMPXMessageArray>(aMessage, KMPXMessageArrayContents);
+    if(!messageArray)
+    {
+        return;
+    }
+    
+    int count = messageArray->Count();    
+    int myVideosMsgId;
+    TMPXMessageId mpxMessageId;
+    
+    CMPXMessage *singleMessage;
+    for ( int i = 0; i < count; ++i )
+    {
+        singleMessage = (*messageArray)[i];
+        if(mVideoUtils.mediaValue<int>(singleMessage, KVcxMediaMyVideosCommandId, myVideosMsgId))
+        {
+            handleMyVideosMPXMessage(myVideosMsgId, singleMessage);
+        }
+        else if(mVideoUtils.mediaValue<TMPXMessageId>(
+                                        singleMessage, KMPXMessageGeneralId, mpxMessageId))
+        {
+            handleMPXMessage(mpxMessageId, singleMessage);
+        }
+    }    
+}
+
+// -----------------------------------------------------------------------------
+// handleMyVideosMPXMessage
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleMyVideosMPXMessage(int &myVideosMsgId, CMPXMessage *aMessage)
+{
+    switch (myVideosMsgId)
+    {
+        case KVcxMessageMyVideosGetMediasByMpxIdResp:
+            handleGetMediasByMpxIdResp(aMessage);
+            break;
+        case KVcxMessageMyVideosDeleteResp:
+            handleMyVideosDeleteMessage(aMessage);
+            break;
+        case KVcxMessageMyVideosDeleteStarted:
+            break;
+        case KVcxMessageMyVideosListComplete:
+            mCollectionClient.startOpenCurrentState();
+            break;
+        case KVcxMessageMyVideosItemsAppended:
+            mCollectionClient.startOpenCurrentState();
+            break;
+        case KVcxMessageMyVideosMoveOrCopyStarted:
+            break;
+        case KVcxMessageMyVideosMoveResp:
+            break;
+        case KVcxMessageMyVideosCopyResp:
+            break;
+        default:
+            break;
+    }
+}
+
+// -----------------------------------------------------------------------------
+// handleCommonMPXMessage
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleMPXMessage(TMPXMessageId &mpxMessageId, CMPXMessage *aMessage)
+{
+    switch(mpxMessageId)
+    {
+        case KMPXMessageGeneral:
+            handleGeneralMPXMessage(aMessage);
+        break;
+        case KMPXMessageIdItemChanged:
+            handleMyVideosItemsChanged(aMessage);
+        break;
+        default:
+        break;
+    }
+}
+
+// -----------------------------------------------------------------------------
+// handleGeneralMPXMessage
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleGeneralMPXMessage(CMPXMessage* aMessage)
+{
+    if(mCollectionClient.getOpenStatus() != VideoCollectionClient::ECollectionOpening)
+    {
+        return;
+    }
+    int event = 0;
+    if(!mVideoUtils.mediaValue<int>(aMessage, KMPXMessageGeneralEvent, event))
+    {
+        return;
+    }
+
+    int data = 0;
+    if(!mVideoUtils.mediaValue<int>(aMessage, KMPXMessageGeneralData, data))
+    {
+        return;
+    }
+
+    if( event == TMPXCollectionMessage::EPathChanged &&    
+        data == EMcContainerOpened )
+    {
+        mCollectionClient.setOpenStatus(VideoCollectionClient::ECollectionOpened);
+    }
+}
+
+// -----------------------------------------------------------------------------
+// handleMyVideosItemsChanged
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleMyVideosItemsChanged(CMPXMessage* aMessage)
+{
+    if(mCollectionClient.getCollectionLevel() != VideoCollectionClient::ELevelVideos)
+    {
+        // we do not handle events from other levels than ones concerning videos
+        return;
+    }
+ 
+    TMPXChangeEventType eventType; 
+    if(!mVideoUtils.mediaValue<TMPXChangeEventType>(aMessage,KMPXMessageChangeEventType, eventType))
+    {
+        return;
+    }
+    TMPXItemId eventData; 
+    if(!mVideoUtils.mediaValue<TMPXItemId>(aMessage,KMPXMessageMediaGeneralId, eventData))
+    {       
+        return;
+    }
+    
+    switch(eventType)
+    {
+        case EMPXItemDeleted:
+            emit videoDeleted(eventData);
+        break;
+        case EMPXItemInserted:        
+            if(eventData.iId2 < 2)
+            {
+                CMPXMedia *media = mVideoUtils.mediaValuePtr<CMPXMedia>(aMessage, KMPXCommandColAddMedia);
+
+                if(media)
+                {
+                    //TODO: album support                    
+                	TUint8 origin = EVcxMyVideosOriginOther;                	
+                	mVideoUtils.mediaValue<TUint8>(media, KVcxMediaMyVideosOrigin, origin);
+
+                    int id = -1;
+                    int type = -1;
+                    
+                    mCollectionClient.getCategoryIds(id, type);
+
+                    if ((1 == type) || (0 == type)) //TODO: KVcxMvcCategoryIdAll has type 0, but it should be 1
+                    {
+						if (id == KVcxMvcCategoryIdAll)
+						{
+							emit newVideoAvailable(media);
+						}
+						else if ((id == KVcxMvcCategoryIdDownloads) && (origin == EVcxMyVideosOriginDownloaded) && (1 == type))
+						{
+							emit newVideoAvailable(media);
+						}
+						else if ((id == KVcxMvcCategoryIdCaptured) && (origin == EVcxMyVideosOriginCapturedWithCamera) && (1 == type))
+						{
+							emit newVideoAvailable(media);
+						}
+                    }
+                    else if (2 == type) //album
+                    {
+                    	//TODO: check album
+                    }
+                    	
+                }
+                else
+                {
+                    mCollectionClient.fetchMpxMediaByMpxId(eventData);
+                }
+            }
+        break;
+    default:
+        break;
+    }
+}
+
+// -----------------------------------------------------------------------------
+// handleMyVideosDeleteMessage
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleMyVideosDeleteMessage(CMPXMessage* aMessage)
+    {
+
+    CMPXMediaArray *messageArray = 
+        mVideoUtils.mediaValuePtr<CMPXMediaArray>(aMessage, KMPXMediaArrayContents);
+    if(!messageArray || messageArray->Count() == 0)
+    {
+        return;
+    }
+    
+    QList<TMPXItemId> failedIds;    
+    TMPXItemId itemId;  
+    int count = messageArray->Count();
+    int failedFlag = 0;
+    CMPXMedia* item = NULL;
+    
+    // go throught all removed videos and see if some has failed
+    for (int i = 0; i < count; ++i)
+    {
+        item = (*messageArray)[i];
+        if(!mVideoUtils.mediaValue<TMPXItemId>(item, KMPXMediaGeneralId, itemId))
+        {
+            // invalid message, return 
+            return;
+        }
+        // if there's error while fetching value, it means that value does not exists,
+        // so we can assume deletion was succefull
+        if(mVideoUtils.mediaValue<int>(item, KVcxMediaMyVideosInt32Value, failedFlag))
+        {
+            if (failedFlag)
+            {
+                failedIds.append(itemId);
+            }
+            failedFlag = 0;
+        }       
+    }
+    emit videoDeleteCompleted(count, &failedIds);
+}
+
+// -----------------------------------------------------------------------------
+// handleGetMediasByMpxIdResp
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleGetMediasByMpxIdResp(CMPXMessage* aMessage)
+{
+    
+    CMPXMediaArray* array = 
+        mVideoUtils.mediaValuePtr<CMPXMediaArray>(aMessage, KMPXMediaArrayContents);
+    if(!array || array->Count() < 1)
+    {
+        return;
+    }
+    emit newVideoAvailable((*array)[0]);    
+}
+
+// -----------------------------------------------------------------------------
+// handleGetVideoDetailsResp
+// -----------------------------------------------------------------------------
+//
+void VideoCollectionListener::handleGetVideoDetailsResp(CMPXMessage* aMessage)
+{
+    CMPXMedia *item = mVideoUtils.mediaValuePtr<CMPXMedia>(aMessage,KMPXCommandColAddMedia); 
+    if(!item)
+    {
+        return;
+    }
+    TMPXItemId itemId;
+    if( !mVideoUtils.mediaValue<TMPXItemId>(item, KMPXMediaGeneralId, itemId))
+    {
+        return;
+    }
+    emit videoDetailsCompleted(itemId);
+}
+
+
+