Commits

Alex Szpakowski committed 8f381fa Merge

Merged bartbes/love-experiments/love.filesystem.mount2 into default

Comments (0)

Files changed (4)

src/modules/filesystem/physfs/Filesystem.cpp

 	return true;
 }
 
+bool Filesystem::mount(const char *archive, const char *mountpoint)
+{
+	if (!isInited || !archive)
+		return false;
+
+	// Not allowed for safety reasons.
+	if (strlen(archive) == 0 || strstr(archive, "..") || strcmp(archive, "/") == 0)
+		return false;
+
+	const char *realDir = PHYSFS_getRealDir(archive);
+	if (!realDir)
+		return false;
+
+	std::string realPath(realDir);
+	realPath += LOVE_PATH_SEPARATOR;
+	realPath += archive;
+
+	return PHYSFS_mount(realPath.c_str(), mountpoint, 0);
+}
+
+bool Filesystem::unmount(const char *archive)
+{
+	if (!isInited || !archive)
+		return false;
+
+	// Not allowed for safety reasons.
+	if (strlen(archive) == 0 || strstr(archive, "..") || strcmp(archive, "/") == 0)
+		return false;
+
+	const char *realDir = PHYSFS_getRealDir(archive);
+	if (!realDir)
+		return false;
+
+	std::string realPath(realDir);
+	realPath += LOVE_PATH_SEPARATOR;
+	realPath += archive;
+
+	const char *mountPoint = PHYSFS_getMountPoint(realPath.c_str());
+	if (!mountPoint)
+		return false;
+
+	return PHYSFS_removeFromSearchPath(realPath.c_str());
+}
+
 File *Filesystem::newFile(const char *filename) const
 {
 	return new File(filename);

src/modules/filesystem/physfs/Filesystem.h

 	 * @param source Path to a directory or a .love-file.
 	 **/
 	bool setSource(const char *source);
+	bool mount(const char *archive, const char *mountpoint);
+	bool unmount(const char *archive);
 
 	/**
 	 * Creates a new file.

src/modules/filesystem/physfs/wrap_Filesystem.cpp

 	return 0;
 }
 
+int w_mount(lua_State *L)
+{
+	const char *archive = luaL_checkstring(L, 1);
+	const char *mountpoint = luaL_checkstring(L, 2);
+
+	luax_pushboolean(L, instance->mount(archive, mountpoint));
+	return 1;
+}
+
+int w_unmount(lua_State *L)
+{
+	const char *archive = luaL_checkstring(L, 1);
+
+	luax_pushboolean(L, instance->unmount(archive));
+	return 1;
+}
+
 int w_newFile(lua_State *L)
 {
 	const char *filename = luaL_checkstring(L, 1);
 	{ "setIdentity",  w_setIdentity },
 	{ "getIdentity", w_getIdentity },
 	{ "setSource",  w_setSource },
+	{ "mount", w_mount },
+	{ "unmount", w_unmount },
 	{ "newFile",  w_newFile },
 	{ "getWorkingDirectory",  w_getWorkingDirectory },
 	{ "getUserDirectory",  w_getUserDirectory },

src/modules/filesystem/physfs/wrap_Filesystem.h

 int w_setIdentity(lua_State *L);
 int w_getIdentity(lua_State *L);
 int w_setSource(lua_State *L);
+int w_mount(lua_State *L);
+int w_unmount(lua_State *L);
 int w_newFile(lua_State *L);
 int w_newFileData(lua_State *L);
 int w_getWorkingDirectory(lua_State *L);