/usr/include/crystalspace-2.0/cstool/vfsdirchange.h is in libcrystalspace-dev 2.0+dfsg-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | /*
Copyright (C) 2005 by Jorrit Tyberghein
(C) 2005 by Frank Richter
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/**\file
* Class to revert VFS directory changes upon leaving a scope.
*/
#include "iutil/vfs.h"
#include "csutil/csstring.h"
/**
* Helper class to change the current VFS directory and restore the previous
* directory when an instance goes out of scope.
*/
class csVfsDirectoryChanger
{
csRef<iVFS> vfs;
/**
* The number of directory changes/directory stack entries that need to be
* popped
*/
uint popCount;
public:
/// Create instance
csVfsDirectoryChanger (iVFS* vfs) : vfs(vfs), popCount(0) { }
/// Destroy instance. Restores the old directory if ChangeTo() was called.
~csVfsDirectoryChanger()
{
while (popCount--) vfs->PopDir();
}
/**
* Change to the directory \a filename is in.
* \remarks Only the part of the path up to the last '/' is treated as the
* directory to change to. E.g. both "<tt>/foo/bar/baz</tt>" and
* "<tt>/foo/bar/</tt>" will cause a directory change to "<tt>/foo/bar</tt>".
*/
bool ChangeTo (const char* filename)
{
if (!vfs) return false;
csString dir(filename);
dir.Truncate(dir.FindLast('/'));
vfs->PushDir ();
popCount++;
return vfs->ChDir (dir);
}
/**
* As above, except that the full path is treated as the directory to
* change to.
*/
bool ChangeToFull (const char* filename)
{
if (!vfs) return false;
// We must make a copy of the filename because it can be a direct
// pointer to vfs->GetCwd() and vfs->PushDir() corrupts that pointer.
csString copy (filename);
vfs->PushDir ();
popCount++;
return vfs->ChDir (copy);
}
/**
* Just pushes the current directory, but doesn't change it in anyway -
* useful when you want to call ChDir() or ChDirAuto() manually for some
* reason, but still want to have the current directory restored
* automatically.
*/
void PushDir ()
{
vfs->PushDir ();
popCount++;
}
};
|