static void cfe_init_ui(void) { ui_init_cmddisp(); OPTIONAL(ui_init_envcmds()); OPTIONAL(ui_init_devcmds()); #if CFG_NETWORK ui_init_netcmds(); #endif ui_init_loadcmds(); OPTIONAL(ui_init_memcmds()); #if CFG_PCI ui_init_pcicmds(); #endif OPTIONAL(ui_init_examcmds()); ui_init_flashcmds(); #if CFG_VAPI ui_init_vapicmds(); #endif ui_init_hccmd(); #if CFG_VENDOR_EXTENSIONS ui_init_vendorcmds(); #endif OPTIONAL(ui_init_misccmds()); }
} (*which_discard)++; } DEFINE_RULE(branch_discard_1) auto_consume_whitespace = 0; SEQ( RULE(token, "a"), CHOOSE( RULE(token, "x"), // which_discard == 0 RULE(token, "y"), // which_discard == 1 RULE(token, "z"), // which_discard == 2 RULE(token, "b") ), OPTIONAL(RULE(token,"q")), // which_discard == 3 RULE(token,"c"), NEG_LOOKAHEAD(RULE(token,"1")), // which_discard == 4 RULE(token,"d") ); END_RULE DEFINE_RULE(branch_discard_2) auto_consume_whitespace = 0; SEQ( ZERO_OR_MORE(RULE(token, "a")), // which_discard == 5 RULE(token,"b"), ONE_OR_MORE(RULE(token, "a")) // which_discard == 6 ); END_RULE
// http://msdn.microsoft.com/en-us/library/ms725481.aspx bool TimeZoneService::cbGetTimeZoneFromEasData(LSHandle* lsHandle, LSMessage *message, void *user_data) { std::string reply; bool ret; LSError lsError; json_object* root = 0; json_object* label = 0; int easBias; EasSystemTime easStandardDate; int easStandardBias; EasSystemTime easDaylightDate; int easDaylightBias; LSErrorInit(&lsError); easBias = 0; easStandardDate.valid = false; easStandardBias = 0; easDaylightDate.valid = false; easDaylightBias = 0; // {"bias": integer, standardDate:{"year": integer, "month": integer, "dayOfWeek": integer, "day": integer, "hour": integer, "minute": integer, "second": integer}, "standardBias": integer, "daylightDate":{"year": integer, "month": integer, "dayOfWeek": integer, "day": integer, "hour": integer, "minute": integer, "second": integer}, "daylightBias": integer} VALIDATE_SCHEMA_AND_RETURN(lsHandle, message, SCHEMA_5(REQUIRED(bias, integer), NAKED_OBJECT_OPTIONAL_7(standardDate, year, integer, month, integer, dayOfWeek, integer, day, integer, hour, integer, minute, integer, second, integer), OPTIONAL(standardBias, integer), NAKED_OBJECT_OPTIONAL_7(daylightDate, year, integer, month, integer, dayOfWeek, integer, day, integer, hour, integer, minute, integer, second, integer),OPTIONAL(daylightBias, integer))); const char* payload = LSMessageGetPayload(message); if (!payload) { reply = "{\"returnValue\": false, " " \"errorText\": \"No payload specifed for message\"}"; goto Done; } root = json_tokener_parse(payload); if (!root || is_error(root)) { reply = "{\"returnValue\": false, " " \"errorText\": \"Cannot parse json payload\"}"; goto Done; } // bias. mandatory (everything else is optional) label = json_object_object_get(root, "bias"); if (!label || !json_object_is_type(label, json_type_int)) { reply = "{\"returnValue\": false, " " \"errorText\": \"bias value missing\"}"; goto Done; } easBias = json_object_get_int(label); // standard date label = json_object_object_get(root, "standardDate"); if (label && json_object_is_type(label, json_type_object)) readEasDate(label, easStandardDate); // standard bias label = json_object_object_get(root, "standardBias"); if (label && json_object_is_type(label, json_type_int)) easStandardBias = json_object_get_int(label); // daylight date label = json_object_object_get(root, "daylightDate"); if (label && json_object_is_type(label, json_type_object)) readEasDate(label, easDaylightDate); // daylight bias label = json_object_object_get(root, "daylightBias"); if (label && json_object_is_type(label, json_type_int)) easDaylightBias = json_object_get_int(label); // Both standard and daylight bias need to specified together, // otherwise both are invalid if (!easDaylightDate.valid) easStandardDate.valid = false; if (!easStandardDate.valid) easDaylightDate.valid = false; { // Get all timezones matching the current offset PrefsHandler* handler = PrefsFactory::instance()->getPrefsHandler("timeZone"); TimePrefsHandler* tzHandler = static_cast<TimePrefsHandler*>(handler); TimeZoneService* tzService = TimeZoneService::instance(); std::list<std::string> timeZones = tzHandler->getTimeZonesForOffset(-easBias); if (timeZones.empty()) { reply = "{\"returnValue\": false, " " \"errorText\": \"Failed to find any timezones with specified bias value\"}"; goto Done; } if (!easStandardDate.valid) { // No additional data available for refinement. Just use the // first timezone entry in the list json_object* obj = json_object_new_object(); json_object_object_add(obj, "returnValue", json_object_new_boolean(true)); json_object_object_add(obj, "timeZone", json_object_new_string(timeZones.begin()->c_str())); reply = json_object_to_json_string(obj); json_object_put(obj); goto Done; } else { time_t utcTime = time(NULL); struct tm* localTime = localtime(&utcTime); int currentYear = localTime->tm_year + 1900; updateEasDateDayOfMonth(easStandardDate, currentYear); updateEasDateDayOfMonth(easDaylightDate, currentYear); for (std::list<std::string>::const_iterator it = timeZones.begin(); it != timeZones.end(); ++it) { TimeZoneEntry tzEntry; tzEntry.tz = (*it); tzEntry.years.push_back(currentYear); TimeZoneResultList tzResultList = tzService->getTimeZoneRuleOne(tzEntry); if (tzResultList.empty()) continue; const TimeZoneResult& tzResult = tzResultList.front(); printf("For timezone: %s\n", tzEntry.tz.c_str()); printf("year: %d, utcOffset: %lld, dstOffset: %lld, dstStart: %lld, dstEnd: %lld\n", tzResult.year, tzResult.utcOffset, tzResult.dstOffset, tzResult.dstStart, tzResult.dstEnd); // Set this timezone as the current timezone, so that we can calculate when the // DST transitions occurs in seconds for the specified eas data setenv("TZ", tzEntry.tz.c_str(), 1); struct tm tzBrokenTime; tzBrokenTime.tm_sec = easStandardDate.second; tzBrokenTime.tm_min = easStandardDate.minute; tzBrokenTime.tm_hour = easStandardDate.hour; tzBrokenTime.tm_mday = easStandardDate.day; tzBrokenTime.tm_mon = easStandardDate.month - 1; tzBrokenTime.tm_year = currentYear - 1900; tzBrokenTime.tm_wday = 0; tzBrokenTime.tm_yday = 0; tzBrokenTime.tm_isdst = 1; time_t easStandardDateSeconds = ::mktime(&tzBrokenTime); tzBrokenTime.tm_sec = easDaylightDate.second; tzBrokenTime.tm_min = easDaylightDate.minute; tzBrokenTime.tm_hour = easDaylightDate.hour; tzBrokenTime.tm_mday = easDaylightDate.day; tzBrokenTime.tm_mon = easDaylightDate.month - 1; tzBrokenTime.tm_year = currentYear - 1900; tzBrokenTime.tm_wday = 0; tzBrokenTime.tm_yday = 0; tzBrokenTime.tm_isdst = 0; time_t easDaylightDateSeconds = ::mktime(&tzBrokenTime); printf("eas dstStart: %ld, dstEnd: %ld\n", easDaylightDateSeconds, easStandardDateSeconds); if (easStandardDateSeconds == tzResult.dstEnd && easDaylightDateSeconds == tzResult.dstStart) { // We have a winner json_object* obj = json_object_new_object(); json_object_object_add(obj, "returnValue", json_object_new_boolean(true)); json_object_object_add(obj, "timeZone", json_object_new_string(tzEntry.tz.c_str())); reply = json_object_to_json_string(obj); json_object_put(obj); goto Done; } } reply = "{\"returnValue\": false, " " \"errorText\": \"Failed to find any timezones with specified parametes\"}"; } } Done: ret = LSMessageReply(lsHandle, message, reply.c_str(), &lsError); if (!ret) LSErrorFree(&lsError); if (root && !is_error(root)) json_object_put(root); return true; }
/* * main */ int main(int argc, char *argv[]) { #ifdef _NDSTOOL_P_H if (sizeof(Header) != 0x200) { fprintf(stderr, "Header size %d != %d\n", sizeof(Header), 0x200); return 1; } #endif if (argc < 2) { Help(); return 0; } int num_actions = 0; int actions[MAX_ACTIONS]; /* * parse parameters to actions */ for (int a=1; a<argc; a++) { if (argv[a][0] == '-') { switch (argv[a][1]) { case 'i': // show information { ADDACTION(ACTION_SHOWINFO); OPTIONAL(ndsfilename); break; } case 'f': // fix header CRC { ADDACTION(ACTION_FIXHEADERCRC); OPTIONAL(ndsfilename); break; } case 's': // en-/decrypt secure area { ADDACTION(ACTION_ENCRYPTSECUREAREA); endecrypt_option = argv[a][2]; OPTIONAL(ndsfilename); break; } case 'l': // list files { ADDACTION(ACTION_LISTFILES); OPTIONAL(ndsfilename); break; } case 'x': // extract { ADDACTION(ACTION_EXTRACT); OPTIONAL(ndsfilename); break; } case 'w': // wildcard filemasks { while (1) { char *filemask = 0; OPTIONAL(filemask); if (!(filemasks[filemask_num] = filemask)) break; if (++filemask_num >= MAX_FILEMASKS) return 1; } break; } case 'c': // create { ADDACTION(ACTION_CREATE); OPTIONAL(ndsfilename); break; } // file root directory case 'd': REQUIRED(filerootdir); break; // ARM7 filename case '7': if (argv[a][2] == 'i') { REQUIRED(arm7ifilename); } else { REQUIRED(arm7filename); } break; // ARM9 filename case '9': if (argv[a][2] == 'i') { REQUIRED(arm9ifilename); } else { REQUIRED(arm9filename); } break; // hook ARM7 executable case 'k': { ADDACTION(ACTION_HOOK); OPTIONAL(ndsfilename); break; } case 't': REQUIRED(bannerfilename); bannertype = BANNER_BINARY; break; case 'b': bannertype = BANNER_IMAGE; REQUIRED(bannerfilename); REQUIRED(bannertext); break; case 'o': REQUIRED(logofilename); break; case 'h': // load header or header size REQUIRED(headerfilename_or_size); break; /*case 'u': // unique ID file REQUIRED(uniquefilename); break;*/ case 'u': // DSi title ID high word if (argc > a) titleidHigh = strtoul(argv[++a], 0, 16); break; case 'z': // SCFG access flags if (argc > a) scfgExtMask = strtoul(argv[++a], 0, 16); break; case 'a': // DSi access control flags if (argc > a) accessControl = strtoul(argv[++a], 0, 16); break; case 'p': // DSi application flags if (argc > a) appFlags = strtoul(argv[++a], 0, 16) & 0xFF; break; case 'v': // verbose for (char *p=argv[a]; *p; p++) if (*p == 'v') verbose++; OPTIONAL(romlistfilename); break; case 'n': // latency //compatibility = true; OPTIONAL_INT(latency1); OPTIONAL_INT(latency2); break; case 'r': // RAM address switch (argv[a][2]) { case '7': arm7RamAddress = (argc > a) ? strtoul(argv[++a], 0, 0) : 0; break; case '9': arm9RamAddress = (argc > a) ? strtoul(argv[++a], 0, 0) : 0; break; default: Help(argv[a]); return 1; } break; case 'e': // entry point switch (argv[a][2]) { case '7': arm7Entry = (argc > a) ? strtoul(argv[++a], 0, 0) : 0; break; case '9': arm9Entry = (argc > a) ? strtoul(argv[++a], 0, 0) : 0; break; default: Help(argv[a]); return 1; } break; case 'm': // maker code REQUIRED(makercode); break; case 'g': // game code REQUIRED(gamecode); OPTIONAL(makercode); OPTIONAL(title); OPTIONAL_INT(romversion); break; case 'y': // overlay table file / directory switch (argv[a][2]) { case '7': REQUIRED(arm7ovltablefilename); break; case '9': REQUIRED(arm9ovltablefilename); break; case 0: REQUIRED(overlaydir); break; default: Help(argv[a]); return 1; } break; case '?': // global or specific help { Help(argv[a][2] ? argv[a]+2 : 0); // 0=global help return 0; // do not perform any other actions } default: { Help(argv[a]); return 1; } } } else { //Help(); if (ndsfilename) { fprintf(stderr, "NDS filename is already given!\n"); return 1; } ndsfilename = argv[a]; break; } } Title(); /* * sanity checks */ if (gamecode) { if (strlen(gamecode) != 4) { fprintf(stderr, "Game code must be 4 characters!\n"); return 1; } for (int i=0; i<4; i++) if ((gamecode[i] >= 'a') && (gamecode[i] <= 'z')) { fprintf(stderr, "Warning: Gamecode contains lowercase characters.\n"); break; } if (gamecode[0] == 'A') { fprintf(stderr, "Warning: Gamecode starts with 'A', which might be used for another commercial product.\n"); } } if (makercode && (strlen(makercode) != 2)) { fprintf(stderr, "Maker code must be 2 characters!\n"); return 1; } if (title && (strlen(title) > 12)) { fprintf(stderr, "Title can be no more than 12 characters!\n"); return 1; } if (romversion > 255) { fprintf(stderr, "romversion can only be 0 - 255!\n"); return 1; } /* * perform actions */ int status = 0; for (int i=0; i<num_actions; i++) { //printf("action %d\n", actions[i]); switch (actions[i]) { case ACTION_SHOWINFO: ShowInfo(ndsfilename); break; case ACTION_FIXHEADERCRC: FixHeaderCRC(ndsfilename); break; case ACTION_EXTRACT: fNDS = fopen(ndsfilename, "rb"); if (!fNDS) { fprintf(stderr, "Cannot open file '%s'.\n", ndsfilename); exit(1); } fread(&header, 512, 1, fNDS); fclose(fNDS); printf("9i %s, 7i %s, unitcode %x\n",arm9ifilename,arm7ifilename, header.unitcode); if (arm9filename) Extract(arm9filename, true, 0x20, true, 0x2C, true); if (arm7filename) Extract(arm7filename, true, 0x30, true, 0x3C); if (header.unitcode & 2) { if (arm9ifilename) Extract(arm9ifilename, true, 0x1C0, true, 0x1CC, true); if (arm7ifilename) Extract(arm7ifilename, true, 0x1D0, true, 0x1DC); } if (bannerfilename) Extract(bannerfilename, true, 0x68, false, 0x840); if (headerfilename_or_size) Extract(headerfilename_or_size, false, 0x0, false, 0x200); if (logofilename) Extract(logofilename, false, 0xC0, false, 156); // *** bin only if (arm9ovltablefilename) Extract(arm9ovltablefilename, true, 0x50, true, 0x54); if (arm7ovltablefilename) Extract(arm7ovltablefilename, true, 0x58, true, 0x5C); if (overlaydir) ExtractOverlayFiles(); if (filerootdir) ExtractFiles(ndsfilename); break; case ACTION_CREATE: Create(); break; case ACTION_LISTFILES: filerootdir = 0; /*status =*/ ExtractFiles(ndsfilename); break; case ACTION_HOOK: { Hook(ndsfilename, arm7filename); break; } case ACTION_ENCRYPTSECUREAREA: { /*status =*/ EnDecryptSecureArea(ndsfilename, endecrypt_option); break; } } } return (status < 0) ? 1 : 0; }