.
[sfinx.git] / faraon / faraon.C
blob171bfc6bad1e42c904a8d8976b5078d0e7edffde
2  /*
3   *   Copyright (C) 2007, Rus V. Brushkoff, All rights reserved.
4   */
6 #include <faraon.H>
7 #include <errno.h>
9 faraon_app *app;
10 Fl_Preferences prefs(Fl_Preferences::USER, "Harbour", "Sfinx");
12 bool faraon_app::process_requests()
14  if (sfinx.read_packet()) {
15    log("faraon:process", "Error reading sfinx request");
16    return true;
17  }
18   sfinx_t *el;
19   while ((el = sfinx.rx_elements.next())) {
20    switch (el->tid()) {
21      case SFINX_NOTES_MODULE_EDIT_REQUEST:
22        ui()->notes_module_edit((sfinx_note_t *)el);
23        break;
24 //     case SFINX_NOTES_MODULE_TREE:
25 //       ui()->fill_notes_tree((sfinx_slice_vector_t *)el);
26 //       notes.copy((sfinx_slice_vector_t *)el);
27 //       break;
28      case SFINX_ELEMENT_SEARCH_RESULT:
29        ui()->search_browser((sfinx_pair_vector_t *)el);
30        break;
31      case SFINX_FILES_MODULE_EDIT_REQUEST:
32        ui()->files_module_edit((sfinx_file_t *)el);
33        break;
34      case SFINX_ALERT:
35        ui()->alert((sfinx_string_t *)el);
36        break;
37      case SFINX_NOTES_MODULE_ADD_REPLY:
38        ui()->notes_module_add_reply((sfinx_string_t *)el);
39        break;
40      case SFINX_FILES_MODULE_EDIT_REPLY:
41        ui()->files_module_edit_reply((sfinx_string_t *)el);
42        break;
43      case SFINX_FILES_MODULE_CLASSIFY_REPLY:
44        ui()->files_module_classify_reply((sfinx_string_t *)el);
45        break;
46      case SFINX_ELEMENT_PROGRESS:
47        ui()->progress((sfinx_progress_t *)el);
48        break;
49 //     case SFINX_FILES_MODULE_SORTED_TREE:
50      case SFINX_FILES_MODULE_UNSORTED_TREE:
51        ui()->fill_files_module_tree((sfinx_files_vector_t *)el);
52        break;
53      case SFINX_FILES_MODULE_CONF:
54        // set files module conf
55        files_module_conf.copy(el);
56        ui()->fill_preferences();
57        break;
58      case SFINX_EDIT_SLICE:
59        ui()->edit_slice((sfinx_slice_t *)el);
60        break;
61 //     case SFINX_SLICES_MODULE_TREE:
62      case SFINX_OBJECTS_TREE:
63        //ui()->fill_slices_tree((sfinx_slice_vector_t *)el);
64        slices.copy((sfinx_slice_vector_t *)el);
65        slices_need_update = false;
66        ui()->fill_objects_tree();
67        break;
68 //     case SFINX_SLICES_MODULE_TREE_EXCEPT:
69 //       ui()->fill_select_slice_tree((sfinx_slice_vector_t *)el);
70 //       break;
71      default:
72        log("sfinx:process", "Unknown element id - %s", sfinx_cmd2str(el->tid()));
73        break;
74    }
75  }
76   return false;
79 // main loop
80 void faraon_app::main()
82  // after connecting get all objects info
83  refresh_slices(1);
84  while(1) {
85   if (sfinx.pending()) {
86     if (process_requests()) {
87       log("faraon:main", "Bad sfinx message");
88       sfinx.disconnect();
89       break;
90    }
91  }
92   idle();
93  } 
96 int main(int argc, char **argv)
98  setlocale(LC_ALL, "");
99  char version[16];
100  sprintf(version, "v%0d.%0d.%0d", SFINX_VERSION_MAJOR, SFINX_VERSION_MINOR, SFINX_VERSION_PLEVEL);
101  app = new faraon_app(argc, argv, "faraon", version, "Harbour <Harbour@Sfinx.Od.UA>", "GPL");
102  app->start_ui(); // start ui
103  app->read_preferences();
104  while(1) {
105    try {
106      if (!app->connected()) {
107        if (app->connect())
108          Thread::sleep(1000);
109      } else
110          app->main();
111   }
112    catch (SockException *s) {
113       app->ui()->log(SFINX_LOG_FATAL, "Socket exception to %s",
114         app->server_name.c_str());
115       app->sfinx.disconnect();
116       Thread::sleep(1000);
117   }
118     catch (Socket *s) {
119       app->ui()->log(SFINX_LOG_FATAL, "Error connecting to %s: (%d) \'%s\'",
120         app->server_name.c_str(), s->getErrorNumber(), s->getErrorString());
121       Thread::sleep(1000);
122   }
123    catch (...) {
124       app->ui()->log(SFINX_LOG_WARN, "Unknown exeption while talking to %s",
125         app->server_name.c_str());
126       app->sfinx.disconnect();
127       Thread::sleep(1000);
128   }
129  } // while(1)
130  return 0;
133 bool faraon_app::connect()
135  if (!server_name.size()) {
136    ui()->log(SFINX_LOG_FATAL, "Sfinx server name is not set !");
137    return 1;
139  ui()->log(SFINX_LOG_NOTICE, "Connecting to Sfinx server at %s", server_name.c_str());
140  // ask username/pass or select auth_type
141  if (!sfinx.connect(server_name)) {
142    char b[1024], b1[128];
143    sprintf(b, "Connected to server v%d.%d.%d, %lld crypt facilities [ ",
144      sfinx.daemon_version->get(0), sfinx.daemon_version->get(1),
145      sfinx.daemon_version->get(2), sfinx.packet_crypt_types->len());
146    for (u32_t i = 0; i < sfinx.packet_crypt_types->len(); i++) {
147      sprintf(b1, "%s%s", i ? ", " : "",
148        sfinx_cmd2str(sfinx.packet_crypt_types->get(i)));
149      strcat(b, b1);
150   }
151    sprintf(b1, " ], %lld auth level [ ", sfinx.min_auth_levels->len());
152    strcat(b, b1);
153    for (u32_t i = 0; i < sfinx.min_auth_levels->len(); i++) {
154      sprintf(b1, "%s%s", i ? ", " : "", sfinx_cmd2str(sfinx.min_auth_levels->get(i)));
155      strcat(b, b1);
156   }
157    strcat(b, " ]");
158    ui()->log(SFINX_LOG_NOTICE, b);
159    strcpy(b, "md5 server challenge [ ");
160    for (u32_t i = 0; i < sfinx.md5_challenge->len(); i++) {
161      sprintf(b1, "%02x", sfinx.md5_challenge->get(i));
162      strcat(b, b1);
163   }
164    strcat(b, " ]");
165    ui()->log(SFINX_LOG_NOTICE, b);
166    return 0;
168   return 1;
171 void faraon_app::read_preferences()
173   char buf[128];
174   Fl_Preferences conn_prefs(prefs, "Connection" );
175   conn_prefs.get("Sfinx Server Name", buf, "localhost", 100);
176   server_name = buf;
177   if (connected())
178     sfinx.send(SFINX_FILES_MODULE_CONF_REQUEST, (u8_t) 0);
181 void faraon_app::write_preferences()
183   Fl_Preferences conn_prefs(prefs, "Connection" );
184   conn_prefs.set("Sfinx Server Name", server_name.c_str());
185   conn_prefs.flush();
186   if (connected())
187     sfinx.send(files_module_conf);