mmlibs/mmfw/tsrc/mmfintegrationtest/vclntavi/src/testexternaldisplay.cpp
changeset 4 9d4397b300d1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmfintegrationtest/vclntavi/src/testexternaldisplay.cpp	Mon Oct 18 12:47:26 2010 +0100
@@ -0,0 +1,314 @@
+// Copyright (c) 2010 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 "testvideoplayer2.h"
+#include <bautils.h>
+
+// file names used to control plugin through their existence. If any are new files are added make sure
+// they are also added to TidyFiles().
+_LIT(KInitExtDisplayHDMI, "c:\\vclntavi\\InitExtDisplayHDMI.txt");
+_LIT(KInitExtDisplayAnalog, "c:\\vclntavi\\InitExtDisplayAnalog.txt");
+_LIT(KConnectExtDisplayOverHDMI, "c:\\vclntavi\\ConnectExtDisplayOverHDMI.txt");
+_LIT(KConnectExtDisplayOverAnalog, "c:\\vclntavi\\ConnectExtDisplayOverAnalog.txt");
+_LIT(KDisconnectExtDisplay, "c:\\vclntavi\\DisconnectExtDisplay.txt");
+void TidyFiles()
+    {
+    RFs fs;
+    TInt error= fs.Connect();
+    if(error == KErrNone)
+        {
+        if(BaflUtils::FileExists(fs, KInitExtDisplayHDMI))
+            {
+            fs.Delete(KInitExtDisplayHDMI);
+            }
+        if(BaflUtils::FileExists(fs, KInitExtDisplayAnalog))
+            {
+            fs.Delete(KInitExtDisplayAnalog);
+            }
+        if(BaflUtils::FileExists(fs, KConnectExtDisplayOverHDMI))
+            {
+            fs.Delete(KConnectExtDisplayOverHDMI);
+            }
+        if(BaflUtils::FileExists(fs, KConnectExtDisplayOverAnalog))
+            {
+            fs.Delete(KConnectExtDisplayOverAnalog);
+            }
+        if(BaflUtils::FileExists(fs, KDisconnectExtDisplay))
+            {
+            fs.Delete(KDisconnectExtDisplay);
+            }
+        }
+}
+
+_LIT(KFilename, "filename");
+
+//
+// RTestMediaClientExternalDisplay
+//
+
+/**
+ * RTestMediaClientExternalDisplay::Constructor
+ */
+RTestMediaClientExternalDisplay::RTestMediaClientExternalDisplay(const TDesC& aTestName)
+    : RTestVclnt2AviPlayerStep(aTestName, aTestName, KFilename, KErrNone)
+    {
+    }
+
+/**
+ * RTestMediaClientExternalDisplay::NewL
+ */
+RTestMediaClientExternalDisplay* RTestMediaClientExternalDisplay::NewL(const TDesC& aTestName)
+    {
+    RTestMediaClientExternalDisplay* self = new (ELeave) RTestMediaClientExternalDisplay(aTestName);
+    return self;
+    }
+
+/**
+ * RTestMediaClientExternalDisplay::DoTestStepPreambleL
+ */
+TVerdict RTestMediaClientExternalDisplay::DoTestStepPreambleL()
+    {
+    TidyFiles();
+
+    TVerdict verdict = SetInitialConnectionType();
+    if(verdict != EPass)
+        {
+        return verdict;
+        }
+
+    verdict = SetConnectionTypeNotification();
+    if(verdict != EPass)
+        {
+        return verdict;
+        }
+
+    verdict = SetExternalDisplayControl();
+    if(verdict != EPass)
+        {
+        return verdict;
+        }
+    
+    return RTestVclnt2AviPlayerStep::DoTestStepPreambleL();
+    }
+
+TVerdict RTestMediaClientExternalDisplay::SetInitialConnectionType()
+    {
+    // Create a file as named in ini file. When external display test plugin is constructed it
+    // checks to see what filenames exist and sets inital connection type as appropriate.
+    // If string does not exist in ini file then plugin initialises with exetrnal display disconnected.
+    if(GetStringFromConfig(iSectName, _L("initialExternalDisplayType"), iInitialExternalDisplayTypeFilename))
+        {
+        if(iInitialExternalDisplayTypeFilename.Compare(KInitExtDisplayHDMI) == 0)
+            {
+            INFO_PRINTF2(_L("Creating %S"), &iInitialExternalDisplayTypeFilename);
+            INFO_PRINTF1(_L("External HDMI Display initially connected"));
+            }
+        else if(iInitialExternalDisplayTypeFilename.Compare(KInitExtDisplayAnalog) == 0)
+            {
+            INFO_PRINTF2(_L("Creating %S"), &iInitialExternalDisplayTypeFilename);
+            INFO_PRINTF1(_L("External Analog Display initially connected"));
+            }
+        else
+            {
+            INFO_PRINTF2(_L("External display setting unkown, %S"), &iInitialExternalDisplayTypeFilename);
+            return EInconclusive;
+            }
+
+        // connect to file system and open file
+        RFs fs;
+        if(fs.Connect() != KErrNone)
+            {
+            return EInconclusive;
+            }
+        RFile file;
+        if(file.Replace(fs, iInitialExternalDisplayTypeFilename, EFileWrite) != KErrNone)
+            {
+            fs.Close();
+            return EInconclusive;
+            }
+        
+        file.Close();
+        fs.Close();
+        }
+    else
+        {
+        INFO_PRINTF1(_L("External Display initially disconnected!"));
+        }
+    
+    return EPass;
+    }
+
+TVerdict RTestMediaClientExternalDisplay::SetConnectionTypeNotification()
+    {
+    // Now create file for the next connection type. This is used to emit a connect or disocnnect notification
+    // after a few seconds. Note that if the initial and next connection types are the same the external
+    // display test plugin will not emit a notification.    
+    if(GetStringFromConfig(iSectName, _L("nextExternalDisplayType"), iNextExternalDisplayTypeFilename))
+        {
+        if(iNextExternalDisplayTypeFilename.Compare(KConnectExtDisplayOverHDMI) == 0)
+            {
+            INFO_PRINTF2(_L("Creating %S"), &iNextExternalDisplayTypeFilename);
+            INFO_PRINTF1(_L("External HDMI Display to be connected and notification emitted"));
+            }
+        else if(iNextExternalDisplayTypeFilename.Compare(KConnectExtDisplayOverAnalog) == 0)
+            {
+            INFO_PRINTF2(_L("Creating %S"), &iNextExternalDisplayTypeFilename);
+            INFO_PRINTF1(_L("External Analog Display to be connected and notification emitted"));
+            }
+        else if(iNextExternalDisplayTypeFilename.Compare(KDisconnectExtDisplay) == 0)
+            {
+            INFO_PRINTF2(_L("Creating %S"), &iNextExternalDisplayTypeFilename);
+            INFO_PRINTF1(_L("External Display to be disconnected and notification emitted"));
+            }
+        else
+            {
+            INFO_PRINTF2(_L("External display switch setting unkown, %S"), &iNextExternalDisplayTypeFilename);
+            return EInconclusive;
+            }
+
+        // connect to file system and open file
+        RFs fs;
+        if(fs.Connect() != KErrNone)
+            {
+            return EInconclusive;
+            }
+        RFile file;
+        if(file.Replace(fs, iNextExternalDisplayTypeFilename, EFileWrite) != KErrNone)
+            {
+            fs.Close();
+            return EInconclusive;
+            }
+        
+        file.Close();
+        fs.Close();
+        }
+    else
+        {
+        INFO_PRINTF1(_L("No External Display switching requested!"));
+        }
+    
+    return EPass;
+    }
+
+TVerdict RTestMediaClientExternalDisplay::SetExternalDisplayControl()
+    {
+    if(GetBoolFromConfig(iSectName, _L("externalDisplayControl"), iExternalDisplayControl))
+        {
+        INFO_PRINTF2(_L("External display switch control set to %d"), iExternalDisplayControl);
+        }
+    else
+        {
+        return EInconclusive;
+        }
+    return EPass;
+    }
+    
+/**
+ * RTestMediaClientExternalDisplay::DoTestStepPostambleL
+ */
+TVerdict RTestMediaClientExternalDisplay::DoTestStepPostambleL()
+    {
+    RFs fs;
+    // connect to file system and open file
+    User::LeaveIfError(fs.Connect());
+    CleanupClosePushL(fs);
+    
+    if((iInitialExternalDisplayTypeFilename.Length()!= 0) && BaflUtils::FileExists(fs, iInitialExternalDisplayTypeFilename))
+        {
+        User::LeaveIfError(fs.Delete(iInitialExternalDisplayTypeFilename));
+        }
+
+    if((iNextExternalDisplayTypeFilename.Length()!= 0) && BaflUtils::FileExists(fs, iNextExternalDisplayTypeFilename))
+        {
+        User::LeaveIfError(fs.Delete(iNextExternalDisplayTypeFilename));
+        }
+    
+    CleanupStack::PopAndDestroy(1); //fs
+    
+    return RTestVclnt2AviPlayerStep::DoTestStepPostambleL();        
+    }
+
+/**
+ * RTestMediaClientExternalDisplay::FsmL
+ */
+void RTestMediaClientExternalDisplay::FsmL(TVclntTestPlayEvents aEventCode)
+    {
+    if (FsmCheck(aEventCode))
+        {
+        switch (aEventCode)
+            {
+            case EVPIdle:
+                HandleIdleL();
+                break;
+                
+            case EVPOpenComplete:
+                HandleOpenCompleteL();
+                break;
+                
+            case EVPPrepareComplete:                    
+                HandlePrepareCompleteL();
+                break;
+                
+            case EVPPlayComplete:
+                HandlePlayCompleteL();
+                break;
+            }
+        }
+    }
+    
+void RTestMediaClientExternalDisplay::HandleIdleL()
+    {
+    // Open iVideoPlayer
+    INFO_PRINTF2(_L("iVideoPlayer2->OpenFileL() %S"), &iFilename);
+    iVideoPlayer2->OpenFileL(iFilename, KMmfTestAviPlayControllerUid);
+    PrepareState(EVPOpenComplete, KErrNone);
+    }
+
+void RTestMediaClientExternalDisplay::HandleOpenCompleteL()
+    {
+    // Prepare iVideoPlayer2
+    INFO_PRINTF1(_L("iVideoPlayer2->Prepare()"));
+    iVideoPlayer2->Prepare();
+    PrepareState(EVPPrepareComplete, KErrNone);
+    }
+    
+void RTestMediaClientExternalDisplay::HandlePrepareCompleteL()
+    {
+    // Add display window using default values - ie. video extent & window clipping 
+    // defaulted to whole window
+    INFO_PRINTF1(_L("iVideoPlayer2->AddDisplayWindowL()"));
+    iVideoPlayer2->AddDisplayWindowL(iWs, *iScreen, *iWindow);
+
+    // set external display control
+    iVideoPlayer2->SetExternalDisplaySwitchingL((*iScreen).GetScreenNumber(), iExternalDisplayControl);
+    
+    // trigger the video to start playing                
+    StartPlayback();
+    }
+
+void RTestMediaClientExternalDisplay::HandlePlayCompleteL()
+    {
+    iTestStepResult = EPass;
+    CActiveScheduler::Stop();
+    }
+
+void RTestMediaClientExternalDisplay::StartPlayback()
+    {
+    iError = KErrTimedOut;
+    INFO_PRINTF1(_L("iVideoPlayer2->Play()"));
+    PrepareState(EVPPlayComplete, KErrNone);
+    iVideoPlayer2->Play();
+    }
+