////////////////////////////////////////////////////////// // // CInstallManager::_InstallNewsItems // // // ////////////////////////////////////////////////////////// SString CInstallManager::_InstallNewsItems ( void ) { // Get install news queue CArgMap queue; queue.SetFromString ( GetApplicationSetting ( "news-install" ) ); SetApplicationSetting ( "news-install", "" ); std::vector < SString > keyList; queue.GetKeys ( keyList ); for ( uint i = 0 ; i < keyList.size () ; i++ ) { // Install each file SString strDate = keyList[i]; SString strFileLocation = queue.Get ( strDate ); // Save cwd SString strSavedDir = GetSystemCurrentDirectory (); // Calc and make target dir SString strTargetDir = PathJoin ( GetMTADataPath (), "news", strDate ); MkDir ( strTargetDir ); // Extract into target dir SetCurrentDirectory ( strTargetDir ); // Try to extract the files if ( !ExtractFiles ( strFileLocation ) ) { // If extract failed and update file is an exe, try to run it if ( ExtractExtension ( strFileLocation ).CompareI ( "exe" ) ) ShellExecuteBlocking ( "open", strFileLocation, "-s" ); } // Restore cwd SetCurrentDirectory ( strSavedDir ); // Check result if ( FileExists ( PathJoin ( strTargetDir, "files.xml" ) ) ) { SetApplicationSettingInt ( "news-updated", 1 ); AddReportLog ( 2051, SString ( "InstallNewsItems ok for '%s'", *strDate ) ); } else { AddReportLog ( 4048, SString ( "InstallNewsItems failed with '%s' '%s' '%s'", *strDate, *strFileLocation, *strTargetDir ) ); } } return "ok"; }
//----------------------------------------------------------------------------- // Purpose: load up a project and parse it //----------------------------------------------------------------------------- bool CVCProjConvert::LoadProject( const char *project ) { #ifdef _WIN32 HRESULT hr; IXMLDOMDocument *pXMLDoc=NULL; hr = ::CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pXMLDoc); if (FAILED(hr)) { Msg ("Cannot instantiate msxml2.dll\n"); Msg ("Please download the MSXML run-time (url below)\n"); Msg ("http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/766/msdncompositedoc.xml\n"); return false; } VARIANT_BOOL vtbool; _variant_t bstrProject(project); pXMLDoc->put_async( VARIANT_BOOL(FALSE) ); hr = pXMLDoc->load(bstrProject,&vtbool); if (FAILED(hr) || vtbool==VARIANT_FALSE) { Msg ("Could not open %s.\n", bstrProject); pXMLDoc->Release(); return false; } #elif _LINUX XercesDOMParser* parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); // optional. parser->setDoNamespaces(true); // optional ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase(); parser->setErrorHandler(errHandler); try { parser->parse(project); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); Error( "Exception message is: %s\n", message ); XMLString::release(&message); return; } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); Error( "Exception message is: %s\n", message ); XMLString::release(&message); return; } catch (...) { Error( "Unexpected Exception \n" ); return; } DOMDocument *pXMLDoc = parser->getDocument(); #endif ExtractProjectName( pXMLDoc ); if ( !m_Name.IsValid() ) { Msg( "Failed to extract project name\n" ); return false; } char baseDir[ MAX_PATH ]; Q_ExtractFilePath( project, baseDir, sizeof(baseDir) ); Q_StripTrailingSlash( baseDir ); m_BaseDir = baseDir; ExtractConfigurations( pXMLDoc ); if ( m_Configurations.Count() == 0 ) { Msg( "Failed to find any configurations to load\n" ); return false; } ExtractFiles( pXMLDoc ); #ifdef _WIN32 pXMLDoc->Release(); #elif _LINUX delete pXMLDoc; delete errHandler; #endif m_bProjectLoaded = true; 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; }