|  | // Copyright 2017 PDFium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
|  |  | 
|  | #include "fpdfsdk/pwl/cpwl_timer.h" | 
|  |  | 
|  | #include <map> | 
|  |  | 
|  | #include "fpdfsdk/cfx_systemhandler.h" | 
|  | #include "fpdfsdk/pwl/cpwl_timer_handler.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | std::map<int32_t, CPWL_Timer*>& GetPWLTimeMap() { | 
|  | // Leak the object at shutdown. | 
|  | static auto* timeMap = new std::map<int32_t, CPWL_Timer*>; | 
|  | return *timeMap; | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, | 
|  | CFX_SystemHandler* pSystemHandler) | 
|  | : m_nTimerID(0), m_pAttached(pAttached), m_pSystemHandler(pSystemHandler) { | 
|  | ASSERT(m_pAttached); | 
|  | ASSERT(m_pSystemHandler); | 
|  | } | 
|  |  | 
|  | CPWL_Timer::~CPWL_Timer() { | 
|  | KillPWLTimer(); | 
|  | } | 
|  |  | 
|  | int32_t CPWL_Timer::SetPWLTimer(int32_t nElapse) { | 
|  | if (m_nTimerID != 0) | 
|  | KillPWLTimer(); | 
|  | m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc); | 
|  |  | 
|  | GetPWLTimeMap()[m_nTimerID] = this; | 
|  | return m_nTimerID; | 
|  | } | 
|  |  | 
|  | void CPWL_Timer::KillPWLTimer() { | 
|  | if (m_nTimerID == 0) | 
|  | return; | 
|  |  | 
|  | m_pSystemHandler->KillTimer(m_nTimerID); | 
|  | GetPWLTimeMap().erase(m_nTimerID); | 
|  | m_nTimerID = 0; | 
|  | } | 
|  |  | 
|  | // static | 
|  | void CPWL_Timer::TimerProc(int32_t idEvent) { | 
|  | auto it = GetPWLTimeMap().find(idEvent); | 
|  | if (it == GetPWLTimeMap().end()) | 
|  | return; | 
|  |  | 
|  | CPWL_Timer* pTimer = it->second; | 
|  | if (pTimer->m_pAttached) | 
|  | pTimer->m_pAttached->TimerProc(); | 
|  | } |