Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2012
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 55.84 KB | None | 0 0
  1. /*
  2.  * Copyright 2000-2002, Johan Nilsson.
  3.  * Copyright 2010-2011 BurnItNow maintainers
  4.  * All rights reserved.
  5.  * Distributed under the terms of the MIT License.
  6.  */
  7.  
  8.  
  9. #include "jpWindow.h"
  10. #include "copyright.h"
  11.  
  12. #include "AboutWindow.h"
  13. #include "AskName.h"
  14. #include "AudioView.h"
  15. #include "BurnView.h"
  16. #include "CDRWView.h"
  17. #include "CopyCDView.h"
  18. #include "DataView.h"
  19. #include "LeftList.h"
  20. #include "LogView.h"
  21. #include "MakeBFS.h"
  22. #include "Prefs.h"
  23. #include "PrefsView.h"
  24. #include "RightList.h"
  25. #include "StatusWindow.h"
  26.  
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29.  
  30.  
  31. #include <Alert.h>
  32. #include <Application.h>
  33. #include <Button.h>
  34. #include <File.h>
  35. #include <FindDirectory.h>
  36. #include <Entry.h>
  37. #include <MenuBar.h>
  38. #include <MenuItem.h>
  39. #include <Path.h>
  40. #include <Roster.h>
  41. #include <ScrollView.h>
  42.  
  43.  
  44. const char* BlType[] = {"all", "fast", "session", "track", "trtail", "unreserve", "unclose"};
  45. int16 BLANK_TYPE;
  46. int16 BLANK_SPD;
  47. int16 BURN_SPD;
  48. int16 BURN_TYPE;
  49. int16 IMAGE_TYPE;
  50. int16 SCSI_DEV;
  51. int16 CDSIZE;
  52.  
  53. uint32 nrtracks;
  54. float angles[100];
  55.  
  56. extern BDirectory* BFSDir;
  57. bool VRCD;
  58. bool ISOFILE;
  59. bool ONTHEFLY;
  60. bool BOOTABLE;
  61. entry_ref BOOTIMAGEREF;
  62.  
  63. char* IMAGE_NAME;
  64. char* BURNIT_PATH;
  65. char* BURN_DIR;
  66. BPath CDRTOOLS_DIR;
  67.  
  68. char BURNFREE[30]; // driveropts=burnfree
  69. char PAD[10]; // -pad (audio)
  70. char DAO[10]; // -dao
  71. char NOFIX[10]; // -nofix (audio)
  72. char PREEMP[10]; // -preemp (audio)
  73. char SWAB[10]; // -swab
  74. char BOOTSTRING[128]; // -c boot.catalog -b boot.catalog/boot.img
  75.  
  76. char MULTISESSION[10];
  77. char AUDIO_FILES[10240];
  78. char DUMMYMODE[10];
  79. char EJECT[10];
  80. char ISOFILE_DIR[1024];
  81. char DATA_STRING[100];
  82. char VOL_NAME[25];
  83. bool JUST_IMAGE;
  84.  
  85. bool scsibus = false;
  86.  
  87. FILE* CLInput;
  88. thread_id OPMkImage = 0, Cntrl = 0, OPBurn = 0, OPBlank = 0;
  89.  
  90.  
  91. int32 controller(void* p)
  92. {
  93.     char* command = (char*)p;
  94.     CLInput = popen(command, "r");
  95.     return 0;
  96. }
  97.  
  98.  
  99. int32 OutPutMkImage(void* p)
  100. {
  101.     char buffer[1024], buf[10], buf2[10], buf3[100];
  102.     int temp, i;
  103.     StatusWindow* SWin = (StatusWindow*)p;
  104.     while (!feof(CLInput) && !ferror(CLInput)) {
  105.         buffer[0] = 0;
  106.  
  107.         fgets(buffer, 1024, CLInput);
  108.         if (buffer[6] == '%' || buffer[7] == '%' || buffer[8] == '%') {
  109.             strncpy(&buf[0], &buffer[0], 8);
  110.  
  111.             for (i = 0; i < (int)strlen(buffer); i++) {
  112.                 if (buffer[i] == '.')
  113.                     break;
  114.             }
  115.             sprintf(buf3, "Making Image %s", buf);
  116.             strncpy(&buf2[0], &buffer[1], i - 1);
  117.             temp = atoi(buf2);
  118.             SWin->Lock();
  119.             SWin->UpdateStatus(temp, buf3);
  120.             SWin->Unlock();
  121.         }
  122.     }
  123.  
  124.     if (!JUST_IMAGE) {
  125.         SWin->Lock();
  126.         SWin->SendMessage(new BMessage(BURN_WITH_CDRECORD));
  127.         SWin->Unlock();
  128.     } else {
  129.         SWin->Lock();
  130.         SWin->Ready();
  131.         SWin->Unlock();
  132.         sprintf(IMAGE_NAME, "%s/tmp/BurnItNow.raw", BURNIT_PATH);
  133.     }
  134.     if (BOOTABLE) {
  135.         char temp[1024];
  136.         BPath path;
  137.         BEntry(&BOOTIMAGEREF, true).GetPath(&path);
  138.         sprintf(temp, "%s/boot.catalog/%s", BURN_DIR, path.Leaf());
  139.         BEntry(temp, true).Remove();
  140.         sprintf(temp, "%s/boot.catalog", BURN_DIR);
  141.         BEntry(temp, true).Remove();
  142.     }
  143.     return 0;
  144. }
  145.  
  146.  
  147. int32 OutPutBurn(void* p)
  148. {
  149.     bool progress_mode = false;
  150.     char buffer[1024], buf[50];
  151.     int done;
  152.     int left;
  153.     bool noerror = true;
  154.     StatusWindow* SWin = (StatusWindow*)p;
  155.     while (!feof(CLInput) && !ferror(CLInput)) {
  156.  
  157.         buffer[0] = 0;
  158.         if (!progress_mode) {
  159.             fgets(buffer, 1024, CLInput);
  160.         } else {
  161.             fread(buffer, 1, 33, CLInput);
  162.             buffer[33] = 0;
  163.             if (buffer[0] != 0x0d)
  164.                 progress_mode = false;
  165.         }
  166.         if (!strncmp(buffer, "Starting new", 12))
  167.             progress_mode = true;
  168.  
  169.         if (!strncmp(buffer, "Sense Code:", 11)) {
  170.             SWin->Lock();
  171.             BMessage hejsan(WRITE_TO_LOG);
  172.             SWin->StatusSetText("An error occurred when burning.");
  173.             hejsan.AddString("Text", "An error occurred when burning, the most common problem that it's now empty or it's a damaged CD.\nTry again and if it fails file a new ticket on the OSDrawer.net BurnItNow page.");
  174.             hejsan.AddBool("Error", true);
  175.             SWin->SendMessage(&hejsan);
  176.             noerror = false;
  177.             SWin->Unlock();
  178.             break;
  179.         }
  180.         if (!strncmp(buffer, "Last chance", 11)) {
  181.             SWin->Lock();
  182.             SWin->StatusSetText("Preparing...");
  183.             SWin->Unlock();
  184.         };
  185.         if (!strncmp(&buffer[1], "Track ", 6)) {
  186.             strncpy(&buf[0], &buffer[11], 3);
  187.             done = strtol(buf, 0, 0);
  188.             strncpy(&buf[0], &buffer[18], 3);
  189.             left = strtol(buf, 0, 0);
  190.             if (done) {
  191.                 sprintf(buf, "Burning %d of %d done", done, left);
  192.                 SWin->Lock();
  193.                 SWin->StatusSetMax((float)left);
  194.                 SWin->UpdateStatus((float)done, &buffer[1]);
  195.                 SWin->Unlock();
  196.             }
  197.         }
  198.         if (!strncmp(buffer, "Fixating", 8)) {
  199.             SWin->Lock();
  200.             SWin->StatusSetColor(black);
  201.             SWin->StatusUpdateReset();
  202.             SWin->StatusSetText("Fixating...");
  203.             SWin->Unlock();
  204.         }
  205.  
  206.     };
  207.     SWin->Lock();
  208.     if (!noerror) {
  209.         SWin->StatusSetColor(red);
  210.         SWin->StatusUpdateReset();
  211.         SWin->Ready();
  212.         SWin->UpdateStatus(100, "An error occurred when burning.");
  213.     }
  214.     SWin->SendMessage(new BMessage(SET_BUTTONS_TRUE));
  215.     if (noerror)
  216.         SWin->Ready();
  217.     SWin->Unlock();
  218.     sprintf(IMAGE_NAME, "%s/tmp/BurnItNow.raw", BURNIT_PATH);
  219.     BEntry(IMAGE_NAME, true).Remove();
  220.     if (BOOTABLE) {
  221.         char temp[1024];
  222.         BPath path;
  223.         BEntry(&BOOTIMAGEREF, true).GetPath(&path);
  224.         sprintf(temp, "%s/boot.catalog/%s", BURN_DIR, path.Leaf());
  225.         BEntry(temp, true).Remove();
  226.         sprintf(temp, "%s/boot.catalog", BURN_DIR);
  227.         BEntry(temp, true).Remove();
  228.     }
  229.     return 0;
  230. }
  231.  
  232.  
  233. int32 OutPutBlank(void* p)
  234. {
  235.     char buffer[1024];
  236.     bool temp = true;
  237.     StatusWindow* SWin = (StatusWindow*)p;
  238.  
  239.     while (!feof(CLInput) && !ferror(CLInput)) {
  240.         buffer[0] = 0;
  241.         fgets(buffer, 1024, CLInput);
  242.  
  243.         snooze(500000);
  244.         SWin->Lock();
  245.         if (temp) {
  246.             SWin->StatusSetColor(green);
  247.             temp = false;
  248.         } else {
  249.             SWin->StatusSetColor(blue);
  250.             temp = true;
  251.         }
  252.         SWin->StatusUpdateReset();
  253.         SWin->StatusSetText("Blanking...");
  254.  
  255.         SWin->Unlock();
  256.     }
  257.     SWin->Lock();
  258.     SWin->Ready();
  259.     SWin->StatusSetText("Blanking Done.");
  260.     SWin->SendMessage(new BMessage(SET_BUTTONS_TRUE));
  261.     SWin->Unlock();
  262.     return 0;
  263. }
  264.  
  265.  
  266. jpWindow::jpWindow(BRect frame)
  267.     :
  268.     BWindow(frame, "BurnItNow", B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE)
  269. {
  270.     char temp_char[1024];
  271.     entry_ref temp_ref;
  272.     BRect r;
  273.     BMenu* menu;
  274.     SetTitle("BurnItNow");
  275.     fBurnItPrefs = new Prefs("BurnItNow");
  276.     // Load settings
  277.     InitBurnIt();
  278.  
  279.     r = Bounds();
  280.     r.top = 20;
  281.     AddChild(fAroundBox = new BBox(r, "BoxAround", B_FOLLOW_NONE, B_WILL_DRAW | B_FRAME_EVENTS, B_PLAIN_BORDER));
  282.     // Size Status and button
  283.     r = fAroundBox->Bounds();
  284.     r.InsetBy(5.0, 5.0);
  285.     r.top = r.bottom - 39;
  286.     r.right -= 85;
  287.     fStatusBar = new BStatusBar(r, "fStatusBar");
  288.     fStatusBar->SetMaxValue(100.0);
  289.     fAroundBox->AddChild(fStatusBar);
  290.     fStatusBar->Reset();
  291.  
  292.     r = fAroundBox->Bounds();
  293.     r.InsetBy(10.0, 10.0);
  294.     r.top = r.bottom - 23;
  295.     r.left = r.right - 70;
  296.     fCalcSizeButton = new BButton(r, "calcsize", "Size?", new BMessage(CALCULATE_SIZE));
  297.     fAroundBox->AddChild(fCalcSizeButton);
  298.  
  299.     // Tabs
  300.     r = fAroundBox->Bounds();
  301.     r.InsetBy(5.0, 5.0);
  302.     r.bottom = 210;
  303.  
  304.     fTabView = new BTabView(r, "mytabview", B_WIDTH_FROM_LABEL);
  305.     fTabView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
  306.  
  307.     r = fTabView->Bounds();
  308.     r.InsetBy(5.0, 5.0);
  309.     r.bottom -= fTabView->TabHeight();
  310.     fMiscTab = new BTab();
  311.     fBurnView = new BurnView(r);
  312.     fTabView->AddTab(fBurnView, fMiscTab);
  313.     fMiscTab->SetLabel("Burn");
  314.  
  315.     fMiscTab = new BTab();
  316.     fDataView = new DataView(r);
  317.     fTabView->AddTab(fDataView, fMiscTab);
  318.     fMiscTab->SetLabel("Data");
  319.  
  320.     fMiscTab = new BTab();
  321.     fAudioView = new AudioView(r);
  322.     fTabView->AddTab(fAudioView, fMiscTab);
  323.     fMiscTab->SetLabel("Audio");
  324.  
  325. //  fMiscTab = new BTab();
  326. //  fTabView->AddTab(new CopyCDView(r, this), fMiscTab);
  327. //  fMiscTab->SetLabel("CopyCD");
  328.  
  329.     fMiscTab = new BTab();
  330.     fCDRWView = new CDRWView(r);
  331.     fTabView->AddTab(fCDRWView, fMiscTab);
  332.     fMiscTab->SetLabel("CDRW");
  333.  
  334.     fMiscTab = new BTab();
  335.     fPrefsView = new PrefsView(r);
  336.     fTabView->AddTab(fPrefsView, fMiscTab);
  337.     fMiscTab->SetLabel("Prefs");
  338.  
  339.     fMiscTab = new BTab();
  340.     fLogView = new LogView(r);
  341.     fTabView->AddTab(fLogView, fMiscTab);
  342.     fMiscTab->SetLabel("Log");
  343.  
  344.     fAroundBox->AddChild(fTabView);
  345.  
  346.     // FileList(RightList)
  347.     r = fAroundBox->Bounds();
  348.     r.InsetBy(5.0, 5.0);
  349.     r.top = 260;
  350.     r.bottom = r.bottom - 50;
  351.     r.left = (r.right / 2) + 3;
  352.     r.right -= (B_V_SCROLL_BAR_WIDTH + 3);
  353.     fRightList = new RightList(r);
  354.  
  355.     fAroundBox->AddChild(new BScrollView("Scroll files/info", fRightList, B_FOLLOW_LEFT | B_FOLLOW_TOP, 0, false, true));
  356.  
  357.     // ParentDir button
  358.     r = fAroundBox->Bounds();
  359.     r.InsetBy(5.0, 5.0);
  360.     r.top = 220;
  361.     r.bottom = 240;
  362.     r.left = (r.right / 2);
  363.     r.right -= (r.right - r.left) / 2;
  364.     fParentDirButton = new BButton(r, "ParentDir", "ParentDir", new BMessage( PARENT_DIR ));
  365.     fAroundBox->AddChild(fParentDirButton);
  366.  
  367.     // MakeDir button
  368.     r = fAroundBox->Bounds();
  369.     r.InsetBy(5.0, 5.0);
  370.     r.top = 220;
  371.     r.bottom = 240;
  372.     r.left = (r.right / 2) + 2;
  373.     r.left += (r.right - r.left) / 2 + 2;
  374.     r.right -= 2;
  375.     fMakeDirButton = new BButton(r, "MakeDir", "MakeDir", new BMessage( MAKE_DIR ));
  376.     fAroundBox->AddChild(fMakeDirButton);
  377.  
  378.     if (!VRCD) {
  379.         fMakeDirButton->SetEnabled(false);
  380.         fParentDirButton->SetEnabled(false);
  381.     }
  382.  
  383.     // LeftList
  384.     r = fAroundBox->Bounds();
  385.     r.InsetBy(5.0, 5.0);
  386.     r.top = 260;
  387.     r.bottom = r.bottom - 50;
  388.     r.right -= ((r.right / 2) + (B_V_SCROLL_BAR_WIDTH) + 3);
  389.     fLeftList = new LeftList(r);
  390.  
  391.     fAroundBox->AddChild(new BScrollView("Scroll LeftListr", fLeftList, B_FOLLOW_LEFT | B_FOLLOW_TOP, 0, false, true));
  392.  
  393.     // Init
  394.     if (VRCD) {
  395.         sprintf(temp_char, "VRCD - [%s]", VOL_NAME);
  396.         if (BOOTABLE)
  397.             sprintf(temp_char, "VRCD(Boot) - [%s]", VOL_NAME);
  398.         else
  399.             sprintf(temp_char, "VRCD - [%s]", VOL_NAME);
  400.  
  401.         fLeftList->AddItem(new LeftListItem(&temp_ref, temp_char, fLeftList->fVRCDBitmap, NULL), 0);
  402.     }
  403.     if (ISOFILE && strcmp(ISOFILE_DIR, "NONE")) {
  404.         BEntry(ISOFILE_DIR).GetRef(&temp_ref);
  405.         fLeftList->AddItem(new LeftListItem(&temp_ref, temp_ref.name, fLeftList->fISOBitmap, NULL), 0);
  406.     }
  407.     fCDRWView->fBlankMenu->ItemAt(BLANK_TYPE)->SetMarked(true);
  408.  
  409.     // New VRCD
  410.     r = fAroundBox->Bounds();
  411.     r.InsetBy(5.0, 5.0);
  412.     r.top = 220;
  413.     r.bottom = 240;
  414.     r.right = 120;
  415.     fNewVRCDButton = new BButton(r, "New Virtual CD", "New Virtual CD", new BMessage(NEW_VRCD));
  416.     fAroundBox->AddChild(fNewVRCDButton);
  417.  
  418.     // Open ISO
  419.     r = fAroundBox->Bounds();
  420.     r.InsetBy(5.0, 5.0);
  421.     r.top = 220;
  422.     r.bottom = 240;
  423.     r.left = 125;
  424.     r.right -= ((r.right / 2) + (B_V_SCROLL_BAR_WIDTH) + 2);
  425.     fAddISOButton = new BButton(r, "Add ISOFile", "Add ISOFile", new BMessage(OPEN_ISO_FILE));
  426.     fAroundBox->AddChild(fAddISOButton);
  427.  
  428.     // FilePanel open isofile
  429.     fISOOpenPanel = new BFilePanel(B_OPEN_PANEL, &be_app_messenger, NULL, B_FILE_NODE, false, NULL, NULL, true, true);
  430.     fISOSavePanel = new BFilePanel(B_SAVE_PANEL, &be_app_messenger, NULL, B_FILE_NODE, false, NULL, NULL, true, true);
  431.  
  432.     // FMenuBar
  433.     r = Bounds();
  434.     r.top = 0;
  435.     r.bottom = 19;
  436.     fMenuBar = new BMenuBar(r, "menu_bar");
  437.     AddChild(fMenuBar);
  438.  
  439.     menu = new BMenu("File");
  440.     menu->AddItem(new BMenuItem("About", new BMessage(MENU_FILE_ABOUT), 'A'));
  441.     menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'));
  442.     fMenuBar->AddItem(menu);
  443.     fMenuBar->AddItem(new BMenuItem("Help", new BMessage(MENU_HELP)));
  444.     fRecorderCount = 0;
  445.     fLogView->fLogTextView->SetFontAndColor(0, 0, be_plain_font, B_FONT_ALL, &red);
  446.     fLogView->fLogTextView->Insert("Welcome to BurnItNow ");
  447.     fLogView->fLogTextView->Insert(VERSION);
  448.     fLogView->fLogTextView->Insert("\n");  
  449.     fLogView->fLogTextView->Insert(COPYRIGHT1);
  450.     fLogView->fLogTextView->Insert("\n");  
  451.     fLogView->fLogTextView->Insert(COPYRIGHT2);
  452.     fLogView->fLogTextView->Insert("\n\n");
  453.  
  454.     CheckForDevices();
  455.     Show();
  456. }
  457.  
  458.  
  459. void jpWindow::AWindow()
  460. {
  461.     fAboutWindow = new AboutWindow();
  462.     fAboutWindow->Show();
  463. }
  464.  
  465.  
  466. uint64 jpWindow::GetVRCDSize()
  467. {
  468.     char command[1024];
  469.     char buffer[1024], buf[1024];
  470.     uint32 i;
  471.     uint64 tempas = 0;
  472.     if (IMAGE_TYPE == 0) {
  473.         FILE* f1;
  474.         sprintf(command, "mkisofs -print-size %s %s -gui -f -V \"%s\" -C %s \"%s\" 2>&1", DATA_STRING, BOOTSTRING, VOL_NAME, fBurnDevice->scsiid, BURN_DIR);
  475.         printf("com: %s\n",command);
  476.         f1 = popen(command, "r");
  477.         while (!feof(f1) && !ferror(f1)) {
  478.             buffer[0] = 0;
  479.             fgets(buffer, 1024, f1);    //printf("# %s",buffer);
  480.             if (!strncmp("Total extents scheduled to be written = ", &buffer[0], 40)) {
  481.                 for (i = 0; i < strlen(&buffer[40]); i++) {
  482.                     if ((buffer[i + 40] != '\n') || (buffer[i + 41] != '\0'))
  483.                         buf[i] = buffer[i + 40];
  484.                 }
  485.             }
  486.         }
  487.         pclose(f1);
  488.         tempas = atol(buf) * 2048;
  489.     } else if (IMAGE_TYPE == 1)
  490.         tempas = GetBFSSize();
  491.  
  492.     return tempas;
  493. }
  494.  
  495.  
  496. void jpWindow::CalculateSize()
  497. {
  498.     BFile f1;
  499.     char temp_char[1024];
  500.     char what[100];
  501.     uint32 angle_temp[100];
  502.     uint32 tracks, i;
  503.     off_t temp, total_audio, total, total_iso, total_vrcd;
  504.    
  505.     total_audio = 0;
  506.     total = 0;
  507.     total_iso = 0;
  508.     total_vrcd = 0;
  509.     temp = 0;   nrtracks = 0;
  510.    
  511.     if (BURN_TYPE == 0) {
  512.         sprintf(what, "DataCD");
  513.         total_vrcd = total = total_iso = total_audio = 0;
  514.         fStatusBar->SetBarColor(blue);
  515.         if (fLeftList->CountItems() > 0) {
  516.             LeftListItem* item1 = (LeftListItem*)fLeftList->ItemAt(0);
  517.             if (item1->fIconBitmap == fLeftList->fISOBitmap) {
  518.                 f1.SetTo(&item1->fRef, B_READ_ONLY);
  519.                 f1.GetSize(&temp);
  520.                 total_iso += temp;
  521.                 angle_temp[0] = temp / 1024 / 1024;
  522.                 nrtracks = 1;
  523.             } else if (item1->fIconBitmap == fLeftList->fVRCDBitmap) {
  524.                 nrtracks = 1;
  525.                 total_vrcd = temp = GetVRCDSize();
  526.                 angle_temp[0] = temp / 1024 / 1024;
  527.             }
  528.         }
  529.     } else if (BURN_TYPE == 1) {
  530.         sprintf(what, "AudioCD");
  531.         total_vrcd = total = total_iso = total_audio = temp = 0;
  532.         fStatusBar->SetBarColor(green);
  533.         if (fLeftList->CountItems() > 0) {
  534.             LeftListItem* item1 = (LeftListItem*)fLeftList->ItemAt(0);
  535.             LeftListItem* item2 = (LeftListItem*)fLeftList->ItemAt(1);
  536.             if (item1->fIconBitmap == fLeftList->fAudioBitmap) {
  537.                 tracks = fLeftList->CountItems();
  538.                 for (i = 0; i < tracks; i++) {
  539.                     item1 = (LeftListItem*)fLeftList->ItemAt(i);
  540.                     f1.SetTo(&item1->fRef, B_READ_ONLY);
  541.                     f1.GetSize(&temp);
  542.                     total_audio += temp;
  543.                     angle_temp[i] = temp / 1024 / 1024;
  544.                     nrtracks++;
  545.                 }
  546.             } else if (fLeftList->CountItems() > 1) {
  547.                 if (item2->fIconBitmap == fLeftList->fAudioBitmap) {
  548.                     tracks = fLeftList->CountItems();
  549.                     for (i = 1; i < tracks; i++) {
  550.                         item1 = (LeftListItem*)fLeftList->ItemAt(i);
  551.                         f1.SetTo(&item1->fRef, B_READ_ONLY);
  552.                         f1.GetSize(&temp);
  553.                         total_audio += temp;
  554.                         angle_temp[i - 1] = temp / 1024 / 1024;
  555.                         nrtracks++;
  556.                     }
  557.                 }
  558.             }
  559.         }
  560.     } else if (BURN_TYPE == 2) {
  561.         sprintf(what, "MixCD");
  562.         total_vrcd = total = total_iso = total_audio = 0;
  563.         fStatusBar->SetBarColor(greenblue);
  564.         if (fLeftList->CountItems() > 0) {
  565.             LeftListItem* item1 = (LeftListItem*)fLeftList->ItemAt(0);
  566.             LeftListItem* item2 = (LeftListItem*)fLeftList->ItemAt(1);
  567.             if (item1->fIconBitmap == fLeftList->fISOBitmap) {
  568.                 nrtracks = 1;
  569.                 f1.SetTo(&item1->fRef, B_READ_ONLY);
  570.                 f1.GetSize(&temp);
  571.                 total_iso = temp;
  572.                 angle_temp[nrtracks - 1] = temp / 1024 / 1024;
  573.             } else if (item1->fIconBitmap == fLeftList->fVRCDBitmap) {
  574.                 nrtracks = 1;
  575.                 total_vrcd = temp = GetVRCDSize();
  576.                 angle_temp[nrtracks - 1] = temp / 1024 / 1024;
  577.             }
  578.  
  579.             if (item1->fIconBitmap == fLeftList->fAudioBitmap) {
  580.                 tracks = fLeftList->CountItems();
  581.                 for (i = 0; i < tracks; i++) {
  582.                     item1 = (LeftListItem*)fLeftList->ItemAt(i);
  583.                     f1.SetTo(&item1->fRef, B_READ_ONLY);
  584.                     f1.GetSize(&temp);
  585.                     total_audio += temp;
  586.                     nrtracks++;
  587.                     angle_temp[nrtracks - 1] = temp / 1024 / 1024;
  588.  
  589.                 }
  590.             }
  591.  
  592.             else if (fLeftList->CountItems() > 1)
  593.                 if (item2->fIconBitmap == fLeftList->fAudioBitmap) {
  594.                     tracks = fLeftList->CountItems();
  595.                     for (i = 1; i < tracks; i++) {
  596.                         item1 = (LeftListItem*)fLeftList->ItemAt(i);
  597.                         f1.SetTo(&item1->fRef, B_READ_ONLY);
  598.                         f1.GetSize(&temp);
  599.                         total_audio += temp;
  600.                         nrtracks++;
  601.                         angle_temp[nrtracks - 1] = temp / 1024 / 1024;
  602.                     }
  603.                 }
  604.         }
  605.     }
  606.  
  607.     total = total_audio + total_iso + total_vrcd;
  608.     sprintf(temp_char, "%s - [%lld of 698 Mb]", what, total / 1024 / 1024);
  609.     fStatusBar->Reset();
  610.     fStatusBar->SetMaxValue(CDSIZE);
  611.     fStatusBar->Update((total / 1024 / 1024), temp_char);
  612.  
  613.     for (i = 0; i < nrtracks; i++) {
  614.         if (i == 0)
  615.             angles[i] = ((float)360 / (float)(total / 1024 / 1024)) * (float)angle_temp[i];
  616.         else
  617.             angles[i] = ((float)360 / (float)(total / 1024 / 1024)) * (float)angle_temp[i] + angles[i - 1];
  618.     }
  619. }
  620.  
  621.  
  622. void jpWindow::InitBurnIt()
  623. {  
  624.     const char* tr;
  625.     char temp_char[1024];
  626.     app_info info;
  627.     BPath path;
  628.  
  629.     be_app->GetAppInfo(&info);
  630.     entry_ref ref = info.ref;
  631.     BEntry(&ref, true).GetPath(&path);
  632.     path.GetParent(&path);
  633.     BURNIT_PATH = new char[strlen(path.Path())+1];
  634.     strcpy(BURNIT_PATH, path.Path());
  635.     sprintf(temp_char, "%s/tmp", BURNIT_PATH);
  636.     if (!BEntry(temp_char).Exists())
  637.         BDirectory(BURNIT_PATH).CreateDirectory(temp_char, NULL);
  638.     IMAGE_NAME = new char[1024];
  639.     sprintf(IMAGE_NAME, "%s/BurnItNow.raw", temp_char);
  640.     sprintf(temp_char, "%s/VRCD", temp_char);
  641.     if (!BEntry(temp_char).Exists())
  642.         BDirectory(temp_char).CreateDirectory(temp_char, NULL);
  643.  
  644.     BURN_DIR = new char[strlen(temp_char)+1];
  645.     strcpy(BURN_DIR, temp_char);
  646.  
  647.     FindCDRTools();
  648.  
  649.     // Load from pref file
  650.     if (fBurnItPrefs->FindString("ISOFILE_DIR", &tr) == B_OK)
  651.         strcpy(ISOFILE_DIR, tr);
  652.     else
  653.         strcpy(ISOFILE_DIR, "NONE");
  654.  
  655.     if (fBurnItPrefs->FindString("VOL_NAME", &tr) == B_OK)
  656.         strcpy(VOL_NAME, tr);
  657.     else
  658.         strcpy(VOL_NAME, "BurnItNow");
  659.  
  660.     if (fBurnItPrefs->FindBool("VRCD", &VRCD) != B_OK)
  661.         VRCD = false;
  662.  
  663.     if (fBurnItPrefs->FindBool("ISOFILE", &ISOFILE) != B_OK)
  664.         ISOFILE = false;
  665.  
  666.     if (fBurnItPrefs->FindInt16("BURN_SPD", &BURN_SPD) != B_OK)
  667.         BURN_SPD = 2;
  668.  
  669.     if (fBurnItPrefs->FindInt16("BLANK_TYPE", &BLANK_TYPE) != B_OK)
  670.         BLANK_TYPE = 1;
  671.  
  672.     if (fBurnItPrefs->FindInt16("BLANK_SPD", &BLANK_SPD) != B_OK)
  673.         BLANK_SPD = 1;
  674.  
  675.     if (fBurnItPrefs->FindInt16("BURN_TYPE", &BURN_TYPE) != B_OK)
  676.         BURN_TYPE = 0;
  677.  
  678.     if (fBurnItPrefs->FindBool("ONTHEFLY", &ONTHEFLY) != B_OK)
  679.         ONTHEFLY = false;
  680.  
  681.     if (fBurnItPrefs->FindString("MULTISESSION", &tr) == B_OK)
  682.         strcpy(MULTISESSION, tr);
  683.     else
  684.         strcpy(MULTISESSION, " ");
  685.  
  686.     if (fBurnItPrefs->FindString("DUMMYMODE", &tr) == B_OK)
  687.         strcpy(DUMMYMODE, tr);
  688.     else
  689.         strcpy(DUMMYMODE, " ");
  690.  
  691.     if (fBurnItPrefs->FindString("EJECT", &tr) == B_OK)
  692.         strcpy(EJECT, tr);
  693.     else
  694.         strcpy(EJECT, " ");
  695.  
  696.     if (fBurnItPrefs->FindString("DATA_STRING", &tr) == B_OK)
  697.         strcpy(DATA_STRING, tr);
  698.     else
  699.         strcpy(DATA_STRING, " ");
  700.  
  701.     if (fBurnItPrefs->FindInt16("IMAGE_TYPE", &IMAGE_TYPE) != B_OK)
  702.         IMAGE_TYPE = 0;
  703.  
  704.     if (fBurnItPrefs->FindInt16("SCSI_DEV", &SCSI_DEV) != B_OK)
  705.         SCSI_DEV = -1;
  706.  
  707.     if (fBurnItPrefs->FindString("PAD", &tr) == B_OK)
  708.         strcpy(PAD, tr);
  709.     else
  710.         strcpy(PAD, "-pad");
  711.  
  712.     if (fBurnItPrefs->FindString("DAO", &tr) == B_OK)
  713.         strcpy(DAO, tr);
  714.     else
  715.         strcpy(DAO, " ");
  716.  
  717.     if (fBurnItPrefs->FindString("BURNFREE", &tr) == B_OK)
  718.         strcpy(BURNFREE, tr);
  719.     else
  720.         strcpy(BURNFREE, " ");
  721.  
  722.     if (fBurnItPrefs->FindString("NOFIX", &tr) == B_OK)
  723.         strcpy(NOFIX, tr);
  724.     else
  725.         strcpy(NOFIX, " ");
  726.  
  727.     if (fBurnItPrefs->FindString("PREEMP", &tr) == B_OK)
  728.         strcpy(PREEMP, tr);
  729.     else
  730.         strcpy(PREEMP, " ");
  731.  
  732.     if (fBurnItPrefs->FindString("SWAB", &tr) == B_OK)
  733.         strcpy(SWAB, tr);
  734.     else
  735.         strcpy(SWAB, " ");
  736.  
  737.     if (fBurnItPrefs->FindRef("BOOTIMAGEREF", &BOOTIMAGEREF) == B_OK)
  738.         if (BEntry(&BOOTIMAGEREF, true).Exists())
  739.             fBurnItPrefs->FindBool("BOOTABLE", &BOOTABLE);
  740.  
  741.     // End loading from pref file
  742.  
  743.     JUST_IMAGE = false;
  744.     CDSIZE = 698;
  745. }
  746.  
  747.  
  748. void jpWindow::FindCDRTools()
  749. {  
  750.     BPath path;
  751.     BEntry entry;
  752.  
  753.     fStatus = find_directory(B_COMMON_BIN_DIRECTORY, &CDRTOOLS_DIR);
  754.     if (fStatus != B_OK)
  755.         return;
  756.  
  757.     path.SetTo(CDRTOOLS_DIR.Path());
  758.     entry.GetPath(&path);
  759.     path.Append("cdrecord");
  760.     if (entry.Exists() != B_OK)
  761.         printf("Error: cdrecord not found, pathname: %s\n", path.Path());
  762.        
  763.     return;
  764. }
  765.  
  766.  
  767. void jpWindow::CheckForDevices()
  768. {  
  769.     bool got_it;
  770.     char command[2048];
  771.     char buffer[1024], buf[512];
  772.     FILE* f;
  773.     int i, k, l, m;
  774.     int msg;
  775.     int pa=0,pb=0,pc=0,px=0;
  776.     char awbuf[50];
  777.     char sidbuf[8];
  778.     char sivbuf[20];
  779.     char sinbuf[50];
  780.     //see struct cdrecorder { char scsiid[7]; char scsi_vendor[20]; char scsi_name[50];};
  781.    
  782.     BString commandstr;
  783.     BEntry cdrecord, mkisofs;
  784.     BPath path1, path2;
  785.  
  786.     path1.SetTo(CDRTOOLS_DIR.Path());   path1.Append("cdrecord");
  787.     cdrecord.SetTo(path1.Path());
  788.     path2.SetTo(CDRTOOLS_DIR.Path());   path2.Append("mkisofs");
  789.     mkisofs.SetTo(path2.Path());
  790.    
  791.     got_it = false;
  792.    
  793.     commandstr.SetTo(CDRTOOLS_DIR.Path());
  794.     commandstr.Append("/cdrecord -scanbus");   
  795.     strcpy(command, commandstr.String());      
  796.    
  797.     if (cdrecord.Exists() && mkisofs.Exists()) {
  798.         if (fRecorderCount < 100) {
  799.             Lock();
  800.             f = popen(command, "r");
  801.             while (!feof(f) && !ferror(f)) {
  802.                 buffer[0] = 0;
  803.                 fgets(buffer, 1024, f);
  804.                 if (!strncmp(buffer, "scsibus", 7)) scsibus = true;
  805.  
  806.                 for (i = 0; i < (int)strlen(buffer); i++)
  807.                 {   if (buffer[i] >= '0' && buffer[i] <= '9') {
  808.                         if (buffer[i + 1] == ',' || buffer[i + 2] == ',')
  809.                         {   got_it = true;
  810.                             break;
  811.                         }
  812.                     }
  813.                 }
  814.                
  815.                 if (got_it) {
  816.                     k= strspn(buffer,"\t 1234567890,)");
  817.                     m= strspn(buffer,"\t ,)");
  818.  
  819.                     if (buffer[k] == '\'') {
  820.                         l= (int)strlen(buffer);
  821.                         buffer[l-1]='\0';   //  printf("[buffer] '%s' \n",buffer);
  822.                         pa=0;
  823.                         pb=0;
  824.                         pc=0;
  825.                         px=0;
  826.                         memset(sidbuf, 0, 7 );
  827.                         memset(sivbuf, 0, 20 );
  828.                         memset(sinbuf, 0, 50 );
  829.                        
  830.                         for (pa = 0; pa < l ; pa++ ) { 
  831.                             if (pb == 0 && buffer[pa] == '\'')  
  832.                                 pb=pa+1;
  833.                             if (pb >= 1 && buffer[pa] == '\'') {   
  834.                                 pc=pa; 
  835.                                 if(pc > pb) {
  836.                                     memset(awbuf, 0,  50 );
  837.                                     memcpy(awbuf, &buffer[pb], (pc-pb) );
  838.                                     pb=0;
  839.                                     pc=0;
  840.                                     if( px == 0 )   {
  841.                                         awbuf[7 -1]='\0';  
  842.                                         strncpy(sidbuf,awbuf, 7);  
  843.                                     }
  844.                                     if( px == 1 )   {
  845.                                         awbuf[20-1]='\0';
  846.                                         strncpy(sivbuf,awbuf ,20);
  847.                                     }                              
  848.                                     if( px == 2 )   {
  849.                                         awbuf[50-1]='\0';
  850.                                         strncpy(sinbuf,awbuf, 50);
  851.                                     }
  852.                                     px++;
  853.                                 }
  854.                             }
  855.                         }
  856.                         sidbuf[7]='\0';
  857.                         sivbuf[20]='\0';
  858.                         sinbuf[50]='\0';
  859.                         //printf("[len=%02ld] '%s' \n",strlen(sidbuf),sidbuf );
  860.                         //printf("[len=%02ld] '%s' \n",strlen(sivbuf),sivbuf );
  861.                         //printf("[len=%02ld] '%s' \n",strlen(sinbuf),sinbuf );
  862.                                    
  863.                                                
  864.                         fRecorderCount++;
  865.                         memset((char*)&fScsiDevices[fRecorderCount - 1].scsiid[0], 0,  7 );
  866.                         /* strncpy(fScsiDevices[fRecorderCount - 1].scsiid, &buffer[m], 7);
  867.                         printf("[len=%02ld] scsiid: '%s' \n",strlen(fScsiDevices[fRecorderCount - 1].scsiid)
  868.                                         ,fScsiDevices[fRecorderCount - 1].scsiid);  */
  869.                                        
  870.                         strncpy(sidbuf, &buffer[m], 7);
  871.                         m= strspn(sidbuf,",1234567890"); if(m > 0) { sidbuf[m]='\0';}  
  872.                         strncpy(fScsiDevices[fRecorderCount - 1].scsiid, sidbuf, 7);
  873.                         printf("[len=%02ld] sidbuf: '%s' \n",strlen(sidbuf),sidbuf);
  874.                        
  875.                         // scsi vendor
  876.                         memset((char*)&fScsiDevices[fRecorderCount - 1].scsi_vendor[0], 0, 20);
  877.                         strncpy(fScsiDevices[fRecorderCount - 1].scsi_vendor, sivbuf, 20);
  878.  
  879.                         // scsi name
  880.                         memset((char*)&fScsiDevices[fRecorderCount - 1].scsi_name[0], 0, 50);
  881.                         strncpy(fScsiDevices[fRecorderCount - 1].scsi_name, sinbuf , 50);
  882.                    
  883.                         msg = 'dev\0' | fRecorderCount;
  884.  
  885.                         strcpy(buf,sivbuf); strcat(buf," ");
  886.                         strcat(buf,sinbuf); strcat(buf," \0");
  887.                         fPrefsView->fRecordersMenu->AddItem(new BMenuItem(buf, new BMessage(msg)));
  888.                     }
  889.                 }
  890.             }
  891.             pclose(f);
  892.  
  893.             fLogView->fLogTextView->SetFontAndColor(0, 0, be_plain_font, B_FONT_ALL, &blue);
  894.            
  895.             if(fRecorderCount == 1)
  896.                 sprintf(buf, "Found %d device.\n\n", fRecorderCount);
  897.             else
  898.                 sprintf(buf, "Found %d devices.\n\n", fRecorderCount);
  899.             fLogView->fLogTextView->Insert(buf);
  900.             if (SCSI_DEV != -1) {
  901.                 fBurnDevice = &fScsiDevices[SCSI_DEV - 1];
  902.                 fPrefsView->fRecordersMenu->ItemAt(SCSI_DEV - 1)->SetMarked(true);
  903.             } else
  904.                    fBurnDevice = NULL;
  905.             Unlock();
  906.         }
  907.     } else {
  908.         Lock();
  909.         fLogView->fLogTextView->SetFontAndColor(0, 0, be_plain_font, B_FONT_ALL, &blue);
  910.         fLogView->fLogTextView->Insert("Cound not find cdrecord/mkisofs check that it is installed and restart BurnItNow");
  911.         Unlock();
  912.         BAlert* MyAlert = new BAlert("BurnItNow", "Could not find cdrecord/mkisofs. You need to install the cdrtools OptionalPackage", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT);
  913.  
  914.         MyAlert->Go();
  915.         fBurnView->SetButton(false);
  916.         fCDRWView->fBlankButton->SetEnabled(false);
  917.     }
  918. }
  919.  
  920.  
  921. int jpWindow::CheckMulti(char* str)
  922. {  
  923.     FILE* f;
  924.     int temp;
  925.     char buf[1024];
  926.    
  927.     BString commandstr;
  928.  
  929.     commandstr.SetTo(CDRTOOLS_DIR.Path());
  930.     commandstr.Append("/");
  931.     commandstr.Append("cdrecord -msinfo dev=11,0,0 2>&1");
  932.     printf("com: '%s'",commandstr.String());
  933.    
  934.     f = popen(commandstr.String(), "r");
  935.     while (!feof(f) && !ferror(f)) {
  936.         buf[0] = 0;
  937.         fgets(buf, 1024, f);
  938.         if (buf[0] == '/') {
  939.             temp = strlen(buf) - strlen("Cannot read first writable address\n");
  940.             if (!strncmp(&buf[temp], "Cannot read first writable address", strlen("Cannot read first writable address")))
  941.                 return -1;
  942.  
  943.             temp = strlen(buf) - strlen("Cannot read session offset\n");
  944.             if (!strncmp(&buf[temp], "Cannot read session offset", strlen("Cannot read session offset")))
  945.                 return 0;
  946.  
  947.         }
  948.         if (buf[0] >= '0' && buf[0] <= '9') {
  949.             strncpy(str, buf, strlen(buf) - 1);
  950.             return 1;
  951.         }
  952.     }
  953.     return 1;
  954. }
  955.  
  956.  
  957. void jpWindow::BurnNOW()
  958. {  
  959.     char buf[1024];
  960.     int temp;
  961.     temp = 0;
  962.     if (fBurnDevice == NULL) {
  963.         fTabView->Select(5);
  964.         BAlert* MyAlert = new BAlert("BurnItNow", "You have to select device to be able to burn.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  965.         MyAlert->Go();
  966.     } else {
  967.         // DataCD
  968.         if (BURN_TYPE == 0) {
  969.             if (VRCD && !ISOFILE) {
  970.                 if (strcmp(BURN_DIR, "NONE")) {
  971.                     if (fBurnView->fOnTheFlyCheckBox->Value() == 1) {
  972.                         ONTHEFLY = true;
  973.                         BurnWithCDRecord();
  974.                     } else {
  975.                         if (fBurnView->fMultiCheckBox->Value() == 1)
  976.                             temp = CheckMulti(buf);
  977.  
  978.                         if (temp != -1)
  979.                             MakeImageNOW(temp, buf);
  980.                         else {
  981.                             BAlert* MyAlert = new BAlert("BurnItNow", "Put a blank CD or a CD that you have burned multisession on before.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  982.                             MyAlert->Go();
  983.                         }
  984.                     }
  985.                 } else {
  986.                     BAlert* MyAlert = new BAlert("BurnItNow", "This is a BUG. Please check the OSDrawer.net BurnItNow project issues page to see if this have already been reported, if not then file a new issue, noting that it is \"BUG #13\"", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  987.                     MyAlert->Go();
  988.                 }
  989.  
  990.             } else if (!VRCD && ISOFILE) {
  991.                 if (strcmp(ISOFILE_DIR, "NONE")) {
  992.                     strcpy(IMAGE_NAME, ISOFILE_DIR);
  993.                     BurnWithCDRecord();
  994.                 } else {
  995.                     BAlert* MyAlert = new BAlert("BurnItNow", "You have to choose an ISO file.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  996.                     MyAlert->Go();
  997.                 }
  998.             } else {
  999.                 BAlert* MyAlert = new BAlert("BurnItNow", "You have to Add an \"Virtual CD Directory\" or an ISOfile to be able to burn a DataCD.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1000.                 MyAlert->Go();
  1001.             }
  1002.         }
  1003.  
  1004.         // AudioCD
  1005.         else if (BURN_TYPE == 1) {
  1006.             BPath temp_path;
  1007.             int32 count;
  1008.             int32 i;
  1009.             count = fLeftList->CountItems();
  1010.             for (i = 0; i < count; i++) {
  1011.                 LeftListItem* item = (LeftListItem*)fLeftList->ItemAt(i);
  1012.                 if (item->fIsAudio) {
  1013.                     BEntry(&item->fRef).GetPath(&temp_path);
  1014.                     sprintf(AUDIO_FILES, "%s \"%s\"", AUDIO_FILES , temp_path.Path());
  1015.                 }
  1016.             }
  1017.             BurnWithCDRecord();
  1018.         }
  1019.  
  1020.         // MixCD
  1021.         if (BURN_TYPE == 2) {
  1022.             BPath temp_path;
  1023.             int32 count;
  1024.             int32 i;
  1025.             count = fLeftList->CountItems();
  1026.             for (i = 0; i < count; i++) {
  1027.                 LeftListItem* item = (LeftListItem*)fLeftList->ItemAt(i);
  1028.                 if (item->fIsAudio) {
  1029.                     BEntry(&item->fRef).GetPath(&temp_path);
  1030.                     sprintf(AUDIO_FILES, "%s \"%s\"", AUDIO_FILES , temp_path.Path());
  1031.                 }
  1032.             }
  1033.             if (VRCD && !ISOFILE) {
  1034.                 if (strcmp(BURN_DIR, "NONE")) {
  1035.                     if (fBurnView->fOnTheFlyCheckBox->Value() == 1) {
  1036.                         ONTHEFLY = true;
  1037.                         BurnWithCDRecord();
  1038.                     } else {
  1039.                         if (fBurnView->fMultiCheckBox->Value() == 1)
  1040.                             temp = CheckMulti(buf);
  1041.  
  1042.                         if (temp != -1)
  1043.                             MakeImageNOW(temp, buf);
  1044.                         else {
  1045.                             BAlert* MyAlert = new BAlert("BurnItNow", "Put a blank CD or a CD that you have burned multisession on before.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1046.                             MyAlert->Go();
  1047.                         }
  1048.                     }
  1049.                 } else {
  1050.                     BAlert* MyAlert = new BAlert("BurnItNow", "This is a BUG. Please check the OSDrawer.net BurnItNow project issues page to see if this have already been reported, if not then file a new issue, noting that it is \"BUG #13\"", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1051.                     MyAlert->Go();
  1052.                 }
  1053.  
  1054.             } else if (!VRCD && ISOFILE) {
  1055.                 if (strcmp(ISOFILE_DIR, "NONE")) {
  1056.                     strcpy(IMAGE_NAME, ISOFILE_DIR);
  1057.                     BurnWithCDRecord();
  1058.                 } else {
  1059.                     BAlert* MyAlert = new BAlert("BurnItNow", "You have to choose an ISO file.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1060.                     MyAlert->Go();
  1061.                 }
  1062.             } else {
  1063.                 BAlert* MyAlert = new BAlert("BurnItNow", "You have to add a Virtual CD Directory/ISOfile to be able to burn a MixCD.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1064.                 MyAlert->Go();
  1065.             }
  1066.         }
  1067.     }
  1068. }
  1069.  
  1070.  
  1071. void jpWindow::BlankNOW()
  1072. {  
  1073.     int Result;
  1074.    
  1075.     BString commandstr;
  1076.  
  1077.     commandstr.SetTo(CDRTOOLS_DIR.Path());
  1078.     commandstr.Append("/");
  1079.    
  1080.     if (fBurnDevice == NULL) {
  1081.         fTabView->Select(5);
  1082.         BAlert* MyAlert = new BAlert("BurnItNow", "You have to select device to be able to blank.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1083.         MyAlert->Go();
  1084.     } else {
  1085.         BAlert* MyAlert = new BAlert("Put in a CDRW", "Put in a CDRW", "Cancel", "Ok", NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1086.         Result = MyAlert->Go();
  1087.         if (Result) {
  1088.             CalculateSize();
  1089.             fStatusWindow = new StatusWindow(VOL_NAME);
  1090.             fStatusWindow->SetAngles(angles, 0);
  1091.             fStatusWindow->Show();
  1092.  
  1093.             SetButtons(false);
  1094.             char command[2000];
  1095.             commandstr << "cdrecord dev=" << fBurnDevice->scsiid << " speed=" << BLANK_SPD ;
  1096.             commandstr << " blank=" << BlType[BLANK_TYPE];
  1097.             commandstr << " -V";
  1098.  
  1099.             printf("BlankNOW: '%s'\n",commandstr.String());
  1100.  
  1101.             Lock();
  1102.             strcpy (command, commandstr.String());
  1103.             resume_thread(Cntrl = spawn_thread(controller, "Blanking", 15, command));
  1104.             snooze(500000);
  1105.             resume_thread(OPBlank = spawn_thread(OutPutBlank, "OutPutBlank", 15, fStatusWindow));
  1106.             snooze(500000);
  1107.  
  1108.             MessageLog("Blanking done");
  1109.             Unlock();
  1110.         }
  1111.     }
  1112. }
  1113.  
  1114.  
  1115. void jpWindow::PutLog(const char* string)
  1116. {
  1117.     font_height fh;  fLogView->fLogTextView->GetFontHeight( &fh );
  1118.     Lock();
  1119.     fLogView->fLogTextView->SetFontAndColor(0, 0, be_plain_font, B_FONT_ALL, &red2);
  1120.     fLogView->fLogTextView->Insert("*******\n");
  1121.     fLogView->fLogTextView->Insert(string);
  1122.     fLogView->fLogTextView->Insert("\n*******\n");
  1123.     //fLogView->fLogTextView->SetFontAndColor(0, 0, be_plain_font, B_FONT_ALL, &black);
  1124.     //fLogView->fLogTextView->ScrollToOffset(fLogView->fLogTextView->CountLines() * 100);
  1125.     fLogView->fLogTextView->ScrollBy( 0, fh.ascent );
  1126.     Unlock();
  1127. }
  1128.  
  1129.  
  1130. void jpWindow::MessageLog(const char* string)
  1131. {  
  1132.     font_height fh;  fLogView->fLogTextView->GetFontHeight( &fh );  //  ascent,descent,leading;
  1133.     //float fv=10.0;  fv=  fh.ascent ;              // printf("MessageLog(Size %5.2f)\n",fv);
  1134.     Lock();
  1135.     fLogView->fLogTextView->SetFontAndColor(0, 0, be_plain_font, B_FONT_ALL, &green);
  1136.     fLogView->fLogTextView->Insert(string);
  1137.     fLogView->fLogTextView->Insert("\n");
  1138.     //fLogView->fLogTextView->SetFontAndColor(0, 0, be_plain_font, B_FONT_ALL, &black);
  1139.     //fLogView->fLogTextView->ScrollToOffset(fLogView->fLogTextView->CountLines() * 100);
  1140.     //fLogView->fLogTextView->ScrollToOffset(fLogView->fLogTextView->CountLines() );
  1141.     fLogView->fLogTextView->ScrollBy( 0, fh.ascent );
  1142.     Unlock();
  1143. }
  1144.  
  1145.  
  1146. void jpWindow::MessageReceived(BMessage* message)
  1147. {
  1148.     entry_ref temp_ref;
  1149.     int temp;
  1150.     char buf[30];
  1151.     uint8 count;
  1152.     switch (message->what) {
  1153.         case MENU_HELP: {
  1154.                 BPath path;
  1155.                 BEntry helpfile;
  1156.                
  1157.                 path.SetTo(BURNIT_PATH);
  1158.                 path.Append("Docs/BurnItNowHelp.html");
  1159.                 helpfile.SetTo(path.Path());
  1160.                 char *command = new char[strlen(path.Path())+1];
  1161.                 sprintf(command, path.Path());
  1162.                 if (helpfile.Exists()) {
  1163.                     be_roster->Launch("text/html", 1, & command);
  1164.                 } else {
  1165.                     printf("\nError: Can't find helpfile: Docs/BurnItNowHelp.html");
  1166.                 }
  1167.                 delete command;
  1168.             }
  1169.             break;
  1170.  
  1171.         case CALCULATE_SIZE: {
  1172.                 if (VRCD && !ISOFILE) {
  1173.  
  1174.                 }
  1175.  
  1176.                 CalculateSize();
  1177.             }
  1178.             break;
  1179.  
  1180.         case BURN_WITH_CDRECORD:
  1181.             BurnWithCDRecord();
  1182.             break;
  1183.  
  1184.         case WRITE_TO_LOG: {
  1185.                 char* temp_str;
  1186.                 bool temp_bool;
  1187.                 message->FindString("Text", (const char**)&temp_str);
  1188.                 message->FindBool("Error", &temp_bool);
  1189.                 if (temp_bool)
  1190.                     PutLog(temp_str);
  1191.                 else
  1192.                     MessageLog(temp_str);
  1193.             }
  1194.             break;
  1195.  
  1196.         case SET_BUTTONS_TRUE:
  1197.             SetButtons(true);
  1198.             break;
  1199.  
  1200.         case DATA_VIRTUALCD:
  1201.             VRCD = true;
  1202.             ISOFILE = false;
  1203.             fDataView->fBootableCDCheckBox->SetEnabled(true);
  1204.             if (fDataView->fBootableCDCheckBox->Value() == 1)
  1205.                 fDataView->fChooseBootImageButton->SetEnabled(true);
  1206.             break;
  1207.  
  1208.         case DATA_ISOFILE:
  1209.             VRCD = false;
  1210.             ISOFILE = true;
  1211.             fDataView->fBootableCDCheckBox->SetEnabled(false);
  1212.             fDataView->fChooseBootImageButton->SetEnabled(false);
  1213.             break;
  1214.  
  1215.         case DATA_ISO9660:
  1216.             IMAGE_TYPE = 0;
  1217.             sprintf(DATA_STRING, " ");
  1218.             if (BURN_TYPE == 0 || BURN_TYPE == 2) {
  1219.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1220.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1221.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1222.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1223.             }
  1224.             if (BURN_TYPE == 1)
  1225.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1226.             break;
  1227.  
  1228.         case DATA_BFS:
  1229.             IMAGE_TYPE = 1;
  1230.             fDataView->fBootableCDCheckBox->SetEnabled(false);
  1231.             fDataView->fChooseBootImageButton->SetEnabled(false);
  1232.             fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1233.             fBurnView->fMultiCheckBox->SetEnabled(false);
  1234.             break;
  1235.  
  1236.         case DATA_HFS:
  1237.             sprintf(DATA_STRING, "-hfs");
  1238.             IMAGE_TYPE = 0;
  1239.             if (BURN_TYPE == 0 || BURN_TYPE == 2) {
  1240.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1241.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1242.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1243.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1244.             }
  1245.             if (BURN_TYPE == 1)
  1246.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1247.             break;
  1248.  
  1249.         case DATA_JOLIET:
  1250.             sprintf(DATA_STRING, "-l -D -J");
  1251.             IMAGE_TYPE = 0;
  1252.             if (BURN_TYPE == 0 || BURN_TYPE == 2) {
  1253.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1254.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1255.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1256.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1257.             }
  1258.             if (BURN_TYPE == 1)
  1259.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1260.             break;
  1261.  
  1262.         case DATA_ROCK:
  1263.             sprintf(DATA_STRING, "-l -L -r");
  1264.             IMAGE_TYPE = 0;
  1265.             if (BURN_TYPE == 0 || BURN_TYPE == 2) {
  1266.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1267.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1268.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1269.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1270.             }
  1271.             if (BURN_TYPE == 1)
  1272.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1273.             break;
  1274.  
  1275.         case DATA_WINDOWS:
  1276.             sprintf(DATA_STRING, "-D -l");
  1277.             IMAGE_TYPE = 0;
  1278.             if (BURN_TYPE == 0 || BURN_TYPE == 2) {
  1279.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1280.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1281.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1282.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1283.             }
  1284.             if (BURN_TYPE == 1)
  1285.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1286.             break;
  1287.  
  1288.         case DATA_REALROCK:
  1289.             sprintf(DATA_STRING, "-l -L -R");
  1290.             IMAGE_TYPE = 0;
  1291.             if (BURN_TYPE == 0 || BURN_TYPE == 2) {
  1292.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1293.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1294.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1295.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1296.             }
  1297.             if (BURN_TYPE == 1)
  1298.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1299.             break;
  1300.  
  1301.         case BURN_DATA_CD:
  1302.             BURN_TYPE = 0;
  1303.             if (fDataView->fBeOSRadio->Value() != 1) {
  1304.                 if (fBurnView->fOnTheFlyCheckBox->Value() != 1)
  1305.                     fBurnView->fMultiCheckBox->SetEnabled(true);
  1306.  
  1307.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(true);
  1308.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1309.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1310.                     fDataView->fChooseBootImageButton->SetEnabled(true);
  1311.             }
  1312.             break;
  1313.  
  1314.         case BURN_AUDIO_CD:
  1315.             BURN_TYPE = 1;
  1316.             fBurnView->fOnTheFlyCheckBox->SetEnabled(false);
  1317.             fBurnView->fMultiCheckBox->SetEnabled(false);
  1318.             fDataView->fBootableCDCheckBox->SetEnabled(false);
  1319.             fDataView->fChooseBootImageButton->SetEnabled(false);
  1320.             break;
  1321.  
  1322.         case BURN_MIX_CD:
  1323.             BURN_TYPE = 2;
  1324.             if (fDataView->fBeOSRadio->Value() != 1) {
  1325.                 fBurnView->fOnTheFlyCheckBox->SetEnabled(true);
  1326.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1327.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1328.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1329.                     fDataView->fChooseBootImageButton->SetEnabled(true);
  1330.             }
  1331.             break;
  1332.  
  1333.         case AUDIO_PAD:
  1334.             if (fAudioView->fPadCheckBox->Value() == 1)
  1335.                 strcpy(PAD, "-pad");
  1336.             else
  1337.                 strcpy(PAD, " ");
  1338.             break;
  1339.  
  1340.         case AUDIO_SWAB:
  1341.             if (fAudioView->fSwabCheckBox->Value() == 1)
  1342.                 strcpy(SWAB, "-swab");
  1343.             else
  1344.                 strcpy(SWAB, " ");
  1345.             break;
  1346.  
  1347.         case AUDIO_NOFIX:
  1348.             if (fAudioView->fNoFixCheckBox->Value() == 1)
  1349.                 strcpy(NOFIX, "-nofix");
  1350.             else
  1351.                 strcpy(NOFIX, " ");
  1352.             break;
  1353.  
  1354.         case AUDIO_PREEMP:
  1355.             if (fAudioView->fPreEmpCheckBox->Value() == 1)
  1356.                 strcpy(PREEMP, "-preemp");
  1357.             else
  1358.                 strcpy(PREEMP, " ");
  1359.             break;
  1360.  
  1361.         case BURN_MULTI:
  1362.             if (fBurnView->fMultiCheckBox->Value() == 1)
  1363.                 strcpy(MULTISESSION, "-multi");
  1364.             else
  1365.                 strcpy(MULTISESSION, " ");
  1366.             break;
  1367.  
  1368.         case BURN_DUMMY_MODE:
  1369.             if (fBurnView->fDummyModeCheckBox->Value() == 1)
  1370.                 strcpy(DUMMYMODE, "-dummy");
  1371.             else
  1372.                 strcpy(DUMMYMODE, " ");
  1373.             break;
  1374.  
  1375.         case BURN_ONTHEFLY:
  1376.             if (fBurnView->fOnTheFlyCheckBox->Value() == 1) {
  1377.                 fBurnView->fMultiCheckBox->SetEnabled(false);
  1378.                 ONTHEFLY = true;
  1379.             } else {
  1380.                 if (BURN_TYPE == 0)
  1381.                     fBurnView->fMultiCheckBox->SetEnabled(true);
  1382.                 ONTHEFLY = false;
  1383.             }
  1384.             break;
  1385.  
  1386.         case BURN_EJECT:
  1387.             if (fBurnView->fEjectCheckBox->Value() == 1)
  1388.                 strcpy(EJECT, "-eject");
  1389.             else
  1390.                 strcpy(EJECT, " ");
  1391.             break;
  1392.  
  1393.         case MISC_DAO:
  1394.             if (fPrefsView->fDAOCheckBox->Value() == 1)
  1395.                 strcpy(DAO, "-dao");
  1396.             else
  1397.                 strcpy(DAO, " ");
  1398.             break;
  1399.  
  1400.         case MISC_BURNFREE:
  1401.             if (fPrefsView->fBurnFreeCheckBox->Value() == 1)
  1402.                 strcpy(BURNFREE, "driveropts=burnfree");
  1403.             else
  1404.                 strcpy(BURNFREE, " ");
  1405.             break;
  1406.  
  1407.         case MENU_FILE_ABOUT:
  1408.             AWindow();
  1409.             break;
  1410.  
  1411.         case OPEN_ISO_FILE:
  1412.             fISOOpenPanel->Show();
  1413.             break;
  1414.  
  1415.         case MAKE_IMAGE:
  1416.             BurnNOW();
  1417.             break;
  1418.  
  1419.         case MAKE_AND_SAVE_IMAGE:
  1420.             if (VRCD && !ISOFILE)
  1421.                 fISOSavePanel->Show();
  1422.             else {
  1423.                 BAlert* MyAlert = new BAlert("BurnItNow", "You have to Add an \"Virtual CD Directory\" able to make an ISOfile.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1424.                 MyAlert->Go();
  1425.             }
  1426.             break;
  1427.  
  1428.         case B_SAVE_REQUESTED: {
  1429.                 entry_ref tempas_ref;
  1430.                 const char* name;
  1431.                 message->FindRef("directory", &tempas_ref);
  1432.                 message->FindString("name", &name);
  1433.                 sprintf(IMAGE_NAME, "%s/%s", BPath(&tempas_ref).Path(), name);
  1434.                 JUST_IMAGE = true;
  1435.                 MakeImageNOW(0, "");
  1436.             }
  1437.             break;
  1438.  
  1439.         case BLANK_IT_NOW:
  1440.             BlankNOW();
  1441.             break;
  1442.  
  1443.         case BLANK_FULL:
  1444.             BLANK_TYPE = 0;
  1445.             break;
  1446.  
  1447.         case BLANK_FAST:
  1448.             BLANK_TYPE = 1;
  1449.             break;
  1450.  
  1451.         case BLANK_SESSION:
  1452.             BLANK_TYPE = 2;
  1453.             break;
  1454.  
  1455.         case BLANK_TRACK:
  1456.             BLANK_TYPE = 3;
  1457.             break;
  1458.  
  1459.         case BLANK_TRACK_TAIL:
  1460.             BLANK_TYPE = 4;
  1461.             break;
  1462.  
  1463.         case BLANK_UNRES:
  1464.             BLANK_TYPE = 5;
  1465.             break;
  1466.  
  1467.         case BLANK_UNCLOSE:
  1468.             BLANK_TYPE = 6;
  1469.             break;
  1470.  
  1471.         case SPEED_CHANGE:
  1472.             temp = (int)fBurnView->fSpeedSlider->Value();
  1473.             BURN_SPD = (int)(temp + 1) * 2;
  1474.             sprintf(buf, "Burning Speed [%dx]", BURN_SPD);
  1475.             fBurnView->fSpeedSlider->SetLabel(buf);
  1476.             break;
  1477.  
  1478.         case BLANK_SPEED_CHANGE:
  1479.             temp = (int)fCDRWView->fBlankSpeedSlider->Value();
  1480.             BLANK_SPD = (int)(temp + 1) * 2;
  1481.             sprintf(buf, "Blank Speed [%dx]", BLANK_SPD);
  1482.             fCDRWView->fBlankSpeedSlider->SetLabel(buf);
  1483.             break;
  1484.  
  1485.         case PARENT_DIR:
  1486.             fRightList->ParentDir();
  1487.             break;
  1488.  
  1489.         case MAKE_DIR:
  1490.             fRightList->CreateDir();
  1491.             break;
  1492.  
  1493.         case MAKE_DIRECTORY:
  1494.             const char* temp_char;
  1495.             message->FindString("DirName", &temp_char);
  1496.             if (strcmp(temp_char, "boot.catalog"))
  1497.                 fRightList->MakeDir(temp_char);
  1498.             else {
  1499.                 BAlert* MyAlert = new BAlert("BurnItNow", "You cannot create a directory named boot.catalog,\nit is reserved for making bootable CDs.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_INFO_ALERT);
  1500.                 MyAlert->Go();
  1501.             }
  1502.             break;
  1503.  
  1504.         case NEW_VRCD:
  1505.             if (!ISOFILE && !VRCD) {
  1506.                 fLeftList->AddItem(new LeftListItem(&temp_ref, "VRCD - []", fLeftList->fVRCDBitmap, NULL), 0);
  1507.                 ISOFILE = false;
  1508.                 VRCD = true;
  1509.                 fNewVRCDButton->SetEnabled(false);
  1510.                 fAddISOButton->SetEnabled(false);
  1511.                 fMakeDirButton->SetEnabled(true);
  1512.                 fParentDirButton->SetEnabled(true);
  1513.  
  1514.                 fVolumeNameWindow = new AskName(BRect(200, 200, 440, 240), "Volume name", VOLUME_NAME, VOL_NAME);
  1515.                 fVolumeNameWindow->Show();
  1516.                 fDataView->fBootableCDCheckBox->SetEnabled(true);
  1517.                 if (fDataView->fBootableCDCheckBox->Value() == 1) {
  1518.                     fDataView->fChooseBootImageButton->SetEnabled(true);
  1519.                 }
  1520.             } else {
  1521.                 BAlert* MyAlert = new BAlert("BurnItNow", "You can only have one ISOfile/VirtualCD on a CD.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_INFO_ALERT);
  1522.                 MyAlert->Go();
  1523.             }
  1524.             break;
  1525.  
  1526.         case VOLUME_NAME: {
  1527.                 message->FindString("DirName", &temp_char);
  1528.                 strcpy(VOL_NAME, temp_char);
  1529.                 LeftListItem* item;
  1530.  
  1531.                 if ((item = (LeftListItem*)fLeftList->ItemAt(0)) != NULL) {
  1532.                     if (item->fIconBitmap == fLeftList->fVRCDBitmap) {
  1533.                         if (BOOTABLE)
  1534.                             sprintf(item->fName, "VRCD(Boot) - [%s]", temp_char);
  1535.                         else
  1536.                             sprintf(item->fName, "VRCD - [%s]", temp_char);
  1537.  
  1538.                         item->fName[27] = 0;
  1539.                         item->fName[26] = ']';
  1540.                         fLeftList->InvalidateItem(0);
  1541.                     }
  1542.                 }
  1543.             }
  1544.             break;
  1545.  
  1546.         case BOOT_CHECKED: {
  1547.                 LeftListItem* item;
  1548.                 if (fDataView->fBootableCDCheckBox->Value() == 1) {
  1549.                     fDataView->fBootableCDCheckBox->SetValue(0);
  1550.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1551.                     BOOTABLE = false;
  1552.                     fDataView->fFilePanel->Show();
  1553.                 } else {
  1554.                     BOOTABLE = false;
  1555.                     sprintf(BOOTSTRING, " ");
  1556.                     fDataView->fChooseBootImageButton->SetEnabled(false);
  1557.                     if ((item = (LeftListItem*)fLeftList->ItemAt(0)) != NULL) {
  1558.                         if (item->fIconBitmap == fLeftList->fVRCDBitmap) {
  1559.                             sprintf(item->fName, "VRCD - [%s]", VOL_NAME);
  1560.                             item->fName[27] = 0;
  1561.                             item->fName[26] = ']';
  1562.                             fLeftList->InvalidateItem(0);
  1563.                         }
  1564.                     }
  1565.                 }
  1566.             }
  1567.             break;
  1568.  
  1569.         case BOOT_FILE_PANEL:
  1570.             fDataView->fBootableCDCheckBox->SetValue(0);
  1571.             fDataView->fChooseBootImageButton->SetEnabled(false);
  1572.             BOOTABLE = false;
  1573.             fDataView->fFilePanel->Show();
  1574.             break;
  1575.  
  1576.         case BOOT_CHANGE_IMAGE_NAME: {
  1577.                 LeftListItem* item;
  1578.                 off_t size;
  1579.                 entry_ref ref;
  1580.                 message->FindRef("refs", &ref);
  1581.                 if (BEntry(&ref, true).GetSize(&size) == B_OK) {
  1582.                     if (size < (2880 * 1024)) {
  1583.                         BOOTIMAGEREF = ref;
  1584.                         fDataView->fBootableCDCheckBox->SetValue(1);
  1585.                         fDataView->fChooseBootImageButton->SetEnabled(true);
  1586.                         BOOTABLE = true;
  1587.                         if ((item = (LeftListItem*)fLeftList->ItemAt(0)) != NULL) {
  1588.                             if (item->fIconBitmap == fLeftList->fVRCDBitmap) {
  1589.                                 sprintf(item->fName, "VRCD(Boot) - [%s]", VOL_NAME);
  1590.                                 item->fName[27] = 0;
  1591.                                 item->fName[26] = ']';
  1592.                                 fLeftList->InvalidateItem(0);
  1593.                             }
  1594.                         }
  1595.                     } else {
  1596.                         sprintf(BOOTSTRING, " ");
  1597.                         fDataView->fBootableCDCheckBox->SetValue(0);
  1598.                         fDataView->fChooseBootImageButton->SetEnabled(false);
  1599.                         BOOTABLE = false;
  1600.                         BAlert* MyAlert = new BAlert("BurnItNow", "The bootimage cannot be bigger than 2.88 Mb", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_INFO_ALERT);
  1601.                         MyAlert->Go();
  1602.                     }
  1603.                 }
  1604.             }
  1605.             break;
  1606.  
  1607.         case CHANGE_VOL_NAME: {
  1608.                 fVolumeNameWindow = new AskName(BRect(200, 200, 440, 240), "Volume name", VOLUME_NAME, VOL_NAME);
  1609.                 fVolumeNameWindow->Show();
  1610.             }
  1611.             break;
  1612.  
  1613.         default:
  1614.             BWindow::MessageReceived(message);
  1615.             break;
  1616.     }
  1617.     if ((message->what & 0xffffff00) == 'dev\0') {
  1618.         count = (uint8)(message->what & 0xff);
  1619.         SCSI_DEV = count;
  1620.         fBurnDevice = &fScsiDevices[count - 1];
  1621.     }
  1622. }
  1623.  
  1624.  
  1625. void jpWindow::SaveData()
  1626. {
  1627.     // Save all prefs
  1628.     fBurnItPrefs->SetBool("BOOTABLE", BOOTABLE);
  1629.     fBurnItPrefs->SetRef("BOOTIMAGEREF", &BOOTIMAGEREF);
  1630.     fBurnItPrefs->SetString("ISOFILE_DIR", ISOFILE_DIR);
  1631.     fBurnItPrefs->SetString("VOL_NAME", VOL_NAME);
  1632.     fBurnItPrefs->SetBool("VRCD", VRCD);
  1633.     fBurnItPrefs->SetBool("ISOFILE", ISOFILE);
  1634.     fBurnItPrefs->SetInt16("BURN_SPD", BURN_SPD);
  1635.     fBurnItPrefs->SetInt16("BLANK_TYPE", BLANK_TYPE);
  1636.     fBurnItPrefs->SetInt16("BLANK_SPD", BLANK_SPD);
  1637.     fBurnItPrefs->SetInt16("BURN_TYPE", BURN_TYPE);
  1638.     fBurnItPrefs->SetBool("ONTHEFLY", ONTHEFLY);
  1639.     fBurnItPrefs->SetString("MULTISESSION", MULTISESSION);
  1640.     fBurnItPrefs->SetString("DUMMYMODE", DUMMYMODE);
  1641.     fBurnItPrefs->SetString("EJECT", EJECT);
  1642.     fBurnItPrefs->SetString("DATA_STRING", DATA_STRING);
  1643.     fBurnItPrefs->SetString("PAD", PAD);
  1644.     fBurnItPrefs->SetString("DAO", DAO);
  1645.     fBurnItPrefs->SetString("BURNFREE", BURNFREE);
  1646.     fBurnItPrefs->SetString("SWAB", SWAB);
  1647.     fBurnItPrefs->SetString("NOFIX", NOFIX);
  1648.     fBurnItPrefs->SetString("PREEMP", PREEMP);
  1649.     fBurnItPrefs->SetInt16("IMAGE_TYPE", IMAGE_TYPE);
  1650.     fBurnItPrefs->SetInt16("SCSI_DEV", SCSI_DEV);
  1651.  
  1652.     // All saved
  1653.     delete fBurnItPrefs;
  1654. }
  1655.  
  1656.  
  1657. bool jpWindow::QuitRequested()
  1658. {
  1659.     SaveData();
  1660.     be_app->PostMessage(B_QUIT_REQUESTED);
  1661.     return true;
  1662. }
  1663.  
  1664.  
  1665. void jpWindow::SetISOFile(char* string)
  1666. {
  1667.     entry_ref temp_ref;
  1668.     if (!VRCD && !ISOFILE) {
  1669.         strcpy(ISOFILE_DIR, string);
  1670.         BEntry(string).GetRef(&temp_ref);
  1671.         fLeftList->AddItem(new LeftListItem(&temp_ref, temp_ref.name, fLeftList->fISOBitmap, NULL), 0);
  1672.         fNewVRCDButton->SetEnabled(false);
  1673.         fAddISOButton->SetEnabled(false);
  1674.         ISOFILE = true;
  1675.         VRCD = false;
  1676.     } else {
  1677.         BAlert* MyAlert = new BAlert("BurnItNow", "You can only have one ISOfile/VirtualCD on a CD.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_INFO_ALERT);
  1678.         MyAlert->Go();
  1679.     }
  1680. }
  1681.  
  1682.  
  1683. void jpWindow::MakeImageNOW(int Multi, const char* str)
  1684. {
  1685.     int Result;
  1686.     BAlert* MyAlert = new BAlert("Burn?", "Do you want to make the image?", "I changed my mind.", "Do it.", NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1687.     Result = MyAlert->Go();
  1688.     if (Result) {
  1689.         fStatusWindow = new StatusWindow(VOL_NAME);
  1690.         fStatusWindow->Show();
  1691.  
  1692.         fStatusWindow->Lock();
  1693.         fStatusWindow->fStatusBar->Reset();
  1694.         fStatusWindow->fStatusBar->SetBarColor(blue);
  1695.         fStatusWindow->Unlock();
  1696.         char command[2000];
  1697.         if (BOOTABLE)
  1698.             MakeBootImage();
  1699.  
  1700.         if (IMAGE_TYPE == 0) {
  1701.             if (Multi == 0)
  1702.                 sprintf(command, "mkisofs -o \"%s\" %s %s -gui -f -V \"%s\" \"%s\" 2>&1", IMAGE_NAME, DATA_STRING, BOOTSTRING, VOL_NAME, BURN_DIR);
  1703.  
  1704.             if (Multi == 1)
  1705.                 sprintf(command, "mkisofs -o \"%s\" %s %s -gui -f -V \"%s\" -C %s -M %s \"%s\" 2>&1", IMAGE_NAME, DATA_STRING, BOOTSTRING, VOL_NAME, str, fBurnDevice->scsiid, BURN_DIR);
  1706.  
  1707.             Lock();
  1708.             resume_thread(Cntrl = spawn_thread(controller, "MakeingIMAGE", 5, command));
  1709.             snooze(500000);
  1710.             resume_thread(OPMkImage = spawn_thread(OutPutMkImage, "OutPutMakeingIMAGE", 5, fStatusWindow));
  1711.             snooze(500000);
  1712.             fBurnView->fBurnButton->SetLabel("Cancel");
  1713.             Unlock();
  1714.  
  1715.         }
  1716.         if (IMAGE_TYPE == 1) { // BFS
  1717.             MessageLog("Begin making and copying to bfs file...");
  1718.             fStatusWindow->Lock();
  1719.             fStatusWindow->StatusSetText("Making BFS image this can take several minutes..");
  1720.             fStatusWindow->Unlock();
  1721.             MakeBFS();
  1722.             MountBFS();
  1723.             BFSDir = new BDirectory("/BurnItNowTempMount");
  1724.             CopyFiles();
  1725.             delete BFSDir;
  1726.             UnmountBFS();
  1727.             MessageLog("Done with bfs.");
  1728.             if (!JUST_IMAGE)
  1729.                 BurnWithCDRecord();
  1730.             else {
  1731.                 sprintf(IMAGE_NAME, "%s/tmp/BurnItNow.raw", BURNIT_PATH);
  1732.                 fStatusWindow->Lock();
  1733.                 fStatusWindow->Ready();
  1734.                 fStatusWindow->Unlock();
  1735.             }
  1736.         }
  1737.     }
  1738. }
  1739.  
  1740.  
  1741. void jpWindow::GetTsize(char* tsize)
  1742. {  
  1743.     char buffer[1024];
  1744.     char command[1024];
  1745.     FILE* f;
  1746.  
  1747.     BString commandstr;
  1748.    
  1749.     commandstr.SetTo(CDRTOOLS_DIR.Path());
  1750.     commandstr << "/";
  1751.     commandstr << "mkisofs -print-size " << DATA_STRING << " -f -V " << '"' << VOL_NAME << '"' << " " << '"' << BURN_DIR << '"' << " 2>&1";
  1752.    
  1753.     printf("GetTsize: '%s'\n",commandstr.String());
  1754.     strcpy(command, commandstr.String());
  1755.     f = popen(command, "r");
  1756.     memset(command, 0, 1024);
  1757.     while (!feof(f) && !ferror(f)) {
  1758.         buffer[0] = 0;
  1759.         fgets(buffer, 1024, f);
  1760.         if (!strncmp(buffer, "Total extents scheduled to be written = ", 40)) {
  1761.             strncpy(command, &buffer[40], strlen(buffer) - 41);
  1762.             sprintf(tsize, "%ss", command);
  1763.         }
  1764.     }
  1765.     pclose(f);
  1766. }
  1767.  
  1768.  
  1769. void jpWindow::BurnWithCDRecord()
  1770. {  
  1771.     char tsize[512];
  1772.     char command[2048];
  1773.     int Result;
  1774.        
  1775.     BString commandstr;
  1776.    
  1777.     CalculateSize();
  1778.  
  1779.     BAlert* MyAlert = new BAlert("Put in a CD", "Put in a CDR/CDRW", "Cancel", "Ok", NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
  1780.     Result = MyAlert->Go();
  1781.     if (Result) {
  1782.         if (ONTHEFLY || ISOFILE || (BURN_TYPE == 1)) {
  1783.             fStatusWindow = new StatusWindow(VOL_NAME);
  1784.             fStatusWindow->Show();
  1785.         }
  1786.         fStatusWindow->Lock();
  1787.         fStatusWindow->fStatusBar->Reset();
  1788.         fStatusWindow->fStatusBar->SetBarColor(blue);
  1789.         fStatusWindow->Unlock();
  1790.  
  1791.         SetButtons(false);
  1792.        
  1793.         commandstr.SetTo(CDRTOOLS_DIR.Path());
  1794.         commandstr << "/";
  1795.         commandstr << "cdrecord dev=" << fBurnDevice->scsiid;
  1796.        
  1797.         if (BURN_TYPE == 0) {
  1798.             fStatusWindow->Lock();
  1799.             fStatusWindow->SetAngles(angles, 1);
  1800.             fStatusWindow->Unlock();
  1801.  
  1802.             if (ONTHEFLY && !ISOFILE && VRCD) {
  1803.                 if (BOOTABLE)
  1804.                     MakeBootImage();
  1805.                 GetTsize(tsize);
  1806.                 commandstr.SetTo(CDRTOOLS_DIR.Path());
  1807.                 commandstr << "/";
  1808.                 commandstr << "mkisofs " << DATA_STRING << " -quiet " ;
  1809.                 commandstr << BOOTSTRING ;
  1810.                 commandstr << " -f -V " << '"' << VOL_NAME << '"' << " " << '"';
  1811.                 commandstr << BURN_DIR << '"' << " | " << CDRTOOLS_DIR.Path();
  1812.                 commandstr << "/cdrecord dev=" << fBurnDevice->scsiid;
  1813.                 commandstr << " speed=" << BURN_SPD ;
  1814.                 commandstr << " "  << BURNFREE;
  1815.                 commandstr << " fs=16m";
  1816.                 commandstr << "tsize" << tsize << " ";
  1817.                 commandstr << DAO << " -data ";
  1818.                 commandstr << DUMMYMODE ;
  1819.                 commandstr << " " << EJECT << " -v -";
  1820.             }
  1821.             else {
  1822.                 commandstr.SetTo(CDRTOOLS_DIR.Path());
  1823.                 commandstr << "/";
  1824.                 commandstr << "cdrecord dev=" << fBurnDevice->scsiid << " speed=" << BURN_SPD ;
  1825.                 commandstr << " " << BURNFREE << " " << DAO;
  1826.                 commandstr << " -data " << DUMMYMODE ;
  1827.                 commandstr << " " << EJECT ;
  1828.                 commandstr << " fs=16m";
  1829.                 commandstr << " -v" ;   // aw 110910
  1830.                 commandstr << " " << MULTISESSION   << "\"" << IMAGE_NAME << "\"";
  1831.             }  
  1832.            
  1833.             commandstr.ReplaceAll("\t"," ");    commandstr.ReplaceAll("  "," ");
  1834.             printf("BURN_TYPE0: '%s'\n",commandstr.String());
  1835.            
  1836.             Lock();
  1837.             strcpy(command, commandstr.String());
  1838.             resume_thread(Cntrl = spawn_thread(controller, "Burning", 15, command));
  1839.             snooze(500000);
  1840.             resume_thread(OPBurn = spawn_thread(OutPutBurn, "OutPutBurning", 15, fStatusWindow));
  1841.             snooze(500000);
  1842.             Unlock();
  1843.         } else if (BURN_TYPE == 1) {
  1844.             fStatusWindow->Lock();
  1845.             fStatusWindow->SetAngles(angles, nrtracks);
  1846.             fStatusWindow->Unlock();
  1847.             commandstr.SetTo(CDRTOOLS_DIR.Path());
  1848.             commandstr << "//";
  1849.             commandstr << "cdrecord dev=" << fBurnDevice->scsiid;
  1850.             commandstr << " speed=" << BURN_SPD;
  1851.             commandstr << " " << BURNFREE ;
  1852.             commandstr << " fs=16m";
  1853.             commandstr << " " << DAO;
  1854.             commandstr << " " << PAD;
  1855.             commandstr << " " << PREEMP ;
  1856.             commandstr << " " << SWAB ;
  1857.             commandstr << " " << NOFIX;
  1858.             commandstr << " -audio " << DUMMYMODE;
  1859.             commandstr << " " << EJECT ;
  1860.             commandstr << " " << AUDIO_FILES;
  1861.             commandstr.ReplaceAll("\t"," ");    commandstr.ReplaceAll("  "," ");
  1862.             printf("BURN_TYPE1: '%s'\n",commandstr.String());
  1863.             Lock();
  1864.             resume_thread(Cntrl = spawn_thread(controller, "Burning", 15, command));
  1865.             snooze(500000);
  1866.             resume_thread(OPBurn = spawn_thread(OutPutBurn, "OutPutBurning", 15, fStatusWindow));
  1867.             snooze(500000);
  1868.             Unlock();
  1869.         } else if (BURN_TYPE == 2) {
  1870.             fStatusWindow->Lock();
  1871.             fStatusWindow->SetAngles(angles, nrtracks);
  1872.             fStatusWindow->Unlock();
  1873.  
  1874.             if (ONTHEFLY && !ISOFILE && VRCD) {
  1875.                 GetTsize(tsize);
  1876.                 if (fDataView->fBootableCDCheckBox->Value() == 1)
  1877.                     MakeBootImage();
  1878.  
  1879.                 commandstr.SetTo(CDRTOOLS_DIR.Path());
  1880.                 commandstr << "/";
  1881.                 commandstr << "mkisofs " << DATA_STRING << BOOTSTRING << " -quiet -f -V " ;
  1882.                 commandstr << '"' << VOL_NAME << '"' << BURN_DIR << '"' << " |";
  1883.                 commandstr << CDRTOOLS_DIR.Path() << "/cdrecord dev=" ;
  1884.                 commandstr <<  fBurnDevice->scsiid << "speed=" << BURN_SPD ;
  1885.                 commandstr << " " << BURNFREE;
  1886.                 commandstr << " fs=16m";
  1887.                 commandstr << " tsize=" << tsize ;
  1888.                 commandstr << " " << DAO << " " << DUMMYMODE ;
  1889.                 commandstr << " " << EJECT << " " << PAD ;
  1890.                 commandstr << " " << PREEMP << " " << SWAB ;
  1891.                 commandstr << " " << NOFIX;
  1892.                 commandstr << " -data - -audio " << AUDIO_FILES;
  1893.                 MessageLog(commandstr.String());
  1894.             } else {
  1895.                 commandstr.SetTo(CDRTOOLS_DIR.Path());
  1896.                 commandstr << "//";
  1897.                 commandstr << "cdrecord dev=" << fBurnDevice->scsiid;
  1898.                 commandstr << " speed=" << BURN_SPD ;
  1899.                 commandstr << " " << BURNFREE << " " << DAO << " " << PAD ;
  1900.                 commandstr << " fs=16m";
  1901.                 commandstr << " " << PREEMP << " " << SWAB ;
  1902.                 commandstr << " " << NOFIX ;
  1903.                 commandstr << " " << DUMMYMODE ;
  1904.                 commandstr << " " << EJECT;
  1905.                 commandstr << " -data " << '"' << IMAGE_NAME << '"' << " -audio " << AUDIO_FILES;
  1906.             }
  1907.            
  1908.             commandstr.ReplaceAll("\t"," ");    commandstr.ReplaceAll("  "," ");
  1909.             printf("BURN_TYPE2: '%s'\n",commandstr.String());
  1910.            
  1911.             Lock();
  1912.             resume_thread(Cntrl = spawn_thread(controller, "Burning", 15, command));
  1913.             snooze(500000);
  1914.             resume_thread(OPBurn = spawn_thread(OutPutBurn, "OutPutBurning", 15, fStatusWindow));
  1915.             snooze(500000);
  1916.             Unlock();
  1917.         }
  1918.     }
  1919.  
  1920.     //restore after burning  not checked..  // aw 1109100
  1921.     fBurnView->fBurnButton->SetLabel("Burn!");
  1922. }
  1923.  
  1924.  
  1925. void jpWindow::UpdateStatus(float delta, char* str)
  1926. {
  1927.     fStatusBar->Update(delta - fStatusBar->CurrentValue(), str);
  1928. }
  1929.  
  1930.  
  1931. void jpWindow::SetButtons(bool what)
  1932. {
  1933.     fBurnView->SetButton(what);
  1934.     fCDRWView->fBlankButton->SetEnabled(what);
  1935. }
  1936.  
  1937.  
  1938. void jpWindow::MakeBootImage()
  1939. {  
  1940.     char temp[1024];
  1941.     char temp2[1024];
  1942.     BPath path;
  1943.     BEntry entry(&BOOTIMAGEREF, true);
  1944.     if (entry.Exists()) {
  1945.         entry.GetPath(&path);
  1946.         sprintf(temp, "%s/boot.catalog", BURN_DIR);
  1947.         create_directory(temp, 0777);
  1948.         sprintf(BOOTSTRING, "-c boot.catalog/ -b \"boot.catalog/%s\"", path.Leaf());
  1949.         sprintf(temp, "%s/%s", temp, path.Leaf());
  1950.         sprintf(temp2, "dd if=/dev/zero of=\"%s\" bs=1024 count=2880", temp);
  1951.         system(temp2);
  1952.         sprintf(temp2, "dd if=\"%s\" of=\"%s\" conv=notrunc", path.Path(), temp);
  1953.         system(temp2);
  1954.     } else {
  1955.         sprintf(BOOTSTRING, " ");
  1956.         fDataView->fBootableCDCheckBox->SetValue(0);
  1957.         fDataView->fChooseBootImageButton->SetEnabled(false);
  1958.         BOOTABLE = false;
  1959.         BAlert* MyAlert = new BAlert("BurnItNow", "The boot image you chose doesn't exist.\n BurnItNow will burn this CD without a bootimage.", "Ok", NULL, NULL, B_WIDTH_AS_USUAL, B_INFO_ALERT);
  1960.         MyAlert->Go();
  1961.     }
  1962. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement