// CefCommandLine::HasSwitch is unable to report the presense of switches, // in the command line properly. This is a generic function that could be // used to check for any particular switch, passed as a command line argument. bool HasSwitch(CefRefPtr<CefCommandLine> command_line , CefString& switch_name) { if (command_line) { ExtensionString cmdLine = command_line->GetCommandLineString(); size_t idx = cmdLine.find(switch_name); return idx > 0 && idx < cmdLine.length(); } else { return false; } }
int32 ReadDir(ExtensionString path, CefRefPtr<CefListValue>& directoryContents) { if (path.length() && path[path.length() - 1] != '/') path += '/'; path += '*'; WIN32_FIND_DATA ffd; HANDLE hFind = FindFirstFile(path.c_str(), &ffd); std::vector<ExtensionString> resultFiles; std::vector<ExtensionString> resultDirs; if (hFind != INVALID_HANDLE_VALUE) { do { // Ignore '.' and '..' if (!wcscmp(ffd.cFileName, L".") || !wcscmp(ffd.cFileName, L"..")) continue; // Collect file and directory names separately if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { resultDirs.push_back(ExtensionString(ffd.cFileName)); } else { resultFiles.push_back(ExtensionString(ffd.cFileName)); } } while (FindNextFile(hFind, &ffd) != 0); FindClose(hFind); } else { return ConvertWinErrorCode(GetLastError()); } // On Windows, list directories first, then files size_t i, total = 0; for (i = 0; i < resultDirs.size(); i++) directoryContents->SetString(total++, resultDirs[i]); for (i = 0; i < resultFiles.size(); i++) directoryContents->SetString(total++, resultFiles[i]); return NO_ERROR; }
int32 ReadDir(ExtensionString path, CefRefPtr<CefListValue>& directoryContents) { //# Add trailing /slash if neccessary if (path.length() && path[path.length() - 1] != '/') path += '/'; DIR *dp; struct dirent *files; struct stat statbuf; ExtensionString curFile; /*struct dirent { unsigned char d_type; #not supported on all systems, faster than stat char d_name[] }*/ if((dp=opendir(path.c_str()))==NULL) return ConvertLinuxErrorCode(errno,true); std::vector<ExtensionString> resultFiles; std::vector<ExtensionString> resultDirs; while((files=readdir(dp))!=NULL) { if(!strcmp(files->d_name,".") || !strcmp(files->d_name,"..")) continue; if(files->d_type==DT_DIR) resultDirs.push_back(ExtensionString(files->d_name)); else if(files->d_type==DT_REG) resultFiles.push_back(ExtensionString(files->d_name)); else { // Some file systems do not support d_type we use // for faster type detection. So on these file systems // we may get DT_UNKNOWN for all file entries, but just // to be safe we will use slower stat call for all // file entries that are not DT_DIR or DT_REG. curFile = path + files->d_name; if(stat(curFile.c_str(), &statbuf) == -1) continue; if(S_ISDIR(statbuf.st_mode)) resultDirs.push_back(ExtensionString(files->d_name)); else if(S_ISREG(statbuf.st_mode)) resultFiles.push_back(ExtensionString(files->d_name)); } } closedir(dp); //# List dirs first, files next size_t i, total = 0; for (i = 0; i < resultDirs.size(); i++) directoryContents->SetString(total++, resultDirs[i]); for (i = 0; i < resultFiles.size(); i++) directoryContents->SetString(total++, resultFiles[i]); return NO_ERROR; }