diff --git a/bindings/android-sdk/android_bindings_generator.lpi b/bindings/android-sdk/android_bindings_generator.lpi
index 40fbcfa8e..0c54a69ff 100644
--- a/bindings/android-sdk/android_bindings_generator.lpi
+++ b/bindings/android-sdk/android_bindings_generator.lpi
@@ -39,7 +39,7 @@
-
+
@@ -68,7 +68,7 @@
-
+
@@ -78,7 +78,7 @@
-
+
@@ -88,7 +88,7 @@
-
+
@@ -98,7 +98,7 @@
-
+
@@ -115,7 +115,7 @@
-
+
@@ -130,15 +130,15 @@
-
-
+
+
-
+
@@ -161,127 +161,137 @@
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/bindings/android-sdk/android_sdk_bindings_gen.pas b/bindings/android-sdk/android_sdk_bindings_gen.pas
index d9e1729c8..87dfa2e9b 100644
--- a/bindings/android-sdk/android_sdk_bindings_gen.pas
+++ b/bindings/android-sdk/android_sdk_bindings_gen.pas
@@ -14,10 +14,13 @@ type
TAndroidSDKBindingsGen = class
private
FSourceFile, FPasOutputClasses, FPasOutputIDs, FPasOutputImpl: TStringList;
+ FJavaOutputIDs, FJavaOutputMethods: TStringList;
FClassName: string; // Class name of the class currently being parsed
FClassNum, FMethodNum: Integer;
- procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputDir: string);
+ procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string);
procedure ProcessModelLine(ASourceLine: string);
+ procedure ProcessModelMethodClass(ASourceLine: string);
+ procedure ProcessModelMethodLine(ASourceLine: string);
function GetNextWord(ALine: string; var AStartPos: Integer): string;
function GetPascalTypeName(ABaseName: string): string;
public
@@ -34,12 +37,14 @@ implementation
{ TAndroidSDKBindingsGen }
procedure TAndroidSDKBindingsGen.ProcessModelFile(ASourceFile, APasOutputFile,
- AJavaOutputDir: string);
+ AJavaOutputFile: string);
var
i: Integer;
lPasOutputFile: TStringList;
+ lJavaOutputFile: TStringList;
begin
lPasOutputFile := TStringList.Create;
+ lJavaOutputFile := TStringList.Create;
try
FSourceFile.LoadFromFile(ASourceFile);
@@ -51,7 +56,7 @@ begin
ProcessModelLine(FSourceFile.Strings[i]);
end;
- // Now save the output
+ // Now save the Pascal file
lPasOutputFile.Add('unit ;');
lPasOutputFile.Add('');
lPasOutputFile.Add('interface');
@@ -70,7 +75,17 @@ begin
lPasOutputFile.Add('end.');
lPasOutputFile.SaveToFile(APasOutputFile);
+
+ // Now save the Java file
+ lJavaOutputFile.Add('');
+ lJavaOutputFile.AddStrings(FJavaOutputIDs);
+ lJavaOutputFile.Add('');
+ lJavaOutputFile.AddStrings(FJavaOutputMethods);
+ lJavaOutputFile.Add('');
+
+ lJavaOutputFile.SaveToFile(AJavaOutputFile);
finally
+ lJavaOutputFile.Free;
lPasOutputFile.Free;
end;
end;
@@ -78,10 +93,7 @@ end;
procedure TAndroidSDKBindingsGen.ProcessModelLine(ASourceLine: string);
var
lReaderPos: Integer = 1;
- lCurWord, lParentClassName: string;
- lMethodReturn, lMethodName, lParamType, lParamName: string;
- DeclarationBase, TmpStr: string;
- FPasOutputImplCurLine: Integer;
+ lCurWord: string;
begin
if ASourceLine = '' then Exit;
@@ -93,84 +105,152 @@ begin
// Starting a new class
if ASourceLine[1] = '[' then
begin
- if FClassName <> '' then
- begin
- FPasOutputClasses.Add(' end;');
- FPasOutputClasses.Add('');
- end;
-
- FClassName := GetPascalTypeName(lCurWord);
- lParentClassName := GetNextWord(ASourceLine, lReaderPos);
- lParentClassName := GetPascalTypeName(lParentClassName);
- FPasOutputClasses.Add(Format(' %s = class(%s)', [FClassName, lParentClassName]));
- FPasOutputClasses.Add(' public');
- lCurWord := GetNextWord(ASourceLine, lReaderPos);
- Inc(FClassNum);
- FMethodNum := 0;
-
+ ProcessModelMethodClass(ASourceLine);
Exit;
end;
// Adding methods to a class
if lCurWord = 'method' then
begin
- // Method type and name
- lMethodReturn := GetNextWord(ASourceLine, lReaderPos);
- lMethodReturn := GetPascalTypeName(lMethodReturn);
- lMethodName := GetNextWord(ASourceLine, lReaderPos);
-
- if lMethodReturn = 'void' then DeclarationBase := 'procedure '
- else DeclarationBase := 'function ';
-
- // Beginning of the implementation part
- FPasOutputImplCurLine := FPasOutputImpl.Count;
- FPasOutputImpl.Add('begin');
- FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));');
- FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(amkUI_' + FClassName + '_' + lMethodName + ');');
- FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Pointer');
- FPasOutputIDs.Add(' amkUI_' + FClassName + '_' + lMethodName + ' = 0' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
-
- // Add all parameters
- TmpStr := lMethodName + '(';
-
- repeat
- lParamType := GetNextWord(ASourceLine, lReaderPos);
- lParamType := GetPascalTypeName(lParamType);
- lParamName := GetNextWord(ASourceLine, lReaderPos);
-
- if lParamName = '' then Break;
-
- TmpStr := TmpStr + lParamName + ': ' + lParamType + '; ';
-
- FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Integer(' + lParamName + '));');
- until lParamName = '';
-
- // Remove the last ; for the parameters, if necessary
- if TmpStr[Length(TmpStr)-1] = ';' then TmpStr := System.Copy(TmpStr, 0, Length(TmpStr)-2);
-
- // Add the return
- if lMethodReturn = 'void' then
- begin
- TmpStr := TmpStr + ');';
- FPasOutputImpl.Add(' vAndroidPipesComm.WaitForReturn();');
- end
- else
- begin
- TmpStr := TmpStr + '): ' + lMethodReturn + ';';
- FPasOutputImpl.Add(' Result := Boolean(vAndroidPipesComm.WaitForIntReturn());');
- end;
-
- FPasOutputClasses.Add(' ' + DeclarationBase + TmpStr);
- FPasOutputImpl.Insert(FPasOutputImplCurLine, DeclarationBase + FClassName + '.' + TmpStr);
- FPasOutputImpl.Add('end;');
- FPasOutputImpl.Add('');
-
- Inc(FMethodNum);
-
+ ProcessModelMethodLine(ASourceLine);
Exit;
end;
end;
+procedure TAndroidSDKBindingsGen.ProcessModelMethodClass(ASourceLine: string);
+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;
+
+ FClassName := GetPascalTypeName(lCurWord);
+ lParentClassName := GetNextWord(ASourceLine, lReaderPos);
+ lParentClassName := GetPascalTypeName(lParentClassName);
+ FPasOutputClasses.Add(Format(' %s = class(%s)', [FClassName, lParentClassName]));
+ FPasOutputClasses.Add(' public');
+ lCurWord := GetNextWord(ASourceLine, lReaderPos);
+ Inc(FClassNum);
+ FMethodNum := 0;
+
+ FPasOutputIDs.Add(' // ' + FClassName);
+ FJavaOutputIDs.Add(' // ' + FClassName);
+end;
+
+procedure TAndroidSDKBindingsGen.ProcessModelMethodLine(
+ ASourceLine: string);
+var
+ lReaderPos: Integer = 1;
+ lParamNum: Integer = 1;
+ lCurWord, lParentClassName: string;
+ lMethodReturn, lMethodName, lParamType, lParamName: string;
+ DeclarationBase, TmpStr, lIDString: string;
+ FPasOutputImplCurLine: Integer;
+ lJavaParamVar, lJavaParams, lJavaParamSelf: string;
+begin
+ if ASourceLine = '' then Exit;
+
+ lCurWord := GetNextWord(ASourceLine, lReaderPos);
+
+ // Method type and name
+ lMethodReturn := GetNextWord(ASourceLine, lReaderPos);
+ lMethodReturn := GetPascalTypeName(lMethodReturn);
+ lMethodName := GetNextWord(ASourceLine, lReaderPos);
+
+ if lMethodReturn = 'void' then DeclarationBase := 'procedure '
+ else DeclarationBase := 'function ';
+
+ // Beginning of the implementation part
+ FPasOutputImplCurLine := FPasOutputImpl.Count;
+ lIDString := 'amkUI_' + FClassName + '_' + lMethodName;
+
+ FPasOutputImpl.Add('begin');
+ FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));');
+ FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');');
+ FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Pointer');
+
+ lJavaParamSelf := 'param_self_' + FClassName;
+ 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');
+
+ // Lists of constants for the IDs
+ FPasOutputIDs.Add(' ' + lIDString + ' = 0' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
+ FJavaOutputIDs.Add(' static final int ' + lIDString + ' = 0x0' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
+
+ // Add all parameters
+ TmpStr := lMethodName + '(';
+
+ repeat
+ lParamType := GetNextWord(ASourceLine, lReaderPos);
+ lParamType := GetPascalTypeName(lParamType);
+ lParamName := GetNextWord(ASourceLine, lReaderPos);
+
+ if lParamName = '' then Break;
+
+ TmpStr := TmpStr + lParamName + ': ' + lParamType + '; ';
+
+ // Pascal parameter sending
+ FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Integer(' + lParamName + '));');
+
+ // Java parameter reading
+ lJavaParamVar := 'l' + lParamType + '_' + IntToStr(lParamNum);
+ FJavaOutputMethods.Add(' ' + lJavaParamVar + ' = MyAndroidPipesComm.GetInt();');
+ lJavaParams := lJavaParams + lJavaParamVar + ', ';
+
+ Inc(lParamNum);
+ until lParamName = '';
+
+ // Remove the last ; for the parameters, if necessary
+ if TmpStr[Length(TmpStr)-1] = ';' then TmpStr := System.Copy(TmpStr, 0, Length(TmpStr)-2);
+ // 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
+ TmpStr := TmpStr + '): ' + lMethodReturn + ';';
+ FPasOutputImpl.Add(' Result := Boolean(vAndroidPipesComm.WaitForIntReturn());');
+ end;
+
+ FPasOutputClasses.Add(' ' + DeclarationBase + TmpStr);
+ FPasOutputImpl.Insert(FPasOutputImplCurLine, DeclarationBase + FClassName + '.' + TmpStr);
+ FPasOutputImpl.Add('end;');
+ FPasOutputImpl.Add('');
+
+ FJavaOutputMethods.Add(' //');
+ if lMethodReturn = 'void' then
+ begin
+ FJavaOutputMethods.Add(' ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
+ FJavaOutputMethods.Add(' MyAndroidPipesComm.SendResult();');
+ end
+ else
+ begin
+ FJavaOutputMethods.Add(' lResult_' + lMethodReturn + ' ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');');
+ FJavaOutputMethods.Add(' MyAndroidPipesComm.SendIntResult(lResult_' + lMethodReturn + ');');
+ end;
+ FJavaOutputMethods.Add(' break;');
+
+ Inc(FMethodNum);
+end;
+
{ 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;
@@ -226,6 +306,10 @@ begin
FPasOutputClasses := TStringList.Create;
FPasOutputImpl := TStringList.Create;
FPasOutputIDs := TStringList.Create;
+
+ FJavaOutputIDs := TStringList.Create;
+ FJavaOutputMethods := TStringList.Create;
+
FClassNum := $100;
end;
@@ -236,6 +320,9 @@ begin
FPasOutputImpl.Free;
FPasOutputIDs.Free;
+ FJavaOutputIDs.Free;
+ FJavaOutputMethods.Free;
+
inherited Destroy;
end;
@@ -244,7 +331,7 @@ procedure TAndroidSDKBindingsGen.GenerateAllBindings(AInputDir, APasOutputDir,
begin
ProcessModelFile(IncludeTrailingPathDelimiter(AInputDir) + 'android_view.txt',
IncludeTrailingPathDelimiter(APasOutputDir) + 'android_view.pas',
- IncludeTrailingPathDelimiter(AJavaOutputDir));
+ IncludeTrailingPathDelimiter(AJavaOutputDir) + 'android_view.java');
end;
initialization
diff --git a/bindings/android-sdk/sdk_level_7/android_view.txt b/bindings/android-sdk/sdk_level_7/android_all.txt
similarity index 100%
rename from bindings/android-sdk/sdk_level_7/android_view.txt
rename to bindings/android-sdk/sdk_level_7/android_all.txt