PathEntry PathEntry_new() { GtkFrame* frame = GTK_FRAME(gtk_frame_new(NULL)); gtk_widget_show(GTK_WIDGET(frame)); gtk_frame_set_shadow_type(frame, GTK_SHADOW_IN); // path entry GtkHBox* hbox = GTK_HBOX(gtk_hbox_new(FALSE, 0)); gtk_widget_show(GTK_WIDGET(hbox)); GtkEntry* entry = GTK_ENTRY(gtk_entry_new()); gtk_entry_set_has_frame(entry, FALSE); gtk_widget_show(GTK_WIDGET(entry)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(entry), TRUE, TRUE, 0); // browse button GtkButton* button = GTK_BUTTON(gtk_button_new()); button_set_icon(button, "ellipsis.bmp"); gtk_widget_show(GTK_WIDGET(button)); gtk_box_pack_end(GTK_BOX(hbox), GTK_WIDGET(button), FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(hbox)); return PathEntry(frame, entry, button); }
std::vector<PathEntry> GetFilesInDirectory(const char *path) { std::vector<PathEntry> ret; DIR *d = opendir(path); if(d == NULL) { PathProperty flags = PathProperty::ErrorUnknown; if(errno == ENOENT) flags = PathProperty::ErrorInvalidPath; else if(errno == EACCES) flags = PathProperty::ErrorAccessDenied; ret.push_back(PathEntry(path, flags)); return ret; } dirent *ent = NULL; for(;;) { ent = readdir(d); if(!ent) break; // skip "." and ".." if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; string fullpath = path; fullpath += '/'; fullpath += ent->d_name; struct ::stat st; int res = stat(fullpath.c_str(), &st); // invalid/bad file - skip it if(res != 0) continue; PathProperty flags = PathProperty::NoFlags; // make directory/executable mutually exclusive for clarity's sake if(S_ISDIR(st.st_mode)) flags |= PathProperty::Directory; else if(st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) flags |= PathProperty::Executable; if(ent->d_name[0] == '.') flags |= PathProperty::Hidden; PathEntry f(ent->d_name, flags); f.lastmod = (uint32_t)st.st_mtime; f.size = (uint64_t)st.st_size; ret.push_back(f); } // don't care if we hit an error or enumerated all files, just finish closedir(d); return ret; }
std::vector<PathEntry> GetFilesInDirectory(const char *path) { std::vector<PathEntry> ret; if(path[0] == '/' && path[1] == 0) { DWORD driveMask = GetLogicalDrives(); for(int i = 0; i < 26; i++) { DWORD mask = (1 << i); if(driveMask & mask) { string fn = "A:/"; fn[0] = char('A' + i); ret.push_back(PathEntry(fn.c_str(), PathProperty::Directory)); } } return ret; } string pathstr = path; // normalise path to windows style for(size_t i = 0; i < pathstr.size(); i++) if(pathstr[i] == '/') pathstr[i] = '\\'; // remove any trailing slash if(pathstr[pathstr.size() - 1] == '\\') pathstr.resize(pathstr.size() - 1); // append '\*' to do the search we want pathstr += "\\*"; wstring wpath = StringFormat::UTF82Wide(pathstr); WIN32_FIND_DATAW findData = {}; HANDLE find = FindFirstFileW(wpath.c_str(), &findData); if(find == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); PathProperty flags = PathProperty::ErrorUnknown; if(err == ERROR_FILE_NOT_FOUND) flags = PathProperty::ErrorInvalidPath; else if(err == ERROR_ACCESS_DENIED) flags = PathProperty::ErrorAccessDenied; ret.push_back(PathEntry(path, flags)); return ret; } do { if(findData.cFileName[0] == L'.' && findData.cFileName[1] == 0) { // skip "." } else if(findData.cFileName[0] == L'.' && findData.cFileName[1] == L'.' && findData.cFileName[2] == 0) { // skip ".." } else { PathProperty flags = PathProperty::NoFlags; if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) flags |= PathProperty::Directory; if(findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) flags |= PathProperty::Hidden; if(wcsstr(findData.cFileName, L".EXE") || wcsstr(findData.cFileName, L".exe") || wcsstr(findData.cFileName, L".Exe")) { flags |= PathProperty::Executable; } PathEntry f(StringFormat::Wide2UTF8(findData.cFileName).c_str(), flags); uint64_t nanosecondsSinceWindowsEpoch = uint64_t(findData.ftLastWriteTime.dwHighDateTime) << 8 | uint64_t(findData.ftLastWriteTime.dwLowDateTime); uint64_t secondsSinceWindowsEpoch = nanosecondsSinceWindowsEpoch / 10000000; // this constant is the number of seconds between Jan 1 1601 and Jan 1 1970 uint64_t secondsSinceUnixEpoch = secondsSinceWindowsEpoch - 11644473600; f.lastmod = uint32_t(secondsSinceUnixEpoch); f.size = uint64_t(findData.nFileSizeHigh) << 8 | uint64_t(findData.nFileSizeLow); ret.push_back(f); } } while(FindNextFile(find, &findData) != FALSE); // don't care if we hit an error or enumerated all files, just finish FindClose(find); return ret; }
int DnDHGSendDataMessage::buildFileTree(const char *pcszPath, size_t cbBaseLen) { RTFSOBJINFO objInfo; int rc = RTPathQueryInfo(pcszPath, &objInfo, RTFSOBJATTRADD_NOTHING); if (RT_FAILURE(rc)) return rc; /* These are the types we currently support. Symlinks are not directly * supported. First the guest could be an OS which doesn't support it and * second the symlink could point to a file which is out of the base tree. * Both things are hard to support. For now we just copy the target file in * this case. */ if (!( RTFS_IS_DIRECTORY(objInfo.Attr.fMode) || RTFS_IS_FILE(objInfo.Attr.fMode) || RTFS_IS_SYMLINK(objInfo.Attr.fMode))) return VINF_SUCCESS; uint64_t cbSize = 0; rc = RTFileQuerySize(pcszPath, &cbSize); if (rc == VERR_IS_A_DIRECTORY) rc = VINF_SUCCESS; if (RT_FAILURE(rc)) return rc; m_uriList.append(PathEntry(pcszPath, &pcszPath[cbBaseLen], objInfo.Attr.fMode, cbSize)); m_cbAll += cbSize; DO(("cbFile: %u\n", cbSize)); PRTDIR hDir; /* We have to try to open even symlinks, cause they could be symlinks * to directories. */ rc = RTDirOpen(&hDir, pcszPath); /* The following error happens when this was a symlink to an file or a * regular file. */ if (rc == VERR_PATH_NOT_FOUND) return VINF_SUCCESS; if (RT_FAILURE(rc)) return rc; while (RT_SUCCESS(rc)) { RTDIRENTRY DirEntry; rc = RTDirRead(hDir, &DirEntry, NULL); if (RT_FAILURE(rc)) { if (rc == VERR_NO_MORE_FILES) rc = VINF_SUCCESS; break; } switch (DirEntry.enmType) { case RTDIRENTRYTYPE_DIRECTORY: { /* Skip "." and ".." entries. */ if ( RTStrCmp(DirEntry.szName, ".") == 0 || RTStrCmp(DirEntry.szName, "..") == 0) break; if (char *pszRecDir = RTStrAPrintf2("%s%c%s", pcszPath, RTPATH_DELIMITER, DirEntry.szName)) { rc = buildFileTree(pszRecDir, cbBaseLen); RTStrFree(pszRecDir); } else rc = VERR_NO_MEMORY; break; } case RTDIRENTRYTYPE_SYMLINK: case RTDIRENTRYTYPE_FILE: { if (char *pszNewFile = RTStrAPrintf2("%s%c%s", pcszPath, RTPATH_DELIMITER, DirEntry.szName)) { /* We need the size and the mode of the file. */ RTFSOBJINFO objInfo1; rc = RTPathQueryInfo(pszNewFile, &objInfo1, RTFSOBJATTRADD_NOTHING); if (RT_FAILURE(rc)) return rc; rc = RTFileQuerySize(pszNewFile, &cbSize); if (RT_FAILURE(rc)) break; m_uriList.append(PathEntry(pszNewFile, &pszNewFile[cbBaseLen], objInfo1.Attr.fMode, cbSize)); m_cbAll += cbSize; RTStrFree(pszNewFile); } else rc = VERR_NO_MEMORY; break; } default: break; } } RTDirClose(hDir); return rc; }
size_t CurvedFactoryTemplate::AddPoint (const csVector3& pos, const csVector3& front, const csVector3& up) { return points.Push (PathEntry (pos, front.Unit (), up.Unit ())); }
void CurvedFactory::ChangePoint (size_t idx, const csVector3& pos, const csVector3& front, const csVector3& up) { anchorPoints[idx] = PathEntry (pos, front.Unit (), up.Unit ()); }