2011-06-15 10:16:23 +00:00
|
|
|
unit android_sdk_bindings_gen;
|
|
|
|
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
uses
|
|
|
|
Classes, SysUtils;
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
|
|
{ TAndroidSDKBindingsGen }
|
|
|
|
|
|
|
|
TAndroidSDKBindingsGen = class
|
|
|
|
private
|
2011-07-18 13:33:05 +00:00
|
|
|
FSourceFile: TStringList;
|
|
|
|
FPasOutputTypes, FPasOutputClassesForward, FPasOutputClasses,
|
|
|
|
FPasOutputConsts, FPasOutputIDs, FPasOutputImpl, FPasOutputMessages: TStringList;
|
2011-06-15 13:32:40 +00:00
|
|
|
FJavaOutputIDs, FJavaOutputMethods: TStringList;
|
2011-06-15 13:39:45 +00:00
|
|
|
FClassName, FClassNamePas: string; // Class name of the class currently being parsed
|
2011-06-15 12:00:24 +00:00
|
|
|
FClassNum, FMethodNum: Integer;
|
2011-08-08 09:30:32 +00:00
|
|
|
procedure GeneratePascalFile(ASourceFile: string; ADest: TStringList);
|
|
|
|
procedure GenerateJavaFile(ASourceFile: string; ADest: TStringList);
|
2011-06-15 13:32:40 +00:00
|
|
|
procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string);
|
2011-06-15 10:16:23 +00:00
|
|
|
procedure ProcessModelLine(ASourceLine: string);
|
2011-06-15 14:45:40 +00:00
|
|
|
procedure ProcessModelClass(ASourceLine: string);
|
2011-07-21 13:32:32 +00:00
|
|
|
procedure ProcessModelMethod(ASourceLine: string; AIsField: Boolean);
|
2011-06-15 14:45:40 +00:00
|
|
|
procedure ProcessModelConstructor(ASourceLine: string);
|
2011-07-14 09:44:35 +00:00
|
|
|
procedure ProcessModelConst(ASourceLine: string);
|
2011-07-18 13:33:05 +00:00
|
|
|
procedure ProcessModelCallbackSetterCaller(ASourceLine: string);
|
2011-06-15 10:16:23 +00:00
|
|
|
function GetNextWord(ALine: string; var AStartPos: Integer): string;
|
|
|
|
function GetPascalTypeName(ABaseName: string): string;
|
2011-07-14 09:44:35 +00:00
|
|
|
function PassByReference(ABaseName: string): Boolean;
|
2011-06-15 14:45:40 +00:00
|
|
|
function GetJavaResultFunction(AReturnType: string): string;
|
|
|
|
function GetJavaTypeReader(AType: string): string;
|
2011-08-08 09:30:32 +00:00
|
|
|
function GetJavaTypeLocalVar(AType: string): string;
|
|
|
|
function GetJavaTypeConverter(AType: string): string;
|
2011-07-14 09:44:35 +00:00
|
|
|
function GetIDString(AMethodName: string): string;
|
|
|
|
procedure AddOutputIDs(AIDString: string);
|
2011-08-08 09:30:32 +00:00
|
|
|
function ConvertPointToUnderline(AStr: string): string;
|
|
|
|
function IsBasicJavaType(AStr: string): Boolean;
|
2011-06-15 10:16:23 +00:00
|
|
|
public
|
2011-06-15 12:00:24 +00:00
|
|
|
constructor Create;
|
|
|
|
destructor Destroy; override;
|
2011-06-15 10:16:23 +00:00
|
|
|
procedure GenerateAllBindings(AInputDir, APasOutputDir, AJavaOutputDir: string);
|
|
|
|
end;
|
|
|
|
|
|
|
|
var
|
|
|
|
AndroidSDKBindingsGen: TAndroidSDKBindingsGen;
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
{ TAndroidSDKBindingsGen }
|
|
|
|
|
2011-08-08 09:30:32 +00:00
|
|
|
procedure TAndroidSDKBindingsGen.GeneratePascalFile(ASourceFile: string; ADest: TStringList);
|
|
|
|
begin
|
|
|
|
ADest.Add(Format('unit %s;', [ChangeFileExt(ExtractFileName(ASourceFile), '')]));
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('interface');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('uses javalang, androidpipescomm;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('type');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' { Forward declaration of classes }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FPasOutputClassesForward);
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' { Types }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FPasOutputTypes);
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' { Classes }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FPasOutputClasses);
|
|
|
|
ADest.Add(' end;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('function HandleMessage(AFirstInt: Integer): Boolean;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('implementation');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('const');
|
|
|
|
ADest.Add(' { Constants }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FPasOutputConsts);
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' { IDs }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FPasOutputIDs);
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('{ Implementation of Classes }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FPasOutputImpl);
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('{ Message Handling }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('function HandleMessage(AFirstInt: Integer): Boolean;');
|
|
|
|
ADest.Add('var');
|
|
|
|
ADest.Add(' lInt: Integer;');
|
|
|
|
ADest.Add(' lPascalPointer: PtrInt = -1;');
|
|
|
|
ADest.Add('begin');
|
|
|
|
ADest.Add(' case AFirstInt of');
|
|
|
|
ADest.AddStrings(FPasOutputMessages);
|
|
|
|
ADest.Add(' end;');
|
|
|
|
ADest.Add('end;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('end.');
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TAndroidSDKBindingsGen.GenerateJavaFile(ASourceFile: string; ADest: TStringList);
|
|
|
|
begin
|
|
|
|
ADest.Add('package com.pascal.androidlcl;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('import android.app.*;');
|
|
|
|
ADest.Add('import android.view.*;');
|
|
|
|
ADest.Add('import android.os.*;');
|
|
|
|
ADest.Add('import android.util.*;');
|
|
|
|
ADest.Add('import android.content.*;');
|
|
|
|
ADest.Add('import android.view.*;');
|
|
|
|
ADest.Add('import android.widget.*;');
|
|
|
|
ADest.Add('import java.util.*;');
|
|
|
|
ADest.Add('import java.lang.*;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add('public class AndroidAll');
|
|
|
|
ADest.Add('{');
|
|
|
|
ADest.Add(' // info from other classes');
|
|
|
|
ADest.Add(' Activity activity;');
|
|
|
|
ADest.Add(' AndroidPipesComm MyAndroidPipesComm;');
|
|
|
|
ADest.Add(' JavaLang MyJavaLang;');
|
|
|
|
ADest.Add(' // lists of variables');
|
|
|
|
ADest.Add(' ArrayList ViewElements;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' public AndroidAll(AndroidPipesComm AAndroidPipesComm, Activity AActivity, JavaLang AJavaLang)');
|
|
|
|
ADest.Add(' {');
|
|
|
|
ADest.Add(' activity = AActivity;');
|
|
|
|
ADest.Add(' MyAndroidPipesComm = AAndroidPipesComm;');
|
|
|
|
ADest.Add(' MyJavaLang = AJavaLang;');
|
|
|
|
ADest.Add(' ViewElements = new ArrayList();');
|
|
|
|
ADest.Add(' }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' public void DebugOut(String Str)');
|
|
|
|
ADest.Add(' {');
|
|
|
|
ADest.Add(' MyAndroidPipesComm.DebugOut(Str);');
|
|
|
|
ADest.Add(' }');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FJavaOutputIDs);
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' public boolean ProcessCommand(int Buffer)');
|
|
|
|
ADest.Add(' {');
|
|
|
|
ADest.Add(' //DebugOut("AndroidUI.ProcessCommand Command=" + java.lang.Integer.toHexString(Buffer));');
|
|
|
|
ADest.Add(' // basic types');
|
|
|
|
ADest.Add(' int lInt, lIndex, lPascalPointer;');
|
|
|
|
ADest.Add(' boolean lBool;');
|
|
|
|
ADest.Add(' float lFloat;');
|
|
|
|
ADest.Add(' // Self params');
|
|
|
|
ADest.Add(' View param_self_View;');
|
|
|
|
ADest.Add(' ViewGroup param_self_ViewGroup;');
|
|
|
|
ADest.Add(' TextView param_self_TextView;');
|
|
|
|
ADest.Add(' Button param_self_Button;');
|
|
|
|
ADest.Add(' EditText param_self_EditText;');
|
|
|
|
ADest.Add(' LinearLayout param_self_LinearLayout;');
|
|
|
|
ADest.Add(' TimePicker param_self_TimePicker;');
|
|
|
|
ADest.Add(' Display param_self_Display;');
|
|
|
|
ADest.Add(' DisplayMetrics param_self_DisplayMetrics;');
|
|
|
|
ADest.Add(' CompoundButton param_self_CompoundButton;');
|
|
|
|
ADest.Add(' WindowManager param_self_WindowManager;');
|
|
|
|
ADest.Add(' // Params');
|
2011-08-08 13:58:57 +00:00
|
|
|
ADest.Add(' ViewGroup.LayoutParams lViewGroup_LayoutParams_1, lViewGroup_LayoutParams_2;');
|
2011-08-08 09:30:32 +00:00
|
|
|
ADest.Add(' DisplayMetrics lDisplayMetrics_1;');
|
|
|
|
ADest.Add(' CharSequence lCharSequence_1;');
|
2011-08-08 13:58:57 +00:00
|
|
|
ADest.Add(' View lView_1;');
|
2011-08-08 09:30:32 +00:00
|
|
|
ADest.Add(' int lint_1, lint_2, lint_3, lint_4;');
|
|
|
|
ADest.Add(' float lfloat_1, lfloat_2;');
|
|
|
|
ADest.Add(' boolean lboolean_1;');
|
|
|
|
ADest.Add(' // Results');
|
|
|
|
ADest.Add(' float lResult_float;');
|
|
|
|
ADest.Add(' int lResult_int;');
|
|
|
|
ADest.Add(' boolean lResult_boolean;');
|
|
|
|
ADest.Add(' Display lResult_Display;');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' switch (Buffer)');
|
|
|
|
ADest.Add(' {');
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.AddStrings(FJavaOutputMethods);
|
|
|
|
ADest.Add('');
|
|
|
|
ADest.Add(' default:');
|
|
|
|
ADest.Add(' return false;');
|
|
|
|
ADest.Add(' }');
|
|
|
|
ADest.Add(' return true;');
|
|
|
|
ADest.Add(' }');
|
|
|
|
ADest.Add('}');
|
|
|
|
end;
|
|
|
|
|
2011-06-15 10:16:23 +00:00
|
|
|
procedure TAndroidSDKBindingsGen.ProcessModelFile(ASourceFile, APasOutputFile,
|
2011-06-15 13:32:40 +00:00
|
|
|
AJavaOutputFile: string);
|
2011-06-15 10:16:23 +00:00
|
|
|
var
|
|
|
|
i: Integer;
|
|
|
|
lPasOutputFile: TStringList;
|
2011-06-15 13:32:40 +00:00
|
|
|
lJavaOutputFile: TStringList;
|
2011-06-15 10:16:23 +00:00
|
|
|
begin
|
|
|
|
lPasOutputFile := TStringList.Create;
|
2011-06-15 13:32:40 +00:00
|
|
|
lJavaOutputFile := TStringList.Create;
|
2011-06-15 10:16:23 +00:00
|
|
|
try
|
|
|
|
FSourceFile.LoadFromFile(ASourceFile);
|
|
|
|
|
|
|
|
// Preparations
|
|
|
|
FClassName := '';
|
|
|
|
|
|
|
|
for i := 0 to FSourceFile.Count - 1 do
|
|
|
|
begin
|
|
|
|
ProcessModelLine(FSourceFile.Strings[i]);
|
|
|
|
end;
|
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
// Now save the Pascal file
|
2011-08-08 09:30:32 +00:00
|
|
|
GeneratePascalFile(ASourceFile, lPasOutputFile);
|
2011-06-15 10:16:23 +00:00
|
|
|
|
|
|
|
lPasOutputFile.SaveToFile(APasOutputFile);
|
2011-06-15 13:32:40 +00:00
|
|
|
|
2011-08-08 09:30:32 +00:00
|
|
|
GenerateJavaFile(ASourceFile, lJavaOutputFile);
|
2011-06-15 13:32:40 +00:00
|
|
|
|
|
|
|
lJavaOutputFile.SaveToFile(AJavaOutputFile);
|
2011-06-15 10:16:23 +00:00
|
|
|
finally
|
2011-06-15 13:32:40 +00:00
|
|
|
lJavaOutputFile.Free;
|
2011-06-15 10:16:23 +00:00
|
|
|
lPasOutputFile.Free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TAndroidSDKBindingsGen.ProcessModelLine(ASourceLine: string);
|
|
|
|
var
|
|
|
|
lReaderPos: Integer = 1;
|
2011-06-15 13:32:40 +00:00
|
|
|
lCurWord: string;
|
2011-06-15 10:16:23 +00:00
|
|
|
begin
|
|
|
|
if ASourceLine = '' then Exit;
|
|
|
|
|
|
|
|
lCurWord := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
|
2011-06-15 12:00:24 +00:00
|
|
|
// Comments
|
|
|
|
if ASourceLine[1] = '#' then Exit;
|
|
|
|
|
2011-06-15 10:16:23 +00:00
|
|
|
// Starting a new class
|
|
|
|
if ASourceLine[1] = '[' then
|
|
|
|
begin
|
2011-06-15 14:45:40 +00:00
|
|
|
ProcessModelClass(ASourceLine);
|
2011-06-15 12:00:24 +00:00
|
|
|
Exit;
|
2011-06-15 10:16:23 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
// Adding methods to a class
|
|
|
|
if lCurWord = 'method' then
|
|
|
|
begin
|
2011-07-21 13:32:32 +00:00
|
|
|
ProcessModelMethod(ASourceLine, False);
|
2011-06-15 14:45:40 +00:00
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if lCurWord = 'constructor' then
|
|
|
|
begin
|
|
|
|
ProcessModelConstructor(ASourceLine);
|
2011-06-15 13:32:40 +00:00
|
|
|
Exit;
|
|
|
|
end;
|
2011-07-14 09:44:35 +00:00
|
|
|
|
|
|
|
// Constants
|
|
|
|
if lCurWord = 'const' then
|
|
|
|
begin
|
|
|
|
ProcessModelConst(ASourceLine);
|
|
|
|
Exit;
|
|
|
|
end;
|
2011-07-18 13:33:05 +00:00
|
|
|
|
|
|
|
// Callbacks
|
|
|
|
if lCurWord = 'callbacksettercaller' then
|
|
|
|
begin
|
|
|
|
ProcessModelCallbackSetterCaller(ASourceLine);
|
|
|
|
Exit;
|
|
|
|
end;
|
2011-07-21 13:32:32 +00:00
|
|
|
|
|
|
|
// Fields
|
|
|
|
if lCurWord = 'field' then
|
|
|
|
begin
|
|
|
|
ProcessModelMethod(ASourceLine, True);
|
|
|
|
Exit;
|
|
|
|
end;
|
2011-06-15 13:32:40 +00:00
|
|
|
end;
|
|
|
|
|
2011-06-15 14:45:40 +00:00
|
|
|
procedure TAndroidSDKBindingsGen.ProcessModelClass(ASourceLine: string);
|
2011-06-15 13:32:40 +00:00
|
|
|
var
|
|
|
|
lReaderPos: Integer = 1;
|
|
|
|
lCurWord, lParentClassName: string;
|
|
|
|
begin
|
|
|
|
if ASourceLine = '' then Exit;
|
|
|
|
|
|
|
|
lCurWord := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
|
|
|
|
if FClassName <> '' then
|
|
|
|
begin
|
|
|
|
FPasOutputClasses.Add(' end;');
|
|
|
|
FPasOutputClasses.Add('');
|
|
|
|
end;
|
|
|
|
|
2011-06-15 13:39:45 +00:00
|
|
|
FClassNamePas := GetPascalTypeName(lCurWord);
|
|
|
|
FClassName := lCurWord;
|
2011-06-15 13:32:40 +00:00
|
|
|
lParentClassName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
lParentClassName := GetPascalTypeName(lParentClassName);
|
2011-06-15 13:39:45 +00:00
|
|
|
FPasOutputClasses.Add(Format(' %s = class(%s)', [FClassNamePas, lParentClassName]));
|
2011-06-15 13:32:40 +00:00
|
|
|
FPasOutputClasses.Add(' public');
|
|
|
|
lCurWord := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
Inc(FClassNum);
|
|
|
|
FMethodNum := 0;
|
|
|
|
|
2011-06-15 13:39:45 +00:00
|
|
|
FPasOutputIDs.Add(' // ' + FClassNamePas);
|
2011-06-15 13:32:40 +00:00
|
|
|
FJavaOutputIDs.Add(' // ' + FClassName);
|
2011-07-14 09:44:35 +00:00
|
|
|
FPasOutputConsts.Add(' { ' + FClassNamePas + ' }');
|
2011-07-18 13:33:05 +00:00
|
|
|
FPasOutputClassesForward.Add(' ' + FClassNamePas + ' = class;')
|
2011-06-15 13:32:40 +00:00
|
|
|
end;
|
|
|
|
|
2011-06-15 14:45:40 +00:00
|
|
|
procedure TAndroidSDKBindingsGen.ProcessModelMethod(
|
2011-07-21 13:32:32 +00:00
|
|
|
ASourceLine: string; AIsField: Boolean);
|
2011-06-15 13:32:40 +00:00
|
|
|
var
|
|
|
|
lReaderPos: Integer = 1;
|
|
|
|
lParamNum: Integer = 1;
|
|
|
|
lCurWord, lParentClassName: string;
|
2011-07-18 13:33:05 +00:00
|
|
|
lMethodReturn, lMethodReturnPas, lMethodName, lParamType, lParamTypePas, lParamName, lParamPrefix: string;
|
2011-06-15 13:32:40 +00:00
|
|
|
DeclarationBase, TmpStr, lIDString: string;
|
|
|
|
FPasOutputImplCurLine: Integer;
|
|
|
|
lJavaParamVar, lJavaParams, lJavaParamSelf: string;
|
|
|
|
begin
|
|
|
|
if ASourceLine = '' then Exit;
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
lCurWord := GetNextWord(ASourceLine, lReaderPos);
|
2011-06-15 12:00:24 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
// Method type and name
|
|
|
|
lMethodReturn := GetNextWord(ASourceLine, lReaderPos);
|
2011-06-15 13:39:45 +00:00
|
|
|
lMethodReturnPas := GetPascalTypeName(lMethodReturn);
|
2011-06-15 13:32:40 +00:00
|
|
|
lMethodName := GetNextWord(ASourceLine, lReaderPos);
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
if lMethodReturn = 'void' then DeclarationBase := 'procedure '
|
|
|
|
else DeclarationBase := 'function ';
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
// Beginning of the implementation part
|
|
|
|
FPasOutputImplCurLine := FPasOutputImpl.Count;
|
2011-07-14 09:44:35 +00:00
|
|
|
lIDString := GetIDString(lMethodName);
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
FPasOutputImpl.Add('begin');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Pointer');
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
lJavaParamSelf := 'param_self_' + FClassName;
|
2011-06-15 14:45:40 +00:00
|
|
|
FJavaOutputMethods.Add(' // ' + ASourceLine);
|
|
|
|
FJavaOutputMethods.Add(' case ' + lIDString + ':');
|
|
|
|
FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");');
|
|
|
|
FJavaOutputMethods.Add(' // Self');
|
|
|
|
FJavaOutputMethods.Add(' lInt = MyAndroidPipesComm.GetInt();');
|
|
|
|
FJavaOutputMethods.Add(' ' + lJavaParamSelf + ' = (' + FClassName + ') ViewElements.get(lInt);');
|
|
|
|
FJavaOutputMethods.Add(' // params');
|
2011-06-15 12:00:24 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
// Lists of constants for the IDs
|
2011-07-14 09:44:35 +00:00
|
|
|
AddOutputIDs(lIDString);
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
// Add all parameters
|
|
|
|
TmpStr := lMethodName + '(';
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
repeat
|
|
|
|
lParamType := GetNextWord(ASourceLine, lReaderPos);
|
2011-07-14 09:44:35 +00:00
|
|
|
|
|
|
|
// Method modifiers
|
|
|
|
if (lParamType = 'virtual') or (lParamType = 'override') then Continue;
|
|
|
|
|
2011-06-15 13:39:45 +00:00
|
|
|
lParamTypePas := GetPascalTypeName(lParamType);
|
2011-07-18 13:33:05 +00:00
|
|
|
lParamName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
if PassByReference(lParamType) then lParamPrefix := 'var '
|
|
|
|
else lParamPrefix := '';
|
2011-06-15 12:00:24 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
if lParamName = '' then Break;
|
2011-06-15 10:16:23 +00:00
|
|
|
|
2011-07-18 13:33:05 +00:00
|
|
|
TmpStr := TmpStr + lParamPrefix + lParamName + ': ' + lParamTypePas + '; ';
|
2011-06-15 12:00:24 +00:00
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
// Pascal parameter sending
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Integer(' + lParamName + '));');
|
|
|
|
|
|
|
|
// Java parameter reading
|
2011-08-08 09:30:32 +00:00
|
|
|
lJavaParamVar := Format('l%s_%d', [ConvertPointToUnderline(lParamType), lParamNum]);
|
|
|
|
FJavaOutputMethods.Add(Format(' %s = MyAndroidPipesComm.%s();',
|
|
|
|
[GetJavaTypeLocalVar(lParamType), GetJavaTypeReader(lParamType)]));
|
|
|
|
FJavaOutputMethods.Add(Format(' %s = %s;',
|
|
|
|
[lJavaParamVar, GetJavaTypeConverter(lParamType)]));
|
2011-06-15 13:32:40 +00:00
|
|
|
lJavaParams := lJavaParams + lJavaParamVar + ', ';
|
|
|
|
|
|
|
|
Inc(lParamNum);
|
|
|
|
until lParamName = '';
|
|
|
|
|
|
|
|
// Remove the last ; for the parameters, if necessary
|
2011-07-21 13:32:32 +00:00
|
|
|
if (Length(TmpStr) > 0) and (TmpStr[Length(TmpStr)-1] = ';') then
|
|
|
|
TmpStr := System.Copy(TmpStr, 0, Length(TmpStr)-2);
|
2011-06-15 13:32:40 +00:00
|
|
|
// And for Java params too
|
|
|
|
lJavaParams := System.Copy(lJavaParams, 0, Length(lJavaParams)-2);
|
|
|
|
|
|
|
|
// Add the return
|
|
|
|
if lMethodReturn = 'void' then
|
|
|
|
begin
|
|
|
|
TmpStr := TmpStr + ');';
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.WaitForReturn();');
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
2011-06-15 13:39:45 +00:00
|
|
|
TmpStr := TmpStr + '): ' + lMethodReturnPas + ';';
|
2011-07-18 13:33:05 +00:00
|
|
|
FPasOutputImpl.Add(' Result := ' + lMethodReturnPas + '(vAndroidPipesComm.WaitForIntReturn());');
|
2011-06-15 13:32:40 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
FPasOutputClasses.Add(' ' + DeclarationBase + TmpStr);
|
2011-06-15 13:39:45 +00:00
|
|
|
FPasOutputImpl.Insert(FPasOutputImplCurLine, DeclarationBase + FClassNamePas + '.' + TmpStr);
|
2011-06-15 13:32:40 +00:00
|
|
|
FPasOutputImpl.Add('end;');
|
|
|
|
FPasOutputImpl.Add('');
|
|
|
|
|
2011-06-15 14:45:40 +00:00
|
|
|
FJavaOutputMethods.Add(' //');
|
2011-07-21 13:32:32 +00:00
|
|
|
if AIsField then
|
|
|
|
begin
|
|
|
|
FJavaOutputMethods.Add(' lResult_' + lMethodReturn + ' = ' + lJavaParamSelf + '.' + lMethodName + ';');
|
|
|
|
FJavaOutputMethods.Add(' MyAndroidPipesComm.' + GetJavaResultFunction(lMethodReturn) + '(lResult_' + lMethodReturn + ');');
|
|
|
|
end
|
|
|
|
else if lMethodReturn = 'void' then
|
2011-06-15 13:32:40 +00:00
|
|
|
begin
|
2011-06-15 14:45:40 +00:00
|
|
|
FJavaOutputMethods.Add(' ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
|
|
|
|
FJavaOutputMethods.Add(' MyAndroidPipesComm.SendResult();');
|
2011-06-15 13:32:40 +00:00
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
2011-06-15 14:45:40 +00:00
|
|
|
FJavaOutputMethods.Add(' lResult_' + lMethodReturn + ' = ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
|
2011-08-08 09:30:32 +00:00
|
|
|
if IsBasicJavaType(lMethodReturn) then
|
|
|
|
FJavaOutputMethods.Add(' MyAndroidPipesComm.' + GetJavaResultFunction(lMethodReturn) + '(lResult_' + lMethodReturn + ');')
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
FJavaOutputMethods.Add(Format(' ViewElements.add(lResult_%s);', [lMethodReturn]));
|
|
|
|
FJavaOutputMethods.Add(Format(' MyAndroidPipesComm.%s(ViewElements.size() - 1);', [GetJavaResultFunction(lMethodReturn)]))
|
|
|
|
end;
|
2011-06-15 10:16:23 +00:00
|
|
|
end;
|
2011-06-15 14:45:40 +00:00
|
|
|
FJavaOutputMethods.Add(' break;');
|
|
|
|
|
|
|
|
Inc(FMethodNum);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TAndroidSDKBindingsGen.ProcessModelConstructor(ASourceLine: string);
|
|
|
|
var
|
|
|
|
lReaderPos: Integer = 1;
|
|
|
|
lCurWord: string;
|
|
|
|
lParamNum: Integer = 1;
|
|
|
|
lMethodName, lParamType, lParamTypePas, lParamName: string;
|
2011-07-21 13:32:32 +00:00
|
|
|
lConstructorPasParams, lConstructorJavaParams, lParamPrefix, lJavaParamVar: string;
|
|
|
|
DeclarationBase, lIDString: string;
|
2011-06-15 14:45:40 +00:00
|
|
|
FPasOutputImplCurLine: Integer;
|
2011-07-21 13:32:32 +00:00
|
|
|
HasActivityParam: Boolean = False;
|
2011-06-15 14:45:40 +00:00
|
|
|
begin
|
|
|
|
if ASourceLine = '' then Exit;
|
|
|
|
|
|
|
|
lCurWord := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
|
|
|
|
// Method type and name
|
|
|
|
lMethodName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
|
2011-07-14 09:44:35 +00:00
|
|
|
lIDString := GetIDString(lMethodName);
|
2011-06-15 14:45:40 +00:00
|
|
|
|
2011-07-21 13:32:32 +00:00
|
|
|
AddOutputIDs(lIDString);
|
|
|
|
|
2011-08-08 09:30:32 +00:00
|
|
|
FPasOutputImplCurLine := FPasOutputImpl.Count;
|
2011-06-15 14:45:40 +00:00
|
|
|
FPasOutputImpl.Add('begin');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');');
|
|
|
|
|
|
|
|
FJavaOutputMethods.Add(' case ' + lIDString + ':');
|
|
|
|
FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");');
|
2011-07-21 13:32:32 +00:00
|
|
|
|
|
|
|
// Constructor parameters
|
|
|
|
lConstructorJavaParams := '';
|
|
|
|
lConstructorPasParams := '';
|
|
|
|
|
|
|
|
repeat
|
|
|
|
lParamType := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
|
|
|
|
// Method modifiers
|
|
|
|
if (lParamType = 'virtual') or (lParamType = 'override') then Continue;
|
|
|
|
|
|
|
|
// The Activity global object doesn't appear in the Pascal side and
|
|
|
|
//comes as a single word in the txt file
|
|
|
|
if (lParamType = 'Activity') then
|
|
|
|
begin
|
|
|
|
HasActivityParam := True;
|
|
|
|
Continue;
|
|
|
|
end;
|
|
|
|
|
|
|
|
lParamTypePas := GetPascalTypeName(lParamType);
|
|
|
|
lParamName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
if PassByReference(lParamType) then lParamPrefix := 'var '
|
|
|
|
else lParamPrefix := '';
|
|
|
|
|
|
|
|
if lParamName = '' then Break;
|
|
|
|
|
|
|
|
lConstructorPasParams := lConstructorPasParams + lParamPrefix + lParamName + ': ' + lParamTypePas + '; ';
|
|
|
|
|
|
|
|
// Pascal parameter sending
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Integer(' + lParamName + '));');
|
|
|
|
|
|
|
|
// Java parameter reading
|
|
|
|
lJavaParamVar := 'l' + lParamType + '_' + IntToStr(lParamNum);
|
|
|
|
FJavaOutputMethods.Add(' ' + lJavaParamVar + ' = MyAndroidPipesComm.' + GetJavaTypeReader(lParamType) + '();');
|
|
|
|
lConstructorJavaParams := lConstructorJavaParams + lJavaParamVar + ', ';
|
|
|
|
|
|
|
|
Inc(lParamNum);
|
|
|
|
until lParamName = '';
|
|
|
|
|
|
|
|
if HasActivityParam then lConstructorJavaParams := 'activity, ' + lConstructorJavaParams;
|
|
|
|
|
|
|
|
// Remove the last ; for the parameters, if necessary
|
|
|
|
if (Length(lConstructorPasParams) > 0) and (lConstructorPasParams[Length(lConstructorPasParams)-1] = ';') then
|
|
|
|
lConstructorPasParams := System.Copy(lConstructorPasParams, 0, Length(lConstructorPasParams)-2);
|
|
|
|
// And for Java params too
|
|
|
|
lConstructorJavaParams := System.Copy(lConstructorJavaParams, 0, Length(lConstructorJavaParams)-2);
|
|
|
|
|
|
|
|
// Finalization of the constructor
|
|
|
|
|
2011-08-08 09:30:32 +00:00
|
|
|
FPasOutputClasses.Add(Format(' constructor %s(%s);', [lMethodName, lConstructorPasParams]));
|
|
|
|
//
|
|
|
|
FPasOutputImpl.Insert(FPasOutputImplCurLine,
|
|
|
|
Format('constructor %s.%s(%s);', [FClassNamePas, lMethodName, lConstructorPasParams]));
|
2011-07-21 13:32:32 +00:00
|
|
|
FPasOutputImpl.Add(' Index := vAndroidPipesComm.WaitForIntReturn();');
|
|
|
|
FPasOutputImpl.Add('end;');
|
|
|
|
|
|
|
|
FJavaOutputMethods.Add(' ViewElements.add(new ' + FClassName + '(' + lConstructorJavaParams + '));');
|
2011-06-15 14:45:40 +00:00
|
|
|
FJavaOutputMethods.Add(' MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);');
|
|
|
|
FJavaOutputMethods.Add(' break;');
|
2011-06-15 13:32:40 +00:00
|
|
|
|
|
|
|
Inc(FMethodNum);
|
2011-06-15 10:16:23 +00:00
|
|
|
end;
|
|
|
|
|
2011-07-14 09:44:35 +00:00
|
|
|
procedure TAndroidSDKBindingsGen.ProcessModelConst(ASourceLine: string);
|
|
|
|
var
|
|
|
|
lReaderPos: Integer = 1;
|
|
|
|
lCurWord: string;
|
|
|
|
lConstName, lConstValue: string;
|
|
|
|
begin
|
|
|
|
if ASourceLine = '' then Exit;
|
|
|
|
|
|
|
|
lConstName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
lConstName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
lConstValue := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
lConstValue := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
|
|
|
|
// Method type and name
|
|
|
|
FPasOutputConsts.Add(Format(' %s = %s;', [lConstName, lConstValue]));
|
|
|
|
end;
|
|
|
|
|
2011-07-18 13:33:05 +00:00
|
|
|
// callbacksettercaller setOnClickListener callOnClickListener OnClickCallback = procedure (v: TView) of object;
|
|
|
|
procedure TAndroidSDKBindingsGen.ProcessModelCallbackSetterCaller(ASourceLine: string);
|
|
|
|
var
|
|
|
|
lReaderPos: Integer = 1;
|
|
|
|
lCurWord: string;
|
|
|
|
lSetterName, lCallerName, lCallbackName, lCallbackDeclaration: string;
|
|
|
|
lIDSetter, lIDStart, lIDFinished: String;
|
|
|
|
begin
|
|
|
|
if ASourceLine = '' then Exit;
|
|
|
|
|
|
|
|
lSetterName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
lSetterName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
lCallerName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
lCallbackDeclaration := Copy(ASourceLine, lReaderPos, Length(ASourceLine));
|
|
|
|
lCallbackDeclaration := Trim(lCallbackDeclaration);
|
|
|
|
lCallbackName := GetNextWord(ASourceLine, lReaderPos);
|
|
|
|
|
|
|
|
lIDSetter := GetIDString(lSetterName);
|
|
|
|
AddOutputIDs(lIDSetter);
|
|
|
|
lIDStart := GetIDString(lCallbackName + '_Start');
|
|
|
|
AddOutputIDs(lIDStart);
|
|
|
|
lIDFinished := GetIDString(lCallbackName + '_Finished');
|
|
|
|
AddOutputIDs(lIDFinished);
|
|
|
|
|
|
|
|
FPasOutputTypes.Add(' T' + lCallbackDeclaration);
|
|
|
|
|
|
|
|
FPasOutputClasses.Add(' public');
|
|
|
|
FPasOutputClasses.Add(' ' + lCallbackName + ': T' + lCallbackName + ';');
|
|
|
|
FPasOutputClasses.Add(' procedure ' + lSetterName + '(ACallback: T' + lCallbackName + ');');
|
|
|
|
FPasOutputClasses.Add(' procedure ' + lCallerName + '();');
|
|
|
|
FPasOutputClasses.Add(' public');
|
|
|
|
|
|
|
|
FPasOutputImpl.Add('procedure ' + FClassNamePas + '.' + lSetterName + '(ACallback: T' + lCallbackName + ');');
|
|
|
|
FPasOutputImpl.Add('begin');
|
|
|
|
FPasOutputImpl.Add(' OnClickListener := ACallback;');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDSetter + ');');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Index');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(PtrInt(Self)); // Self, Pascal pointer');
|
|
|
|
FPasOutputImpl.Add(' vAndroidPipesComm.WaitForReturn();');
|
|
|
|
FPasOutputImpl.Add('end;');
|
|
|
|
FPasOutputImpl.Add('');
|
|
|
|
FPasOutputImpl.Add('procedure ' + FClassNamePas + '.' + lCallerName + '();');
|
|
|
|
FPasOutputImpl.Add('begin');
|
|
|
|
FPasOutputImpl.Add(' if Assigned(OnClickListener) then OnClickListener(Self);');
|
|
|
|
FPasOutputImpl.Add('end;');
|
|
|
|
|
|
|
|
// Method type and name
|
|
|
|
FPasOutputMessages.Add(' ' + lIDStart + ':');
|
|
|
|
FPasOutputMessages.Add(' begin');
|
|
|
|
FPasOutputMessages.Add(' lPascalPointer := vAndroidPipesComm.ReadInt();');
|
|
|
|
FPasOutputMessages.Add(' TTextView(lPascalPointer).callOnClickListener();');
|
|
|
|
FPasOutputMessages.Add(' vAndroidPipesComm.SendMessage(amkUICommand, ' + lIDFinished + ');');
|
|
|
|
FPasOutputMessages.Add(' end;');
|
|
|
|
{ amkUI_MenuItem_setOnMenuItemClickListener_Start:
|
|
|
|
begin
|
|
|
|
lInt := ReadInt();
|
|
|
|
lMenuItem := TMenuItem(FindItemIdInList(MenuItems, lInt));
|
|
|
|
if lMenuItem <> nil then
|
|
|
|
lInt := lMenuItem.callOnMenuItemClickListener();
|
|
|
|
vAndroidPipesComm.SendMessage(amkUICommand, amkUI_MenuItem_setOnMenuItemClickListener_Finished);
|
|
|
|
vAndroidPipesComm.SendInt(lInt);
|
|
|
|
end;
|
|
|
|
end;}
|
|
|
|
end;
|
|
|
|
|
2011-06-15 10:16:23 +00:00
|
|
|
{ Reads one word in a string, starting at AStartPos (1-based index)
|
|
|
|
and going up to a space or comma or ( or ) or another separator }
|
|
|
|
function TAndroidSDKBindingsGen.GetNextWord(ALine: string;
|
|
|
|
var AStartPos: Integer): string;
|
|
|
|
const
|
2011-07-18 13:33:05 +00:00
|
|
|
WordSeparators = [' ','(',')','[',']',',',';',':',#9{TAB}];
|
2011-06-15 10:16:23 +00:00
|
|
|
var
|
|
|
|
lState: Integer = 0;
|
|
|
|
begin
|
|
|
|
Result := '';
|
|
|
|
|
|
|
|
while AStartPos <= Length(ALine) do
|
|
|
|
begin
|
|
|
|
// Searching the word start
|
|
|
|
if lState = 0 then
|
|
|
|
begin
|
|
|
|
if ALine[AStartPos] in WordSeparators then Inc(AStartPos)
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
Result := ALine[AStartPos];
|
|
|
|
Inc(AStartPos);
|
|
|
|
lState := 1;
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
// Reading until the word finishes
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
if ALine[AStartPos] in WordSeparators then Exit
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
Result := Result + ALine[AStartPos];
|
|
|
|
Inc(AStartPos);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TAndroidSDKBindingsGen.GetPascalTypeName(ABaseName: string): string;
|
|
|
|
begin
|
|
|
|
if ABaseName = '' then Exit('');
|
|
|
|
|
|
|
|
if ABaseName = 'int' then Result := 'Integer'
|
2011-06-15 12:00:24 +00:00
|
|
|
else if ABaseName = 'boolean' then Result := 'Boolean'
|
2011-07-14 09:44:35 +00:00
|
|
|
else if ABaseName = 'float' then Result := 'Single'
|
2011-06-15 10:16:23 +00:00
|
|
|
else if ABaseName = 'void' then Result := ABaseName
|
|
|
|
else if ABaseName = 'CharSequence' then Result := 'string'
|
|
|
|
else if ABaseName = 'TJavaObject' then Result := ABaseName
|
2011-07-21 13:32:32 +00:00
|
|
|
else
|
|
|
|
begin
|
|
|
|
Result := 'T' + ABaseName;
|
|
|
|
Result := StringReplace(Result, '.', '_', [rfReplaceAll]);
|
|
|
|
end;
|
2011-06-15 10:16:23 +00:00
|
|
|
end;
|
|
|
|
|
2011-07-14 09:44:35 +00:00
|
|
|
function TAndroidSDKBindingsGen.PassByReference(ABaseName: string): Boolean;
|
|
|
|
begin
|
|
|
|
if ABaseName = '' then Exit(False);
|
|
|
|
|
|
|
|
if ABaseName = 'int' then Result := False
|
|
|
|
else if ABaseName = 'boolean' then Result := False
|
|
|
|
else if ABaseName = 'float' then Result := False
|
|
|
|
else Result := True;
|
|
|
|
end;
|
|
|
|
|
2011-06-15 14:45:40 +00:00
|
|
|
function TAndroidSDKBindingsGen.GetJavaResultFunction(AReturnType: string
|
|
|
|
): string;
|
|
|
|
begin
|
|
|
|
if AReturnType = 'boolean' then Result := 'SendBoolResult'
|
2011-07-21 13:32:32 +00:00
|
|
|
else if AReturnType = 'float' then Result := 'SendFloatResult'
|
2011-06-15 14:45:40 +00:00
|
|
|
else Result := 'SendIntResult';
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TAndroidSDKBindingsGen.GetJavaTypeReader(AType: string): string;
|
|
|
|
begin
|
|
|
|
if AType = 'boolean' then Exit('GetBool')
|
2011-08-08 09:30:32 +00:00
|
|
|
else if AType = 'float' then Exit('GetFloat')
|
2011-06-15 14:45:40 +00:00
|
|
|
else Exit('GetInt');
|
|
|
|
end;
|
|
|
|
|
2011-08-08 09:30:32 +00:00
|
|
|
function TAndroidSDKBindingsGen.GetJavaTypeLocalVar(AType: string): string;
|
|
|
|
begin
|
|
|
|
if AType = 'boolean' then Exit('lBool')
|
|
|
|
else if AType = 'float' then Exit('lFloat')
|
|
|
|
else Exit('lInt');
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TAndroidSDKBindingsGen.GetJavaTypeConverter(AType: string): string;
|
|
|
|
begin
|
|
|
|
if AType = 'boolean' then Exit('lBool')
|
|
|
|
else if AType = 'int' then Exit('lInt')
|
|
|
|
else if AType = 'float' then Exit('lFloat')
|
|
|
|
else Result := Format('(%s) ViewElements.get(lInt)', [AType]);
|
|
|
|
end;
|
|
|
|
|
2011-07-14 09:44:35 +00:00
|
|
|
function TAndroidSDKBindingsGen.GetIDString(AMethodName: string): string;
|
|
|
|
begin
|
|
|
|
Result := 'amkUI_' + FClassNamePas + '_' + AMethodName;;
|
2011-07-21 13:32:32 +00:00
|
|
|
Result := StringReplace(Result, '.', '_', [rfReplaceAll]);
|
2011-07-14 09:44:35 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TAndroidSDKBindingsGen.AddOutputIDs(AIDString: string);
|
|
|
|
begin
|
|
|
|
FPasOutputIDs.Add(' ' + AIDString + ' = $' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
|
|
|
|
FJavaOutputIDs.Add(' static final int ' + AIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
|
|
|
|
end;
|
|
|
|
|
2011-08-08 09:30:32 +00:00
|
|
|
function TAndroidSDKBindingsGen.ConvertPointToUnderline(AStr: string): string;
|
|
|
|
begin
|
|
|
|
Result := SysUtils.StringReplace(AStr, '.', '_', [rfReplaceAll, rfIgnoreCase]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TAndroidSDKBindingsGen.IsBasicJavaType(AStr: string): Boolean;
|
|
|
|
begin
|
|
|
|
Result := (AStr = 'boolean') or (AStr = 'int') or (AStr = 'float');
|
|
|
|
end;
|
|
|
|
|
2011-06-15 12:00:24 +00:00
|
|
|
constructor TAndroidSDKBindingsGen.Create;
|
|
|
|
begin
|
|
|
|
FSourceFile := TStringList.Create;
|
2011-07-18 13:33:05 +00:00
|
|
|
|
|
|
|
FPasOutputTypes := TStringList.Create;
|
|
|
|
FPasOutputClassesForward := TStringList.Create;
|
2011-06-15 12:00:24 +00:00
|
|
|
FPasOutputClasses := TStringList.Create;
|
|
|
|
FPasOutputImpl := TStringList.Create;
|
|
|
|
FPasOutputIDs := TStringList.Create;
|
2011-07-14 09:44:35 +00:00
|
|
|
FPasOutputConsts := TStringList.Create;
|
2011-07-18 13:33:05 +00:00
|
|
|
FPasOutputMessages := TStringList.Create;
|
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
FJavaOutputIDs := TStringList.Create;
|
|
|
|
FJavaOutputMethods := TStringList.Create;
|
|
|
|
|
2011-06-15 12:00:24 +00:00
|
|
|
FClassNum := $100;
|
|
|
|
end;
|
|
|
|
|
|
|
|
destructor TAndroidSDKBindingsGen.Destroy;
|
|
|
|
begin
|
|
|
|
FSourceFile.Free;
|
2011-07-18 13:33:05 +00:00
|
|
|
|
|
|
|
FPasOutputTypes.Free;
|
|
|
|
FPasOutputClassesForward.Free;
|
2011-06-15 12:00:24 +00:00
|
|
|
FPasOutputClasses.Free;
|
|
|
|
FPasOutputImpl.Free;
|
|
|
|
FPasOutputIDs.Free;
|
2011-07-14 09:44:35 +00:00
|
|
|
FPasOutputConsts.Free;
|
2011-07-18 13:33:05 +00:00
|
|
|
FPasOutputMessages.Free;
|
|
|
|
|
2011-06-15 13:32:40 +00:00
|
|
|
FJavaOutputIDs.Free;
|
|
|
|
FJavaOutputMethods.Free;
|
|
|
|
|
2011-06-15 12:00:24 +00:00
|
|
|
inherited Destroy;
|
|
|
|
end;
|
|
|
|
|
2011-06-15 10:16:23 +00:00
|
|
|
procedure TAndroidSDKBindingsGen.GenerateAllBindings(AInputDir, APasOutputDir,
|
|
|
|
AJavaOutputDir: string);
|
|
|
|
begin
|
2011-06-15 13:39:45 +00:00
|
|
|
ProcessModelFile(IncludeTrailingPathDelimiter(AInputDir) + 'android_all.txt',
|
|
|
|
IncludeTrailingPathDelimiter(APasOutputDir) + 'android_all.pas',
|
2011-07-21 13:32:32 +00:00
|
|
|
IncludeTrailingPathDelimiter(AJavaOutputDir) + 'AndroidAll.java');
|
2011-06-15 10:16:23 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
initialization
|
|
|
|
|
|
|
|
AndroidSDKBindingsGen := TAndroidSDKBindingsGen.Create;
|
|
|
|
|
|
|
|
finalization
|
|
|
|
|
|
|
|
AndroidSDKBindingsGen.Free;
|
|
|
|
|
|
|
|
end.
|
|
|
|
|