Added resource policy support (Still needs more testing) and refactored the pipeline...
[harmattan/cameraplus] / src / cameraresources.cpp
1 #include "cameraresources.h"
2 #include <QDebug>
3
4 using namespace ResourcePolicy;
5
6 CameraResources::CameraResources(QObject *parent) :
7   QObject(parent),
8   m_set(new ResourceSet("camera", this, true, true)),
9   m_mode(None), m_acquired(false) {
10
11   QObject::connect(m_set, SIGNAL(resourcesReleased()), this, SLOT(resourcesReleased()));
12   QObject::connect(m_set, SIGNAL(lostResources()), this, SLOT(lostResources()));
13   QObject::connect(m_set, SIGNAL(resourcesGranted(const QList<ResourcePolicy::ResourceType>&)),
14                    this, SLOT(resourcesGranted(const QList<ResourcePolicy::ResourceType>&)));
15   QObject::connect(m_set, SIGNAL(updateOK()), this, SLOT(updateOK()));
16
17   if (!m_set->initAndConnect()) {
18     qCritical() << "Failed to connect to resource policy engine";
19   }
20 }
21
22 CameraResources::~CameraResources() {
23   acquire(None);
24 }
25
26 void CameraResources::acquire(const CameraResources::Mode& mode) {
27   if (mode == m_mode) {
28     // We need to emit this because the UI migh be waiting
29     emit acquiredChanged();
30     return;
31   }
32
33   m_mode = mode;
34
35   switch (m_mode) {
36   case None:
37     m_set->release();
38     break;
39
40   case Image:
41     updateSet(QList<ResourcePolicy::ResourceType>()
42               << ResourcePolicy::VideoPlaybackType
43               << ResourcePolicy::VideoRecorderType
44               << ResourcePolicy::ScaleButtonType
45               << ResourcePolicy::SnapButtonType);
46     break;
47
48   case Video:
49     updateSet(QList<ResourcePolicy::ResourceType>()
50               << ResourcePolicy::VideoPlaybackType
51               << ResourcePolicy::VideoRecorderType
52               << ResourcePolicy::ScaleButtonType
53               << ResourcePolicy::SnapButtonType);
54     break;
55
56   case Recording:
57     updateSet(QList<ResourcePolicy::ResourceType>()
58               << ResourcePolicy::VideoPlaybackType
59               << ResourcePolicy::VideoRecorderType
60               << ResourcePolicy::ScaleButtonType
61               << ResourcePolicy::SnapButtonType
62               << ResourcePolicy::AudioRecorderType,
63               QList<ResourcePolicy::ResourceType>()
64               << ResourcePolicy::AudioPlaybackType);
65     break;
66
67   case PostCapture:
68     updateSet(QList<ResourcePolicy::ResourceType>()
69               << ResourcePolicy::VideoPlaybackType
70               << ResourcePolicy::ScaleButtonType,
71               QList<ResourcePolicy::ResourceType>()
72               << ResourcePolicy::AudioPlaybackType);
73
74     break;
75
76   default:
77     qWarning() << "Unknown mode" << mode;
78
79     break;
80   }
81 }
82
83 bool CameraResources::acquired() const {
84   return m_acquired;
85 }
86
87 void CameraResources::resourcesReleased() {
88   m_mode = None;
89   m_acquired = false;
90   emit acquiredChanged();
91 }
92
93 void CameraResources::lostResources() {
94   m_mode = None;
95   m_acquired = false;
96   emit acquiredChanged();
97 }
98
99 void CameraResources::resourcesGranted(const QList<ResourcePolicy::ResourceType>& optional) {
100   Q_UNUSED(optional);
101
102   m_acquired = true;
103   emit acquiredChanged();
104 }
105
106 void CameraResources::updateOK() {
107   m_acquired = true;
108   emit acquiredChanged();
109 }
110
111 QList<ResourcePolicy::ResourceType> CameraResources::listSet() {
112   QList<Resource *> resources = m_set->resources();
113   QList<ResourcePolicy::ResourceType> set;
114
115   foreach (Resource *r, resources) {
116     set << r->type();
117   }
118
119   return set;
120 }
121
122 void CameraResources::updateSet(const QList<ResourcePolicy::ResourceType>& required,
123                                 const QList<ResourcePolicy::ResourceType>& optional) {
124
125   QList<ResourcePolicy::ResourceType> set = listSet();
126
127   foreach (ResourceType r, set) {
128     // Check for acquired resources that should be dropped.
129     if (required.indexOf(r) == -1) {
130       m_set->deleteResource(r);
131     }
132   }
133
134   foreach (ResourceType r, required) {
135     // TODO: AudioPlayback needs special handling
136     m_set->addResource(r);
137   }
138
139   // TODO: optional resources
140
141   m_set->update();
142 }