#include #include #include #include #include #include "client.h" using namespace ResourcePolicy; Client::Client() : QObject(), standardInput(stdin, QFile::ReadOnly), applicationClass(), resourceSet(NULL) { mainTimerID = startTimer(0); } Client::~Client() { killTimer(mainTimerID); delete resourceSet; } void Client::showPrompt() { printf("res-client> "); fflush(stdout); } bool Client::initialize(const CommandLineParser &parser) { QSet allResources; QSet optionalResources; resourceSet = new ResourceSet(parser.resourceApplicationClass()); if (resourceSet == NULL) { return false; } if (parser.shouldAlwaysReply()) { qDebug("client: AlwaysReply"); resourceSet->setAlwaysReply(); } if (parser.shouldAutoRelease()) { qDebug("client: AutoRelease"); resourceSet->setAutoRelease(); } allResources.unite(parser.resources()); optionalResources.unite(parser.optionalResources()); foreach (ResourcePolicy::ResourceType resource, allResources) { resourceSet->addResource(resource); if (optionalResources.contains(resource)) { resourceSet->resource(resource)->setOptional(); } } if (!connect(resourceSet, SIGNAL(resourcesGranted(QList)), this, SLOT(resourceAcquiredHandler(QList)))) { return false; } if (!connect(resourceSet, SIGNAL(resourcesDenied()), this, SLOT(resourceDeniedHandler()))) { return false; } if (!connect(resourceSet, SIGNAL(lostResources()), this, SLOT(resourceLostHandler()))) { return false; } if (!connect(resourceSet, SIGNAL(resourcesReleased()), this, SLOT(resourceReleasedHandler()))) { return false; } if (!connect(resourceSet, SIGNAL(resourcesBecameAvailable(const QList &)), this, SLOT(resourcesBecameAvailableHandler(const QList &)))) { return false; } showPrompt(); return true; } const char * resourceTypeToString(ResourceType type) { switch (type) { case AudioPlaybackType: return "AudioPlayback"; case AudioRecorderType: return "AudioRecording"; case VideoPlaybackType: return "VideoPlayback"; case VideoRecorderType: return "VideoRegording"; case VibraType: return "Vibra"; case LedsType: return "Leds"; case BacklightType: return "Backlight"; case SystemButtonType: return "SystemButton"; case LockButtonType: return "LockButton"; case ScaleButtonType: return "ScaleButton"; case SnapButtonType: return "SnapButton"; case LensCoverType: return "LensCover"; case HeadsetButtonsType: return "HeadsetButtons"; default: return "Unknown/Invalid Resource"; } } void Client::showResources(const QList resList) { foreach (ResourceType resource, resList) { printf("\t%s\n", resourceTypeToString(resource)); } } void Client::showResources(const QList resList) { foreach (Resource* resource, resList) { printf("\t%s%s%s\n", resourceTypeToString(resource->type()), resource->isOptional() ? " (optional)" : "", resource->isGranted() ? " (granted)" : ""); } } void Client::resourceAcquiredHandler(const QList& /*grantedResList*/) { double ms = stop_timer(); if( ms > 0.0 ) { printf("Operation took %.2f ms\n", ms); } QList list = resourceSet->resources(); if (!list.count()) { printf("\nGranted resource set is empty. Possible bug?\n"); } else { printf("\nManager grants access to these resources:\n"); printf("Resource set:\n"); showResources(list); } showPrompt(); } void Client::resourceDeniedHandler() { double ms = stop_timer(); if( ms > 0.0 ) { printf("Operation took %.2f ms\n", ms); } printf("\nManager denies access to resources!\n"); showPrompt(); } void Client::resourceLostHandler() { double ms = stop_timer(); if( ms > 0.0 ) { printf("Operation took %.2f ms\n", ms); } printf("\nLost resources from manager!\n"); showPrompt(); } void Client::resourceReleasedHandler() { double ms = stop_timer(); if( ms > 0.0 ) { printf("Operation took %.2f ms\n", ms); } printf("\nAll resources released\n"); showPrompt(); } void Client::resourcesBecameAvailableHandler(const QList &availableResources) { printf("\nManager advice: These resources are available:\n"); printf("Resource set:\n"); showResources(availableResources); showPrompt(); } void Client::timerEvent(QTimerEvent*) { bool quitFlag = false; fd_set stdinfd; FD_ZERO(&stdinfd); FD_SET(0, &stdinfd); timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; int ready = select(1, &stdinfd, NULL, NULL, &tv); if (ready > 0) { QString line = standardInput.readLine(); if (!line.isNull()) { QStringList params = line.split(" "); if (params[0] == "quit") { quitFlag = true; QMetaObject::invokeMethod(QCoreApplication::instance(), "quit"); } else if (params[0] == "help") { printf("Available commands:\n"); printf("\t help \tprint this help message\n"); printf("\t quit \texit application\n"); printf("\t free \tdestroy and free the resources\n"); printf("\t acquire\tacquire required resources\n"); printf("\t release\trelease resources\n"); printf("\t update\tupdate modified resource set after add or remove command\n"); printf("\t add reslist [-o]\tadd reosurce list, if -o provided, set as optional\n"); printf("\t remove reslist [-o]\tremove reosurce list, if -o provided, removed only optional flag\n"); printf("\t audio pid | group