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