source: dev/trunk/ab5.0/abdev/abdev/Backup.cpp@ 625

Last change on this file since 625 was 625, checked in by dai_9181, 16 years ago

・WindowInfoクラスをリファクタリング
・MdiInfoを単純配列からvectorに変更した。

File size: 5.5 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5
6char szBackupDirPath[MAX_PATH];
7
8void CreateBackupDir(void){
9 //自動バックアップ用のフォルダを取得
10 extern char szBackupDirPath[MAX_PATH];
11 GUID guid;
12 char *temp2;
13 CoCreateGuid(&guid);
14 UuidToString(&guid,(unsigned char **)&temp2);
15
16 char temporary[MAX_PATH];
17 GetTempPath(MAX_PATH,temporary);
18 ShortPathToLongPath(temporary,szBackupDirPath);
19 if(szBackupDirPath[lstrlen(szBackupDirPath)-1]!='\\') lstrcat(szBackupDirPath,"\\");
20
21#ifdef THETEXT
22 lstrcat(szBackupDirPath,"TheText_Temporary_");
23#else
24 lstrcat(szBackupDirPath,"abdev_temporary_");
25#endif
26 lstrcat(szBackupDirPath,temp2);
27 RpcStringFree((unsigned char **)&temp2);
28
29 CreateDirectory(szBackupDirPath,NULL);
30 lstrcat(szBackupDirPath,"\\");
31}
32
33
34void backup(void *dummy){
35 extern char szBackupDirPath[MAX_PATH];
36 int i,iNum=0;
37 char temporary[MAX_PATH];
38
39 lstrcpy( temporary, szBackupDirPath );
40 if( temporary[lstrlen(temporary)-1] == '\\' ) temporary[lstrlen(temporary)-1] = 0;
41 if( !IsExistDirectory( temporary ) ){
42 //バックアップ用一時ディレクトリが存在しないときは作る
43 CreateDirectory( temporary, NULL );
44 }
45
46 char *temp2;
47 temp2=(char *)malloc(8192);
48 sprintf(temp2,"%x\r\n",hOwner);
49
50 for(i=0;i<MdiInfo.size();i++){
51 if(MdiInfo[i].hwnd){
52 int WndNum;
53 WndNum=i;
54
55 if(!IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)) continue;
56
57 //ファイルを保存
58 sprintf(temporary,"%sdocument%02d.txt",szBackupDirPath,iNum);
59 WriteBuffer(temporary,MdiInfo[WndNum].pMdiTextEdit->buffer,lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer), false);
60
61 //情報を追加
62 sprintf(temp2+lstrlen(temp2),"%s\r\n",MdiInfo[WndNum].path.c_str());
63
64 iNum++;
65 }
66 }
67
68 //バックアップヘッダ
69 sprintf(temporary,"%sinfo.txt",szBackupDirPath);
70 WriteBuffer_NonErrMsg(temporary,temp2,lstrlen(temp2));
71
72 free(temp2);
73}
74
75
76void RestoreBeforeState(const char *dir_path,char *pHeaderBuffer){
77 int i,i2;
78 for(i=0;;i++){
79 if(pHeaderBuffer[i]=='\0') break;
80 if(pHeaderBuffer[i]=='\r'&&pHeaderBuffer[i+1]=='\n') break;
81 }
82 if(pHeaderBuffer[i]=='\0') return;
83 i+=2;
84
85
86 int iDocNum=0;
87 char temporary[MAX_PATH];
88 while(1){
89 //元のファイルパスを取得
90 char szBeforeFilePath[MAX_PATH];
91 for(i2=0;;i++,i2++){
92 if(pHeaderBuffer[i]=='\r'&&pHeaderBuffer[i+1]=='\n'){
93 szBeforeFilePath[i2]=0;
94 break;
95 }
96 szBeforeFilePath[i2]=pHeaderBuffer[i];
97 if(pHeaderBuffer[i]=='\0') break;
98 }
99 if(pHeaderBuffer[i]=='\0') break;
100
101 sprintf(temporary,"%sdocument%02d.txt",dir_path,iDocNum);
102
103 HWND hChild;
104 hChild=NewTextEditWindow(temporary,WNDTYPE_TEXT);
105 int WndNum;
106 WndNum=GetWndNum(hChild);
107
108 char szOldTitle[MAX_PATH];
109 lstrcpy(szOldTitle,MdiInfo[WndNum].title);
110
111 //ドキュメント セレクト コンボボックスから消去
112 extern HWND hDocCombo;
113 i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum].title);
114 SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
115
116 //パスを変更
117 MdiInfo[WndNum].path = szBeforeFilePath;
118
119 //ドキュメント セレクト コンボボックスに挿入
120 char str[MAX_PATH],str2[MAX_PATH];
121 if(szBeforeFilePath[0]){
122 _splitpath(szBeforeFilePath,NULL,NULL,str,str2);
123 lstrcat(str,str2);
124 }
125 else{
126 extern int DocumentCounter;
127 DocumentCounter++;
128 sprintf(str,"Document[%d]",DocumentCounter);
129 }
130 DuplicateTitleCheck(str);
131 GlobalFree(MdiInfo[WndNum].title);
132 MdiInfo[WndNum].title=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(str)+1);
133 lstrcpy(MdiInfo[WndNum].title,str);
134 SendMessage(hDocCombo,CB_ADDSTRING,0,(long)MdiInfo[WndNum].title);
135 i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum].title);
136 SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
137
138 //MDIウィンドウのタイトルを再設定
139 SetWindowText(hChild,MdiInfo[WndNum].title);
140
141 //タブコントロールを再設定
142 COLORREF TabColor;
143 TabColor=pobj_nv->pobj_ExtLink->GetTabColorFromFilePath(MdiInfo[WndNum].path);
144 pobj_MainTab->DeleteItem( szOldTitle, false );
145 pobj_MainTab->InsertItem( MdiInfo[WndNum].title, false, TabColor );
146
147 MdiInfo[WndNum].pMdiTextEdit->Modify();
148
149
150 iDocNum++;
151
152 i+=2;
153 if(pHeaderBuffer[i]=='\0') break;
154 }
155
156 RemoveDirectoryStrong(dir_path);
157}
158
159
160BOOL restore(void){
161 HANDLE hFind;
162 WIN32_FIND_DATA wfd;
163 char temporary[MAX_PATH],*temp2;
164
165 char szTempPath[MAX_PATH];
166 GetTempPath(MAX_PATH,temporary);
167 ShortPathToLongPath(temporary,szTempPath);
168 if(szTempPath[lstrlen(szTempPath)-1]!='\\') lstrcat(szTempPath,"\\");
169
170 sprintf(temporary,"%s*",szTempPath);
171 hFind=FindFirstFile(temporary,&wfd);
172 if(hFind!=INVALID_HANDLE_VALUE){
173 do{
174 if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
175#ifdef THETEXT
176 if(memcmp(wfd.cFileName,"TheText_Temporary_",18)==0){
177#else
178 if(memcmp(wfd.cFileName,"abdev_temporary_",16)==0){
179#endif
180 sprintf(temporary,"%s%s\\info.txt",szTempPath,wfd.cFileName);
181 temp2=ReadBuffer_NonErrMsg(temporary);
182 if(temp2){
183 HWND hTemp;
184 sscanf(temp2,"%x",&hTemp);
185 if(!IsWindow(hTemp)){
186 sprintf(temporary,"前回、%sが異常終了した可能性があります。データを復元しますか?",APPLICATION_NAME);
187 if(MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNO)==IDNO){
188 HeapDefaultFree(temp2);
189
190 sprintf(temporary,"%s%s\\",szTempPath,wfd.cFileName);
191 RemoveDirectoryStrong(temporary);
192 return 0;
193 }
194
195 sprintf(temporary,"%s%s\\",szTempPath,wfd.cFileName);
196 RestoreBeforeState(temporary,temp2);
197
198 HeapDefaultFree(temp2);
199
200 return 1;
201 }
202
203 HeapDefaultFree(temp2);
204 }
205 }
206 }
207 }while(FindNextFile(hFind,&wfd));
208 }
209
210 return 0;
211}
Note: See TracBrowser for help on using the repository browser.