/* * 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. */ // // vie_autotest_windows.cc // #include "vie_autotest_windows.h" #include "vie_autotest_defines.h" #include "vie_autotest_main.h" #include "engine_configurations.h" #include "critical_section_wrapper.h" #include "thread_wrapper.h" #include #ifdef _DEBUG //#include "vld.h" #endif // Disable Visual studio warnings // 'this' : used in base member initializer list #pragma warning(disable: 4355) // new behavior: elements of array 'XXX' will be default initialized #pragma warning(disable: 4351) LRESULT CALLBACK ViEAutoTestWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage( WM_QUIT); break; case WM_COMMAND: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } ViEAutoTestWindowManager::ViEAutoTestWindowManager() : _window1(NULL), _window2(NULL), _terminate(false), _eventThread(*webrtc::ThreadWrapper::CreateThread(EventProcess, this, webrtc::kNormalPriority, "ViEAutotestEventThread")), _crit(*webrtc::CriticalSectionWrapper::CreateCriticalSection()), _hwnd1(NULL), _hwnd2(NULL), _hwnd1Size(), _hwnd2Size(), _hwnd1Title(), _hwnd2Title() { } ViEAutoTestWindowManager::~ViEAutoTestWindowManager() { if (_hwnd1) { ViEDestroyWindow(_hwnd1); } if (_hwnd2) { ViEDestroyWindow(_hwnd1); } delete &_crit; } void* ViEAutoTestWindowManager::GetWindow1() { return _window1; } void* ViEAutoTestWindowManager::GetWindow2() { return _window2; } int ViEAutoTestWindowManager::CreateWindows(AutoTestRect window1Size, AutoTestRect window2Size, void* window1Title, void* window2Title) { _hwnd1Size.Copy(window1Size); _hwnd2Size.Copy(window2Size); memcpy(_hwnd1Title, window1Title, TITLE_LENGTH); memcpy(_hwnd2Title, window2Title, TITLE_LENGTH); unsigned int tId = 0; _eventThread.Start(tId); do { _crit.Enter(); if (_window1 != NULL) break; _crit.Leave(); AutoTestSleep(10); } while (true); _crit.Leave(); return 0; } int ViEAutoTestWindowManager::TerminateWindows() { _eventThread.SetNotAlive(); _terminate = true; if (_eventThread.Stop()) { _crit.Enter(); delete &_eventThread; _crit.Leave(); } return 0; } bool ViEAutoTestWindowManager::EventProcess(void* obj) { return static_cast (obj)->EventLoop(); } bool ViEAutoTestWindowManager::EventLoop() { _crit.Enter(); //ViECreateWindow(_hwnd1, 352, 288, 600, 100, "ViE Autotest Window 1"); //ViECreateWindow(_hwnd2, 352, 288, 1000, 100, "ViE Autotest Window 2"); ViECreateWindow(_hwnd1, _hwnd1Size.origin.x, _hwnd1Size.origin.y, _hwnd1Size.size.width, _hwnd1Size.size.height, _hwnd1Title); ViECreateWindow(_hwnd2, _hwnd2Size.origin.x, _hwnd2Size.origin.y, _hwnd2Size.size.width, _hwnd2Size.size.height, _hwnd2Title); _window1 = (void*) _hwnd1; _window2 = (void*) _hwnd2; MSG msg; while (!_terminate) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } _crit.Leave(); AutoTestSleep(10); _crit.Enter(); } ViEDestroyWindow(_hwnd1); ViEDestroyWindow(_hwnd2); _crit.Leave(); return false; } int ViEAutoTestWindowManager::ViECreateWindow(HWND &hwndMain, int xPos, int yPos, int width, int height, TCHAR* className) { HINSTANCE hinst = GetModuleHandle(0); WNDCLASSEX wcx; wcx.hInstance = hinst; wcx.lpszClassName = className; wcx.lpfnWndProc = (WNDPROC) ViEAutoTestWinProc; wcx.style = CS_DBLCLKS; wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wcx.hCursor = LoadCursor(NULL, IDC_ARROW); wcx.lpszMenuName = NULL; wcx.cbSize = sizeof(WNDCLASSEX); wcx.cbClsExtra = 0; wcx.cbWndExtra = 0; wcx.hbrBackground = GetSysColorBrush(COLOR_3DFACE); // Register our window class with the operating system. // If there is an error, exit program. ViETest::TestError(RegisterClassEx(&wcx) != NULL, "Could not register autotest window"); // Create the main window. hwndMain = CreateWindowEx(0, // no extended styles className, // class name className, // window name WS_OVERLAPPED | WS_THICKFRAME,// overlapped window xPos, // horizontal position yPos, // vertical position width, // width height, // height (HWND) NULL, // no parent or owner window (HMENU) NULL, // class menu used hinst, // instance handle NULL); // no window creation data if (!hwndMain) { int error = GetLastError(); return -1; } // Show the window using the flag specified by the program // that started the application, and send the application // a WM_PAINT message. ShowWindow(hwndMain, SW_SHOWDEFAULT); UpdateWindow(hwndMain); ::SetWindowPos(hwndMain, HWND_TOP, xPos, yPos, width, height, SWP_FRAMECHANGED); return 0; } int ViEAutoTestWindowManager::ViEDestroyWindow(HWND& hwnd) { ::DestroyWindow(hwnd); return 0; } bool ViEAutoTestWindowManager::SetTopmostWindow() { // meant to put terminal window on top return true; } int main(int argc, char* argv[]) { ViEAutoTestMain autoTest; if (argc > 1) { autoTest.UseAnswerFile(argv[1]); } return autoTest.BeginOSIndependentTesting(); }