/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "WindowsTest.h"
#include "ChannelDlg.h"
#include "WindowsTestMainDlg.h"
#include "engine_configurations.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// Check memory leaks id running debug
#if (defined(_DEBUG) && defined(_WIN32))
//    #include "vld.h"
#endif
/////////////////////////////////////////////////////////////////////////////
// CDXWindowsTestApp

BEGIN_MESSAGE_MAP(CDXWindowsTestApp, CWinApp)
	//{{AFX_MSG_MAP(CDXWindowsTestApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG
	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDXWindowsTestApp construction

CDXWindowsTestApp::CDXWindowsTestApp()
{
    
}

/////////////////////////////////////////////////////////////////////////////
// The one and only object

CDXWindowsTestApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CDXWindowsTestApp initialization

BOOL CDXWindowsTestApp::InitInstance()
{
    int result=0;
    #ifndef NO_VOICE_ENGINE
        _voiceEngine = VoiceEngine::Create();
        _veBase = VoEBase::GetInterface(_voiceEngine);
         result+=_veBase->Init();
     #else
        _voiceEngine=NULL;
    #endif

    _videoEngine = VideoEngine::Create();

    _videoEngine->SetTraceFilter(webrtc::kTraceDefault);//webrtc::kTraceDebug | webrtc::kTraceError | webrtc::kTraceApiCall | webrtc::kTraceWarning | webrtc::kTraceCritical | webrtc::kTraceStateInfo | webrtc::kTraceInfo | webrtc::kTraceStream);
    _videoEngine->SetTraceFile("trace.txt");
    
    ViEBase* vieBase=ViEBase::GetInterface(_videoEngine);
    result+=vieBase->Init();
    if(result!=0)
    {
        ::MessageBox (NULL, (LPCTSTR)("failed to init VideoEngine"), TEXT("Error Message"),  MB_OK | MB_ICONINFORMATION);                
    }
    
    {
        WindowsTestMainDlg dlg(_videoEngine,_voiceEngine);

	    m_pMainWnd = &dlg;
	    int nResponse = dlg.DoModal();
    }
    
    vieBase->Release();

    if(!VideoEngine::Delete(_videoEngine))
    {
        char errorMsg[255];
        sprintf(errorMsg,"All VideoEngine interfaces are not released properly!");
        ::MessageBox (NULL, (LPCTSTR)errorMsg, TEXT("Error Message"),  MB_OK | MB_ICONINFORMATION);
    }

  #ifndef NO_VOICE_ENGINE
    
    _veBase->Terminate();
    if(_veBase->Release()!=0)        
    {
        // ensure that no interface is still referenced
        char errorMsg[256];
        sprintf(errorMsg,"All VoiceEngine interfaces are not released properly!");
        ::MessageBox (NULL, (LPCTSTR)errorMsg, TEXT("Error Message"),  MB_OK | MB_ICONINFORMATION);
    }

    if (false == VoiceEngine::Delete(_voiceEngine))
    {
        char errorMsg[256];
        sprintf(errorMsg,"VoiceEngine::Delete() failed!");
        ::MessageBox (NULL, (LPCTSTR)errorMsg, TEXT("Error Message"),  MB_OK | MB_ICONINFORMATION);
    }
   #endif

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.
	return FALSE;
}
