Browse Source

fcl-db/dbase: attempt to fix dbase code page marks in (v)foxpro files. Needs more work.

git-svn-id: trunk@24253 -
reiniero 12 years ago
parent
commit
a0455a4673
1 changed files with 34 additions and 9 deletions
  1. 34 9
      packages/fcl-db/src/dbase/dbf_dbffile.pas

+ 34 - 9
packages/fcl-db/src/dbase/dbf_dbffile.pas

@@ -175,6 +175,9 @@ type
   end;
   end;
 
 
 //====================================================================
 //====================================================================
+
+  { TDbfGlobals }
+
   TDbfGlobals = class
   TDbfGlobals = class
   protected
   protected
     FCodePages: TList;
     FCodePages: TList;
@@ -192,6 +195,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
 
 
     function CodePageInstalled(ACodePage: Integer): Boolean;
     function CodePageInstalled(ACodePage: Integer): Boolean;
+    function CreateFoxProLangID(NewCodePage: integer): Byte;
 
 
     property CurrencyAsBCD: Boolean read FCurrencyAsBCD write FCurrencyAsBCD;
     property CurrencyAsBCD: Boolean read FCurrencyAsBCD write FCurrencyAsBCD;
     property DefaultOpenCodePage: Integer read FDefaultOpenCodePage write FDefaultOpenCodePage;
     property DefaultOpenCodePage: Integer read FDefaultOpenCodePage write FDefaultOpenCodePage;
@@ -624,11 +628,24 @@ begin
     lHasBlob := false;
     lHasBlob := false;
     lNullVarFlagCount := 0;
     lNullVarFlagCount := 0;
     // determine codepage & locale
     // determine codepage & locale
-    if FFileLangId = 0 then
-      FFileLangId := DbfGlobals.DefaultCreateLangId;
-    FFileCodePage := LangId_To_CodePage[FFileLangId];
-    lLocaleID := LangId_To_Locale[FFileLangId];
-    FUseCodePage := FFileCodePage;
+    if FDbfVersion in [xFoxPro, xVisualFoxPro] then
+    begin
+      if FFileLangId = 0 then
+        FFileLangId := DbfGlobals.CreateFoxProLangID(DbfGlobals.DefaultCreateCodePage);
+      FFileCodePage := LangId_To_CodePage[FFileLangId];
+      lLocaleID := LangId_To_Locale[FFileLangId];
+      FUseCodePage := FFileCodePage;
+    end
+    else
+    begin
+      // DBase
+      if FFileLangId = 0 then
+        FFileLangId := DbfGlobals.DefaultCreateLangId;
+      FFileCodePage := LangId_To_CodePage[FFileLangId];
+      lLocaleID := LangId_To_Locale[FFileLangId];
+      FUseCodePage := FFileCodePage;
+    end;
+
     // prepare header size
     // prepare header size
     if FDbfVersion = xBaseVII then
     if FDbfVersion = xBaseVII then
     begin
     begin
@@ -657,11 +674,13 @@ begin
         xVisualFoxPro: PDbfHdr(Header)^.VerDBF := $30; {Visual FoxPro no autoincrement,no varchar}
         xVisualFoxPro: PDbfHdr(Header)^.VerDBF := $30; {Visual FoxPro no autoincrement,no varchar}
         else PDbfHdr(Header)^.VerDBF := $03; {FoxBASE+/FoxPro/dBASE III PLUS/dBASE IV, no memo}
         else PDbfHdr(Header)^.VerDBF := $03; {FoxBASE+/FoxPro/dBASE III PLUS/dBASE IV, no memo}
       end;
       end;
-      // standard language WE/Western Europe, dBase III no language support
-      if FDbfVersion = xBaseIII then
-        PDbfHdr(Header)^.Language := 0
+
+      // standard language WE/Western Europe
+      if FDbfVersion=xBaseIII then
+        PDbfHdr(Header)^.Language := 0 //no language support
       else
       else
         PDbfHdr(Header)^.Language := FFileLangId;
         PDbfHdr(Header)^.Language := FFileLangId;
+
       // init field ptr
       // init field ptr
       lFieldDescPtr := @lFieldDescIII;
       lFieldDescPtr := @lFieldDescIII;
     end;
     end;
@@ -3069,13 +3088,19 @@ begin
   Result := FCodePages.IndexOf(Pointer(ACodePage)) >= 0;
   Result := FCodePages.IndexOf(Pointer(ACodePage)) >= 0;
 end;
 end;
 
 
+function TDbfGlobals.CreateFoxProLangID(NewCodePage: integer): Byte;
+begin
+  ConstructLangId(NewCodePage, GetUserDefaultLCID, true);
+end;
+
 initialization
 initialization
 finalization
 finalization
   FreeAndNil(DbfGlobals);
   FreeAndNil(DbfGlobals);
 
 
 
 
 (*
 (*
-  Stuffs non implemented yet
+  Not implemented yet (encrypted cdx is undocumented;
+  unencrypted cdx could be implemented)
   TFoxCDXHeader         = Record
   TFoxCDXHeader         = Record
     PointerRootNode     : Integer;
     PointerRootNode     : Integer;
     PointerFreeList     : Integer;
     PointerFreeList     : Integer;