19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "KeyLayoutMap"
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "KeyLayoutMap.h"
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/stat.h>
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h>
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/KeycodeLabels.h>
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectKeyLayoutMap::KeyLayoutMap()
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    :m_status(NO_INIT),
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_keys()
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectKeyLayoutMap::~KeyLayoutMap()
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic String8
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnext_token(char const** p, int *line)
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool begun = false;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* begin = *p;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* end = *p;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (true) {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (*end == '\n') {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (*line)++;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (*end)
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '#':
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (begun) {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p = end;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return String8(begin, end-begin);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    do {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        begin++;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        end++;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } while (*begin != '\0' && *begin != '\n');
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '\0':
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ' ':
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '\n':
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '\r':
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '\t':
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (begun || (*end == '\0')) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    *p = end;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return String8(begin, end-begin);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    begin++;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    end++;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                end++;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                begun = true;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttoken_to_value(const char *literal, const KeycodeLabel *list)
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (list->literal) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (0 == strcmp(literal, list->literal)) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return list->value;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        list++;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return list->value;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectKeyLayoutMap::load(const char* filename)
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int fd = open(filename, O_RDONLY);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fd < 0) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("error opening file=%s err=%s\n", filename, strerror(errno));
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_status = errno;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return errno;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    off_t len = lseek(fd, 0, SEEK_END);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    off_t errlen = lseek(fd, 0, SEEK_SET);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len < 0 || errlen < 0) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close(fd);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("error seeking file=%s err=%s\n", filename, strerror(errno));
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_status = errno;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return errno;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char* buf = (char*)malloc(len+1);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (read(fd, buf, len) != len) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("error reading file=%s err=%s\n", filename, strerror(errno));
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_status = errno != 0 ? errno : ((int)NOT_ENOUGH_DATA);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return errno != 0 ? errno : ((int)NOT_ENOUGH_DATA);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    errno = 0;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buf[len] = '\0';
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t scancode = -1;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t keycode = -1;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t flags = 0;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t tmp;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char* end;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = NO_ERROR;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int line = 1;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char const* p = buf;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum { BEGIN, SCANCODE, KEYCODE, FLAG } state = BEGIN;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (true) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String8 token = next_token(&p, &line);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (*p == '\0') {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (state)
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case BEGIN:
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token == "key") {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    state = SCANCODE;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    LOGE("%s:%d: expected key, got '%s'\n", filename, line,
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.string());
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    err = BAD_VALUE;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto done;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SCANCODE:
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scancode = strtol(token.string(), &end, 0);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (*end != '\0') {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    LOGE("%s:%d: expected scancode (a number), got '%s'\n",
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            filename, line, token.string());
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto done;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //LOGI("%s:%d: got scancode %d\n", filename, line, scancode );
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                state = KEYCODE;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case KEYCODE:
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                keycode = token_to_value(token.string(), KEYCODES);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //LOGI("%s:%d: got keycode %d for %s\n", filename, line, keycode, token.string() );
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (keycode == 0) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    LOGE("%s:%d: expected keycode, got '%s'\n",
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            filename, line, token.string());
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto done;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                state = FLAG;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FLAG:
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token == "key") {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scancode != -1) {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //LOGI("got key decl scancode=%d keycode=%d"
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //       " flags=0x%08x\n", scancode, keycode, flags);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Key k = { keycode, flags };
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        m_keys.add(scancode, k);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        state = SCANCODE;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        scancode = -1;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        keycode = -1;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        flags = 0;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmp = token_to_value(token.string(), FLAGS);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //LOGI("%s:%d: got flags %x for %s\n", filename, line, tmp, token.string() );
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tmp == 0) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    LOGE("%s:%d: expected flag, got '%s'\n",
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            filename, line, token.string());
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    goto done;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flags |= tmp;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (state == FLAG && scancode != -1 ) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGI("got key decl scancode=%d keycode=%d"
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //       " flags=0x%08x\n", scancode, keycode, flags);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Key k = { keycode, flags };
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_keys.add(scancode, k);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdone:
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    free(buf);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    close(fd);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    m_status = err;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectKeyLayoutMap::map(int32_t scancode, int32_t *keycode, uint32_t *flags) const
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (m_status != NO_ERROR) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_status;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t index = m_keys.indexOfKey(scancode);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index < 0) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOGW("couldn't map scancode=%d\n", scancode);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NAME_NOT_FOUND;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const Key& k = m_keys.valueAt(index);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *keycode = k.keycode;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *flags = k.flags;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //LOGD("mapped scancode=%d to keycode=%d flags=0x%08x\n", scancode,
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //        keycode, flags);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectKeyLayoutMap::findScancodes(int32_t keycode, Vector<int32_t>* outScancodes) const
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (m_status != NO_ERROR) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_status;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N = m_keys.size();
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<N; i++) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (m_keys.valueAt(i).keycode == keycode) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outScancodes->add(m_keys.keyAt(i));
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
236