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