diff options
Diffstat (limited to 'src/base/UPlatformMacOSX.pas')
-rw-r--r-- | src/base/UPlatformMacOSX.pas | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/src/base/UPlatformMacOSX.pas b/src/base/UPlatformMacOSX.pas deleted file mode 100644 index 1dc0014a..00000000 --- a/src/base/UPlatformMacOSX.pas +++ /dev/null @@ -1,279 +0,0 @@ -{* 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$ - * $Id$ - *} - -unit UPlatformMacOSX; - -interface - -{$IFDEF FPC} - {$MODE Delphi} -{$ENDIF} - -{$I switches.inc} - -uses - Classes, - ULog, - UPlatform, - UFilesystem, - UPath; - -type - {** - * @abstract(Provides Mac OS X specific details.) - * @lastmod(August 1, 2008) - * The UPlatformMacOSX unit takes care of setting paths to resource folders. - * - * (Note for non-Maccies: "folder" is the Mac name for directory.) - * - * Note on the resource folders: - * 1. Installation of an application on the mac works as follows: Extract and - * copy an application and if you don't like or need the application - * anymore you move the folder to the trash - and you're done. - * 2. The use of folders in the user's home directory is against Apple's - * guidelines and strange to an average user. - * 3. Even worse is using /usr/local/... since all lowercase folders in / are - * not visible to an average user in the Finder, at least not without some - * "tricks". - * - * The best way would be to store everything within the application bundle. - * However, this requires USDX to offer the handling of the resources. Until - * this is implemented, the second best solution is as follows: - * - * According to Aple guidelines handling of resources and folders should follow - * these lines: - * - * Acceptable places for files are folders named UltraStarDeluxe either in - * /Library/Application Support/ - * or - * ~/Library/Application Support/ - * - * So - * GetGameSharedPath could return - * /Library/Application Support/UltraStarDeluxe/. - * GetGameUserPath could return - * ~/Library/Application Support/UltraStarDeluxe/. - * - * Right now, only $HOME/Library/Application Support/UltraStarDeluxe - * is used. So every user needs the complete set of files and folders. - * Future versions may also use shared resources in - * /Library/Application Support/UltraStarDeluxe. However, this is - * not treated yet in the code outside this unit. - * - * USDX checks, whether GetGameUserPath exists. If not, USDX creates it. - * The existence of needed files is then checked and if a file is missing - * it is copied to there from within the folder Contents in the Application - * bundle, which contains the default files. USDX should not delete files or - * folders in Application Support/UltraStarDeluxe automatically or without - * user confirmation. - *} - TPlatformMacOSX = class(TPlatform) - private - {** - * GetBundlePath returns the path to the application bundle - * UltraStarDeluxe.app. - *} - function GetBundlePath: IPath; - - {** - * GetApplicationSupportPath returns the path to - * $HOME/Library/Application Support/UltraStarDeluxe. - *} - function GetApplicationSupportPath: IPath; - - {** - * see the description of @link(Init). - *} - procedure CreateUserFolders(); - - function GetHomeDir(): IPath; - - public - {** - * Init simply calls @link(CreateUserFolders), which in turn scans the - * folder UltraStarDeluxe.app/Contents for all files and - * folders. $HOME/Library/Application Support/UltraStarDeluxe - * is then checked for their presence and missing ones are copied. - *} - procedure Init; override; - - {** - * GetLogPath returns the path for log messages. Currently it is set to - * $HOME/Library/Application Support/UltraStarDeluxe/Log. - *} - function GetLogPath : IPath; override; - - {** - * GetGameSharedPath returns the path for shared resources. Currently it - * is set to /Library/Application Support/UltraStarDeluxe. - * However it is not used. - *} - function GetGameSharedPath : IPath; override; - - {** - * GetGameUserPath returns the path for user resources. Currently it is - * set to $HOME/Library/Application Support/UltraStarDeluxe. - * This is where a user can add songs, themes, .... - *} - function GetGameUserPath : IPath; override; - end; - -implementation - -uses - SysUtils; - -procedure TPlatformMacOSX.Init; -begin - CreateUserFolders(); -end; - -procedure TPlatformMacOSX.CreateUserFolders(); -var - RelativePath: IPath; - // BaseDir contains the path to the folder, where a search is performed. - // It is set to the entries in @link(DirectoryList) one after the other. - BaseDir: IPath; - // OldBaseDir contains the path to the folder, where the search started. - // It is used to return to it, when the search is completed in all folders. - OldBaseDir: IPath; - Iter: IFileIterator; - FileInfo: TFileInfo; - CurPath: IPath; - // These two lists contain all folder and file names found - // within the folder @link(BaseDir). - DirectoryList, FileList: IInterfaceList; - // DirectoryIsFinished contains the index of the folder in @link(DirectoryList), - // which is the last one completely searched. Later folders are still to be - // searched for additional files and folders. - DirectoryIsFinished: longint; - I: longint; - // These three are for creating directories, due to possible symlinks - CreatedDirectory: boolean; - FileAttrs: integer; - DirectoryPath: IPath; - UserPath: IPath; - SrcFile, TgtFile: IPath; -begin - // Get the current folder and save it in OldBaseDir for returning to it, when - // finished. - OldBaseDir := FileSystem.GetCurrentDir(); - - // UltraStarDeluxe.app/Contents contains all the default files and folders. - BaseDir := OldBaseDir.Append('UltraStarDeluxe.app/Contents'); - FileSystem.SetCurrentDir(BaseDir); - - // Right now, only $HOME/Library/Application Support/UltraStarDeluxe is used. - UserPath := GetGameUserPath(); - - DirectoryIsFinished := 0; - // replace with IInterfaceList - DirectoryList := TInterfaceList.Create(); - FileList := TInterfaceList.Create(); - DirectoryList.Add(Path('.')); - - // create the folder and file lists - repeat - RelativePath := (DirectoryList[DirectoryIsFinished] as IPath); - FileSystem.SetCurrentDir(BaseDir.Append(RelativePath)); - Iter := FileSystem.FileFind(Path('*'), faAnyFile); - while (Iter.HasNext) do - begin - FileInfo := Iter.Next; - CurPath := FileInfo.Name; - if CurPath.IsDirectory() then - begin - if (not CurPath.Equals('.')) and (not CurPath.Equals('..')) then - DirectoryList.Add(RelativePath.Append(CurPath)); - end - else - Filelist.Add(RelativePath.Append(CurPath)); - end; - Inc(DirectoryIsFinished); - until (DirectoryIsFinished = DirectoryList.Count); - - // create missing folders - UserPath.CreateDirectory(true); // should not be necessary since (UserPathName+'/.') is created. - for I := 0 to DirectoryList.Count-1 do - begin - CurPath := DirectoryList[I] as IPath; - DirectoryPath := UserPath.Append(CurPath); - CreatedDirectory := DirectoryPath.CreateDirectory(); - FileAttrs := DirectoryPath.GetAttr(); - // Maybe analyse the target of the link with FpReadlink(). - // Let's assume the symlink is pointing to an existing directory. - if (not CreatedDirectory) and (FileAttrs and faSymLink > 0) then - Log.LogError('Failed to create the folder "'+ DirectoryPath.ToNative +'"', - 'TPlatformMacOSX.CreateUserFolders'); - end; - - // copy missing files - for I := 0 to Filelist.Count-1 do - begin - CurPath := Filelist[I] as IPath; - SrcFile := BaseDir.Append(CurPath); - TgtFile := UserPath.Append(CurPath); - SrcFile.CopyFile(TgtFile, true); - end; - - // go back to the initial folder - FileSystem.SetCurrentDir(OldBaseDir); -end; - -function TPlatformMacOSX.GetBundlePath: IPath; -begin - // Mac applications are packaged in folders. - // Cutting the last two folders yields the application folder. - Result := GetExecutionDir().GetParent().GetParent(); -end; - -function TPlatformMacOSX.GetApplicationSupportPath: IPath; -const - PathName: string = 'Library/Application Support/UltraStarDeluxe'; -begin - Result := GetHomeDir().Append(PathName, pdAppend); -end; - -function TPlatformMacOSX.GetHomeDir(): IPath; -begin - Result := Path(GetEnvironmentVariable('HOME')); -end; - -function TPlatformMacOSX.GetLogPath: IPath; -begin - Result := GetApplicationSupportPath.Append('Logs'); -end; - -function TPlatformMacOSX.GetGameSharedPath: IPath; -begin - Result := GetApplicationSupportPath; -end; - -function TPlatformMacOSX.GetGameUserPath: IPath; -begin - Result := GetApplicationSupportPath; -end; - -end. |