1 /* 2 * Copyright 2005-2006, Jérôme DUVAL. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #include "CopyEngine.h" 7 #include "InstallerWindow.h" 8 #include "PartitionMenuItem.h" 9 #include <Alert.h> 10 #include <FindDirectory.h> 11 #include <Path.h> 12 #include <String.h> 13 #include <VolumeRoster.h> 14 15 //#define COPY_TRACE 16 #ifdef COPY_TRACE 17 #define CALLED() printf("CALLED %s\n",__PRETTY_FUNCTION__) 18 #else 19 #define CALLED() 20 #endif 21 22 const char BOOT_PATH[] = "/boot"; 23 24 extern void SizeAsString(off_t size, char *string); 25 26 27 CopyEngine::CopyEngine(InstallerWindow *window) 28 : BLooper("copy_engine"), 29 fWindow(window), 30 fPackages(NULL), 31 fSpaceRequired(0) 32 { 33 Run(); 34 } 35 36 37 void 38 CopyEngine::MessageReceived(BMessage*msg) 39 { 40 CALLED(); 41 switch (msg->what) { 42 case ENGINE_START: 43 Start(fWindow->GetSourceMenu(), fWindow->GetTargetMenu()); 44 break; 45 } 46 } 47 48 49 void 50 CopyEngine::SetStatusMessage(char *status) 51 { 52 BMessage msg(STATUS_MESSAGE); 53 msg.AddString("status", status); 54 BMessenger(fWindow).SendMessage(&msg); 55 } 56 57 58 void 59 CopyEngine::LaunchInitScript(BPath &path) 60 { 61 BPath bootPath; 62 find_directory(B_BEOS_BOOT_DIRECTORY, &bootPath); 63 BString command("/bin/sh "); 64 command += bootPath.Path(); 65 command += "/InstallerInitScript "; 66 command += path.Path(); 67 SetStatusMessage("Starting Installation."); 68 system(command.String()); 69 } 70 71 72 void 73 CopyEngine::LaunchFinishScript(BPath &path) 74 { 75 BPath bootPath; 76 find_directory(B_BEOS_BOOT_DIRECTORY, &bootPath); 77 BString command("/bin/sh "); 78 command += bootPath.Path(); 79 command += "/InstallerFinishScript "; 80 command += path.Path(); 81 SetStatusMessage("Finishing Installation."); 82 system(command.String()); 83 } 84 85 86 void 87 CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu) 88 { 89 CALLED(); 90 PartitionMenuItem *targetItem = (PartitionMenuItem *)targetMenu->FindMarked(); 91 PartitionMenuItem *srcItem = (PartitionMenuItem *)srcMenu->FindMarked(); 92 if (!srcItem || !targetItem) { 93 fprintf(stderr, "bad menu items\n"); 94 return; 95 } 96 97 BMessage msg(INSTALL_FINISHED); 98 BMessenger(fWindow).SendMessage(&msg); 99 } 100 101 102 void 103 CopyEngine::ScanDisksPartitions(BMenu *srcMenu, BMenu *targetMenu) 104 { 105 PartitionMenuItem *item = new PartitionMenuItem(NULL, "boot", NULL, new BMessage(SRC_PARTITION), 0); 106 srcMenu->AddItem(item); 107 108 PartitionMenuItem *item2 = new PartitionMenuItem(NULL, "target", NULL, new BMessage(TARGET_PARTITION), 0); 109 targetMenu->AddItem(item2); 110 } 111 112 113 void 114 CopyEngine::SetPackagesList(BList *list) 115 { 116 if (fPackages) 117 delete fPackages; 118 fPackages = list; 119 } 120 121