123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- //
- // Eric Vaughan
- // Netscape Communications
- //
- // See documentation in associated header file
- //
- #include "nsRepeatService.h"
- #include "nsIServiceManager.h"
- nsRepeatService* nsRepeatService::gInstance = nullptr;
- nsRepeatService::nsRepeatService()
- : mCallback(nullptr), mCallbackData(nullptr)
- {
- }
- nsRepeatService::~nsRepeatService()
- {
- NS_ASSERTION(!mCallback && !mCallbackData, "Callback was not removed before shutdown");
- }
- nsRepeatService*
- nsRepeatService::GetInstance()
- {
- if (!gInstance) {
- gInstance = new nsRepeatService();
- NS_IF_ADDREF(gInstance);
- }
- return gInstance;
- }
- /*static*/ void
- nsRepeatService::Shutdown()
- {
- NS_IF_RELEASE(gInstance);
- }
- void nsRepeatService::Start(Callback aCallback, void* aCallbackData,
- uint32_t aInitialDelay)
- {
- NS_PRECONDITION(aCallback != nullptr, "null ptr");
- mCallback = aCallback;
- mCallbackData = aCallbackData;
- nsresult rv;
- mRepeatTimer = do_CreateInstance("@mozilla.org/timer;1", &rv);
- if (NS_SUCCEEDED(rv)) {
- mRepeatTimer->InitWithCallback(this, aInitialDelay, nsITimer::TYPE_ONE_SHOT);
- }
- }
- void nsRepeatService::Stop(Callback aCallback, void* aCallbackData)
- {
- if (mCallback != aCallback || mCallbackData != aCallbackData)
- return;
- //printf("Stopping repeat timer\n");
- if (mRepeatTimer) {
- mRepeatTimer->Cancel();
- mRepeatTimer = nullptr;
- }
- mCallback = nullptr;
- mCallbackData = nullptr;
- }
- NS_IMETHODIMP nsRepeatService::Notify(nsITimer *timer)
- {
- // do callback
- if (mCallback)
- mCallback(mCallbackData);
- // start timer again.
- if (mRepeatTimer) {
- mRepeatTimer->InitWithCallback(this, REPEAT_DELAY, nsITimer::TYPE_ONE_SHOT);
- }
- return NS_OK;
- }
- NS_IMPL_ISUPPORTS(nsRepeatService, nsITimerCallback)
|