diff options
| author | Xiaohong Bao <bao@lindenlab.com> | 2011-02-23 10:44:59 -0700 | 
|---|---|---|
| committer | Xiaohong Bao <bao@lindenlab.com> | 2011-02-23 10:44:59 -0700 | 
| commit | 01cdeb0cdd8c48b76a229d42ced4e5563cd18c5c (patch) | |
| tree | e7b7ca976f17c8af3c8a2648a801030594e94c8c /indra/llvfs | |
| parent | 7daa3d1ca10199468946feef0ce8eb67489deee0 (diff) | |
| parent | ff5e3f5c2e566f3a8e86efaa763f7b12e07eeb53 (diff) | |
Merge from viewer-development
Diffstat (limited to 'indra/llvfs')
| -rw-r--r-- | indra/llvfs/lldir.cpp | 21 | ||||
| -rw-r--r-- | indra/llvfs/lldir.h | 28 | ||||
| -rw-r--r-- | indra/llvfs/lldir_linux.cpp | 48 | ||||
| -rw-r--r-- | indra/llvfs/lldir_linux.h | 3 | ||||
| -rw-r--r-- | indra/llvfs/lldir_mac.cpp | 42 | ||||
| -rw-r--r-- | indra/llvfs/lldir_mac.h | 3 | ||||
| -rw-r--r-- | indra/llvfs/lldir_solaris.cpp | 48 | ||||
| -rw-r--r-- | indra/llvfs/lldir_solaris.h | 3 | ||||
| -rw-r--r-- | indra/llvfs/lldir_win32.cpp | 135 | ||||
| -rw-r--r-- | indra/llvfs/lldir_win32.h | 5 | ||||
| -rw-r--r-- | indra/llvfs/tests/lldir_test.cpp | 155 | 
11 files changed, 237 insertions, 254 deletions
| diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 938fb008c9..cb898e385f 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -83,7 +83,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)  	std::string filename;   	std::string fullpath;  	S32 result; -	while (getNextFileInDir(dirname, mask, filename, FALSE)) +	while (getNextFileInDir(dirname, mask, filename))  	{  		fullpath = dirname;  		fullpath += getDirDelimiter(); @@ -101,10 +101,18 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)  		{  			if (0 != LLFile::remove(fullpath))  			{ +				retry_count++;  				result = errno;  				llwarns << "Problem removing " << fullpath << " - errorcode: "  						<< result << " attempt " << retry_count << llendl; -				ms_sleep(1000); + +				if(retry_count >= 5) +				{ +					llwarns << "Failed to remove " << fullpath << llendl ; +					return count ; +				} + +				ms_sleep(100);  			}  			else  			{ @@ -113,8 +121,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)  					llwarns << "Successfully removed " << fullpath << llendl;  				}  				break; -			} -			retry_count++; +			}			  		}  		count++;  	} @@ -382,11 +389,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd  		break;  	case LL_PATH_USER_SKIN: -		prefix = getOSUserAppDir(); -		prefix += mDirDelimiter; -		prefix += "user_settings"; -		prefix += mDirDelimiter; -		prefix += "skins"; +		prefix = getUserSkinDir();  		break;  	case LL_PATH_SKINS: diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 4f63c04aab..42996fd051 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -74,8 +74,32 @@ class LLDir  // pure virtual functions  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0; -	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0; -	virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0; + +    /// Walk the files in a directory, with file pattern matching +	virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash! +                                  const std::string& mask,    ///< file pattern string (use "*" for all) +                                  std::string& fname          ///< output: found file name +                                  ) = 0; +    /**< +     * @returns true if a file was found, false if the entire directory has been scanned. +     * +     * @note that this function is NOT thread safe +     * +     * This function may not be used to scan part of a directory, then start a new search of a different +     * directory, and then restart the first search where it left off; the entire search must run to +     * completion or be abandoned - there is no restart. +     * +     * @bug: See http://jira.secondlife.com/browse/VWR-23697 +     *       and/or the tests in test/lldir_test.cpp +     *       This is known to fail with patterns that have both: +     *       a wildcard left of a . and more than one sequential ? right of a . +     *       the pattern foo.??x appears to work +     *       but *.??x or foo?.??x do not +     * +     * @todo this really should be rewritten as an iterator object, and the +     *       filtering should be done in a platform-independent way. +     */ +  	virtual std::string getCurPath() = 0;  	virtual BOOL fileExists(const std::string &filename) const = 0; diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index a1c6669b97..73f2336f94 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -243,8 +243,7 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &  }  // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)  {  	glob_t g;  	BOOL result = FALSE; @@ -276,11 +275,6 @@ BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string  			mCurrentDirIndex++; -			if((mCurrentDirIndex >= (int)g.gl_pathc) && wrap) -			{ -				mCurrentDirIndex = 0; -			} -			  			if(mCurrentDirIndex < (int)g.gl_pathc)  			{  //				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; @@ -308,47 +302,7 @@ BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string  } -// get a random file in the directory -// automatically wrap if we've hit the end -void LLDir_Linux::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -	S32 num_files; -	S32 which_file; -	DIR *dirp; -	dirent *entryp = NULL; - -	fname = ""; -	num_files = countFilesInDir(dirname,mask); -	if (!num_files) -	{ -		return; -	} - -	which_file = ll_rand(num_files); - -//	llinfos << "Random select file #" << which_file << llendl; - -    // which_file now indicates the (zero-based) index to which file to play -	 -	if (!((dirp = opendir(dirname.c_str())))) -	{ -		while (which_file--) -		{ -			if (!((entryp = readdir(dirp)))) -			{ -				return; -			} -		}		    - -		if ((!which_file) && entryp) -		{ -			fname = entryp->d_name; -		} -		 -		closedir(dirp); -	} -}  std::string LLDir_Linux::getCurPath()  { diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h index 809959e873..451e81ae93 100644 --- a/indra/llvfs/lldir_linux.h +++ b/indra/llvfs/lldir_linux.h @@ -43,8 +43,7 @@ public:  public:	  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); -	virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); +	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	/*virtual*/ BOOL fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index b41b0ec5dd..445285aa43 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -259,8 +259,7 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma  }  // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)  {  	glob_t g;  	BOOL result = FALSE; @@ -292,11 +291,6 @@ BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &  			mCurrentDirIndex++; -			if((mCurrentDirIndex >= g.gl_pathc) && wrap) -			{ -				mCurrentDirIndex = 0; -			} -			  			if(mCurrentDirIndex < g.gl_pathc)  			{  //				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; @@ -323,41 +317,7 @@ BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &  	return(result);  } -// get a random file in the directory -void LLDir_Mac::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -	S32 which_file; -	glob_t g; -	fname = ""; -	 -	std::string tmp_str; -	tmp_str = dirname; -	tmp_str += mask; -	 -	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) -	{ -		if(g.gl_pathc > 0) -		{ -			 -			which_file = ll_rand(g.gl_pathc); -	 -//			llinfos << "getRandomFileInDir: returning number " << which_file << ", path is " << g.gl_pathv[which_file] << llendl; -			// The API wants just the filename, not the full path. -			//fname = g.gl_pathv[which_file]; -			char *s = strrchr(g.gl_pathv[which_file], '/'); -			 -			if(s == NULL) -				s = g.gl_pathv[which_file]; -			else if(s[0] == '/') -				s++; -				 -			fname = s; -		} -		 -		globfree(&g); -	} -}  S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask)  { diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h index 04c52dc940..4eac3c3ae6 100644 --- a/indra/llvfs/lldir_mac.h +++ b/indra/llvfs/lldir_mac.h @@ -43,8 +43,7 @@ public:  	virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); -	virtual void getRandomFileInDir(const std::string &dirname, const std::string &ask, std::string &fname); +	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	virtual BOOL fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 4323dfd44a..515fd66b6e 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -261,8 +261,7 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string  }  // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)  {  	glob_t g;  	BOOL result = FALSE; @@ -294,11 +293,6 @@ BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::stri  			mCurrentDirIndex++; -			if((mCurrentDirIndex >= (int)g.gl_pathc) && wrap) -			{ -				mCurrentDirIndex = 0; -			} -			  			if(mCurrentDirIndex < (int)g.gl_pathc)  			{  //				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; @@ -326,47 +320,7 @@ BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::stri  } -// get a random file in the directory -// automatically wrap if we've hit the end -void LLDir_Solaris::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -	S32 num_files; -	S32 which_file; -	DIR *dirp; -	dirent *entryp = NULL; - -	fname = ""; - -	num_files = countFilesInDir(dirname,mask); -	if (!num_files) -	{ -		return; -	} - -	which_file = ll_rand(num_files); - -//	llinfos << "Random select file #" << which_file << llendl; -    // which_file now indicates the (zero-based) index to which file to play -	 -	if (!((dirp = opendir(dirname.c_str())))) -	{ -		while (which_file--) -		{ -			if (!((entryp = readdir(dirp)))) -			{ -				return; -			} -		}		    - -		if ((!which_file) && entryp) -		{ -			fname = entryp->d_name; -		} -		 -		closedir(dirp); -	} -}  std::string LLDir_Solaris::getCurPath()  { diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index 6e0c5cfc69..4a1794f539 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -43,8 +43,7 @@ public:  public:	  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); -	virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); +	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	/*virtual*/ BOOL fileExists(const std::string &filename) const;  private: diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 52d864e26f..33718e520d 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -206,14 +206,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name,  		}  	} -	res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,"")); -	if (res == -1) -	{ -		if (errno != EEXIST) -		{ -			llwarns << "Couldn't create LL_PATH_SKINS dir " << getExpandedFilename(LL_PATH_USER_SKIN,"") << llendl; -		} -	}  	mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");  } @@ -246,21 +238,13 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &  // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)  { -	llutf16string dirnamew = utf8str_to_utf16str(dirname); -	return getNextFileInDir(dirnamew, mask, fname, wrap); - -} +    BOOL fileFound = FALSE; +	fname = ""; -BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap) -{  	WIN32_FIND_DATAW FileData; - -	fname = ""; -	llutf16string pathname = dirname; -	pathname += utf8str_to_utf16str(mask); +    llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask);  	if (pathname != mCurrentDir)  	{ @@ -273,91 +257,44 @@ BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::stri  		// and open new one  		// Check error opening Directory structure -		if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) == INVALID_HANDLE_VALUE)    -		{ -//			llinfos << "Unable to locate first file" << llendl; -			return(FALSE); -		} -	} -	else // get next file in list -	{ -		// Find next entry -		if (!FindNextFile(mDirSearch_h, &FileData)) +		if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)     		{ -			if (GetLastError() == ERROR_NO_MORE_FILES) -			{ -                // No more files, so reset to beginning of directory -				FindClose(mDirSearch_h); -				mCurrentDir[0] = NULL; - -				if (wrap) -				{ -					return(getNextFileInDir(pathname,"",fname,TRUE)); -				} -				else -				{ -					fname[0] = 0; -					return(FALSE); -				} -			} -			else -			{ -				// Error -//				llinfos << "Unable to locate next file" << llendl; -				return(FALSE); -			} +           fileFound = TRUE;  		}  	} -	// convert from TCHAR to char -	fname = utf16str_to_utf8str(FileData.cFileName); -	 -	// fname now first name in list -	return(TRUE); -} - - -// get a random file in the directory -// automatically wrap if we've hit the end -void LLDir_Win32::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -	S32 num_files; -	S32 which_file; -	HANDLE random_search_h; - -	fname = ""; - -	llutf16string pathname = utf8str_to_utf16str(dirname); -	pathname += utf8str_to_utf16str(mask); - -	WIN32_FIND_DATA FileData; -	fname[0] = NULL; - -	num_files = countFilesInDir(dirname,mask); -	if (!num_files) -	{ -		return; -	} - -	which_file = ll_rand(num_files); - -//	llinfos << "Random select mp3 #" << which_file << llendl; - -    // which_file now indicates the (zero-based) index to which file to play +    // Loop to skip over the current (.) and parent (..) directory entries +    // (apparently returned in Win7 but not XP) +    do +    { +       if (   fileFound +           && (  (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0) +               ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0) +               ) +           ) +       { +          fileFound = FALSE; +       } +    } while (   mDirSearch_h != INVALID_HANDLE_VALUE +             && !fileFound +             && (fileFound = FindNextFile(mDirSearch_h, &FileData) +                 ) +             ); + +    if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES) +    { +       // No more files, so reset to beginning of directory +       FindClose(mDirSearch_h); +       mCurrentDir[0] = '\000'; +    } -	if ((random_search_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)    -	{ -		while (which_file--) -		{ -			if (!FindNextFile(random_search_h, &FileData)) -			{ -				return; -			} -		}		    -		FindClose(random_search_h); - -		fname = utf16str_to_utf8str(llutf16string(FileData.cFileName)); +    if (fileFound) +    { +        // convert from TCHAR to char +        fname = utf16str_to_utf8str(FileData.cFileName);  	} +     +	return fileFound;  }  std::string LLDir_Win32::getCurPath() diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h index d3e45dc1f3..4c932c932c 100644 --- a/indra/llvfs/lldir_win32.h +++ b/indra/llvfs/lldir_win32.h @@ -40,15 +40,14 @@ public:  	/*virtual*/ std::string getCurPath();  	/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); -	/*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); +	/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	/*virtual*/ BOOL fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher();  	/*virtual*/ std::string getLLPluginFilename(std::string base_name);  private: -	BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap); +	BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);  	void* mDirSearch_h;  	llutf16string mCurrentDir; diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp index bcffa449c8..8788bd63e8 100644 --- a/indra/llvfs/tests/lldir_test.cpp +++ b/indra/llvfs/tests/lldir_test.cpp @@ -256,5 +256,160 @@ namespace tut  			      gDirUtilp->getExtension(dottedPathExt),  			      "ext");  	} + +   std::string makeTestFile( const std::string& dir, const std::string& file ) +   { +      std::string delim = gDirUtilp->getDirDelimiter(); +      std::string path = dir + delim + file; +      LLFILE* handle = LLFile::fopen( path, "w" ); +      ensure("failed to open test file '"+path+"'", handle != NULL ); +      // Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs +      // returns EOF; otherwise, it returns some other, nonnegative value." +      ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0); +      fclose(handle); +      return path; +   } + +   std::string makeTestDir( const std::string& dirbase ) +   { +      int counter; +      std::string uniqueDir; +      bool foundUnused; +      std::string delim = gDirUtilp->getDirDelimiter(); +       +      for (counter=0, foundUnused=false; !foundUnused; counter++ ) +      { +         char counterStr[3]; +         sprintf(counterStr, "%02d", counter); +         uniqueDir = dirbase + counterStr; +         foundUnused = ! ( LLFile::isdir(uniqueDir) || LLFile::isfile(uniqueDir) ); +      } +      ensure("test directory '" + uniqueDir + "' creation failed", !LLFile::mkdir(uniqueDir)); +       +      return uniqueDir + delim; // HACK - apparently, the trailing delimiter is needed... +   } + +   static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" }; +    +   void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5]) +   { + +      // Scan directory and see if any file1.* files are found +      std::string scanResult; +      int   found = 0; +      bool  filesFound[5] = { false, false, false, false, false }; +      //std::cerr << "searching '"+directory+"' for '"+pattern+"'\n"; + +      while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) ) +      { +         found++; +         //std::cerr << "  found '"+scanResult+"'\n"; +         int check; +         for (check=0; check < 5 && ! ( scanResult == DirScanFilename[check] ); check++) +         { +         } +         // check is now either 5 (not found) or the index of the matching name +         if (check < 5) +         { +            ensure( "found file '"+(std::string)DirScanFilename[check]+"' twice", ! filesFound[check] ); +            filesFound[check] = true; +         } +         else // check is 5 - should not happen +         { +            fail( "found unknown file '"+scanResult+"'"); +         } +      } +      for (int i=0; i<5; i++) +      { +         if (correctResult[i]) +         { +            ensure("scan of '"+directory+"' using '"+pattern+"' did not return '"+DirScanFilename[i]+"'", filesFound[i]); +         } +         else +         { +            ensure("scan of '"+directory+"' using '"+pattern+"' incorrectly returned '"+DirScanFilename[i]+"'", !filesFound[i]); +         } +      } +   } +    +   template<> template<> +   void LLDirTest_object_t::test<5>() +      // getNextFileInDir +   { +      std::string delim = gDirUtilp->getDirDelimiter(); +      std::string dirTemp = LLFile::tmpdir(); + +      // Create the same 5 file names of the two directories + +      std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir"); +      std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir"); +      std::string dir1files[5]; +      std::string dir2files[5]; +      for (int i=0; i<5; i++) +      { +         dir1files[i] = makeTestFile(dir1, DirScanFilename[i]); +         dir2files[i] = makeTestFile(dir2, DirScanFilename[i]); +      } + +      // Scan dir1 and see if each of the 5 files is found exactly once +      bool expected1[5] = { true, true, true, true, true }; +      scanTest(dir1, "*", expected1); + +      // Scan dir2 and see if only the 2 *.xyz files are found +      bool  expected2[5] = { false, false, true, true, false }; +      scanTest(dir1, "*.xyz", expected2); + +      // Scan dir2 and see if only the 1 *.mno file is found +      bool  expected3[5] = { false, false, false, false, true }; +      scanTest(dir2, "*.mno", expected3); + +      // Scan dir1 and see if any *.foo files are found +      bool  expected4[5] = { false, false, false, false, false }; +      scanTest(dir1, "*.foo", expected4); + +      // Scan dir1 and see if any file1.* files are found +      bool  expected5[5] = { true, false, true, false, true }; +      scanTest(dir1, "file1.*", expected5); + +      // Scan dir1 and see if any file1.* files are found +      bool  expected6[5] = { true, true, false, false, false }; +      scanTest(dir1, "file?.abc", expected6); + +      // Scan dir2 and see if any file?.x?z files are found +      bool  expected7[5] = { false, false, true, true, false }; +      scanTest(dir2, "file?.x?z", expected7); + +      // Scan dir2 and see if any file?.??c files are found +      // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW +      //      bool  expected8[5] = { true, true, false, false, false }; +      //      scanTest(dir2, "file?.??c", expected8); +      //      scanTest(dir2, "*.??c", expected8); + +      // Scan dir1 and see if any *.?n? files are found +      bool  expected9[5] = { false, false, false, false, true }; +      scanTest(dir1, "*.?n?", expected9); + +      // Scan dir1 and see if any *.???? files are found +      // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW +      // bool  expected10[5] = { false, false, false, false, false }; +      // scanTest(dir1, "*.????", expected10); + +      // Scan dir1 and see if any ?????.* files are found +      bool  expected11[5] = { true, true, true, true, true }; +      scanTest(dir1, "?????.*", expected11); + +      // Scan dir1 and see if any ??l??.xyz files are found +      bool  expected12[5] = { false, false, true, true, false }; +      scanTest(dir1, "??l??.xyz", expected12); + +      // clean up all test files and directories +      for (int i=0; i<5; i++) +      { +         LLFile::remove(dir1files[i]); +         LLFile::remove(dir2files[i]); +      } +      LLFile::rmdir(dir1); +      LLFile::rmdir(dir2); +   }  } | 
