1 /* 2 * Copyright 2002-2009 Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT license. 4 * 5 * Authors: 6 * Erik Jaesler <ejakowatz@users.sourceforge.net> 7 * Ithamar R. Adema <ithamar@unet.nl> 8 * Stephan Aßmus <superstippi@gmx.de> 9 */ 10 11 #include "DriveSetup.h" 12 #include "MainWindow.h" 13 14 #include <stdio.h> 15 #include <string.h> 16 17 #include <File.h> 18 #include <FindDirectory.h> 19 #include <Locale.h> 20 #include <Path.h> 21 22 23 DriveSetup::DriveSetup() 24 : BApplication("application/x-vnd.Haiku-DriveSetup"), 25 fWindow(NULL), 26 fSettings(0UL) 27 { 28 } 29 30 31 DriveSetup::~DriveSetup() 32 { 33 } 34 35 36 void 37 DriveSetup::ReadyToRun() 38 { 39 fWindow = new MainWindow(BRect(50, 50, 600, 450)); 40 if (_RestoreSettings() != B_OK) 41 fWindow->ApplyDefaultSettings(); 42 fWindow->Show(); 43 } 44 45 46 bool 47 DriveSetup::QuitRequested() 48 { 49 _StoreSettings(); 50 51 if (fWindow->Lock()) { 52 fWindow->Quit(); 53 fWindow = NULL; 54 } 55 56 return true; 57 } 58 59 60 // #pragma mark - 61 62 63 status_t 64 DriveSetup::_StoreSettings() 65 { 66 status_t ret = B_ERROR; 67 if (fWindow->Lock()) { 68 ret = fWindow->StoreSettings(&fSettings); 69 fWindow->Unlock(); 70 } 71 72 if (ret < B_OK) { 73 fprintf(stderr, "failed to store settings: %s\n", strerror(ret)); 74 return ret; 75 } 76 77 BFile file; 78 ret = _GetSettingsFile(file, true); 79 if (ret < B_OK) 80 return ret; 81 82 ret = fSettings.Flatten(&file); 83 if (ret < B_OK) { 84 fprintf(stderr, "failed to flatten settings: %s\n", strerror(ret)); 85 return ret; 86 } 87 88 return B_OK; 89 } 90 91 92 status_t 93 DriveSetup::_RestoreSettings() 94 { 95 BFile file; 96 status_t ret = _GetSettingsFile(file, false); 97 if (ret < B_OK) 98 return ret; 99 100 ret = fSettings.Unflatten(&file); 101 if (ret < B_OK) { 102 fprintf(stderr, "failed to unflatten settings: %s\n", strerror(ret)); 103 return ret; 104 } 105 106 ret = fWindow->RestoreSettings(&fSettings); 107 if (ret < B_OK) { 108 fprintf(stderr, "failed to restore settings: %s\n", strerror(ret)); 109 return ret; 110 } 111 112 return B_OK; 113 } 114 115 116 status_t 117 DriveSetup::_GetSettingsFile(BFile& file, bool forWriting) const 118 { 119 BPath path; 120 status_t ret = find_directory(B_USER_SETTINGS_DIRECTORY, &path); 121 if (ret != B_OK) { 122 fprintf(stderr, "failed to get user settings folder: %s\n", 123 strerror(ret)); 124 return ret; 125 } 126 127 ret = path.Append("DriveSetup"); 128 if (ret != B_OK) { 129 fprintf(stderr, "failed to construct path: %s\n", strerror(ret)); 130 return ret; 131 } 132 133 uint32 writeFlags = B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY; 134 uint32 readFlags = B_READ_ONLY; 135 136 ret = file.SetTo(path.Path(), forWriting ? writeFlags : readFlags); 137 if (ret != B_OK) { 138 if (forWriting) { 139 // Only inform of an error if the file was supposed to be written. 140 fprintf(stderr, "failed to init settings file: %s\n", 141 strerror(ret)); 142 } 143 return ret; 144 } 145 146 return B_OK; 147 } 148 149 150 // #pragma mark - 151 152 153 int 154 main(int, char**) 155 { 156 DriveSetup app; 157 app.Run(); 158 return 0; 159 } 160