Blame widget/GfxInfoCollector.h

Packit f0b94e
/* vim: se cin sw=2 ts=2 et : */
Packit f0b94e
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
Packit f0b94e
 *
Packit f0b94e
 * This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#ifndef __mozilla_widget_GfxInfoCollector_h__
Packit f0b94e
#define __mozilla_widget_GfxInfoCollector_h__
Packit f0b94e
Packit f0b94e
#include "mozilla/Attributes.h"
Packit f0b94e
#include "nsStringFwd.h"
Packit f0b94e
#include "js/RootingAPI.h"
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
namespace widget {
Packit f0b94e
Packit f0b94e
/* this is handy wrapper around JSAPI to make it more pleasant to use.
Packit f0b94e
 * We collect the JSAPI errors and so that callers don't need to */
Packit f0b94e
class MOZ_STACK_CLASS InfoObject {
Packit f0b94e
  friend class GfxInfoBase;
Packit f0b94e
Packit f0b94e
 public:
Packit f0b94e
  void DefineProperty(const char *name, int value);
Packit f0b94e
  void DefineProperty(const char *name, nsAString &value);
Packit f0b94e
  void DefineProperty(const char *name, const char *value);
Packit f0b94e
Packit f0b94e
 private:
Packit f0b94e
  // We need to ensure that this object lives on the stack so that GC sees it
Packit f0b94e
  // properly
Packit f0b94e
  explicit InfoObject(JSContext *aCx);
Packit f0b94e
  InfoObject(InfoObject &);
Packit f0b94e
Packit f0b94e
  JSContext *mCx;
Packit f0b94e
  JS::Rooted<JSObject *> mObj;
Packit f0b94e
  bool mOk;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
/*
Packit f0b94e
Packit f0b94e
   Here's an example usage:
Packit f0b94e
Packit f0b94e
   class Foo {
Packit f0b94e
   Foo::Foo() : mInfoCollector(this, &Foo::GetAweseomeness) {}
Packit f0b94e
Packit f0b94e
   void GetAwesomeness(InfoObject &obj) {
Packit f0b94e
     obj.DefineProperty("awesome", mAwesome);
Packit f0b94e
   }
Packit f0b94e
Packit f0b94e
   int mAwesome;
Packit f0b94e
Packit f0b94e
   GfxInfoCollector<Foo> mInfoCollector;
Packit f0b94e
   }
Packit f0b94e
Packit f0b94e
   This will define a property on the object
Packit f0b94e
   returned from calling getInfo() on a
Packit f0b94e
   GfxInfo object. e.g.
Packit f0b94e
Packit f0b94e
       gfxInfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
Packit f0b94e
       info = gfxInfo.getInfo();
Packit f0b94e
       if (info.awesome)
Packit f0b94e
          alert(info.awesome);
Packit f0b94e
Packit f0b94e
*/
Packit f0b94e
Packit f0b94e
class GfxInfoCollectorBase {
Packit f0b94e
 public:
Packit f0b94e
  GfxInfoCollectorBase();
Packit f0b94e
  virtual void GetInfo(InfoObject &obj) = 0;
Packit f0b94e
  virtual ~GfxInfoCollectorBase();
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
template <class T>
Packit f0b94e
class GfxInfoCollector : public GfxInfoCollectorBase {
Packit f0b94e
 public:
Packit f0b94e
  GfxInfoCollector(T *aPointer, void (T::*aFunc)(InfoObject &obj))
Packit f0b94e
      : mPointer(aPointer), mFunc(aFunc) {}
Packit f0b94e
  virtual void GetInfo(InfoObject &obj) override { (mPointer->*mFunc)(obj); }
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  T *mPointer;
Packit f0b94e
  void (T::*mFunc)(InfoObject &obj);
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
}  // namespace widget
Packit f0b94e
}  // namespace mozilla
Packit f0b94e
Packit f0b94e
#endif