void MakeAbsolute(std::string &dir) { std::string current = GetCWD(); if (dir[0] != '/') dir = current + "/" + dir; // HACK: 'Normalize' path (eg. no dots) CHDir(dir); dir = GetCWD(); CHDir(current); }
std::string FileList::GetPath( std::string pattern ) { int i; int lastPos; std::string tmp; lastPos = 0; for( i = 0; i < pattern.length(); i++ ) { if( pattern[i] == '\\' ) { lastPos = i; } } tmp = pattern.substr( 0, lastPos ); if( pattern.substr( 0, lastPos ).length() == 0 ) { GetCWD( tmp ); return( tmp ); } else { return( pattern.substr( 0, lastPos ) ); } }
static void OnAttach(void) { gLog.SetPrintLevel(IDebugLog::kLevel_Error); gLog.SetLogLevel(IDebugLog::kLevel_DebugMessage); std::string dllSuffix; bool steamVersion; // paranoia check if(!TestChecksum("oblivion.exe", &dllSuffix, &steamVersion)) { _ERROR("checksum not found"); return; } // /extreme/ paranoia check if(!steamVersion) { _ERROR("not a steam version!?"); return; } // build full path to our dll std::string dllPath; dllPath = GetCWD() + "\\obse_" + dllSuffix + ".dll"; _MESSAGE("dll = %s", dllPath.c_str()); // load it if(!LoadLibrary(dllPath.c_str())) { _ERROR("couldn't load dll"); } }
void VisionConductor::Load(string pathfile) { // $IT_DATA environmet variable, NULL if not set const char *it_data = getenv("IT_DATA"); string std_it_data; if (it_data!=NULL) { std_it_data = ConvertPathToStandard(it_data); } else { std_it_data = ""; } // substitute $IT_DATA environment variable, if requested string::size_type pos = pathfile.find("$IT_DATA"); if (pos!=string::npos) { if (it_data==NULL) { throw HVEFile(pathfile, "The filename requests the environment variable " "$IT_DATA to be set."); } // substitute "$IT_DATA" for the value of that environment variable ReplaceAll(pathfile, "$IT_DATA", std_it_data); } // all paths in the VisionConductor file "filename" are relative // to the path of "filename". so, let's cd to that directory, load // all cascades etc., and in the end restore the previous cwd. string old_cwd = GetCWD(); string vc_path, fname; SplitPathFile(pathfile, vc_path, fname); VERBOSE1(5, "HandVu: loading supplemental conductor files from path %s", vc_path.c_str()); if (old_cwd!=vc_path) { SetCWD(vc_path); } m_masks.clear(); m_orig_areas.clear(); try { // the actual parsing function ParseFromFile(fname); } catch (HVException& hve) { if (old_cwd!=vc_path) { SetCWD(old_cwd); } throw HVException(hve.GetMessage() + "\n" + "note: paths in VisionConductor files are relative;\n" "in this case to " + vc_path); } if (old_cwd!=vc_path) { SetCWD(old_cwd); } SanityCheckMasks(); m_is_loaded = true; }
/** * Check if a directory exists. * * @param directory the path to the directory * @return true if the directory exists, false otherwise */ bool Directory::Exists(std::string directory) { std::string back = GetCWD(); if (chdir(directory.c_str()) != 0) { return false; }else { chdir(back.c_str()); return true; } }
void CleanTemp(void) { OSErr err = noErr; short vRefNum; long dirID; FSSpec viewerFSp; XPISpec *xpiList, *currXPI = 0, *nextXPI = 0; #ifdef MIW_DEBUG Boolean isDir = false; #endif #ifndef MIW_DEBUG /* get "viewer" in "Temporary Items" folder */ ERR_CHECK(FindFolder(kOnSystemDisk, kTemporaryFolderType, kCreateFolder, &vRefNum, &dirID)); err = FSMakeFSSpec(vRefNum, dirID, kViewerFolder, &viewerFSp); #else /* for DEBUG builds temp is "<currProcessVolume>:Temp NSInstall:" */ ERR_CHECK(GetCWD(&dirID, &vRefNum)); err = FSMakeFSSpec(vRefNum, 0, kTempFolder, &viewerFSp); if (err == fnfErr) return; /* no debug temp exists */ err = FSpGetDirectoryID(&viewerFSp, &dirID, &isDir); if (err != noErr || !isDir) return; err = FSMakeFSSpec(vRefNum, dirID, kViewerFolder, &viewerFSp); #endif /* whack the viewer folder if it exists */ if (err == noErr) { ERR_CHECK(DeleteDirectory(viewerFSp.vRefNum, viewerFSp.parID, viewerFSp.name)); } /* clean out the zippies (.xpi's) */ xpiList = (XPISpec *) NewPtrClear(sizeof(XPISpec)); if (!xpiList) return; IterateDirectory(vRefNum, dirID, "\p", 1, CheckIfXPI, (void*)&xpiList); if (xpiList) { currXPI = xpiList; while(currXPI) { nextXPI = currXPI->next; /* save nextXPI before we blow away currXPI */ if (currXPI->FSp) { FSpDelete(currXPI->FSp); DisposePtr((Ptr)currXPI->FSp); } DisposePtr((Ptr)currXPI); currXPI = nextXPI; } } }
void CFileDialog::OpenDir(const std::string &newdir) { std::string curdir = GetCWD(); try { CHDir(newdir); m_Directory = GetCWD(); CDirIter dir(m_Directory); m_pFileMenu->ClearEntries(); while (dir) { // Valid directory? if (ValidDir(dir)) m_pFileMenu->AddEntry(dir->d_name); dir++; } m_pInputField->SetText(m_Directory); } catch(Exceptions::CExReadDir &e) { // Couldn't open directory(probably no read access) WarningBox(e.what()); // If no directory is open yet, just open / if (m_pFileMenu->Empty()) { if (newdir == "/") throw; // Seems we can't even open / ... OpenDir("/"); } } CHDir(curdir); }
/* todo: - destination coding if blank then it should use the extension of the source file if *.* then it should use the extension from the source file if *.png then it should store it as a png file if *.jpg then it should store it as a jpg file etc.. */ FileList::FileList(std::string src, std::string dest, std::string append) { FileInfo* info; std::string newName; std::string srcExt; std::string destExt; FileType destType; std::string tmpBase; std::cout << "FileList::FileList(src) == " << src << "\n"; tmpBase = GetBasePath( src ); if( tmpBase == src ) { GetCWD(tmpBase); // no wildcard or filename information was provided //return; } std::cout << "FileList::FileList.tmpBase == " << tmpBase << "\n"; // open the basepath dir DIR * dir; dir = opendir(tmpBase.c_str()); //TODO : need to see if the open dir fails!! dirent* de; std::string tmpName; tmpName = GetFilename(src); while((de = readdir(dir)) != NULL) { if( de->d_type == DT_REG) { // we need to see if it matches the filename/wildcard stuff? if( IsMatch( tmpName, de->d_name ) == true ) { std::cout << "file match found\n"; info = GetInfo(de, src, dest, append); mFiles.push_back( info ); } } } }
// Incase dir does not exist, it will search for the first valid top directory std::string GetFirstValidDir(const std::string &dir) { if ((dir[0] == '/') && (dir.length() == 1)) return dir; // Root dir given std::string subdir = dir; if (dir[0] != '/') // No absolute path given { std::string curdir = GetCWD(); subdir.insert(0, curdir + std::string("/")); } if (ReadAccess(subdir)) return subdir; // Remove trailing / if (subdir[subdir.length()-1] == '/') subdir.erase(subdir.length()-1, 1); TSTLStrSize pos; do { pos = subdir.rfind('/'); assert(pos != std::string::npos); if (pos == std::string::npos) { // Shouldn't happen return subdir; } else if (pos == 0) // Reached the root dir('/') return "/"; subdir.erase(pos); } while (!ReadAccess(subdir)); return subdir; }
int main(int argc, char ** argv) { gLog.SetPrintLevel(IDebugLog::kLevel_Error); gLog.SetLogLevel(IDebugLog::kLevel_DebugMessage); if(!g_options.Read(argc, argv)) { PrintError("Couldn't read arguments."); g_options.PrintUsage(); return -1; } if(g_options.m_optionsOnly) { g_options.PrintUsage(); return 0; } if(g_options.m_launchCS) _MESSAGE("launching editor"); if(g_options.m_loadOldblivion) _MESSAGE("loading oldblivion"); // create the process STARTUPINFO startupInfo = { 0 }; PROCESS_INFORMATION procInfo = { 0 }; bool dllHasFullPath = false; startupInfo.cb = sizeof(startupInfo); const char * procName = g_options.m_launchCS ? "TESConstructionSet.exe" : "Oblivion.exe"; const char * baseDllName = g_options.m_launchCS ? "obse_editor" : "obse"; if(g_options.m_altEXE.size()) { procName = g_options.m_altEXE.c_str(); _MESSAGE("launching alternate exe (%s)", procName); } if(g_options.m_altDLL.size()) { baseDllName = g_options.m_altDLL.c_str(); _MESSAGE("launching alternate dll (%s)", baseDllName); dllHasFullPath = true; } std::string dllSuffix; ProcHookInfo procHookInfo; if(!TestChecksum(procName, &dllSuffix, &procHookInfo)) { _ERROR("checksum not found"); return -1; } if(procHookInfo.steamVersion) { // ### maybe check for the loader DLL and just CreateProcess("oblivion.exe") if we can? PrintError("You are trying to use a Steam version of Oblivion. Steam users should launch the game through Steam, not by running obse_loader.exe. If OBSE fails to load, go to Steam > Settings > In Game and check the box marked \"Enable Steam community in game\". Please see the instructions in obse_readme.txt for more information."); return 0; } if(g_options.m_crcOnly) return 0; // build dll path std::string dllPath; if(dllHasFullPath) { dllPath = baseDllName; } else { dllPath = GetCWD() + "\\" + baseDllName + "_" + dllSuffix + ".dll"; } _MESSAGE("dll = %s", dllPath.c_str()); // check to make sure the dll exists { IFileStream tempFile; if(!tempFile.Open(dllPath.c_str())) { PrintError("Couldn't find OBSE DLL (%s). Please make sure you have installed OBSE correctly and are running it from your Oblivion folder.", dllPath.c_str()); return -1; } } bool result = CreateProcess( procName, NULL, // no args NULL, // default process security NULL, // default thread security TRUE, // don't inherit handles CREATE_SUSPENDED, NULL, // no new environment NULL, // no new cwd &startupInfo, &procInfo) != 0; // check for Vista failing to create the process due to elevation requirements if(!result && (GetLastError() == ERROR_ELEVATION_REQUIRED)) { // in theory we could figure out how to UAC-prompt for this process and then run CreateProcess again, but I have no way to test code for that PrintError("Vista has decided that launching Oblivion requires UAC privilege elevation. There is no good reason for this to happen, but to fix it, right-click on obse_loader.exe, go to Properties, pick the Compatibility tab, then turn on \"Run this program as an administrator\"."); return -1; } ASSERT_STR_CODE(result, "Launching Oblivion failed", GetLastError()); if(g_options.m_setPriority) { if(!SetPriorityClass(procInfo.hProcess, g_options.m_priority)) _WARNING("couldn't set process priority"); } result = false; if(g_options.m_launchCS) { if(g_options.m_oldInject) { _MESSAGE("using old editor injection method"); // start the process ResumeThread(procInfo.hThread); // CS needs to run its crt0 code before the DLL is attached, this delays until the message pump is running // note that this method makes it impossible to patch the startup code // this is better than Sleep(1000) but still ugly WaitForInputIdle(procInfo.hProcess, 1000 * 10); // too late if this fails result = InjectDLL(&procInfo, dllPath.c_str(), !g_options.m_noSync); if(!result) PrintError("Couldn't inject dll."); } else { _MESSAGE("using new editor injection method"); result = DoInjectDLL_New(&procInfo, dllPath.c_str(), &procHookInfo); if(!result) PrintError("Couldn't inject dll."); // start the process either way ResumeThread(procInfo.hThread); } } else { result = InjectDLL(&procInfo, dllPath.c_str(), !g_options.m_noSync); if(result) { // try to load oldblivion if requested if(g_options.m_loadOldblivion) { result = LoadOldblivion(&procInfo); if(!result) PrintError("Couldn't load oldblivion."); } } else PrintError("Couldn't inject dll."); if(result) { _MESSAGE("launching oblivion"); // start the process ResumeThread(procInfo.hThread); } else { _ERROR("terminating oblivion process"); // kill the partially-created process TerminateProcess(procInfo.hProcess, 0); g_options.m_waitForClose = false; } } // wait for the process to close if requested if(g_options.m_waitForClose) { WaitForSingleObject(procInfo.hProcess, INFINITE); } // clean up CloseHandle(procInfo.hProcess); CloseHandle(procInfo.hThread); return 0; }
void ShowTerminalWin(void) { Str255 next, back; Handle rectH; Rect viewRect; short reserr; MenuHandle popupMenu; PopupPrivateData ** pvtDataHdl; unsigned char * currMenuItem; short i, vRefNum; long cwdDirID, dirID; Boolean isDir = false; Str255 pModulesDir; OSErr err = noErr; GrafPtr oldPort; GetPort(&oldPort); if (gWPtr != NULL) { SetPort(gWPtr); gCurrWin = kTerminalID; /* gControls->tw = (TermWin*) NewPtrClear(sizeof(TermWin)); */ GetResourcedString(next, rInstList, sInstallBtn); GetResourcedString(back, rInstList, sBackBtn); // malloc and get control rectH = Get1Resource('RECT', rStartMsgBox); reserr = ResError(); if (reserr == noErr && rectH != NULL) { viewRect = (Rect) **((Rect **)rectH); ReleaseResource(rectH); } else { ErrorHandler(reserr, nil); return; } gControls->tw->siteSelector = NULL; gControls->tw->saveBitsCheckbox = NULL; gControls->tw->startMsgBox = viewRect; gControls->tw->startMsg = TENew(&viewRect, &viewRect); if (gControls->tw->startMsg == NULL) { ErrorHandler(eMem, nil); return; } // save bits after download and install /* get the "Installer Modules" relative subdir */ ERR_CHECK(GetCWD(&cwdDirID, &vRefNum)); GetIndString(pModulesDir, rStringList, sInstModules); GetDirectoryID(vRefNum, cwdDirID, pModulesDir, &dirID, &isDir); if (isDir) { if (!ExistArchives(vRefNum, dirID)) // going to download { if (gControls->cfg->numSites > 0) { // download settings groupbox Str255 dlSettingsGBTitle; gControls->tw->dlSettingsGB = GetNewControl(rDLSettingsGB, gWPtr); if (gControls->tw->dlSettingsGB) { GetResourcedString(dlSettingsGBTitle, rInstList, sDLSettings); SetControlTitle(gControls->tw->dlSettingsGB, dlSettingsGBTitle); ShowControl(gControls->tw->dlSettingsGB); } // site selector label Str255 siteSelMsgStr; gControls->tw->siteSelMsg = GetNewControl(rSiteSelMsg, gWPtr); if (gControls->tw->siteSelMsg) { GetResourcedString(siteSelMsgStr, rInstList, sSiteSelMsg); SetControlData(gControls->tw->siteSelMsg, kControlNoPart, kControlStaticTextTextTag, siteSelMsgStr[0], (Ptr)&siteSelMsgStr[1]); ShowControl(gControls->tw->siteSelMsg); } // site selector gControls->tw->siteSelector = GetNewControl( rSiteSelector, gWPtr ); if (!gControls->tw->siteSelector) { ErrorHandler(eMem, nil); return; } // populate popup button menus HLock((Handle)gControls->tw->siteSelector); pvtDataHdl = (PopupPrivateData **) (*(gControls->tw->siteSelector))->contrlData; HLock((Handle)pvtDataHdl); popupMenu = (MenuHandle) (**pvtDataHdl).mHandle; for (i=0; i<gControls->cfg->numSites; i++) { HLock(gControls->cfg->site[i].desc); currMenuItem = CToPascal(*gControls->cfg->site[i].desc); HUnlock(gControls->cfg->site[i].desc); InsertMenuItem( popupMenu, currMenuItem, i ); } HUnlock((Handle)pvtDataHdl); HUnlock((Handle)gControls->tw->siteSelector); SetControlMaximum(gControls->tw->siteSelector, gControls->cfg->numSites); SetControlValue(gControls->tw->siteSelector, gControls->opt->siteChoice); ShowControl(gControls->tw->siteSelector); } // show check box and message gControls->tw->saveBitsCheckbox = GetNewControl( rSaveCheckbox, gWPtr ); if (!gControls->tw->saveBitsCheckbox) { ErrorHandler(eMem, nil); return; } if (gControls->opt->saveBits) SetControlValue(gControls->tw->saveBitsCheckbox, 1); ShowControl(gControls->tw->saveBitsCheckbox); // get rect for save bits message rectH = Get1Resource('RECT', rSaveBitsMsgBox); reserr = ResError(); if (reserr == noErr && rectH != NULL) { gControls->tw->saveBitsMsgBox = (Rect) **((Rect **)rectH); DisposeHandle(rectH); } else { ErrorHandler(reserr, nil); return; } // get text edit record for save bits message gControls->tw->saveBitsMsg = TENew(&gControls->tw->saveBitsMsgBox, &gControls->tw->saveBitsMsgBox ); if (gControls->tw->saveBitsMsg == NULL) { ErrorHandler(eMem, nil); return; } HLock(gControls->cfg->saveBitsMsg); TESetText(*gControls->cfg->saveBitsMsg, strlen(*gControls->cfg->saveBitsMsg), gControls->tw->saveBitsMsg); HUnlock(gControls->cfg->saveBitsMsg); // show save bits msg TEUpdate(&gControls->tw->saveBitsMsgBox, gControls->tw->saveBitsMsg); // proxy settings button gControls->tw->proxySettingsBtn = GetNewControl(rProxySettgBtn, gWPtr); if (!gControls->tw->proxySettingsBtn) { ErrorHandler(eMem, nil); return; } Str255 proxySettingsTitle; GetResourcedString(proxySettingsTitle, rInstList, sProxySettings); SetControlTitle(gControls->tw->proxySettingsBtn, proxySettingsTitle); ShowControl(gControls->tw->proxySettingsBtn); } } // populate control HLock(gControls->cfg->startMsg); TESetText(*gControls->cfg->startMsg, strlen(*gControls->cfg->startMsg), gControls->tw->startMsg); HUnlock(gControls->cfg->startMsg); // show controls TEUpdate(&viewRect, gControls->tw->startMsg); ShowNavButtons( back, next ); } SetPort(oldPort); }
void InitLicTxt(void) { Rect destRect, viewRect; FSSpec licFile; long dirID, dataSize; short vRefNum, dataRef, resRef; unsigned char* cLicFName; Str255 pLicFName; OSErr err; Handle text, stylHdl; ERR_CHECK(GetCWD(&dirID, &vRefNum)); /* open and read license file */ HLock(gControls->cfg->licFileName); if(**gControls->cfg->licFileName != nil) { cLicFName = CToPascal(*gControls->cfg->licFileName); ERR_CHECK(FSMakeFSSpec(vRefNum, dirID, cLicFName, &licFile)); if (cLicFName) DisposePtr((char*)cLicFName); } else /* assume default license filename from str rsrc */ { GetResourcedString(pLicFName, rInstList, sLicenseFName); ERR_CHECK(FSMakeFSSpec(vRefNum, dirID, pLicFName, &licFile)); } HUnlock(gControls->cfg->licFileName); /* read license text */ ERR_CHECK(FSpOpenDF( &licFile, fsRdPerm, &dataRef)); ERR_CHECK(GetEOF(dataRef, &dataSize)); if (dataSize > 0) { if (!(text = NewHandle(dataSize))) { ErrorHandler(eMem, nil); return; } ERR_CHECK(FSRead(dataRef, &dataSize, *text)); } else text = nil; ERR_CHECK(FSClose(dataRef)); /* get 'styl' if license is multistyled */ resRef = FSpOpenResFile( &licFile, fsRdPerm); ERR_CHECK(ResError()); UseResFile(resRef); stylHdl = RGetResource('styl', 128); ERR_CHECK(ResError()); if(stylHdl) DetachResource(stylHdl); else stylHdl = nil; CloseResFile(resRef); /* TE specific init */ HLock( (Handle) gControls->lw->licBox); SetRect(&viewRect, (*(gControls->lw->licBox))->contrlRect.left, (*(gControls->lw->licBox))->contrlRect.top, (*(gControls->lw->licBox))->contrlRect.right, (*(gControls->lw->licBox))->contrlRect.bottom); HUnlock( (Handle) gControls->lw->licBox); destRect.left = viewRect.left; viewRect.right = (*(gControls->lw->scrollBar))->contrlRect.left; destRect.right = viewRect.right; destRect.top = viewRect.top; destRect.bottom = viewRect.bottom * kNumLicScrns; // gControls->lw->licTxt = (TEHandle) NewPtrClear(sizeof(TEPtr)); TextFont(applFont); TextFace(normal); TextSize(9); HLock(text); if (stylHdl) { gControls->lw->licTxt = TEStyleNew( &destRect, &viewRect ); TEStyleInsert( *text, dataSize, (StScrpRec ** )stylHdl, gControls->lw->licTxt); } else { gControls->lw->licTxt = TENew( &destRect, &viewRect); TEInsert( *text, dataSize, gControls->lw->licTxt); } HUnlock(text); TextFont(systemFont); TextSize(12); TESetAlignment(teFlushDefault, gControls->lw->licTxt); }