Example #1
0
bool
SessionImpl::FindFileInternal (/*[in]*/ const char *	      lpszFileName,
			       /*[in]*/ FileType	      fileType,
			       /*[in]*/ bool		      firstMatchOnly,
			       /*[in]*/ bool		      tryHard,
			       /*[in]*/ bool		      create,
			       /*[in]*/ bool		      renew,
			       /*[out]*/ vector<PathName> &   result)
{
  MIKTEX_ASSERT (result.empty());

  // try to derive the file type
  if (fileType == FileType::None)
  {
    fileType = DeriveFileType(lpszFileName);
    if (fileType == FileType::None)
    {
      trace_filesearch->WriteFormattedLine (
	"core",
	T_("cannot derive file type from %s"),
	Q_(lpszFileName));
      return (false);
    }
  }

  if (renew)
  {
    if (! TryCreateFile(lpszFileName, fileType))
    {
      return (false);
    }
  }

  // construct the search vector
  PathNameArray vec = ConstructSearchVector(fileType);

  // get the file type information
  const InternalFileTypeInfo * pFileTypeInfo = GetInternalFileTypeInfo(fileType);
  MIKTEX_ASSERT (pFileTypeInfo != 0);

  // check to see whether the file name has a registered file name extension
  const char * lpszExtension = GetFileNameExtension(lpszFileName);
  bool hasRegisteredExtension = false;
  if (lpszExtension != 0)
  {
    for (CSVList ext (pFileTypeInfo->fileNameExtensions.c_str(),
		      PATH_DELIMITER);
	 ext.GetCurrent() != 0 && ! hasRegisteredExtension;
	 ++ ext)
    {
      if (PathName::Compare(lpszExtension, ext.GetCurrent()) == 0)
      {
	hasRegisteredExtension = true;
      }
    }
    for (CSVList ext (pFileTypeInfo->alternateExtensions.c_str(),
		      PATH_DELIMITER);
	 ext.GetCurrent() != 0 && ! hasRegisteredExtension;
	 ++ ext)
    {
      if (PathName::Compare(lpszExtension, ext.GetCurrent()) == 0)
      {
	hasRegisteredExtension = true;
      }
    }
  }

  vector<PathName> fileNamesToTry;

  // try each registered file name extension, if none was specified
  if (! hasRegisteredExtension)
  {
    for (CSVList ext (pFileTypeInfo->fileNameExtensions.c_str(),
		      PATH_DELIMITER);
	 ext.GetCurrent() != 0;
	 ++ ext)
    {
      PathName fileName (lpszFileName);
      fileName.AppendExtension (ext.GetCurrent());
      fileNamesToTry.push_back (fileName);
    }
  }

  // try it with the given file name
  fileNamesToTry.push_back (lpszFileName);

  // first round: use the fndb
  for (vector<PathName>::const_iterator it = fileNamesToTry.begin();
    it != fileNamesToTry.end();
    ++ it)
  {
    if (FindFileInternal(it->Get(), vec, firstMatchOnly, true, false, result) && firstMatchOnly)
    {
      return (true);
    }
  }

  // second round: don't use the fndb
  if (tryHard)
  {
    for (vector<PathName>::const_iterator it = fileNamesToTry.begin();
      it != fileNamesToTry.end();
      ++ it)
    {
      if (FindFileInternal(it->Get(), vec, firstMatchOnly, false, true, result) && firstMatchOnly)
      {
	return (true);
      }
    }
  }

  if (create)
  {
    if (result.empty())
    {
      if (TryCreateFile(lpszFileName, fileType))
      {
	FindFileInternal (lpszFileName, vec, firstMatchOnly, true, false, result);
      }
    }
    else if ((fileType == FileType::BASE || fileType == FileType::FMT || fileType == FileType::MEM)
	     && GetConfigValue(MIKTEX_REGKEY_TEXMF,
			       MIKTEX_REGVAL_RENEW_FORMATS_ON_UPDATE,
			       true))
    {
      PathName pathPackagesIniC (
	GetSpecialPath(SpecialPath::CommonInstallRoot),
	MIKTEX_PATH_PACKAGES_INI,
	0);
      PathName pathPackagesIniU (
	GetSpecialPath(SpecialPath::UserInstallRoot),
	MIKTEX_PATH_PACKAGES_INI,
	0);
      if (IsNewer(pathPackagesIniC, result[0])
	|| (pathPackagesIniU != pathPackagesIniC && IsNewer(pathPackagesIniU, result[0])))
      {
	if (TryCreateFile(lpszFileName, fileType))
	{
	  result.clear ();
	  FindFileInternal (lpszFileName, vec, firstMatchOnly, true, false, result);
	}
      }
    }
  }

  return (! result.empty());
}