133fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair/*
233fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * Copyright (C) 2017 The Android Open Source Project
333fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair *
433fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * Licensed under the Apache License, Version 2.0 (the "License");
533fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * you may not use this file except in compliance with the License.
633fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * You may obtain a copy of the License at
733fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair *
833fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair *      http://www.apache.org/licenses/LICENSE-2.0
933fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair *
1033fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * Unless required by applicable law or agreed to in writing, software
1133fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * distributed under the License is distributed on an "AS IS" BASIS,
1233fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1333fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * See the License for the specific language governing permissions and
1433fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair * limitations under the License.
1533fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair */
1633fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair
17357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair#include "include/serviceutils/PriorityDumper.h"
1833fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair
1933fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nairnamespace android {
2033fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair
216a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairconst char16_t PriorityDumper::PROTO_ARG[] = u"--proto";
226a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairconst char16_t PriorityDumper::PRIORITY_ARG[] = u"--dump-priority";
236a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairconst char16_t PriorityDumper::PRIORITY_ARG_CRITICAL[] = u"CRITICAL";
246a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairconst char16_t PriorityDumper::PRIORITY_ARG_HIGH[] = u"HIGH";
256a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairconst char16_t PriorityDumper::PRIORITY_ARG_NORMAL[] = u"NORMAL";
266a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair
276a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairenum class PriorityType { INVALID, CRITICAL, HIGH, NORMAL };
286a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair
296a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairstatic PriorityType getPriorityType(const String16& arg) {
306a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    if (arg == PriorityDumper::PRIORITY_ARG_CRITICAL) {
316a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        return PriorityType::CRITICAL;
326a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    } else if (arg == PriorityDumper::PRIORITY_ARG_HIGH) {
336a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        return PriorityType::HIGH;
346a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    } else if (arg == PriorityDumper::PRIORITY_ARG_NORMAL) {
356a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        return PriorityType::NORMAL;
3633fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair    }
376a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    return PriorityType::INVALID;
3833fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair}
3933fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair
406a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nairstatus_t PriorityDumper::dumpAll(int fd, const Vector<String16>& args, bool asProto) {
41357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair    status_t status;
426a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    status = dumpCritical(fd, args, asProto);
43357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair    if (status != OK) return status;
446a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    status = dumpHigh(fd, args, asProto);
45357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair    if (status != OK) return status;
466a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    status = dumpNormal(fd, args, asProto);
47357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair    if (status != OK) return status;
48357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair    return status;
49357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair}
50357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair
51357988777218502ed68a56a0c8b247ba64b74721Vishnu Nairstatus_t PriorityDumper::priorityDump(int fd, const Vector<String16>& args) {
52357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair    status_t status;
536a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    bool asProto = false;
546a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    PriorityType priority = PriorityType::INVALID;
556a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair
566a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    Vector<String16> strippedArgs;
576a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    for (uint32_t argIndex = 0; argIndex < args.size(); argIndex++) {
586a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        if (args[argIndex] == PROTO_ARG) {
596a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            asProto = true;
606a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        } else if (args[argIndex] == PRIORITY_ARG) {
616a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            if (argIndex + 1 < args.size()) {
626a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair                argIndex++;
636a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair                priority = getPriorityType(args[argIndex]);
646a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            }
6533fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair        } else {
666a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            strippedArgs.add(args[argIndex]);
6733fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair        }
686a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    }
696a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair
706a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair    switch (priority) {
716a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        case PriorityType::CRITICAL:
726a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            status = dumpCritical(fd, strippedArgs, asProto);
736a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            break;
746a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        case PriorityType::HIGH:
756a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            status = dumpHigh(fd, strippedArgs, asProto);
766a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            break;
776a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        case PriorityType::NORMAL:
786a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            status = dumpNormal(fd, strippedArgs, asProto);
796a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            break;
806a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair        default:
816a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            status = dumpAll(fd, strippedArgs, asProto);
826a40853e06f5274d84b0fc66e349a36510d1497fVishnu Nair            break;
8333fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair    }
84357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair    return status;
8533fd3be6088bfacaf659108bad67d24103494aa1Vishnu Nair}
86357988777218502ed68a56a0c8b247ba64b74721Vishnu Nair} // namespace android
87