Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 //
     12 // vie_autotest_windows.cc
     13 //
     14 
     15 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_windows.h"
     16 
     17 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
     18 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_main.h"
     19 
     20 #include "webrtc/engine_configurations.h"
     21 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
     22 #include "webrtc/system_wrappers/interface/thread_wrapper.h"
     23 
     24 #include <windows.h>
     25 
     26 #ifdef _DEBUG
     27 //#include "vld.h"
     28 #endif
     29 
     30 // Disable Visual studio warnings
     31 // 'this' : used in base member initializer list
     32 #pragma warning(disable: 4355)
     33 
     34 LRESULT CALLBACK ViEAutoTestWinProc(HWND hWnd, UINT uMsg, WPARAM wParam,
     35                                     LPARAM lParam) {
     36   switch (uMsg) {
     37     case WM_DESTROY:
     38       PostQuitMessage( WM_QUIT);
     39       break;
     40     case WM_COMMAND:
     41       break;
     42   }
     43   return DefWindowProc(hWnd, uMsg, wParam, lParam);
     44 }
     45 
     46 ViEAutoTestWindowManager::ViEAutoTestWindowManager()
     47     : _window1(NULL),
     48       _window2(NULL),
     49       _terminate(false),
     50       _eventThread(*webrtc::ThreadWrapper::CreateThread(
     51           EventProcess, this, webrtc::kNormalPriority,
     52           "ViEAutotestEventThread")),
     53       _crit(*webrtc::CriticalSectionWrapper::CreateCriticalSection()),
     54       _hwnd1(NULL),
     55       _hwnd2(NULL),
     56       _hwnd1Size(),
     57       _hwnd2Size(),
     58       _hwnd1Title(),
     59       _hwnd2Title() {
     60 }
     61 
     62 ViEAutoTestWindowManager::~ViEAutoTestWindowManager() {
     63   if (_hwnd1) {
     64     ViEDestroyWindow(_hwnd1);
     65   }
     66   if (_hwnd2) {
     67     ViEDestroyWindow(_hwnd2);
     68   }
     69   delete &_crit;
     70 }
     71 
     72 void* ViEAutoTestWindowManager::GetWindow1() {
     73   return _window1;
     74 }
     75 
     76 void* ViEAutoTestWindowManager::GetWindow2() {
     77   return _window2;
     78 }
     79 
     80 int ViEAutoTestWindowManager::CreateWindows(AutoTestRect window1Size,
     81                                             AutoTestRect window2Size,
     82                                             void* window1Title,
     83                                             void* window2Title) {
     84   _hwnd1Size.Copy(window1Size);
     85   _hwnd2Size.Copy(window2Size);
     86   memcpy(_hwnd1Title, window1Title, TITLE_LENGTH);
     87   memcpy(_hwnd2Title, window2Title, TITLE_LENGTH);
     88 
     89   unsigned int tId = 0;
     90   _eventThread.Start(tId);
     91 
     92   do {
     93     _crit.Enter();
     94     if (_window1 != NULL) {
     95       break;
     96     }
     97     _crit.Leave();
     98     AutoTestSleep(10);
     99   } while (true);
    100   _crit.Leave();
    101   return 0;
    102 }
    103 
    104 int ViEAutoTestWindowManager::TerminateWindows() {
    105   _eventThread.SetNotAlive();
    106 
    107   _terminate = true;
    108   if (_eventThread.Stop()) {
    109     _crit.Enter();
    110     delete &_eventThread;
    111     _crit.Leave();
    112   }
    113 
    114   return 0;
    115 }
    116 
    117 bool ViEAutoTestWindowManager::EventProcess(void* obj) {
    118   return static_cast<ViEAutoTestWindowManager*> (obj)->EventLoop();
    119 }
    120 
    121 bool ViEAutoTestWindowManager::EventLoop() {
    122   _crit.Enter();
    123 
    124   ViECreateWindow(_hwnd1, _hwnd1Size.origin.x, _hwnd1Size.origin.y,
    125                   _hwnd1Size.size.width, _hwnd1Size.size.height, _hwnd1Title);
    126   ViECreateWindow(_hwnd2, _hwnd2Size.origin.x, _hwnd2Size.origin.y,
    127                   _hwnd2Size.size.width, _hwnd2Size.size.height, _hwnd2Title);
    128 
    129   _window1 = (void*) _hwnd1;
    130   _window2 = (void*) _hwnd2;
    131   MSG msg;
    132   while (!_terminate) {
    133     if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
    134       TranslateMessage(&msg);
    135       DispatchMessage(&msg);
    136     }
    137     _crit.Leave();
    138     AutoTestSleep(10);
    139     _crit.Enter();
    140   }
    141   ViEDestroyWindow(_hwnd1);
    142   ViEDestroyWindow(_hwnd2);
    143   _crit.Leave();
    144 
    145   return false;
    146 }
    147 
    148 int ViEAutoTestWindowManager::ViECreateWindow(HWND &hwndMain, int xPos,
    149                                               int yPos, int width, int height,
    150                                               TCHAR* className) {
    151   HINSTANCE hinst = GetModuleHandle(0);
    152   WNDCLASSEX wcx;
    153   wcx.hInstance = hinst;
    154   wcx.lpszClassName = className;
    155   wcx.lpfnWndProc = (WNDPROC) ViEAutoTestWinProc;
    156   wcx.style = CS_DBLCLKS;
    157   wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    158   wcx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    159   wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
    160   wcx.lpszMenuName = NULL;
    161   wcx.cbSize = sizeof(WNDCLASSEX);
    162   wcx.cbClsExtra = 0;
    163   wcx.cbWndExtra = 0;
    164   wcx.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
    165 
    166   RegisterClassEx(&wcx);
    167 
    168   // Create the main window.
    169   hwndMain = CreateWindowEx(0,          // no extended styles
    170                             className,  // class name
    171                             className,  // window name
    172                             WS_OVERLAPPED | WS_THICKFRAME,  // overlapped window
    173                             xPos,    // horizontal position
    174                             yPos,    // vertical position
    175                             width,   // width
    176                             height,  // height
    177                             (HWND) NULL,   // no parent or owner window
    178                             (HMENU) NULL,  // class menu used
    179                             hinst,  // instance handle
    180                             NULL);  // no window creation data
    181 
    182   if (!hwndMain)
    183     return -1;
    184 
    185   // Show the window using the flag specified by the program
    186   // that started the application, and send the application
    187   // a WM_PAINT message.
    188   ShowWindow(hwndMain, SW_SHOWDEFAULT);
    189   UpdateWindow(hwndMain);
    190 
    191   ::SetWindowPos(hwndMain, HWND_TOP, xPos, yPos, width, height,
    192                  SWP_FRAMECHANGED);
    193 
    194   return 0;
    195 }
    196 
    197 int ViEAutoTestWindowManager::ViEDestroyWindow(HWND& hwnd) {
    198   ::DestroyWindow(hwnd);
    199   return 0;
    200 }
    201 
    202 bool ViEAutoTestWindowManager::SetTopmostWindow() {
    203   // Meant to put terminal window on top
    204   return true;
    205 }
    206 
    207 int main(int argc, char* argv[]) {
    208   ViEAutoTestMain auto_test;
    209   return auto_test.RunTests(argc, argv);
    210 }
    211