source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/NonVolatile.cpp @ 717

Last change on this file since 717 was 717, checked in by dai, 15 years ago

#188への対応。UserSettingディレクトリを廃止し、正規のユーザ空間ディレクトリを取り入れた。

File size: 7.9 KB
Line 
1#include "stdafx.h"
2
3#include "../BasicCompiler_Common/common.h"
4
5
6char *ReadBuffer_NonErrMsg( const std::string &path ){
7    extern HANDLE hHeap;
8    int i;
9    DWORD dw;
10    char *buffer;
11    HANDLE hFile;
12
13    hFile=CreateFile(path.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
14    if(hFile==INVALID_HANDLE_VALUE) return 0;
15    i=GetFileSize(hFile,0);
16    buffer=(char *)HeapAlloc(hHeap,0,i+1);
17    ReadFile(hFile,buffer,i,&dw,0);
18    buffer[dw]=0;
19    CloseHandle(hFile);
20    return buffer;
21}
22_int8 WriteBuffer( const std::string &path, char *buffer,int length){
23    extern HWND hOwnerEditor;
24    HANDLE hFile;
25    DWORD dw;
26    hFile=CreateFile(path.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
27    if(hFile==INVALID_HANDLE_VALUE){
28        char temporary[MAX_PATH];
29
30        sprintf(temporary,"\"%s\" ファイルへの書き込みに失敗しました。",path);
31        MessageBox(hOwnerEditor,temporary,"エラー",MB_OK|MB_ICONEXCLAMATION);
32        return 0;
33    }
34    if(length) WriteFile(hFile,buffer,length,&dw,NULL);
35    CloseHandle(hFile);
36    return 1;
37}
38
39
40///////////////////////////
41// 不揮発性のデータ管理
42///////////////////////////
43
44BOOL CNonVolatile::GetDataLine(char *name,char *parms){
45    int i,i2,length;
46    length=lstrlen(name);
47    for(i=0;;i++){
48        if(buffer[i]=='\0') break;
49        if(i==0||buffer[i]=='\r'&&buffer[i+1]=='\n'){
50            if(buffer[i]=='\r'&&buffer[i+1]=='\n') i+=2;
51            if(memcmp(buffer+i,name,length)==0&&buffer[i+length]=='='){
52                i+=length+1;
53                for(i2=0;;i++,i2++){
54                    if(buffer[i]=='\r'&&buffer[i+1]=='\n'||buffer[i]=='\0'){
55                        parms[i2]=0;
56                        break;
57                    }
58                    parms[i2]=buffer[i];
59                }
60                return 1;
61            }
62        }
63    }
64    return 0;
65}
66
67BOOL CNonVolatile::GetWholeValue(char *name,int *pi32data){
68    char temporary[8192];
69    if(!GetDataLine(name,temporary)) return 0;
70    *pi32data=atoi(temporary);
71    return 1;
72}
73BOOL CNonVolatile::Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3){
74    char temporary[8192];
75    if(!GetDataLine(name,temporary)) return 0;
76    sscanf(temporary,"%d,%d,%d",pd1,pd2,pd3);
77    return 1;
78}
79BOOL CNonVolatile::GetRGBValue(char *name,COLORREF *prgb){
80    char temporary[8192];
81    if(!GetDataLine(name,temporary)) return 0;
82    sscanf(temporary,"%x",prgb);
83    return 1;
84}
85BOOL CNonVolatile::GetStringValue(char *name,char *str){
86    if(!GetDataLine(name,str)) return 0;
87    return 1;
88}
89BOOL CNonVolatile::GetRectValue(char *name,RECT *prc){
90    char temporary[8192];
91    if(!GetDataLine(name,temporary)) return 0;
92    sscanf(temporary,"%d,%d,%d,%d",&prc->left,&prc->top,&prc->right,&prc->bottom);
93    return 1;
94}
95BOOL CNonVolatile::GetPointValue(char *name,POINT *pos){
96    char temporary[8192];
97    if(!GetDataLine(name,temporary)) return 0;
98    sscanf(temporary,"%d,%d",&pos->x,&pos->y);
99    return 1;
100}
101
102void CNonVolatile::load(){
103    extern HANDLE hHeap;
104    int i;
105
106    //開く
107    buffer=ReadBuffer_NonErrMsg( Program::GetUserAppDir() + "\\compiler.ini" );
108    if(!buffer){
109        //レジストリを読み込む
110        OldLoad();
111        return;
112    }
113
114
115    if(!GetWholeValue("IsShow_DefaultSystem_Var",&bShow_DefaultSystem_Var)) bShow_DefaultSystem_Var=0;
116    if(!GetWholeValue("IsShow_Rad_Var",&bShow_Rad_Var)) bShow_Rad_Var=0;
117    if(!GetWholeValue("IsShow_GUID_Var",&bShow_GUID_Var)) bShow_Rad_Var=0;
118
119    extern int ScreenX,ScreenY;
120    if(!GetPointValue("MainDlgPos",&MainDlgPos)){
121        MainDlgPos.x=ScreenX/2-100;
122        MainDlgPos.y=ScreenX/2-250;
123    }
124
125    if(!GetRectValue("VarDlgRect",&VarDlgRect)){
126        VarDlgRect.left=ScreenX/2-390/2;
127        VarDlgRect.top=ScreenY/2-270/2;
128        VarDlgRect.right=ScreenX/2+390/2;
129        VarDlgRect.bottom=ScreenY/2+270/2;
130    }
131
132    //ウォッチリスト
133    if(!GetWholeValue("WatchNum",&WatchNum)) WatchNum=0;
134
135    ppWatchStr=(char **)HeapAlloc(hHeap,0,WatchNum*sizeof(char *)+1);
136    for(i=0;i<WatchNum;i++){
137        char temporary[VN_SIZE];
138        sprintf(temporary,"Watch%03d",i);
139
140        char temp2[VN_SIZE];
141        GetStringValue(temporary,temp2);
142        ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
143        lstrcpy(ppWatchStr[i],temp2);
144    }
145
146
147    HeapDefaultFree(buffer);
148}
149void CNonVolatile::OldLoad(){
150    extern HANDLE hHeap;
151    extern int ScreenX,ScreenY;
152
153    int i;
154    HKEY hKey;
155    ULONG ulSize;
156    char temporary[MAX_PATH],temp2[VN_SIZE];
157
158    if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Discoversoft\\BasicCompiler",0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS){
159        bShow_DefaultSystem_Var=0;
160        bShow_Rad_Var=0;
161        bShow_GUID_Var=0;
162
163        MainDlgPos.x=ScreenX/2-100;
164        MainDlgPos.y=ScreenX/2-250;
165
166        VarDlgRect.left=ScreenX/2-390/2;
167        VarDlgRect.top=ScreenY/2-270/2;
168        VarDlgRect.right=ScreenX/2+390/2;
169        VarDlgRect.bottom=ScreenY/2+270/2;
170
171        WatchNum=0;
172        ppWatchStr=(char **)HeapAlloc(hHeap,0,1);
173    }
174    else{
175        ulSize=sizeof(DWORD);
176        if(RegQueryValueEx(hKey,"bShow_DefaultSystem_Var",NULL,NULL,(BYTE *)&bShow_DefaultSystem_Var,&ulSize)!=ERROR_SUCCESS)
177            bShow_DefaultSystem_Var=0;
178
179        ulSize=sizeof(DWORD);
180        if(RegQueryValueEx(hKey,"bShow_Rad_Var",NULL,NULL,(BYTE *)&bShow_Rad_Var,&ulSize)!=ERROR_SUCCESS)
181            bShow_Rad_Var=0;
182
183        ulSize=sizeof(DWORD);
184        if(RegQueryValueEx(hKey,"bShow_GUID_Var",NULL,NULL,(BYTE *)&bShow_GUID_Var,&ulSize)!=ERROR_SUCCESS)
185            bShow_GUID_Var=0;
186
187        ulSize=1024;
188        if(RegQueryValueEx(hKey,"MainDlgPos",NULL,NULL,(unsigned char *)temporary,&ulSize)!=ERROR_SUCCESS){
189            MainDlgPos.x=ScreenX/2-100;
190            MainDlgPos.y=ScreenX/2-250;
191        }
192        else sscanf(temporary,"%d %d",
193            &MainDlgPos.x,
194            &MainDlgPos.y);
195
196        ulSize=1024;
197        if(RegQueryValueEx(hKey,"VarDlgRect",NULL,NULL,(unsigned char *)temporary,&ulSize)!=ERROR_SUCCESS){
198            VarDlgRect.left=ScreenX/2-390/2;
199            VarDlgRect.top=ScreenY/2-270/2;
200            VarDlgRect.right=ScreenX/2+390/2;
201            VarDlgRect.bottom=ScreenY/2+270/2;
202        }
203        else sscanf(temporary,"%d %d %d %d",
204            &VarDlgRect.left,
205            &VarDlgRect.top,
206            &VarDlgRect.right,
207            &VarDlgRect.bottom);
208
209        ulSize=sizeof(DWORD);
210        if(RegQueryValueEx(hKey,"WatchNum",NULL,NULL,(BYTE *)&WatchNum,&ulSize)!=ERROR_SUCCESS)
211            WatchNum=0;
212        ppWatchStr=(char **)HeapAlloc(hHeap,0,WatchNum*sizeof(char *)+1);
213        for(i=0;i<WatchNum;i++){
214            sprintf(temporary,"WathNum%03d",i);
215            ulSize=VN_SIZE;
216            if(RegQueryValueEx(hKey,temporary,NULL,NULL,(unsigned char *)temp2,&ulSize)!=ERROR_SUCCESS){
217                WatchNum=i;
218                break;
219            }
220            ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
221            lstrcpy(ppWatchStr[i],temp2);
222        }
223    }
224}
225
226void CNonVolatile::SetWholeValue(char *name,long i32data){
227    sprintf(buffer+lstrlen(buffer),"%s=%d\r\n",name,i32data);
228}
229void CNonVolatile::Set3WholeValue(char *name,long d1,long d2,long d3){
230    sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d\r\n",name,d1,d2,d3);
231}
232void CNonVolatile::SetRGBValue(char *name,COLORREF rgb){
233    sprintf(buffer+lstrlen(buffer),"%s=%x\r\n",name,rgb);
234}
235void CNonVolatile::SetStringValue(char *name,char *str){
236    sprintf(buffer+lstrlen(buffer),"%s=%s\r\n",name,str);
237}
238void CNonVolatile::SetRectValue(char *name,RECT *prc){
239    sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d,%d\r\n",name,prc->left,prc->top,prc->right,prc->bottom);
240}
241void CNonVolatile::SetPointValue(char *name,POINT *pos){
242    sprintf(buffer+lstrlen(buffer),"%s=%d,%d\r\n",name,pos->x,pos->y);
243}
244
245void CNonVolatile::save(){
246    int i;
247    char temporary[MAX_PATH];
248
249    // ユーザ情報保存用のディレクトリを作成
250    Jenga::Common::Directory dir( Program::GetUserAppDir(), true );
251
252
253    extern HANDLE hHeap;
254    buffer=(char *)HeapAlloc(hHeap,0,65536);
255    buffer[0]=0;
256
257
258    SetWholeValue("IsShow_DefaultSystem_Var",bShow_DefaultSystem_Var);
259    SetWholeValue("IsShow_Rad_Var",bShow_Rad_Var);
260    SetWholeValue("IsShow_GUID_Var",bShow_GUID_Var);
261
262    SetPointValue("MainDlgPos",&MainDlgPos);
263
264    SetRectValue("VarDlgRect",&VarDlgRect);
265
266    //ウォッチリスト
267    SetWholeValue("WatchNum",WatchNum);
268    for(i=0;i<WatchNum;i++){
269        sprintf(temporary,"Watch%03d",i);
270        SetStringValue(temporary,ppWatchStr[i]);
271        HeapDefaultFree(ppWatchStr[i]);
272    }
273    HeapDefaultFree(ppWatchStr);
274
275
276    //保存
277    WriteBuffer(
278        Program::GetUserAppDir() + "\\compiler.ini",
279        buffer,lstrlen(buffer));
280
281
282    HeapDefaultFree(buffer);
283}
Note: See TracBrowser for help on using the repository browser.