aboutsummaryrefslogblamecommitdiffstats
path: root/src/base/UPath.pas
blob: 2316ac02bec17adf2fa499bc66406ce5651ac0dc (plain) (tree)



























































































































































































                                                                                                               
{* 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.