Fix file edit: add sorted location move
[sfinx.git] / faraon / faraon.C
blobe02f9382fd1d720a8fe59671a1c89edc915e9ea1
2 #include <faraon.H>
3 #include <errno.h>
5 faraon_app *app;
6 Fl_Preferences prefs(Fl_Preferences::USER, "Harbour", "Sfinx");
8 bool faraon_app::process_requests()
10  if (sfinx.read_packet()) {
11    log("faraon:process", "Error reading sfinx request");
12    return true;
13  }
14   sfinx_t *el;
15   while ((el = sfinx.rx_elements.next())) {
16    switch (el->id()) {
17      case SFINX_ELEMENT_SEARCH_RESULT:
18        ui()->search_browser((sfinx_pair_vector_t *)el);
19        break;
20      case SFINX_FILES_MODULE_EDIT_FILE_REQUEST:
21        ui()->files_module_edit((sfinx_file_t *)el);
22        break;
23      case SFINX_ALERT:
24        ui()->alert((sfinx_string_t *)el);
25        break;
26      case SFINX_FILES_MODULE_EDIT_REPLY:
27        ui()->files_module_edit_reply((sfinx_string_t *)el);
28        break;
29      case SFINX_FILES_MODULE_CLASSIFY_REPLY:
30        ui()->files_module_classify_reply((sfinx_string_t *)el);
31        break;
32      case SFINX_ELEMENT_PROGRESS:
33        ui()->progress((sfinx_progress_t *)el);
34        break;
35      case SFINX_FILES_MODULE_SORTED_TREE:
36      case SFINX_FILES_MODULE_UNSORTED_TREE:
37        ui()->fill_files_module_tree((sfinx_files_vector_t *)el);
38        break;
39      case SFINX_FILES_MODULE_CONF:
40        // set files module conf
41        files_module_conf.copy(el);
42        ui()->fill_preferences();
43        break;
44      case SFINX_EDIT_SLICE:
45        ui()->edit_slice((sfinx_slice_t *)el);
46        break;
47      case SFINX_SLICES_MODULE_TREE:
48        ui()->fill_slices_tree((sfinx_slice_vector_t *)el);
49        slices.copy((sfinx_slice_vector_t *)el);
50        break;
51      case SFINX_SLICES_MODULE_TREE_EXCEPT:
52        ui()->fill_select_slice_tree((sfinx_slice_vector_t *)el);
53        break;
54      default:
55        log("sfinx:process", "Unknown element id - 0x%x", el->id());
56        break;
57    }
58  }
59   return false;
62 // main loop
63 void faraon_app::main()
65  // after connecting get some info :
66  sfinx.send(SFINX_SLICES_MODULE_TREE_REQUEST, (u8_t)0); // prepare for slice_name() calls
67  while(1) {
68   if (sfinx.pending()) {
69     if (process_requests()) {
70       log("faraon:main", "Bad sfinx message");
71       sfinx.disconnect();
72       break;
73    }
74  }
75   idle();
76  } 
79 int main(int argc, char **argv)
81  setlocale(LC_ALL, "");
82  char version[16];
83  sprintf(version, "v%0d.%0d.%0d", SFINX_VERSION_MAJOR, SFINX_VERSION_MINOR, SFINX_VERSION_PLEVEL);
84  app = new faraon_app(argc, argv, "faraon", version, "Harbour <Harbour@Sfinx.Od.UA>", "GPL");
85  app->start_ui(); // start ui
86  app->read_preferences();
87  while(1) {
88    try {
89      if (!app->connected()) {
90        if (app->connect())
91          Thread::sleep(1000);
92      } else
93          app->main();
94   }
95    catch (SockException *s) {
96       app->ui()->log(SFINX_LOG_FATAL, "Socket exception to %s",
97         app->server_name.c_str());
98       Thread::sleep(1000);
99   }
100     catch (Socket *s) {
101       app->ui()->log(SFINX_LOG_FATAL, "Error connecting to %s: (%d) \'%s\'",
102         app->server_name.c_str(), s->getErrorNumber(), s->getErrorString());
103       Thread::sleep(1000);
104   }
105    catch (...) {
106       app->ui()->log(SFINX_LOG_WARN, "Disconnected from %s",
107         app->server_name.c_str());
108       Thread::sleep(1000);
109   }
110  } // while(1)
111  return 0;
114 bool faraon_app::connect()
116  if (!server_name.size()) {
117    ui()->log(SFINX_LOG_FATAL, "Sfinx server name is not set !");
118    return 1;
120  ui()->log(SFINX_LOG_NOTICE, "Connecting to Sfinx server at %s", server_name.c_str());
121  // ask username/pass or select auth_type
122  if (!sfinx.connect(server_name)) {
123    char b[1024], b1[128];
124    sprintf(b, "Connected to server v%d.%d.%d, %d crypt facilities [", sfinx.daemon_version->get(0), sfinx.daemon_version->get(1),
125      sfinx.daemon_version->get(2), sfinx.packet_crypt_types->size());
126    for (u32_t i = 0; i < sfinx.packet_crypt_types->size(); i++) {
127      sprintf(b1, " 0x%x ", sfinx.packet_crypt_types->get(i));
128      strcat(b, b1);
129   }
130    sprintf(b1, "], %d auth level [", sfinx.min_auth_levels->size());
131    strcat(b, b1);
132    for (u32_t i = 0; i < sfinx.min_auth_levels->size(); i++) {
133      sprintf(b1, " 0x%x ", sfinx.min_auth_levels->get(i));
134      strcat(b, b1);
135   }
136    strcat(b, "]");
137    ui()->log(SFINX_LOG_NOTICE, b);
138    strcpy(b, "md5 server challenge [ ");
139    for (u32_t i = 0; i < sfinx.md5_challenge->size(); i++) {
140      sprintf(b1, "%02x", sfinx.md5_challenge->get(i));
141      strcat(b, b1);
142   }
143    strcat(b, " ]");
144    ui()->log(SFINX_LOG_NOTICE, b);
145    return 0;
147   return 1;
150 void faraon_app::read_preferences()
152   char buf[128];
153   Fl_Preferences conn_prefs(prefs, "Connection" );
154   conn_prefs.get("Sfinx Server Name", buf, "localhost", 100);
155   server_name = buf;
156   if (connected())
157     sfinx.send(SFINX_FILES_MODULE_CONF_REQUEST, (u8_t) 0);
160 void faraon_app::write_preferences()
162   Fl_Preferences conn_prefs(prefs, "Connection" );
163   conn_prefs.set("Sfinx Server Name", server_name.c_str());
164   conn_prefs.flush();
165   if (connected())
166     sfinx.send(files_module_conf);