/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ #include "Log.h" #include "task/TaskAll.h" TaskGeneric::TaskGeneric(TaskType type): mType(type), mParent(NULL) { } bool deleteChildInstance(TaskGeneric* child, void* /*data*/) { delete child; return true; } TaskGeneric::~TaskGeneric() { forEachChild(deleteChildInstance, NULL); //mChildren.clear(); } bool TaskGeneric::addChild(TaskGeneric* child) { mChildren.push_back(child); child->setParent(this); return true; } bool TaskGeneric::forEachChild(bool (*runForEachChild)(TaskGeneric* child, void* data), void* data) { std::list<TaskGeneric*>::iterator i = mChildren.begin(); std::list<TaskGeneric*>::iterator end = mChildren.end(); for (; i != end; i++) { if (!(*runForEachChild)(*i, data)) { return false; } } return true; } TaskGeneric* TaskGeneric::getParent() { return mParent; } TaskCase* TaskGeneric::getTestCase() { TaskGeneric* task = this; while (task != NULL) { if (task->getType() == ETaskCase) { // do not use dynamic_cast intentionally return reinterpret_cast<TaskCase*>(task); } task = task->getParent(); } LOGE("TaskGeneric::getTestCase no TaskCase found!"); return NULL; } void TaskGeneric::setParent(TaskGeneric* parent) { LOGD("TaskGeneric::setParent self %x, parent %x", this, parent); mParent = parent; } bool runChild(TaskGeneric* child, void* data) { TaskGeneric::ExecutionResult* result = reinterpret_cast<TaskGeneric::ExecutionResult*>(data); *result = child->run(); if (*result != TaskGeneric::EResultOK) { LOGE("child type %d returned %d", child->getType(), *result); return false; } return true; } TaskGeneric::ExecutionResult TaskGeneric::run() { ExecutionResult result = EResultOK; forEachChild(runChild, &result); return result; } bool TaskGeneric::parseAttribute(const android::String8& name, const android::String8& value) { // default implementation only handles registered string attributes if (!addStringAttribute(name, value)) { LOGE("parseAttribute unknown attribute %s %s for type %d", name.string(), value.string(), getType()); return false; } return true; } void TaskGeneric::registerSupportedStringAttributes(const android::String8* keys[]) { int i = 0; while (keys[i] != NULL) { mAllowedStringAttributes.insert(*keys[i]); i++; } } bool TaskGeneric::addStringAttribute(const android::String8& key, const android::String8& value) { std::set<android::String8, android::String8>::iterator it = mAllowedStringAttributes.find(key); if (it == mAllowedStringAttributes.end()) { return false; // not allowed } mStringAttributes[key] = value; return true; } bool TaskGeneric::findStringAttribute(const android::String8& key, android::String8& value) const { std::map<android::String8, android::String8>::const_iterator it = mStringAttributes.find(key); if (it == mStringAttributes.end()) { return false; // not found } value = it->second; return true; }