summaryrefslogtreecommitdiff
path: root/libresourceqt/src/resource-engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libresourceqt/src/resource-engine.cpp')
-rw-r--r--libresourceqt/src/resource-engine.cpp222
1 files changed, 176 insertions, 46 deletions
diff --git a/libresourceqt/src/resource-engine.cpp b/libresourceqt/src/resource-engine.cpp
index 2c5c1f8..2704235 100644
--- a/libresourceqt/src/resource-engine.cpp
+++ b/libresourceqt/src/resource-engine.cpp
@@ -21,6 +21,10 @@ ResourceEngine::ResourceEngine(ResourceSet *resourceSet)
ResourceEngine::~ResourceEngine()
{
+ delete dbusEngine;
+ if (libresourceSet != NULL)
+ libresourceSet->userdata = NULL;
+ //need to destroy all libresource structures, but how?
}
bool ResourceEngine::initialize()
@@ -53,9 +57,13 @@ bool ResourceEngine::initialize()
return true;
}
-static void handleUnregisterMessage(resmsg_t *, resset_t *resSet, void *)
+static void handleUnregisterMessage(resmsg_t *, resset_t *libresourceSet, void *)
{
- ResourceEngine *engine = reinterpret_cast<ResourceEngine *>(resSet->userdata);
+ if (NULL == libresourceSet->userdata) {
+ qDebug("IGNORING unregister, no context");
+ return;
+ }
+ ResourceEngine *engine = reinterpret_cast<ResourceEngine *>(libresourceSet->userdata);
engine->disconnected();
}
@@ -67,43 +75,78 @@ void ResourceEngine::disconnected()
emit disconnectedFromManager();
}
-static void handleGrantMessage(resmsg_t *msg, resset_t *resSet, void *)
+static void handleGrantMessage(resmsg_t *message, resset_t *libresourceSet, void *)
{
- ResourceEngine *engine = reinterpret_cast<ResourceEngine *>(resSet->userdata);
-
- engine->receivedGrant(&(msg->notify));
+ if (NULL == libresourceSet->userdata) {
+ qDebug("IGNORING grant, no context: type=0x%04x, id=0x%04x, reqno=0x%04x, resc=0x%04x",
+ message->notify.type, message->notify.id, message->notify.reqno, message->notify.resrc);
+ return;
+ }
+ ResourceEngine *engine = reinterpret_cast<ResourceEngine *>(libresourceSet->userdata);
+ engine->receivedGrant(&(message->notify));
}
void ResourceEngine::receivedGrant(resmsg_notify_t *notifyMessage)
{
- qDebug("received a grant message for request %u", notifyMessage->reqno);
- if(notifyMessage->resrc == 0) {
- qDebug("request DENIED!");
- emit resourcesDenied();
+ qDebug("receivedGrant: type=0x%04x, id=0x%04x, reqno=0x%04x, resc=0x%04x",
+ notifyMessage->type, notifyMessage->id, notifyMessage->reqno, notifyMessage->resrc);
+ if (notifyMessage->resrc == 0) {
+ bool unkownRequest = !messageMap.contains(notifyMessage->reqno);
+ resmsg_type_t originaloriginalMessageType = messageMap.take(notifyMessage->reqno);
+ qDebug("lost resources, originaloriginalMessageType=%u", originaloriginalMessageType);
+ if (unkownRequest) {
+ //we don't know this req number => it must be a server override.
+ qDebug("emiting signal resourcesLost()");
+ emit resourcesLost(allResourcesToBitmask(resourceSet));
+ }
+ else if (originaloriginalMessageType == RESMSG_ACQUIRE) {
+ qDebug("request DENIED!");
+ emit resourcesDenied();
+ }
+ else if (originaloriginalMessageType == RESMSG_RELEASE) {
+ qDebug("confirmnation to release");
+ emit resourcesReleased();
+ }
+ else {
+ qDebug("Ignoring the receivedGrant");
+ }
}
else {
- qDebug("emiting signal resourcesAcquired(%02x), this=%p", notifyMessage->resrc, this);
- emit resourcesAcquired(notifyMessage->resrc);
+ qDebug("emiting signal resourcesGranted(%02x)", notifyMessage->resrc);
+ emit resourcesGranted(notifyMessage->resrc);
}
}
-static void handleAdviceMessage(resmsg_t *msg, resset_t *resSet, void *)
+static void handleAdviceMessage(resmsg_t *message, resset_t *libresourceSet, void *)
{
- ResourceEngine *engine = reinterpret_cast<ResourceEngine *>(resSet->userdata);
+ qDebug("ADVICE: type=0x%04x, id=0x%04x, reqno=0x%04x, resc=0x%04x",
+ message->notify.type, message->notify.id, message->notify.reqno, message->notify.resrc);
+
+ if (NULL == libresourceSet->userdata) {
+ qDebug("IGNORING advice, no context");
+ return;
+ }
+ ResourceEngine *engine = reinterpret_cast<ResourceEngine *>(libresourceSet->userdata);
- engine->receivedAdvice(&(msg->notify));
+ engine->receivedAdvice(&(message->notify));
}
-void ResourceEngine::receivedAdvice(resmsg_notify_t *notifyMessage)
+void ResourceEngine::receivedAdvice(resmsg_notify_t *message)
{
- char buf[80];
- resmsg_res_str(notifyMessage->resrc, buf, sizeof(buf));
- qDebug("%s: %s", __FUNCTION__, buf);
+ qDebug("%s: %04x", __FUNCTION__, message->resrc);
+ uint32_t allResources = allResourcesToBitmask(resourceSet);
+ if(message->resrc < allResources) {
+ emit resourcesLost(allResources-message->resrc);
+ }
+ else {
+ emit resourcesBecameAvailable(message->resrc);
+ }
}
-bool ResourceEngine::connect()
+bool ResourceEngine::connectToManager()
{
resmsg_t resourceMessage;
+ memset(&resourceMessage, 0, sizeof(resmsg_t));
resourceMessage.record.type = RESMSG_REGISTER;
resourceMessage.record.id = resourceSet->id();
resourceMessage.record.reqno = ++requestId;
@@ -132,29 +175,19 @@ bool ResourceEngine::connect()
return true;
}
-bool ResourceEngine::disconnect()
+bool ResourceEngine::disconnectFromManager()
{
resmsg_t resourceMessage;
+ memset(&resourceMessage, 0, sizeof(resmsg_t));
+
+ qDebug("disconnecting from manager");
+
resourceMessage.record.type = RESMSG_UNREGISTER;
resourceMessage.record.id = resourceSet->id();
resourceMessage.record.reqno = ++requestId;
messageMap.insert(requestId, RESMSG_UNREGISTER);
- uint32_t allResources, optionalResources;
- allResources = allResourcesToBitmask(resourceSet);
- optionalResources = optionalResourcesToBitmask(resourceSet);
-
- resourceMessage.record.rset.all = allResources;
- resourceMessage.record.rset.opt = optionalResources;
- resourceMessage.record.rset.share = 0;
- resourceMessage.record.rset.mask = mode;
-
- QByteArray ba = resourceSet->applicationClass().toLatin1();
- resourceMessage.record.klass = ba.data();
-
- resourceMessage.record.mode = 0; //No auto release
-
int r = resconn_disconnect(libresourceSet, &resourceMessage,
statusCallbackHandler);
connected = false;
@@ -220,6 +253,11 @@ static inline quint32 optionalResourcesToBitmask(const ResourceSet *resourceSet)
static void statusCallbackHandler(resset_t *libresourceSet, resmsg_t *message)
{
+ if (NULL == libresourceSet->userdata) {
+ qDebug("IGNORING status message, no context: type=0x%04x, id=0x%04x, reqno=0x%04x, errcod=%d",
+ message->status.type, message->status.id, message->status.reqno, message->status.errcod);
+ return;
+ }
ResourceEngine *resourceEngine = reinterpret_cast<ResourceEngine *>(libresourceSet->userdata);
qDebug("Received a status notification");
if (message->type != RESMSG_STATUS) {
@@ -237,27 +275,38 @@ static void statusCallbackHandler(resset_t *libresourceSet, resmsg_t *message)
void ResourceEngine::handleStatusMessage(quint32 requestNo)
{
- resmsg_type_t messageType = messageMap.take(requestNo);
- qDebug("Received a status message: %u(0x%02x)", requestNo, messageType);
- if (messageType == RESMSG_REGISTER) {
+ resmsg_type_t originalMessageType = messageMap.value(requestNo);
+ qDebug("Received a status message: %u(0x%02x)", requestNo, originalMessageType);
+ if (originalMessageType == RESMSG_REGISTER) {
qDebug("connected!");
connected = true;
emit connectedToManager();
+ messageMap.remove(requestNo);
}
- else if (messageType == RESMSG_UNREGISTER) {
+ else if (originalMessageType == RESMSG_UNREGISTER) {
qDebug("disconnected!");
connected = false;
emit disconnectedFromManager();
+ messageMap.remove(requestNo);
+ }
+ else if(originalMessageType == RESMSG_UPDATE) {
+ qDebug("Update status");
+ }
+ else if(originalMessageType == RESMSG_ACQUIRE) {
+ qDebug("Acquire status");
+ }
+ else if(originalMessageType == RESMSG_RELEASE) {
+ qDebug("Release status");
}
}
void ResourceEngine::handleError(quint32 requestNo, qint32 code, const char *message)
{
- resmsg_type_t messageType = messageMap.take(requestNo);
- qDebug("Error on request %u(0x%02x): %d - %s", requestNo, messageType, code, message);
+ resmsg_type_t originalMessageType = messageMap.take(requestNo);
+ qDebug("Error on request %u(0x%02x): %d - %s", requestNo, originalMessageType, code, message);
}
-bool ResourceEngine::isConnected()
+bool ResourceEngine::isConnectedToManager()
{
return connected;
}
@@ -268,8 +317,8 @@ bool ResourceEngine::acquireResources()
memset(&message, 0, sizeof(resmsg_t));
message.possess.type = RESMSG_ACQUIRE;
- message.any.id = resourceSet->id();
- message.any.reqno = ++requestId;
+ message.possess.id = resourceSet->id();
+ message.possess.reqno = ++requestId;
messageMap.insert(requestId, RESMSG_ACQUIRE);
@@ -284,21 +333,102 @@ bool ResourceEngine::acquireResources()
bool ResourceEngine::releaseResources()
{
- return false;
+ resmsg_t message;
+ memset(&message, 0, sizeof(resmsg_t));
+
+ message.possess.type = RESMSG_RELEASE;
+ message.possess.id = resourceSet->id();
+ message.possess.reqno = ++requestId;
+
+ messageMap.insert(requestId, RESMSG_RELEASE);
+ qDebug("release %u:%u", resourceSet->id(), requestId);
+ int success = resproto_send_message(libresourceSet, &message, statusCallbackHandler);
+
+ if(!success)
+ return false;
+ else
+ return true;
}
bool ResourceEngine::updateResources()
{
+ resmsg_t message;
+ memset(&message, 0, sizeof(resmsg_t));
+ message.record.type = RESMSG_UPDATE;
+ message.record.id = resourceSet->id();
+ message.record.reqno = ++requestId;
+
+ uint32_t allResources, optionalResources;
+ allResources = allResourcesToBitmask(resourceSet);
+ optionalResources = optionalResourcesToBitmask(resourceSet);
+
+ message.record.rset.all = allResources;
+ message.record.rset.opt = optionalResources;
+ message.record.rset.share = 0;
+ message.record.rset.mask = 0;
+
+ QByteArray ba = resourceSet->applicationClass().toLatin1();
+ message.record.klass = ba.data();
+
+ messageMap.insert(requestId, RESMSG_UPDATE);
+
+ qDebug("update %u:%u", resourceSet->id(), requestId);
+ int success = resproto_send_message(libresourceSet, &message, statusCallbackHandler);
+
+ if(!success)
+ return false;
+ else
+ return true;
+}
+
+bool ResourceEngine::registerAudioPid(quint32)
+{
return false;
}
-bool ResourceEngine::registerAudioProperties(quint32 pid, QString streamName)
+bool ResourceEngine::registerAudioStreamTag(const QString &)
{
return false;
}
+bool ResourceEngine::registerAudioGroup(const QString &audioGroup)
+{
+ resmsg_t message;
+ memset(&message, 0, sizeof(resmsg_t));
+
+ QByteArray ba = resourceSet->applicationClass().toLatin1();
+ message.audio.group = ba.data();
+
+ message.audio.type = RESMSG_AUDIO;
+ message.audio.id = resourceSet->id();
+ message.audio.reqno = ++requestId;
+
+ message.audio.type = RESMSG_AUDIO;
+
+// msg.audio.pid = pid;
+//stream tag is a name:value pair
+// msg.audio.property.name = name;
+// msg.audio.property.match.method = resmsg_method_equals;
+// msg.audio.property.match.pattern = value;
+
+ messageMap.insert(requestId, RESMSG_AUDIO);
+
+ qDebug("audio %u:%u", resourceSet->id(), requestId);
+ int success = resproto_send_message(libresourceSet, &message, statusCallbackHandler);
+
+ if(!success)
+ return false;
+ else
+ return true;
+
+}
+
static void connectionIsUp(resconn_t *connection)
{
+ if (NULL == connection->dbus.rsets->userdata) {
+ qDebug("IGNORING connectionIsUp");
+ return;
+ }
ResourceEngine *resourceEngine;
resourceEngine = reinterpret_cast<ResourceEngine *>(connection->dbus.rsets->userdata);