Changeset 2534
- Timestamp:
- 2001-06-13T11:02:50+12:00 (23 years ago)
- Location:
- trunk/gsinstaller
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsinstaller/FilePath.cpp
r1589 r2534 334 334 reply->is_aRoot = __pathIsAValidRoot(reply->path); 335 335 return reply; 336 } 337 338 /** 339 * Check that the given path is a child/descendant of this path 340 */ 341 bool FilePath::isAncestorOf(string pathString) 342 { 343 if (this->path == "") 344 return false; 345 346 if (pathString.length() < this->path.length()) 347 { return false; 348 } 349 if (pathString.substr(0, this->path.length()) != this->path) 350 { return false; 351 } 352 if (pathString.length() == this->path.length()) 353 { return false; 354 } 355 if (pathString[this->path.length()-1] != '\\' && 356 pathString[this->path.length()] != '\\') 357 { return false; 358 } 359 // can't be a proper ancestor of itself 360 return true; 336 361 } 337 362 -
trunk/gsinstaller/FilePath.h
r1544 r2534 36 36 FilePath *root(); 37 37 FilePath *rootDrive(); 38 bool isAncestorOf(string pathString); 38 39 bool ensureWriteablePath(); 39 40 bool exists(); -
trunk/gsinstaller/configurable.cpp
r1397 r2534 26 26 { return this->option; 27 27 } 28 void configurable::setFirst(bool isFirst) 29 { this->first = isFirst; 30 } 28 31 32 bool configurable::isFirst() 33 { return this->first; 34 } 29 35 void configurable::setFinal(bool isFinal) 30 36 { this->final = isFinal; 31 37 } 32 33 38 bool configurable::isFinal() 34 39 { return this->final; -
trunk/gsinstaller/configurable.h
r1539 r2534 15 15 void setFinal(bool isFinal); 16 16 bool isFinal(); 17 void setFirst(bool isFirst); 18 bool isFirst(); 17 19 18 20 void setOption(bool to); … … 22 24 bool option; 23 25 bool final; 26 bool first; 24 27 char *optPrompt; 25 28 }; -
trunk/gsinstaller/copyProgress.cpp
r2073 r2534 25 25 progressBar = (copyProgressBar *) GetWindowLong(window, GWL_USERDATA); 26 26 if (progressBar == NULL) 27 { 28 MessageBox(0, "A", "A", MB_OK); 27 { 28 // TODO: error handling 29 29 } 30 30 … … 63 63 } 64 64 65 copyProgressBar::copyProgressBar(unsigned long totalSize) 66 { this->total = totalSize; 67 this->copied = 0; 65 copyProgressBar::copyProgressBar(unsigned long totalSize, unsigned long totalFiles) 66 { this->total = totalSize; 67 this->totalFiles = totalFiles; 68 this->copied = 0; 69 this->copiedFiles = 0; 70 this->showing = false; 68 71 } 69 72 70 73 copyProgressBar::copyProgressBar() 71 { this->total = 0; 72 this->copied = 0; 74 { this->total = 0; 75 this->totalFiles = 0; 76 this->copied = 0; 77 this->copiedFiles = 0; 78 this->showing = false; 73 79 } 74 80 75 void copyProgressBar::init(unsigned long totalSize) 76 { this->total = totalSize; 77 this->copied = 0; 81 // just ensure everything is tidily terminated 82 copyProgressBar::~copyProgressBar() 83 { this->close(); 84 } 85 86 void copyProgressBar::init(unsigned long totalSize, unsigned long totalFiles) 87 { this->total = totalSize; 88 this->totalFiles = totalFiles; 89 this->copied = 0; 90 this->copiedFiles = 0; 78 91 } 79 92 80 93 void copyProgressBar::done(unsigned long bytesDone) 81 { unsigned int percent; 82 this->copied += bytesDone; 94 { 95 static char progressText[100] = "Remaining: "; 96 static int progressTimePos = strlen(progressText); 97 double seconds; 83 98 84 percent =(this->copied * 100 / this->total); 99 // note the progress made by the extra bytes 100 this->copied += bytesDone; 101 this->copiedFiles += 1; 85 102 86 SendMessage(this->progressBar, PBM_SETPOS, percent, 0L); 103 // present the progress in the progress bar 104 double percent = (double) this->copied / (double) this->total; 105 percent = percent * 100; 106 SendMessage(this->progressBar, PBM_SETPOS, (int) percent, 0L); 107 108 // present time remaining 109 seconds = difftime(time(NULL), this->startTime); 110 if (this->copied == 0) 111 { return; 112 } 113 seconds = seconds * (double) (this->total - this->copied) / (double) this->copied; 114 115 sprintf(&progressText[progressTimePos], "%d:%02d %3.1fMb (%d files)", (int) (seconds / 60), ((int) seconds) % 60, double (this->total - this->copied) / (double) (1024 * 1024), this->totalFiles - this->copiedFiles); 116 SetWindowText(this->progressTime, progressText); 117 } 118 119 void copyProgressBar::done(unsigned long bytesDone, LPSTR message) 120 { 121 this->done(bytesDone); 122 this->message(message); 123 } 124 125 void copyProgressBar::message(LPSTR message) 126 { SetWindowText(this->progressText, message); 87 127 } 88 128 … … 97 137 gsInstall_getDesktopExt(&sx, &sy); 98 138 99 dx = (sx - 200) >> 1;100 dy = (sy - 80) >> 1;139 dx = (sx - 400) >> 1; 140 dy = (sy - 110) >> 1; 101 141 102 142 143 // Create the parent to hold the progress elements 103 144 this->progressParent = CreateWindowEx( WS_EX_APPWINDOW, "CopyProgressBar", 104 145 "GreenStone Installer", WS_VISIBLE, 105 dx, dy, 200, 80,146 dx, dy, 400, 110, 106 147 0, (HMENU) 0, 107 148 app_instance, (void *) params); 149 // Create the progress bar itself 108 150 this->progressBar = CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE, 109 10, 30, 180, GetSystemMetrics(SM_CYVSCROLL),151 10, 60, 380, GetSystemMetrics(SM_CYVSCROLL), 110 152 this->progressParent, (HMENU) 0, 111 153 app_instance, NULL); 154 155 // Create the text reporter 156 this->progressText = CreateWindowEx(0, "STATIC", "", WS_CHILD | SS_LEFT | WS_VISIBLE, 157 10, 5, 380, 20, 158 this->progressParent, (HMENU) 0, 159 app_instance, NULL); 160 161 // Create the time reporter 162 this->progressTime = CreateWindowEx(0, "STATIC", "", WS_CHILD | SS_LEFT | WS_VISIBLE, 163 10, 30, 380, 20, 164 this->progressParent, (HMENU) 0, 165 app_instance, NULL); 166 167 // Note that we are now showing the progress bar 168 this->showing = true; 112 169 } 113 170 171 // ensure that if the windows are showing, they are closed before the object 172 // is destroyed 114 173 void copyProgressBar::close() 115 { // return; 116 ShowWindow(this->progressBar, SW_HIDE); 117 DestroyWindow(this->progressBar); 174 { if (this->showing == true) 175 { 176 ShowWindow(this->progressBar, SW_HIDE); 177 DestroyWindow(this->progressBar); 118 178 119 ShowWindow(this->progressParent, SW_HIDE); 120 DestroyWindow(this->progressParent); 179 ShowWindow(this->progressParent, SW_HIDE); 180 DestroyWindow(this->progressParent); 181 this->showing = false; 182 } 121 183 } 122 184 -
trunk/gsinstaller/copyProgress.h
r1397 r2534 2 2 #define _COPYPROGRESS_H_ 3 3 #include <windows.h> 4 #include <time.h> 4 5 5 6 class copyProgressBar … … 7 8 unsigned long total; 8 9 unsigned long copied; 9 HWND progressParent; 10 HWND progressBar; 10 unsigned long totalFiles; 11 unsigned long copiedFiles; 12 HWND progressParent; 13 HWND progressBar; 14 HWND progressText; 15 HWND progressTime; 16 bool showing; 17 time_t startTime; 11 18 public: 12 copyProgressBar(); 13 copyProgressBar(unsigned long totalSize); 14 void registerClass(); 19 // constructors/destructors 20 copyProgressBar(); 21 22 copyProgressBar(unsigned long totalSize, unsigned long totalFiles); 23 ~copyProgressBar(); // destructor introduced to ensure that open windows are closed 24 25 void registerClass(); // does the registration of the window classes into Windows 26 // the window procedure itself 15 27 LRESULT CALLBACK windowProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam); 28 29 // timing methods 30 void setStartTime() { this->startTime = time(NULL); } 31 // messaging methods 16 32 void done(unsigned long bytesDone); 17 void init(unsigned long totalSize); 33 void done(unsigned long bytesDone, LPSTR message); 34 void message(LPSTR message); 35 36 // reinitialise the progress bar, giving a new total completion size 37 void init(unsigned long totalSize, unsigned long totalFiles); 38 // show the progress bar 18 39 void show(); 40 // close (hide) the progress bar 19 41 void close(); 20 42 }; -
trunk/gsinstaller/file.cpp
r1541 r2534 3 3 4 4 #include <windows.h> 5 #include <stdio.h>5 // #include <stdio.h> 6 6 7 7 #include "file.h" 8 9 #include <direct.h> 8 10 9 11 void File::_getDetails() … … 105 107 { return this->size; 106 108 } 109 unsigned long File::getFileSize() 110 { unsigned long size, files; 107 111 108 unsigned long File::getFileSize() 109 { unsigned long totalSize = 0; 112 this->getFileSize(size, files); 113 return size; 114 } 115 void File::getFileSize(unsigned long &totalSize, unsigned long &totalFiles) 116 { totalSize = 0; 117 totalFiles = 1; 110 118 111 119 if (this->is_dir) … … 114 122 115 123 while (here != end) 116 { totalSize += here->getFileSize(); 124 { unsigned long ldata, lcount; 125 126 here->getFileSize(ldata, lcount); 127 totalSize += ldata; 128 totalFiles += lcount; 117 129 here ++; 118 130 } 119 131 } 132 120 133 totalSize += this->size; 121 return totalSize;122 134 } 135 123 136 124 137 vector<File>::iterator File::childBegin() … … 141 154 { return this->does_exist; 142 155 } 156 bool File::remove() 157 { bool ok = true; 143 158 159 if (this->is_dir) 160 { 161 vector<File>::iterator here = this->children.begin(); 162 vector<File>::iterator end = this->children.end(); 163 164 while (here != end) 165 { ok = here->remove() && ok; 166 here ++; 167 } 168 169 ok = RemoveDirectory(this->path.c_str()) && ok; 170 } 171 else 172 { ok = DeleteFile(this->path.c_str()) != 0 ? true : false; 173 } 174 return ok; 175 } 144 176 void File::copy(char *to) 145 177 { -
trunk/gsinstaller/file.h
r1541 r2534 32 32 File(string filename); 33 33 void copy(char *destination); 34 bool remove(); 34 35 bool isDirectory(); 35 36 bool isWriteable(); 36 37 bool exists(); 37 38 unsigned long getRawFileSize(); 39 void getFileSize(unsigned long &dataSize, unsigned long &dataFiles); 38 40 unsigned long getFileSize(); 39 41 // const char *cString(); -
trunk/gsinstaller/fileCopier.cpp
r1766 r2534 6 6 #include <direct.h> 7 7 8 #include <fstream.h> 9 8 10 fileCopySet::fileCopySet() 9 11 { … … 13 15 } 14 16 15 fileCopySet::fileCopySet( FileVector files, FilePath &from, FilePath &to)16 { 17 this->fileList = files;17 fileCopySet::fileCopySet(string label, FileVector files, FilePath &from, FilePath &to) 18 { 19 this->fileList = files; 18 20 this->sourceDir = from; 19 this->destDir = to; 20 this->dataSize = 0; 21 this->label = label; 22 this->destDir = to; 23 this->dataSize = 0; 24 this->dataFiles = 0; 21 25 22 26 FileVector::iterator here = files.begin(); … … 25 29 while (here != end) 26 30 { 27 this->dataSize += here->getFileSize(); 31 unsigned long size, files; 32 here->getFileSize(size, files); 33 this->dataSize += size; 34 this->dataFiles += files; 28 35 here ++; 29 36 } … … 63 70 // log the creation - we don't give a source - it's not needed for directories 64 71 if (monitor != NULL) 65 { monitor->c opiedDir(parentName->cString());72 { monitor->createdDir(parentName->cString()); 66 73 } 67 74 } … … 77 84 unsigned long copied = 0; 78 85 unsigned long bytes_read, bytes_written; 79 unsigned char buffer[65536];86 static unsigned char buffer[65536]; 80 87 FILE *read_handle, *write_handle; 81 88 char *destination; … … 123 130 // note new bytes copied 124 131 copied += bytes_written; 125 this->dataSize += bytes_written;132 // this->dataSize += bytes_written; 126 133 } 127 134 fclose(read_handle); 128 135 fclose(write_handle); 136 137 // this->dataFiles += 1; 129 138 130 139 // free destination filename text … … 152 161 if (file->isDirectory()) 153 162 { 154 155 163 // get destination directory 156 164 char *thisDestDir = this->destination(file); … … 168 176 if (monitor != NULL) 169 177 { 170 monitor->copiedDir( thisDestDir);178 monitor->copiedDir(destPath.pathString()); 171 179 } 172 180 } … … 230 238 } 231 239 240 unsigned long fileCopySet::getOriginalFiles() 241 { 242 // initialise counters for size 243 return this->dataFiles; 244 } 245 232 246 /** 233 247 * Perform a check on the total space available at the destination; if not … … 237 251 { 238 252 fileCopySetList localSet = this->list; 253 254 this->progressBar.message("Checking disk space requirements"); 239 255 240 256 do … … 294 310 295 311 // record size and initialise the progressbar with the same 296 this->dataSize = 0; 312 this->dataSize = 0; 313 this->dataFiles = 0; 297 314 for (unsigned int i = 0; i < this->list.size(); i ++) 298 315 { 299 316 this->dataSize += this->list[i].getOriginalSize(); 300 } 301 this->progressBar.init(this->dataSize); 317 this->dataFiles += this->list[i].getOriginalFiles(); 318 } 319 this->progressBar.init(this->dataSize, this->dataFiles); 302 320 303 321 // return postive check … … 310 328 this->dataSize = 0; 311 329 this->copied = 0; 330 this->dataFiles = 0; 312 331 this->monitor = monitor; 332 333 this->progressBar.show(); 334 this->progressBar.message("Initialising"); 313 335 } 314 336 … … 317 339 this->dataSize = 0; 318 340 this->copied = 0; 341 this->dataFiles = 0; 319 342 this->monitor = monitor; 320 } 321 343 344 this->progressBar.show(); 345 this->progressBar.message("Initialising"); 346 } 347 348 void fileCopier::addSet(fileCopySet &set) 349 { this->list.push_back(set); 350 this->progressBar.message("Gathering files to copy"); 351 } 352 353 // Do the actual file copy 322 354 void fileCopier::copy() 323 355 { … … 325 357 fileCopySetList::iterator end = list.end(); 326 358 327 328 this->progressBar.show(); 359 // Tell the user what is happening 360 char buffer[100]; 361 sprintf(buffer, "Copying %3.1fMb of files", (double) this->dataSize / (double) (1024 * 1024)); 362 this->progressBar.message(buffer); 363 this->progressBar.setStartTime(); 364 365 // Copy each file set individually, using the progress bar as a monitor 329 366 while (here != end) 330 367 { … … 333 370 } 334 371 372 // Close the progress bar, as it is no longer needed 335 373 this->progressBar.close(); 336 374 } -
trunk/gsinstaller/fileCopier.h
r1766 r2534 10 10 fileCopyMonitor() {}; 11 11 virtual void copiedFile(string from, string to) = 0; 12 virtual void createdDir(string dirName) = 0; 12 13 virtual void copiedDir(string dirName) = 0; 13 14 }; … … 16 17 { 17 18 private: 18 FileVector fileList; 19 FilePath sourceDir; 19 FileVector fileList; 20 FilePath sourceDir; 21 string label; 20 22 unsigned long dataSize; 23 unsigned long dataFiles; 21 24 public: 22 25 FilePath destDir; 23 26 fileCopySet(); 24 fileCopySet( FileVector files, FilePath &from, FilePath &to);27 fileCopySet(string label, FileVector files, FilePath &from, FilePath &to); 25 28 char *destination(File *file); 26 29 unsigned long getOriginalSize(); 30 unsigned long getOriginalFiles(); 27 31 unsigned long getCopiedSize(DiskSpace &space); 28 32 bool ensureParent(FilePath &child, fileCopyMonitor *monitor); … … 38 42 private: 39 43 fileCopySetList list; 40 unsigned long dataSize;44 unsigned long dataSize; 41 45 unsigned long copied; 46 unsigned long dataFiles; 42 47 copyProgressBar progressBar; 43 48 fileCopyMonitor *monitor; … … 46 51 fileCopier::fileCopier(fileCopyMonitor *monitor, fileCopySetList &list); 47 52 fileCopier::fileCopier(fileCopyMonitor *monitor); 48 void fileCopier::addSet(fileCopySet &set) { this->list.push_back(set); }53 void fileCopier::addSet(fileCopySet &set); 49 54 bool checkSpace(); 50 55 void copy(); -
trunk/gsinstaller/gsManifest.cpp
r2063 r2534 14 14 gsManifest::gsManifest(installManager &manager, FilePath &root) 15 15 : installAgent(manager), fileCopyMonitor() 16 { 16 { 17 17 this->getManifest(root); 18 18 this->expandGroups(); … … 234 234 stringArray &groupArray = this->manifests[groupName]; 235 235 236 // do we really need this twice ??237 // groupArray = this->manifests[groupName];238 239 236 this->selected[destination].add(groupArray); 237 238 if (groupName == "collection") 239 { FilePath *temp = new FilePath(destination, "\\collect"); 240 this->collectRoot = *temp; 241 delete temp; 242 } 240 243 } 241 244 … … 261 264 // as the destinations go 262 265 fileList = this->selection(*source, array); 263 fileCopySet copySet( *fileList, *source, path);266 fileCopySet copySet("", *fileList, *source, path); 264 267 copy.addSet(copySet); 265 268 delete fileList; … … 279 282 280 283 void gsManifest::copiedFile(string from, string to) 281 { this->logAction("Manifest.CopyFile", from, to); 284 { if (!this->collectRoot.isAncestorOf(to)) 285 { this->logAction("Manifest.CopyFile", from, to); 286 } 287 } 288 289 void gsManifest::createdDir(string dirName) 290 { this->logAction("Manifest.CreateDir", dirName); 282 291 } 283 292 284 293 void gsManifest::copiedDir(string dirName) 285 { this->logAction("Manifest.CreateDir", dirName); 294 { 295 if (!this->collectRoot.isAncestorOf(dirName)) 296 { if (this->collectRoot.pathString() == dirName) 297 { 298 this->logAction("Manifest.CopyDir", dirName); 299 } 300 else 301 { 302 this->logAction("Manifest.CreateDir", dirName); 303 } 304 } 286 305 } 287 306 … … 311 330 return true; 312 331 } 332 else if (actionName == "Manifest.CopyDir") 333 { 334 // do a recursive delete then 335 File f(params[0]); 336 if (!f.remove()) 337 { 338 this->removeFailed.add(params[0]); 339 } 340 return true; 341 } 313 342 else if (actionName == "Manifest.CopyFile" || actionName == "CopyFile") 314 343 { -
trunk/gsinstaller/gsManifest.h
r2013 r2534 28 28 stringArray removeFailed; 29 29 30 FilePath collectRoot; 31 30 32 bool getManifestLine(char *line, string ¯o); 31 33 public: … … 51 53 52 54 void copiedFile(string from, string to); // from fileCopyMonitor 55 void createdDir(string dirName); // from fileCopyMonitor 53 56 void copiedDir(string dirName); // from fileCopyMonitor 54 57 }; -
trunk/gsinstaller/gsProfile.cpp
r2288 r2534 28 28 { if (this->fileName == params[0]) 29 29 { DeleteFile(params[0].c_str()); 30 return true; 30 31 } 31 32 } … … 100 101 itemValue.c_str(), this->fileName.c_str())) 101 102 { DWORD error = GetLastError(); 102 /* char buffer[20]; 103 sprintf(buffer, "%lx", error); 104 MessageBox(0, buffer, "", MB_OK);*/ 103 /* char buffer[201]; 104 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, buffer, 200, NULL); 105 MessageBox(0, buffer, "Write error", MB_OK); 106 */ 107 105 108 return false; 106 109 } … … 112 115 { if (!WritePrivateProfileString( sectionName.c_str(), itemName.c_str(), 113 116 NULL, this->fileName.c_str())) 114 { MessageBox(0, "Failed", itemName.c_str(), MB_OK); 115 return false; 117 { DWORD error = GetLastError(); 118 if (error != 3) 119 { char buffer[201]; 120 121 MessageBox(0, "Failed", itemName.c_str(), MB_OK); 122 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 0, 0, buffer, 200, NULL); 123 MessageBox(0, buffer, "Write error", MB_OK); 124 return false; 125 } 126 WritePrivateProfileString(NULL, NULL, NULL, this->fileName.c_str()); 127 MessageBox(0, this->fileName.c_str(), sectionName.c_str(), MB_OK); 116 128 } 117 129 return true; -
trunk/gsinstaller/gsinstall.cpp
r2288 r2534 257 257 258 258 // do the copy 259 this->manifest->copy(this->gsdlSourcePath); 260 261 return true; 259 return this->manifest->copy(this->gsdlSourcePath); 262 260 } 263 261 … … 413 411 this->readLog(); 414 412 delete logPath; 415 413 416 414 return true; 417 415 } … … 431 429 { 432 430 if (!this->manifest->undoAction(command, params)) 433 { 431 { 434 432 if (!gsdlProfile.undoAction(command, params)) 435 { 433 { 436 434 if (!this->gsRegister->undoAction(command, params)) 437 { 435 { 438 436 if (!this->progman->undoAction(command, params)) 439 437 { 440 438 } 439 else 440 { 441 442 } 441 443 } 442 444 } 443 445 } 444 446 } 445 447 446 448 } 447 449 … … 456 458 } 457 459 if (this->installFullVolume) 458 { 460 { 461 this->manifest->selectGroup("supporting", *this->dataDestPath); 459 462 this->manifest->selectGroup("collection", *this->dataDestPath); 460 463 } 461 464 else 462 { 465 { 463 466 this->manifest->selectGroup("database", *this->dataDestPath); 464 467 } … … 784 787 } 785 788 break; 786 789 787 790 case WM_NOTIFY: 788 791 switch (((LPNMHDR) lParam)->code) … … 791 794 { 792 795 dirSelector *selector = ((dirSelector *) GetWindowLong(Dialog, GWL_USERDATA)); 793 796 794 797 // bodge to set the dialogue path to the correct value 795 798 if (selector != rootSelector) … … 798 801 SetDlgItemText(Dialog, dirpath_PATH, selector->selectedPath()); 799 802 } 800 801 if (selector->isFinal()) 802 { 803 PropSheet_SetWizButtons(GetParent(Dialog), PSWIZB_BACK | PSWIZB_FINISH); 804 } 805 else 806 { 807 PropSheet_SetWizButtons(GetParent(Dialog), PSWIZB_BACK | PSWIZB_NEXT); 808 } 803 804 805 PropSheet_SetWizButtons(GetParent(Dialog), (selector->isFirst() ? 0 : PSWIZB_BACK) | 806 (selector->isFinal() ? PSWIZB_FINISH : PSWIZB_NEXT)); 809 807 } 810 808 break; … … 856 854 857 855 void GSInstall_init_propertySheet(PROPSHEETPAGE &ppage, char *prompt, char *optPrompt, 858 char *title, GSInstall &installer, bool isFi nal)856 char *title, GSInstall &installer, bool isFirst, bool isFinal) 859 857 { 860 858 GSInstall_dirPathData *data = new GSInstall_dirPathData; … … 862 860 // create the directory Selector 863 861 data->dirSelect = new dirSelector(prompt, optPrompt, title, installer.installPath()); 862 data->dirSelect->setFirst(isFirst); 864 863 data->dirSelect->setFinal(isFinal); 865 864 … … 933 932 "Choose a directory to install your " 934 933 "GreenStone software to.", NULL, 935 "Select", install, false);934 "Select", install, true, false); 936 935 GSInstall_init_propertySheet(ppage[1], 937 936 "Choose a directory to install the collection " … … 945 944 "computer.\n\n", 946 945 "Install all collection files", 947 "Select", install, true);946 "Select", install, false, true); 948 947 949 948 reply = (PropertySheet (&pshead) >= 0); … … 1041 1040 install.setManifest(); 1042 1041 1043 install.copyFiles(); // caused page fault; Windows 3.1 1042 if (!install.copyFiles()) // caused page fault; Windows 3.1 1043 { MessageBox(0, "Not enough space to install required files", "Greenstone Installer", MB_OK); 1044 install.abortLog(); 1045 DestroyWindow(Window); 1046 return false; 1047 } 1044 1048 install.updateProgman(); // caused divide overflow; Windows 3.1 1045 1049 install.updateRegistry();
Note:
See TracChangeset
for help on using the changeset viewer.