Implement a dummy SoundVolumeControl for nemo
[harmattan/cameraplus] / src / cameraresources.cpp
index daa849e..4e936e5 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * This file is part of CameraPlus.
  *
- * Copyright (C) 2012 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -22,8 +22,8 @@
 #include <dbusconnectioneventloop.h>
 #include <QDebug>
 
-// TODO: video recording ?
-// TODO: more resources ?
+#define APPLICATION_CLASS "camera"
+
 CameraResources::CameraResources(QObject *parent) :
   QObject(parent),
   m_worker(new CameraResourcesWorker) {
@@ -35,27 +35,33 @@ CameraResources::CameraResources(QObject *parent) :
   m_thread.start();
 
   qRegisterMetaType<CameraResources::Mode>("CameraResources::Mode");
-  qRegisterMetaType<CameraResources::ResourceType>("CameraResources::ResourceType");
   qRegisterMetaType<bool *>("bool *");
 
   QObject::connect(m_worker, SIGNAL(acquiredChanged()), this, SIGNAL(acquiredChanged()));
   QObject::connect(m_worker, SIGNAL(hijackedChanged()), this, SIGNAL(hijackedChanged()));
-  QObject::connect(m_worker, SIGNAL(updated()), this, SLOT(updated()));
+  QObject::connect(m_worker, SIGNAL(updated()), this, SIGNAL(updated()));
+  QObject::connect(m_worker, SIGNAL(acquiredChanged()), this, SIGNAL(scaleAcquisitionChanged()));
+  QObject::connect(m_worker, SIGNAL(hijackedChanged()), this, SIGNAL(scaleAcquisitionChanged()));
+  QObject::connect(m_worker, SIGNAL(updated()), this, SIGNAL(scaleAcquisitionChanged()));
 }
 
 CameraResources::~CameraResources() {
-  m_thread.quit();
-  m_thread.wait();
+  acquire(CameraResources::None);
+  m_thread.exit(0);
+
+  while (m_thread.isRunning()) {
+    m_thread.wait(10);
+  }
 
   delete m_worker;
   m_worker = 0;
 }
 
-bool CameraResources::isResourceGranted(const ResourceType& resource) {
+bool CameraResources::isResourceGranted(const ResourcePolicy::ResourceType& resource) const {
   bool ok = false;
 
   QMetaObject::invokeMethod(m_worker, "isResourceGranted", Qt::BlockingQueuedConnection,
-                           Q_ARG(bool *, &ok), Q_ARG(CameraResources::ResourceType, resource));
+                           Q_ARG(bool *, &ok), Q_ARG(int, resource));
 
   return ok;
 }
@@ -87,6 +93,10 @@ bool CameraResources::hijacked() const {
   return ok;
 }
 
+bool CameraResources::isScaleAcquired() const {
+  return isResourceGranted(ResourcePolicy::ScaleButtonType);
+}
+
 CameraResourcesWorker::CameraResourcesWorker(QObject *parent) :
   QObject(parent),
   m_set(0),
@@ -98,13 +108,11 @@ CameraResourcesWorker::CameraResourcesWorker(QObject *parent) :
 }
 
 CameraResourcesWorker::~CameraResourcesWorker() {
-  bool ok;
 
-  acquire(&ok, CameraResources::None);
 }
 
 void CameraResourcesWorker::init() {
-  m_set = new ResourcePolicy::ResourceSet("camera", this);
+  m_set = new ResourcePolicy::ResourceSet(APPLICATION_CLASS, this);
   m_set->setAlwaysReply();
 
   QObject::connect(m_set, SIGNAL(resourcesReleased()), this, SLOT(resourcesReleased()));
@@ -185,36 +193,34 @@ void CameraResourcesWorker::acquire(bool *ok, const CameraResources::Mode& mode)
   case CameraResources::Image:
     *ok = updateSet(QList<ResourcePolicy::ResourceType>()
                    << ResourcePolicy::VideoPlaybackType
-                   << ResourcePolicy::VideoRecorderType
-                   << ResourcePolicy::ScaleButtonType
-                   << ResourcePolicy::SnapButtonType);
+                   << ResourcePolicy::VideoRecorderType,
+                   QList<ResourcePolicy::ResourceType>()
+                   << ResourcePolicy::ScaleButtonType);
     break;
 
   case CameraResources::Video:
     *ok = updateSet(QList<ResourcePolicy::ResourceType>()
                    << ResourcePolicy::VideoPlaybackType
-                   << ResourcePolicy::VideoRecorderType
-                   << ResourcePolicy::ScaleButtonType
-                   << ResourcePolicy::SnapButtonType);
+                   << ResourcePolicy::VideoRecorderType,
+                   QList<ResourcePolicy::ResourceType>()
+                   << ResourcePolicy::ScaleButtonType);
     break;
 
   case CameraResources::Recording:
     *ok = updateSet(QList<ResourcePolicy::ResourceType>()
                    << ResourcePolicy::VideoPlaybackType
-                   << ResourcePolicy::VideoRecorderType
-                   << ResourcePolicy::ScaleButtonType
-                   << ResourcePolicy::SnapButtonType,
+                   << ResourcePolicy::VideoRecorderType,
                    QList<ResourcePolicy::ResourceType>()
+                   << ResourcePolicy::ScaleButtonType
                    << ResourcePolicy::AudioRecorderType
                    << ResourcePolicy::AudioPlaybackType);
     break;
 
-  case CameraResources::PostCapture:
+  case CameraResources::Player:
     *ok = updateSet(QList<ResourcePolicy::ResourceType>()
                    << ResourcePolicy::VideoPlaybackType
-                   << ResourcePolicy::ScaleButtonType,
-                   QList<ResourcePolicy::ResourceType>()
-                   << ResourcePolicy::AudioPlaybackType);
+                   << ResourcePolicy::AudioPlaybackType,
+                   QList<ResourcePolicy::ResourceType>());
     break;
 
   default:
@@ -265,7 +271,7 @@ bool CameraResourcesWorker::updateSet(const QList<ResourcePolicy::ResourceType>&
   if (m_set->contains(ResourcePolicy::AudioPlaybackType)) {
     bool isOptional = m_set->resource(ResourcePolicy::AudioPlaybackType)->isOptional();
 
-    ResourcePolicy::AudioResource *audio = new ResourcePolicy::AudioResource("camera");
+    ResourcePolicy::AudioResource *audio = new ResourcePolicy::AudioResource(APPLICATION_CLASS);
     audio->setProcessID(QCoreApplication::applicationPid());
     audio->setOptional(isOptional);
     m_set->addResourceObject(audio);
@@ -311,8 +317,7 @@ void CameraResourcesWorker::setHijacked(bool hijacked) {
   }
 }
 
-void CameraResourcesWorker::isResourceGranted(bool *ok,
-                                             const CameraResources::ResourceType& resource) {
+void CameraResourcesWorker::isResourceGranted(bool *ok, int resource) {
 
   ResourcePolicy::ResourceType rt = (ResourcePolicy::ResourceType)resource;