Exemplo n.º 1
0
const char* misc_model_dialog(GtkWidget* parent)
{
  StringOutputStream buffer(1024);

  buffer << g_qeglobals.m_userGamePath.c_str() << "models/";

  if(!file_readable(buffer.c_str()))
  {
    // just go to fsmain
    buffer.clear();
    buffer << g_qeglobals.m_userGamePath.c_str() << "/";
  }

  const char *filename = file_dialog (parent, TRUE, "Choose Model", buffer.c_str(), ModelLoader::Name());
  if (filename != 0)
  {
    // use VFS to get the correct relative path
    const char* relative = path_make_relative(filename, GlobalFileSystem().findRoot(filename));
    if(relative == filename)
    {
      globalOutputStream() << "WARNING: could not extract the relative path, using full path instead\n";
    }
    return relative;
  }
  return 0;
}
Exemplo n.º 2
0
    void realise ()
    {
        ASSERT_MESSAGE(m_unrealised != 0, "ModelResource::realise: already realised");
        if (--m_unrealised == 0) {
            m_path = rootPath(m_originalName);
            m_name = path_make_relative(m_originalName, m_path);

            m_observers.realise();
        }
    }
Exemplo n.º 3
0
 void visit(const char* name)
 {
   const char* subname = path_make_relative(name, m_directory);
   if(subname != name)
   {
     if(subname[0] == '/')
       ++subname;
     if(m_extension[0] == '*' || extension_equal(path_get_extension(subname), m_extension))
       pathlist_prepend_unique(m_matches, g_strdup (subname));
   }
 }
Exemplo n.º 4
0
  virtual void forEachFile(VisitorFunc visitor, const char* root)
  {
    std::vector<Directory*> dirs;
    UnixPath path(m_root.c_str());
    path.push(root);
    dirs.push_back(directory_open(path.c_str()));

    while(!dirs.empty() && directory_good(dirs.back()))
    {
      const char* name = directory_read_and_increment(dirs.back());

      if(name == 0)
      {
        directory_close(dirs.back());
        dirs.pop_back();
        path.pop();
      }
      else if(!string_equal(name, ".") && !string_equal(name, ".."))
      {
        path.push_filename(name);

        bool is_directory = file_is_directory(path.c_str());

        if(!is_directory)
          visitor.file(path_make_relative(path.c_str(), m_root.c_str()));

        path.pop();

        if(is_directory)
        {
          path.push(name);

          if(!visitor.directory(path_make_relative(path.c_str(), m_root.c_str()), dirs.size()))
            dirs.push_back(directory_open(path.c_str()));
          else
            path.pop();
        }
      }
    }
  }
Exemplo n.º 5
0
  void realise()
  {
    ASSERT_MESSAGE(m_unrealised != 0, "ModelResource::realise: already realised");
    if(--m_unrealised == 0)
    {
      m_path = rootPath(m_originalName.c_str());
      m_name = path_make_relative(m_originalName.c_str(), m_path.c_str());

      //globalOutputStream() << "ModelResource::realise: " << m_path.c_str() << m_name.c_str() << "\n";

      m_observers.realise();
    }
  }
Exemplo n.º 6
0
const char *misc_model_dialog( ui::Widget parent ){
	const char *filename = parent.file_dialog( TRUE, "Choose Model", getLastModelFolderPath(), ModelLoader::Name() );

	if ( filename != NULL ) {
		g_strLastModelFolder = g_path_get_dirname( filename );
		// use VFS to get the correct relative path
		const char *relative = path_make_relative( filename, GlobalFileSystem().findRoot( filename ) );
		if ( relative == filename ) {
			globalOutputStream() << "WARNING: could not extract the relative path, using full path instead\n";
		}
		return relative;
	}
	return 0;
}
Exemplo n.º 7
0
 void visit(const char* name)
 {
   const char* subname = path_make_relative(name, m_directory);
   if(subname != name)
   {
     if(subname[0] == '/')
       ++subname;
     char* dir = g_strdup(subname);
     char* last_char = dir + strlen(dir);
     if(last_char != dir && *(--last_char) == '/')
       *last_char = '\0';
     pathlist_prepend_unique(m_matches, dir);
   }
 }
Exemplo n.º 8
0
static int node_symlink(sd_device *dev, const char *node, const char *slink) {
        _cleanup_free_ char *slink_dirname = NULL, *target = NULL;
        const char *id_filename, *slink_tmp;
        struct stat stats;
        int r;

        assert(dev);
        assert(node);
        assert(slink);

        slink_dirname = dirname_malloc(slink);
        if (!slink_dirname)
                return log_oom();

        /* use relative link */
        r = path_make_relative(slink_dirname, node, &target);
        if (r < 0)
                return log_device_error_errno(dev, r, "Failed to get relative path from '%s' to '%s': %m", slink, node);

        /* preserve link with correct target, do not replace node of other device */
        if (lstat(slink, &stats) == 0) {
                if (S_ISBLK(stats.st_mode) || S_ISCHR(stats.st_mode)) {
                        log_device_error(dev, "Conflicting device node '%s' found, link to '%s' will not be created.", slink, node);
                        return -EOPNOTSUPP;
                } else if (S_ISLNK(stats.st_mode)) {
                        _cleanup_free_ char *buf = NULL;

                        if (readlink_malloc(slink, &buf) >= 0 &&
                            streq(target, buf)) {
                                log_device_debug(dev, "Preserve already existing symlink '%s' to '%s'", slink, target);
                                (void) label_fix(slink, LABEL_IGNORE_ENOENT);
                                (void) utimensat(AT_FDCWD, slink, NULL, AT_SYMLINK_NOFOLLOW);
                                return 0;
                        }
                }
        } else {
                log_device_debug(dev, "Creating symlink '%s' to '%s'", slink, target);
                do {
                        r = mkdir_parents_label(slink, 0755);
                        if (!IN_SET(r, 0, -ENOENT))
                                break;
                        mac_selinux_create_file_prepare(slink, S_IFLNK);
                        if (symlink(target, slink) < 0)
                                r = -errno;
                        mac_selinux_create_file_clear();
                } while (r == -ENOENT);
                if (r == 0)
                        return 0;
                if (r < 0)
                        log_device_debug_errno(dev, r, "Failed to create symlink '%s' to '%s', trying to replace '%s': %m", slink, target, slink);
        }

        log_device_debug(dev, "Atomically replace '%s'", slink);
        r = device_get_id_filename(dev, &id_filename);
        if (r < 0)
                return log_device_error_errno(dev, r, "Failed to get id_filename: %m");
        slink_tmp = strjoina(slink, ".tmp-", id_filename);
        (void) unlink(slink_tmp);
        do {
                r = mkdir_parents_label(slink_tmp, 0755);
                if (!IN_SET(r, 0, -ENOENT))
                        break;
                mac_selinux_create_file_prepare(slink_tmp, S_IFLNK);
                if (symlink(target, slink_tmp) < 0)
                        r = -errno;
                mac_selinux_create_file_clear();
        } while (r == -ENOENT);
        if (r < 0)
                return log_device_error_errno(dev, r, "Failed to create symlink '%s' to '%s': %m", slink_tmp, target);

        if (rename(slink_tmp, slink) < 0) {
                r = log_device_error_errno(dev, errno, "Failed to rename '%s' to '%s' failed: %m", slink_tmp, slink);
                (void) unlink(slink_tmp);
        }

        return r;
}
Exemplo n.º 9
0
std::string FileSystem::getRelative (const std::string& name)
{
	const std::string abolsoluteBasePath = findRoot(name);
	return path_make_relative(name, abolsoluteBasePath);
}