void ConfigStateIncrementRunCount(ConfigStateEnum &code) { std::string rcFile(GetUserVisItDirectory()); rcFile += "state"; rcFile += VISIT_VERSION; rcFile += ".txt"; // Does the file exist? bool firstTime = false; VisItStat_t s; if(VisItStat(rcFile.c_str(), &s) == -1) firstTime = true; ConfigStateEnum code2; int nStartups = firstTime ? 0 : ConfigStateGetRunCount(code2); if(!firstTime && code2 == CONFIGSTATE_IOERROR) nStartups = 0; FILE *f = 0; if((f = fopen(rcFile.c_str(), "w")) != 0) { fprintf(f, "%d\n", nStartups + 1); fclose(f); code = firstTime ? CONFIGSTATE_FIRSTTIME : CONFIGSTATE_SUCCESS; } else code = CONFIGSTATE_IOERROR; }
static bool ug_RW(const char *name) { VisItStat_t s; VisItStat(name, &s); bool uRW = ((s.st_mode & S_IRUSR) != 0) && ((s.st_mode & S_IWUSR) != 0); bool gRW = ((s.st_mode & S_IRGRP) != 0) && ((s.st_mode & S_IWGRP) != 0); return uRW && gRW; }
void avtRAWFileFormat::ReadFile(const char *name) { const char *mName = "avtRAWFileFormat::ReadFile: "; int total = visitTimer->StartTimer(); debug4 << mName << endl; // Open the file. ifstream ifile(name); if (ifile.fail()) { EXCEPTION1(InvalidFilesException, name); } debug4 << "Opened the file: " << name << endl; bool trianglesAdded = false; #ifndef MDSERVER // Make a guess about the number of cells and points based on // the size of the file. int nCells = 100; VisItStat_t statbuf; VisItStat(name, &statbuf); VisItOff_t fileSize = statbuf.st_size; nCells = fileSize / (VisItOff_t) 80; debug4 << mName << "Guessing there are about " << nCells << " cells" << endl; vtkPolyData *currentPD = NewPD(nCells); VertexManager *vertexMgr = new VertexManager(currentPD->GetPoints()); #else vtkPolyData *currentPD = 0; #endif int domain = 0; char line[1024]; double pts[9] = {0.,0.,0.,0.,0.,0.,0.,0.,0.}; int nc = 0; for(int lineIndex = 0; ifile.good(); ++lineIndex) { // Get the line ifile.getline(line, 1024); if (lineIndex<100 && !StringHelpers::IsPureASCII(line, 1024)) EXCEPTION2(InvalidFilesException, name, "Not ASCII."); // Skip leading spaces. char *cptr = line; while((*cptr == ' ' || *cptr == '\t') && (cptr < (line + 1024))) ++cptr; if((cptr[0] >= '0' && cptr[0] <= '9') || (cptr[0] == '-')) { #ifndef MDSERVER // We found a line with points. Read the line and add a triangle cell. int n = sscanf(cptr, "%lg %lg %lg %lg %lg %lg %lg %lg %lg", &pts[0], &pts[1], &pts[2], &pts[3], &pts[4], &pts[5], &pts[6], &pts[7], &pts[8]); if (GetStrictMode() && n != 9) { EXCEPTION2(InvalidFilesException, GetFilename(), "Bad line in file; less than nine values"); } vtkIdType ids[3]; ids[0] = vertexMgr->GetVertexId(pts); ids[1] = vertexMgr->GetVertexId(pts + 3); ids[2] = vertexMgr->GetVertexId(pts + 6); currentPD->InsertNextCell(VTK_TRIANGLE, 3, ids); #endif trianglesAdded = true; } else { // If we're hitting a new object name and we've added some triangles // then we need to add the currentPD to the meshes vector. if(trianglesAdded) { if(meshes.size() == 0) { // We get here when we've created some polydata but have not // seen an object id for it yet. In that case, we add an object // to the list. debug4 << mName << "Adding Object mesh" << endl; domain_data dom; dom.domainName = "Object"; dom.mesh = currentPD; meshes.push_back(dom); ++domain; } #ifndef MDSERVER else { // We get here when we've created some polydata for a tag that // we've seen and we're encountering a new tag. debug4 << mName << "Setting mesh for mesh[" << (domain-1) << "]\n"; meshes[domain-1].mesh = currentPD; } currentPD->Squeeze(); // Reset for a new polydata. currentPD = NewPD(nCells); delete vertexMgr; vertexMgr = new VertexManager(currentPD->GetPoints()); #endif trianglesAdded = false; } // We have the name of a new object. domain_data dom; int len = strlen(cptr); if(len > 0) { // If the new name is valid then add a mesh entry for it. if(cptr[len-1] == '\n') cptr[len-1] = '\0'; // Remove the end of line. dom.domainName = std::string(cptr); dom.mesh = 0; meshes.push_back(dom); ++domain; debug4 << mName << "Domain " << domain << " is called: " << cptr << endl; } else { debug4 << mName << "Empty domain name" << endl; if (GetStrictMode() && !ifile.eof()) { EXCEPTION2(InvalidFilesException, GetFilename(), "Empty domain name."); } } } } // Print out the meshes list debug4 << "MESHES\n===========================\n"; for(int i = 0; i < meshes.size(); ++i) { debug4 << mName << "Mesh " << i << ": " << meshes[i].domainName.c_str() << ", ptr=" << (void*)meshes[i].mesh << endl; } #ifndef MDSERVER // Delete the vertex manager if it exists. if(vertexMgr != 0) delete vertexMgr; #endif debug4 << mName << "end" << endl; visitTimer->StopTimer(total, "Loading RAW file"); }
bool ReadAndProcessDirectory(const std::string &directory, ProcessDirectoryCallback *processOneFile, void *data, bool checkAccess) { bool retval = false; #if defined(_WIN32) if(directory == "My Computer") { // Add the drives to the list. char buf[200]; DWORD bufLen = 200; DWORD slen = GetLogicalDriveStrings(200, buf); if(slen > 0) { char *ptr = buf; while(*ptr != 0) { std::string drive(ptr); (*processOneFile)(data, drive, true, true, 0); ptr += (drive.size() + 1); retval = true; } } } else if (directory.size() > 0) { // Try and read the files in fullPath. std::string searchPath(directory + std::string("\\*")); WIN32_FIND_DATA fd; HANDLE dirHandle = FindFirstFile(searchPath.c_str(), &fd); if(dirHandle != INVALID_HANDLE_VALUE) { do { bool isDir = ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) || (strcmp(fd.cFileName, "..") == 0) || (strcmp(fd.cFileName, ".") == 0) ; long sz = ((fd.nFileSizeHigh * MAXDWORD) + fd.nFileSizeLow); std::string fileName(directory); if(directory.substr(directory.size() - 1) != "\\") fileName += "\\"; fileName += fd.cFileName; (*processOneFile)(data, fileName, isDir, true, sz); retval = true; } while(FindNextFile(dirHandle, &fd)); FindClose(dirHandle); } } else { //Directory string was empty, nothing to do retval = false; } #else DIR *dir; dirent *ent; // If the directory cannot be opened, return an error code. dir = opendir(directory.c_str()); if (dir) { // Get the userId and the groups for that user so we can check the // file permissions. gid_t gids[100]; int ngids = 0; uid_t uid = 0; if(checkAccess) { uid = getuid(); ngids = getgroups(100, gids); } // Process each directory entry. while ((ent = readdir(dir)) != NULL) { // Get information about the file. VisItStat_t s; std::string fileName(directory); if(directory.substr(directory.size() - 1, 1) != "/") fileName += "/"; fileName += ent->d_name; VisItStat(fileName.c_str(), &s); mode_t mode = s.st_mode; bool isdir = S_ISDIR(mode); bool canaccess = checkAccess ? false : true; if(checkAccess) { bool isuser = (s.st_uid == uid); bool isgroup = false; for (int i=0; i<ngids && !isgroup; i++) if (s.st_gid == gids[i]) isgroup=true; if (isdir) { if ((mode & S_IROTH) && (mode & S_IXOTH)) canaccess=true; else if (isuser && (mode & S_IRUSR) && (mode & S_IXUSR)) canaccess=true; else if (isgroup && (mode & S_IRGRP) && (mode & S_IXGRP)) canaccess=true; } else { if (mode & S_IROTH) canaccess=true; else if (isuser && (mode & S_IRUSR)) canaccess=true; else if (isgroup && (mode & S_IRGRP)) canaccess=true; } } (*processOneFile)(data, fileName, isdir, canaccess, (long)s.st_size); retval = true; } closedir(dir); } #endif return retval; }