Search can open File URL's in mozilla/djview/xpdf/xchm
[sfinx.git] / faraon / faraon.C
blob22782690ed0c07695a6c41d3782199c49b934bd3
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_UNSORT_REPLY:
22      case SFINX_NOTES_MODULE_UNLINK_REPLY:
23      case SFINX_FILES_MODULE_SORTED_UNLINK_REPLY:
24      case SFINX_FILES_MODULE_UNSORT_REPLY:
25        break;
26      case SFINX_NOTES_MODULE_EDIT_REPLY:
27        ui()->notes_module_reply((sfinx_string_t *)el);
28        break;
29      case SFINX_NOTES_MODULE_EDIT_REQUEST:
30        ui()->notes_module_edit((sfinx_note_t *)el);
31        break;
32      case SFINX_ELEMENT_SEARCH_RESULT:
33        ui()->search_browser((sfinx_pair_vector_t *)el);
34        break;
35      case SFINX_FILES_MODULE_EDIT_REQUEST:
36        ui()->files_module_edit((sfinx_file_t *)el);
37        break;
38      case SFINX_ALERT:
39        ui()->alert((sfinx_string_t *)el);
40        break;
41      case SFINX_NOTES_MODULE_ADD_REPLY:
42        ui()->notes_module_reply((sfinx_string_t *)el);
43        break;
44      case SFINX_FILES_MODULE_EDIT_REPLY:
45      case SFINX_FILES_MODULE_CLASSIFY_REPLY:
46        ui()->files_module_edit_reply((sfinx_string_t *)el);
47        break;
48      case SFINX_ELEMENT_PROGRESS:
49        ui()->progress((sfinx_progress_t *)el);
50        break;
51 //     case SFINX_FILES_MODULE_SORTED_TREE:
52      case SFINX_FILES_MODULE_UNSORTED_TREE:
53        ui()->fill_unsorted_files_tree((sfinx_files_vector_t *)el);
54        break;
55      case SFINX_FILES_MODULE_CONF:
56        files_module_conf.copy(el);
57        ui()->fill_preferences();
58        break;
59      case SFINX_EDIT_SLICE:
60        ui()->edit_slice((sfinx_slice_t *)el);
61        break;
62      case SFINX_OBJECTS_TREE:
63        slices.copy((sfinx_slice_vector_t *)el);
64        slices_need_update = false;
65        ui()->fill_objects_tree();
66        break;
67      default:
68        log("sfinx:process", "Unknown element id - %s", sfinx_cmd2str(el->tid()));
69        break;
70    }
71  }
72   return false;
75 // main loop
76 void faraon_app::main()
78  sfinx.send(SFINX_FILES_MODULE_CONF_REQUEST, (u8_t) 0);
79  // after connecting get all objects info
80  refresh_slices(1);
81  while(1) {
82   if (sfinx.pending()) {
83     if (process_requests()) {
84       log("faraon:main", "Bad sfinx message");
85       sfinx.disconnect();
86       break;
87    }
88  }
89   idle();
90  } 
93 CommandOption *faraon_opt_list = 0;
95 CommandOptionArg server_opt("sfinx", "s", "\tSfinx Server", false,
96   &faraon_opt_list);
98 int main(int argc, char **argv)
100  setlocale(LC_ALL, "");
101  char version[16];
102  sprintf(version, "v%0d.%0d.%0d", SFINX_VERSION_MAJOR, SFINX_VERSION_MINOR, SFINX_VERSION_PLEVEL);
103  app = new faraon_app(argc, argv, "faraon", version,
104    "Rus V. Brushkoff <Rus@Sfinx.Od.UA>", "GPL", faraon_opt_list);
105  app->start_ui(); // start ui
106  app->read_preferences();
107  while(1) {
108    try {
109      if (!app->connected()) {
110        if (app->connect())
111          Thread::sleep(1000);
112      } else
113          app->main();
114   }
115    catch (SockException *s) {
116       app->ui()->log(SFINX_LOG_FATAL, "Socket exception to %s",
117         app->server_name.c_str());
118       app->sfinx.disconnect();
119       Thread::sleep(1000);
120   }
121     catch (Socket *s) {
122       app->ui()->log(SFINX_LOG_FATAL, "Error connecting to %s: (%d) \'%s\'",
123         app->server_name.c_str(), s->getErrorNumber(), s->getErrorString());
124       Thread::sleep(1000);
125   }
126    catch (...) {
127       app->ui()->log(SFINX_LOG_WARN, "Unknown exeption while talking to %s",
128         app->server_name.c_str());
129       app->sfinx.disconnect();
130       Thread::sleep(1000);
131   }
132  } // while(1)
133  return 0;
136 bool faraon_app::connect()
138  if (!server_name.size()) {
139    ui()->log(SFINX_LOG_FATAL, "Sfinx server name is not set !");
140    return 1;
142  ui()->log(SFINX_LOG_NOTICE, "Connecting to Sfinx server at %s", server_name.c_str());
143  // ask username/pass or select auth_type
144  if (!sfinx.connect(server_name)) {
145    char b[1024], b1[128];
146    sprintf(b, "Connected to server v%d.%d.%d, %lld crypt facilities [ ",
147      sfinx.daemon_version->get(0), sfinx.daemon_version->get(1),
148      sfinx.daemon_version->get(2), sfinx.packet_crypt_types->len());
149    for (u32_t i = 0; i < sfinx.packet_crypt_types->len(); i++) {
150      sprintf(b1, "%s%s", i ? ", " : "",
151        sfinx_cmd2str(sfinx.packet_crypt_types->get(i)));
152      strcat(b, b1);
153   }
154    sprintf(b1, " ], %lld auth level [ ", sfinx.min_auth_levels->len());
155    strcat(b, b1);
156    for (u32_t i = 0; i < sfinx.min_auth_levels->len(); i++) {
157      sprintf(b1, "%s%s", i ? ", " : "", sfinx_cmd2str(sfinx.min_auth_levels->get(i)));
158      strcat(b, b1);
159   }
160    strcat(b, " ]");
161    ui()->log(SFINX_LOG_NOTICE, b);
162    strcpy(b, "md5 server challenge [ ");
163    for (u32_t i = 0; i < sfinx.md5_challenge->len(); i++) {
164      sprintf(b1, "%02x", sfinx.md5_challenge->get(i));
165      strcat(b, b1);
166   }
167    strcat(b, " ]");
168    ui()->log(SFINX_LOG_NOTICE, b);
169    return 0;
171   return 1;
174 void faraon_app::read_preferences()
176   char buf[128];
177   Fl_Preferences conn_prefs(prefs, "Connection" );
178   if (server_opt.numValue)
179     server_name = server_opt.values[0];
180   else {
181     conn_prefs.get("Sfinx Server Name", buf, "localhost", 100);
182     server_name = buf;
184   if (connected())
185     sfinx.send(SFINX_FILES_MODULE_CONF_REQUEST, (u8_t) 0);
188 void faraon_app::write_preferences()
190   Fl_Preferences conn_prefs(prefs, "Connection" );
191   conn_prefs.set("Sfinx Server Name", server_name.c_str());
192   conn_prefs.flush();
193   if (connected())
194     sfinx.send(files_module_conf);
197 // move to libsfinx
198 string time2str(sfinx_timestamp_t &t)
200  char buf[64];
201  int year, month, day, hour, min, sec;
202  t.GetDate(year, month, day);
203  t.GetTime(hour, min, sec);
204  sprintf(buf, "%02d/%02d/%04d %02d:%02d:%02d\n", day, month, year, hour, min, sec);
205  return string(buf);
208 void faraon_app::prepare_search_info(sfinx_t *el, string &inf)
210  sfinx_file_t *f;
211  sfinx_slice_t *s;
212  sfinx_note_t *n;
213  string dir;
214  files_module_conf.get(FILES_MODULE_SORTED_TREE_PATH, dir);
215  switch (el->tid()) {
216    case SFINX_ELEMENT_SLICE:
217      s = (sfinx_slice_t *)el;
218      inf = "\nType: Slice\n";
219      inf.append("Name: " + s->name_ + "\n");
220      inf.append("Description: " + s->description_ + "\n");
221      inf.append("Create Entry Time: " + time2str(s->ctime));
222      inf.append("Edit Entry Time: " + time2str(s->etime));
223      inf.append("\n");
224      break;
225    case SFINX_ELEMENT_NOTE:
226      n = (sfinx_note_t *)el;
227      inf = "\nType: Note\n";
228      inf.append("Name: " + n->name + "\n");
229      inf.append("URL: " + n->url + "\n");
230      inf.append("Text: " + n->text + "\n");
231      inf.append("Create Entry Time: " + time2str(n->ctime));
232      inf.append("Edit Entry Time: " + time2str(n->etime));
233      inf.append("\n");
234      break;
235    case SFINX_ELEMENT_FILE:
236      f = (sfinx_file_t *)el;
237      inf = "\nType: File\n";
238      inf.append("Title: " + f->title + "\n");
239      inf.append("URL: " + dir + slice_hierarchy_path(f->mtag.slice_id) + "/" + f->name + "\n");
240      inf.append("Slice Hierarchy: " + app->slice_hierarchy(f->mtag.slice_id) + "\n");
241      if (f->tags.size()) {
242        inf.append("Additional Tags : ");
243        for (u32_t i = 0; i < f->tags.size(); i++) {
244          if (i)
245            inf.append(", ");
246          inf.append(f->tags[i].name + " [ " + f->tags[i].description + " ]");
247        }
248         inf.append("\n");
249     }
250      inf.append("Authority: " + f->authority + "\n");
251      inf.append("Description: " + f->description + "\n");
252      inf.append("Comments: " + f->comments + "\n");
253      char buf[64];
254      sprintf(buf, "%llu bytes\n", f->fsize);
255      inf.append("Size: ");
256      inf.append(buf);
257      if (f->csum.size())
258              inf.append("Csum: " + f->csum + "\n");
259      if (f->compressed_csum.size()) {
260      inf.append("Compressed Size: ");
261      sprintf(buf, "%llu bytes\n", f->compressed_fsize);
262      inf.append(buf);
263            inf.append("Compressed Csum: " + f->compressed_csum + "\n");
264           }
265      inf.append("Create Entry Time: " + time2str(f->ctime));
266      inf.append("Edit Entry Time: " + time2str(f->etime));
267            inf.append("\n");
268      break;
269    default:
270      debug("Can't fill element info !");
271      bug();
272   }