
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4417 8e941d3f-bd1b-0410-a28a-d453659cc2b4
191 lines
4.9 KiB
ObjectPascal
191 lines
4.9 KiB
ObjectPascal
unit XcodeUtils;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, PlistFile, LazFilesUtils;
|
|
|
|
const
|
|
iPhoneOSplatform = 'iPhoneOS.platform';
|
|
|
|
// file names should utf8 encoded
|
|
|
|
|
|
// Scanning Xcode platform for available SDKs
|
|
|
|
type
|
|
TSDKFoundEvent = procedure (const Version: String;
|
|
const DeviceSDKName, DeviceSDKPath, SimSDKName, SimSDKPath: String) of object;
|
|
|
|
function ScanForSDK(const PlatformDir: String; FoundProc: TSDKFoundEvent): Boolean;
|
|
|
|
// Scanning for Templates
|
|
|
|
function XibTemplateDir(const PlatformDir: AnsiString): AnsiString;
|
|
|
|
type
|
|
TScanTemplateProc = procedure ( const TemplateName, XibFileName,
|
|
Description, IconFileName: AnsiString) of object;
|
|
|
|
procedure ScanForXibTemplates(const TemplateDir: AnsiString; Callback: TScanTemplateProc);
|
|
|
|
implementation
|
|
|
|
type
|
|
TSDKDescription = record
|
|
FullPath : String; {full SDK path}
|
|
Name : String;
|
|
Alternate : String; {alternate SDK -> iphonesimulator for iphoneos}
|
|
Version : String;
|
|
isSim : Boolean; {true for real iPhoneOS, false for iPhoneSimulator}
|
|
end;
|
|
|
|
function ReadSDKSettings(const FileName: String; var Descr: TSDKDescription): Boolean;
|
|
var
|
|
plist : TPListFile;
|
|
begin
|
|
Result:=False;
|
|
plist:=TPListFile.Create;
|
|
try
|
|
plistfile.LoadFromFile(FileName, plist);
|
|
|
|
Descr.Name:=GetStr(plist, 'CanonicalName');
|
|
Descr.Alternate:=GetStr(plist, 'AlternateSDK');
|
|
Descr.Version:=GetStr(plist, 'Version');
|
|
finally
|
|
plist.Free;
|
|
end;
|
|
end;
|
|
|
|
function isSDKDir(const SDKDir: String; var d: TSDKDescription): Boolean;
|
|
var
|
|
plist : String;
|
|
begin
|
|
plist := IncludeTrailingPathDelimiter(SDKDir)+'SDKSettings.plist';
|
|
Result:=FileExists(plist);
|
|
if not Result then Exit;
|
|
ReadSDKSettings(plist, d);
|
|
d.FullPath:=SDKDir;
|
|
end;
|
|
|
|
function ScanForSDK(const PlatformDir: String; FoundProc: TSDKFoundEvent): Boolean;
|
|
const
|
|
PlatformName: array [Boolean] of String = ('iPhoneOS.platform','iPhoneSimulator.platform');
|
|
SDKSubDir = PathDelim+'Developer'+PathDelim+'SDKs'+PathDelim;
|
|
var
|
|
isSim : Boolean;
|
|
dir : String;
|
|
sr : TSearchRec;
|
|
sdks : array of TSDKDescription;
|
|
descr : TSDKDescription;
|
|
cnt : Integer;
|
|
simname : String;
|
|
simpath : String;
|
|
i,j : Integer;
|
|
|
|
procedure AddDescription(const d: TSDKDescription);
|
|
begin
|
|
if cnt = length(sdks) then begin
|
|
if cnt = 0 then SetLength(sdks, 16)
|
|
else SetLength(sdks, cnt*2);
|
|
end;
|
|
sdks[cnt]:=d;
|
|
inc(cnt);
|
|
end;
|
|
|
|
begin
|
|
Result:=Assigned(FoundProc);
|
|
if not Result then Exit;
|
|
|
|
cnt:=0;
|
|
|
|
for isSim:=false to true do begin
|
|
dir := IncludeTrailingPathDelimiter(PlatformDir) + PlatformName[isSim] + SDKSubDir;
|
|
if FindFirst(dir+'*', faAnyFile, sr)=0 then begin
|
|
repeat
|
|
if (sr.Attr and faDirectory>0) and (ExtractFileExt(sr.Name) = '.sdk') then
|
|
if isSDKDir( dir + sr.Name, descr) then begin
|
|
descr.isSim:=isSim;
|
|
AddDescription(descr);
|
|
end;
|
|
until FindNext(sr)<>0;
|
|
FindClose(sr);
|
|
end;
|
|
end;
|
|
|
|
for i:=0 to cnt-1 do
|
|
if not sdks[i].isSim then begin
|
|
simname:='';
|
|
simpath:='';
|
|
for j:=0 to cnt-1 do
|
|
if (sdks[j].isSim) and (sdks[i].Alternate=sdks[j].Name) then begin
|
|
simname:=sdks[j].Name;
|
|
simpath:=sdks[j].FullPath;
|
|
end;
|
|
FoundProc(sdks[i].Version, sdks[i].Name, sdks[i].FullPath, simname, simpath);
|
|
end;
|
|
|
|
Result:=True;
|
|
end;
|
|
|
|
|
|
function XibTemplateDir(const PlatformDir: AnsiString): AnsiString;
|
|
const
|
|
TemplatePath = 'Developer/Library/Xcode/File Templates/User Interface';
|
|
begin
|
|
Result:=IncludeTrailingPathDelimiter(PlatformDir)+TemplatePath;
|
|
end;
|
|
|
|
procedure ScanForXibTemplates(const TemplateDir: AnsiString; Callback: TScanTemplateProc);
|
|
var
|
|
dirs : TStringList;
|
|
files : TStringList;
|
|
i,j : Integer;
|
|
plist : TPListFile;
|
|
|
|
xib : AnsiString;
|
|
name : AnsiString;
|
|
descr : AnsiString;
|
|
const
|
|
XibTemplateMask = '*.pbfiletemplate';
|
|
IconFile = 'TemplateIcon.tiff';
|
|
begin
|
|
if not Assigned(Callback) or not DirectoryExists(TemplateDir) then Exit;
|
|
|
|
dirs:=TStringList.Create;
|
|
files:=TStringList.Create;
|
|
try
|
|
EnumFilesAtDir( TemplateDir, XibTemplateMask, dirs );
|
|
for i:=0 to dirs.Count-1 do begin
|
|
if DirectoryExists(dirs[i]) then begin
|
|
files.Clear;
|
|
EnumFilesAtDir(dirs[i], files);
|
|
|
|
xib:='';
|
|
for j:=0 to files.Count-1 do
|
|
if AnsiLowerCase(ExtractFileExt(files[j]))='.plist' then begin
|
|
plist:=TPListFile.Create;
|
|
plistfile.LoadFromFile(files[j],plist);
|
|
xib:=GetStr(plist, 'MainTemplateFile');
|
|
descr:=GetStr(plist, 'Description');
|
|
name:=ChangeFileExt(xib, '');
|
|
Break;
|
|
end;
|
|
|
|
if xib<>'' then begin
|
|
xib:=IncludeTrailingPathDelimiter(dirs[i])+xib;
|
|
Callback(name, xib, descr, IncludeTrailingPathDelimiter(dirs[i])+IconFile);
|
|
end;
|
|
end;
|
|
end;
|
|
finally
|
|
dirs.Free;
|
|
files.Free;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|