// generated by Fast Light User Interface Designer (fluid) version 1.0110 #include "appbrowser.h" // (c) Robert Shingledecker 2008-2010 #include #include #include #include #include #include #include #include #include using namespace std; static FILE *G_in = NULL; // how we read the child static int G_out = 0; // how we write to the child static string download_dir, last_dir; static string select_extn; static string repository; static ifstream ifaberr; static string aberr; static string mode, command, msg, url; void HandleInput_CB(int, void *data) { static int x = 0; static char s[1024]; char c = fgetc(G_in); // read one char at a time if ( c == '\n' || x == (sizeof(s)-1) ) { s[x] = 0; status_out->value(s); string result = s; int loc = result.find((select_extn + ": OK")); if (loc != string::npos) { status_out->color(175); } x = 0; } else { s[x++] = c; } } void fetch_extension() { status_out->activate(); status_out->color(FL_WHITE); status_out->value(command.c_str()); command = command + "\n"; write(G_out, command.c_str(), command.length()); Fl::add_fd(fileno(G_in), HandleInput_CB, (void*)&status_out); } void btn_callback(Fl_Widget *, void* userdata) { if (userdata == "tcz") { mode = "tcz"; status_out->value(""); status_out->label("Status"); status_out->deactivate(); repository = (const char*) userdata; window->cursor(FL_CURSOR_WAIT); Fl::flush(); command = "/usr/bin/tce-fetch.sh info.lst.gz"; int results = system(command.c_str()); window->cursor(FL_CURSOR_DEFAULT); Fl::flush(); if (results == 0 ) { system("gunzip info.lst.gz"); brw_select->load("info.lst"); btn_install->deactivate(); btn_download->deactivate(); btn_ondemand->deactivate(); box_select->label("Scegli Estensione"); box_select->activate(); btn_search->activate(); search_field->activate(); system("rm -f info.lst"); } else fl_message("Errore d connessione, controlla la rete o il mirror."); } else if (userdata == "install") { command = "tce-load -wi " + select_extn; fetch_extension(); } else if (userdata == "download") { command = "tce-load -w " + select_extn; fetch_extension(); } else if (userdata == "ondemand") { command = "tce-load -wo " + select_extn; fetch_extension(); } else if (userdata == "toggle") { search_field->value(""); if (btn_search->label() == "&Cerca") btn_search->label("&Fornisce"); else btn_search->label("&Cerca"); } else if (userdata == "search") { if (btn_search->label() == "&Cerca") command = "/usr/bin/search.sh"; else command = "/usr/bin/provides.sh"; window->cursor(FL_CURSOR_WAIT); Fl::flush(); command = command + " " + (string)search_field->value(); int results = system(command.c_str()); window->cursor(FL_CURSOR_DEFAULT); Fl::flush(); if (results == 0 ) { brw_select->load("info.lst"); btn_install->deactivate(); btn_download->deactivate(); btn_search->activate(); search_field->activate(); system("rm -f info.lst"); } } else if (userdata == "quit") { ofstream last_dir_fout("/opt/.appbrowser",ios::out|ios::out); if ( last_dir_fout.is_open()) { last_dir_fout << last_dir << endl; last_dir_fout.close(); } command = "quit\n"; write(G_out, command.c_str(), command.length()); unlink("ab2tce.fifo"); exit(0); } } void brw_select_callback(Fl_Widget *, void *) { if (brw_select->value()) { select_extn = brw_select->text(brw_select->value()); if ( mode == "tcz" ) { string select_extn_file = select_extn + (string)".info"; command = "/usr/bin/tce-fetch.sh " + select_extn_file; int results = system(command.c_str()); if (results == 0) { brw_info->load(select_extn_file.c_str()); command = "rm -f " + select_extn_file; system(command.c_str()); btn_install->activate(); btn_download->activate(); btn_ondemand->activate(); tabs->activate(); tab_info->activate(); tab_files->activate(); brw_list->load(""); tab_depends->activate(); brw_dep->load(""); tab_info->show(); } } if ( mode == "mirror" ) { status_out->value(select_extn.c_str()); url = status_out->value(); ofstream fout("/opt/tcemirror", ios::out|ios::out); if (! fout.is_open()) { cerr << "Impossibile aprire /opt/tcemirror" << endl; exit(EXIT_FAILURE); } fout << url << endl; fout.close(); } } } void local_btn_callback(Fl_Widget*, void* userdata) { string title = "Installa Estensione Locale"; string selected; string flags = " -i "; string target_dir = last_dir; if (userdata == "File/Optional") { target_dir = last_dir + "/optional"; title = "Installa Estensione Opzionale"; } Fl_File_Chooser chooser(target_dir.c_str(),"*.tcz",Fl_File_Chooser::SINGLE,title.c_str()); chooser.show(); // Block until user picks something. // (The other way to do this is to use a callback()) while(chooser.shown()) { Fl::wait(); } // User hit cancel? if ( chooser.value() == NULL ) return; // cout << chooser.value() << endl; selected = (string)chooser.value(); last_dir = chooser.directory(); // cout << last_dir << endl; command = "tce-load" + flags + (string)chooser.value(); // cout << command << endl; status_out->activate(); status_out->color(FL_WHITE); status_out->value(command.c_str()); command = command + "\n"; write(G_out, command.c_str(), command.length()); Fl::add_fd(fileno(G_in), HandleInput_CB, (void*)&status_out); } void mirror_btn_callback(Fl_Widget*, void* userdata) { //Get Mirror mode = "mirror"; window->cursor(FL_CURSOR_WAIT); Fl::flush(); ifstream fin("/opt/tcemirror"); getline(fin,url); fin.close(); brw_info->clear(); tabs->deactivate(); status_out->label(" URL:"); status_out->value(url.c_str()); status_out->activate(); command = "busybox wget -cq ftp://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/2.x/tcz/mirrors.lst"; int results = system(command.c_str()); window->cursor(FL_CURSOR_DEFAULT); Fl::flush(); if ( results == 0) { brw_select->load("mirrors.lst"); box_select->label("Seleziona Mirror"); box_select->activate(); system("rm mirrors.lst"); } else fl_message("Errore d connessione, controlla la rete o ibiblio"); } void tabs_callback(Fl_Widget*, void* userdata) { if (brw_select->value()) { int results; select_extn = brw_select->text(brw_select->value()); if (tab_files->visible()) { string select_extn_file = select_extn + (string)".list"; command = "/usr/bin/tce-fetch.sh " + select_extn_file; results = system(command.c_str()); if (results == 0) { brw_list->load(select_extn_file.c_str()); command = "rm -f " + select_extn_file; system(command.c_str()); } } if (tab_depends->visible()) { string select_extn_file = select_extn + (string)".dep"; command = "/usr/bin/tce-fetch.sh " + select_extn_file; results = system(command.c_str()); if (results == 0) { brw_dep->load(select_extn_file.c_str()); command = "rm -f " + select_extn_file; system(command.c_str()); } } } } Fl_Double_Window *window=(Fl_Double_Window *)0; Fl_Button *btn_search=(Fl_Button *)0; Fl_Input *search_field=(Fl_Input *)0; Fl_Box *box_select=(Fl_Box *)0; Fl_Browser *brw_select=(Fl_Browser *)0; Fl_Tabs *tabs=(Fl_Tabs *)0; Fl_Group *tab_info=(Fl_Group *)0; Fl_Browser *brw_info=(Fl_Browser *)0; Fl_Group *tab_files=(Fl_Group *)0; Fl_Browser *brw_list=(Fl_Browser *)0; Fl_Group *tab_depends=(Fl_Group *)0; Fl_Browser *brw_dep=(Fl_Browser *)0; Fl_Button *btn_install=(Fl_Button *)0; Fl_Button *btn_download=(Fl_Button *)0; Fl_Button *btn_ondemand=(Fl_Button *)0; Fl_Output *status_out=(Fl_Output *)0; int main(int argc, char **argv) { { window = new Fl_Double_Window(685, 395, "Appbrowser"); window->callback((Fl_Callback*)btn_callback, (void*)("quit")); { Fl_Button* o = new Fl_Button(0, 0, 68, 20, "&Connetti"); o->callback((Fl_Callback*)btn_callback, (void*)("tcz")); } // Fl_Button* o { Fl_Button* o = new Fl_Button(69, 0, 65, 20, "Loc&ale"); o->callback((Fl_Callback*)local_btn_callback, (void*)("File/Local")); } // Fl_Button* o { Fl_Button* o = new Fl_Button(135, 0, 65, 20, "&Mirrors"); o->callback((Fl_Callback*)mirror_btn_callback, (void*)("mirror")); } // Fl_Button* o { btn_search = new Fl_Button(206, 0, 65, 20, "C&erca"); btn_search->tooltip("Cambia Cerca / Fornisce"); btn_search->callback((Fl_Callback*)btn_callback, (void*)("toggle")); btn_search->deactivate(); } // Fl_Button* btn_search { search_field = new Fl_Input(275, 0, 405, 20); search_field->labeltype(FL_NO_LABEL); search_field->callback((Fl_Callback*)btn_callback, (void*)("search")); search_field->when(FL_WHEN_ENTER_KEY); search_field->deactivate(); } // Fl_Input* search_field { box_select = new Fl_Box(40, 24, 120, 16); box_select->deactivate(); } // Fl_Box* box_select { brw_select = new Fl_Browser(0, 45, 200, 325); brw_select->type(1); brw_select->textfont(4); brw_select->callback((Fl_Callback*)brw_select_callback); } // Fl_Browser* brw_select { tabs = new Fl_Tabs(205, 20, 475, 350); tabs->callback((Fl_Callback*)tabs_callback); { tab_info = new Fl_Group(205, 45, 475, 325, "I&nfo"); tab_info->when(FL_WHEN_CHANGED); tab_info->hide(); tab_info->deactivate(); { brw_info = new Fl_Browser(210, 50, 470, 318); brw_info->textfont(4); } // Fl_Browser* brw_info tab_info->end(); } // Fl_Group* tab_info { tab_files = new Fl_Group(205, 45, 475, 325, "Fi&les"); tab_files->when(FL_WHEN_CHANGED); tab_files->hide(); tab_files->deactivate(); { brw_list = new Fl_Browser(210, 50, 470, 318); brw_list->textfont(4); } // Fl_Browser* brw_list tab_files->end(); } // Fl_Group* tab_files { tab_depends = new Fl_Group(205, 45, 475, 325, "&Dipende"); tab_depends->deactivate(); { brw_dep = new Fl_Browser(210, 50, 470, 318); brw_dep->textfont(4); } // Fl_Browser* brw_dep tab_depends->end(); } // Fl_Group* tab_depends tabs->end(); } // Fl_Tabs* tabs { btn_install = new Fl_Button(0, 373, 52, 20, "&Installa "); btn_install->tooltip("Scarica, aggiorna menù e onboot.lst."); btn_install->callback((Fl_Callback*)btn_callback, (void*)("install")); btn_install->deactivate(); } // Fl_Button* btn_install { btn_download = new Fl_Button(53, 373, 68, 20, "&Scarica"); btn_download->tooltip("Scarica solo."); btn_download->callback((Fl_Callback*)btn_callback, (void*)("download")); btn_download->deactivate(); } // Fl_Button* btn_download { btn_ondemand = new Fl_Button(123, 373, 76, 20, "&OnDemand"); btn_ondemand->tooltip("Scarica e aggiorna il menù OnDemand."); btn_ondemand->callback((Fl_Callback*)btn_callback, (void*)("ondemand")); btn_ondemand->deactivate(); } // Fl_Button* btn_ondemand { status_out = new Fl_Output(250, 373, 430, 20, "Stato"); status_out->deactivate(); } // Fl_Output* status_out window->end(); window->resizable(window); } // Fl_Double_Window* window ifstream download_dir_file("/opt/.tce_dir"); getline(download_dir_file,download_dir); download_dir_file.close(); last_dir = download_dir + "/optional"; ifstream last_dir_file("/opt/.appbrowser"); if ( last_dir_file.is_open() ) { getline(last_dir_file,last_dir); last_dir_file.close(); } // Make fifo unlink("/tmp/ab2tce.fifo"); if ( mkfifo("/tmp/ab2tce.fifo", 0666) < 0 ) { perror("mkfifo(/tmp/ab2tce.fifo)"); exit(1); } // Popen child for reading, set child to read fifo if ( ( G_in = popen("ab2tce.sh < /tmp/ab2tce.fifo", "r") ) == NULL ) { perror("popen failed"); exit(1); } setbuf(G_in, NULL); // disable buffering // Now open fifo if ( ( G_out = open("/tmp/ab2tce.fifo", O_WRONLY) ) < 0 ) { perror("open(/tmp/ab2tce.fifo) for write failed"); unlink("/tmp/ab2tce.fifo"); exit(1); } window->show(argc, argv); return Fl::run(); }