{* UltraStar Deluxe - Karaoke Game
*
* UltraStar Deluxe is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* $URL: https://ultrastardx.svn.sourceforge.net/svnroot/ultrastardx/trunk/src/base/UPath.pas $
* $Id: UPath.pas 1624 2009-03-06 23:45:10Z k-m_schindler $
*}
unit UPath;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I switches.inc}
uses
SysUtils,
Classes;
var
// Absolute Paths
GamePath: string;
SoundPath: string;
SongPaths: TStringList;
LogPath: string;
ThemePath: string;
SkinsPath: string;
ScreenshotsPath: string;
CoverPaths: TStringList;
LanguagesPath: string;
PluginPath: string;
VisualsPath: string;
FontPath: string;
ResourcesPath: string;
PlayListPath: string;
function FindPath(out PathResult: string; const RequestedPath: string; NeedsWritePermission: boolean): boolean;
procedure InitializePaths;
procedure AddSongPath(const Path: string);
implementation
uses
StrUtils,
UPlatform,
UCommandLine,
ULog;
procedure AddSpecialPath(var PathList: TStringList; const Path: string);
var
Index: integer;
PathAbs, OldPathAbs: string;
begin
if (PathList = nil) then
PathList := TStringList.Create;
if (Path = '') or not ForceDirectories(Path) then
Exit;
PathAbs := IncludeTrailingPathDelimiter(ExpandFileName(Path));
// check if path or a part of the path was already added
for Index := 0 to PathList.Count-1 do
begin
OldPathAbs := IncludeTrailingPathDelimiter(ExpandFileName(PathList[Index]));
// check if the new directory is a sub-directory of a previously added one.
// This is also true, if both paths point to the same directories.
if (AnsiStartsText(OldPathAbs, PathAbs)) then
begin
// ignore the new path
Exit;
end;
// check if a previously added directory is a sub-directory of the new one.
if (AnsiStartsText(PathAbs, OldPathAbs)) then
begin
// replace the old with the new one.
PathList[Index] := PathAbs;
Exit;
end;
end;
PathList.Add(PathAbs);
end;
procedure AddSongPath(const Path: string);
begin
AddSpecialPath(SongPaths, Path);
end;
procedure AddCoverPath(const Path: string);
begin
AddSpecialPath(CoverPaths, Path);
end;
(**
* Initialize a path variable
* After setting paths, make sure that paths exist
*)
function FindPath(out PathResult: string;
const RequestedPath: string;
NeedsWritePermission: boolean)
: boolean;
begin
Result := false;
if (RequestedPath = '') then
Exit;
// Make sure the directory exists
if (not ForceDirectories(RequestedPath)) then
begin
PathResult := '';
Exit;
end;
PathResult := IncludeTrailingPathDelimiter(RequestedPath);
if (NeedsWritePermission) and
(FileIsReadOnly(RequestedPath)) then
begin
Exit;
end;
Result := true;
end;
(**
* Function sets all absolute paths e.g. song path and makes sure the directorys exist
*)
procedure InitializePaths;
begin
// Log directory (must be writable)
if (not FindPath(LogPath, Platform.GetLogPath, true)) then
begin
Log.FileOutputEnabled := false;
Log.LogWarn('Log directory "'+ Platform.GetLogPath +'" not available', 'InitializePaths');
end;
FindPath(SoundPath, Platform.GetGameSharedPath + 'sounds', false);
FindPath(ThemePath, Platform.GetGameSharedPath + 'themes', false);
FindPath(SkinsPath, Platform.GetGameSharedPath + 'themes', false);
FindPath(LanguagesPath, Platform.GetGameSharedPath + 'languages', false);
FindPath(PluginPath, Platform.GetGameSharedPath + 'plugins', false);
FindPath(VisualsPath, Platform.GetGameSharedPath + 'visuals', false);
FindPath(FontPath, Platform.GetGameSharedPath + 'fonts', false);
FindPath(ResourcesPath, Platform.GetGameSharedPath + 'resources', false);
// Playlists are not shared as we need one directory to write too
FindPath(PlaylistPath, Platform.GetGameUserPath + 'playlists', true);
// Screenshot directory (must be writable)
if (not FindPath(ScreenshotsPath, Platform.GetGameUserPath + 'screenshots', true)) then
begin
Log.LogWarn('Screenshot directory "'+ Platform.GetGameUserPath +'" not available', 'InitializePaths');
end;
// Add song paths
AddSongPath(Params.SongPath);
AddSongPath(Platform.GetGameSharedPath + 'songs');
AddSongPath(Platform.GetGameUserPath + 'songs');
// Add category cover paths
AddCoverPath(Platform.GetGameSharedPath + 'covers');
AddCoverPath(Platform.GetGameUserPath + 'covers');
end;
end.