1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 #include "Log.h" 18 19 #include "task/TaskAll.h" 20 21 22 TaskGeneric::TaskGeneric(TaskType type): 23 mType(type), 24 mParent(NULL) 25 { 26 27 } 28 29 bool deleteChildInstance(TaskGeneric* child, void* /*data*/) 30 { 31 delete child; 32 return true; 33 } 34 35 TaskGeneric::~TaskGeneric() 36 { 37 forEachChild(deleteChildInstance, NULL); 38 //mChildren.clear(); 39 } 40 41 bool TaskGeneric::addChild(TaskGeneric* child) 42 { 43 mChildren.push_back(child); 44 child->setParent(this); 45 return true; 46 } 47 48 bool TaskGeneric::forEachChild(bool (*runForEachChild)(TaskGeneric* child, void* data), void* data) 49 { 50 std::list<TaskGeneric*>::iterator i = mChildren.begin(); 51 std::list<TaskGeneric*>::iterator end = mChildren.end(); 52 for (; i != end; i++) { 53 if (!(*runForEachChild)(*i, data)) { 54 return false; 55 } 56 } 57 return true; 58 } 59 60 TaskGeneric* TaskGeneric::getParent() 61 { 62 return mParent; 63 } 64 65 TaskCase* TaskGeneric::getTestCase() 66 { 67 TaskGeneric* task = this; 68 69 while (task != NULL) { 70 if (task->getType() == ETaskCase) { 71 // do not use dynamic_cast intentionally 72 return reinterpret_cast<TaskCase*>(task); 73 } 74 task = task->getParent(); 75 } 76 LOGE("TaskGeneric::getTestCase no TaskCase found!"); 77 return NULL; 78 } 79 80 void TaskGeneric::setParent(TaskGeneric* parent) 81 { 82 LOGD("TaskGeneric::setParent self %x, parent %x", this, parent); 83 mParent = parent; 84 } 85 86 bool runChild(TaskGeneric* child, void* data) 87 { 88 TaskGeneric::ExecutionResult* result = reinterpret_cast<TaskGeneric::ExecutionResult*>(data); 89 *result = child->run(); 90 if (*result != TaskGeneric::EResultOK) { 91 LOGE("child type %d returned %d", child->getType(), *result); 92 return false; 93 } 94 return true; 95 } 96 97 TaskGeneric::ExecutionResult TaskGeneric::run() 98 { 99 ExecutionResult result = EResultOK; 100 forEachChild(runChild, &result); 101 return result; 102 } 103 104 bool TaskGeneric::parseAttribute(const android::String8& name, const android::String8& value) 105 { 106 // default implementation only handles registered string attributes 107 if (!addStringAttribute(name, value)) { 108 LOGE("parseAttribute unknown attribute %s %s for type %d", 109 name.string(), value.string(), getType()); 110 return false; 111 } 112 return true; 113 } 114 115 116 void TaskGeneric::registerSupportedStringAttributes(const android::String8* keys[]) 117 { 118 int i = 0; 119 while (keys[i] != NULL) { 120 mAllowedStringAttributes.insert(*keys[i]); 121 i++; 122 } 123 } 124 125 bool TaskGeneric::addStringAttribute(const android::String8& key, const android::String8& value) 126 { 127 std::set<android::String8, android::String8>::iterator it = mAllowedStringAttributes.find(key); 128 if (it == mAllowedStringAttributes.end()) { 129 return false; // not allowed 130 } 131 mStringAttributes[key] = value; 132 return true; 133 } 134 135 bool TaskGeneric::findStringAttribute(const android::String8& key, android::String8& value) const 136 { 137 std::map<android::String8, android::String8>::const_iterator it = mStringAttributes.find(key); 138 if (it == mStringAttributes.end()) { 139 return false; // not found 140 } 141 value = it->second; 142 return true; 143 } 144 145