3 * Copyright (C) 2007, Rus V. Brushkoff, All rights reserved.
16 #include <cc++/config.h>
17 #include <cc++/strchar.h>
18 #include <cc++/exception.h>
19 #include <cc++/thread.h>
20 #include <cc++/socket.h>
23 #ifdef CCXX_NAMESPACES
32 class app_specific_ui {
35 virtual ~app_specific_ui() { }
36 virtual void alert(bool fatal, const char *fmt, ...) = 0;
41 class batch_ui: public F_Batch_UI, public app_specific_ui {
43 batch_ui() : F_Batch_UI(/* 1 */) { }
47 void alert(bool fatal, const char *fmt, ...);
50 class sfinx_socket : public TCPSocket {
52 bool onAccept(const InetHostAddress &ia, tpport_t port) {
53 log("sfinx::accept", "Faraon connected from %s:%d",
54 ia.getHostname(), port);
58 sfinx_socket(InetAddress &ia) : TCPSocket(ia, SFINX_PORT,
59 SFINX_SERVER_BACKLOG, SFINX_MAX_PACKET_SIZE) { }
62 class faraon_session : public sfinx_stream, public TCPSession {
69 log("faraon_session", "Disconnected %s:%d", peer_name.c_str(), peer_port);
72 bool send_data(u8_t *b, u32_t size) {
73 return !(::send(so, (const char *)b, size, 0) == (s32_t)size);
75 bool read_data(u8_t *b, u32_t buf_size, u32_t timeout = 0) {
78 while (total_read != buf_size) {
79 nread = readData(b, buf_size, 0, timeout);
86 bool process_requests();
87 void get_slices(u32_t el_id, u32_t except = 0);
88 void get_slice(u32_t slice_id, u32_t el_id);
89 void update_slice(sfinx_slice_t *slice);
90 void new_slice(sfinx_slice_t *slice);
91 void relink_slice(sfinx_slice_t *slice);
92 void delete_slice_with_reattach(u32_t slice_id);
93 void delete_slice_assoc_data(u32_t slice_id, bool recursivly);
94 void delete_slice_mark_data_unsorted(u32_t slice_id, bool recursivly);
95 void delete_slice_recursivly(u32_t slice_id);
96 void module_conf_request(u32_t module_id);
97 void update_files_module_conf(sfinx_pair_vector_t *conf);
98 void send_dir(bool sorted, sfinx_file_t *f);
99 void send_file(sfinx_file_t *f);
100 void files_module_classify(sfinx_file_t *f);
101 void edit_file(sfinx_file_t *f);
102 bool gen_desc_file(u32_t slice_id);
103 void search_query(sfinx_search_query_t *);
104 void search_in_files(string &pattern, sfinx_pair_vector_t *r);
105 void mark_files_unsorted(u32_t slice_id, bool recursivly, bool remove = false);
106 void mark_file_unsorted(sfinx_file_t *f, bool remove = false);
107 bool get_file_by_id(sfinx_file_t *f);
112 faraon_session(TCPSocket &socket, int bufsize) :
113 sfinx_stream(), TCPSession(socket) {
115 peer_name = getPeer(&peer_port).getHostname();
117 packet_crypt_types->add(SFINX_PACKET_PLAIN);
118 packet_crypt_types->add(SFINX_PACKET_CRC32);
119 daemon_version->add(SFINX_VERSION_MAJOR);
120 daemon_version->add(SFINX_VERSION_MINOR);
121 daemon_version->add(SFINX_VERSION_PLEVEL);
122 min_auth_levels->add(SFINX_AUTH_USERPASS);
124 ~faraon_session() { }
127 class sfinx_app : public F_App {
129 string dbname_, dbuser_, dbpass_;
130 IBPP::Driver driver_;
134 sfinx_pair_vector_t files_module_conf;
135 sfinx_app(int argc, char **argv, const char *name = 0, const char *version = 0,
136 const char *author = 0, const char *license = 0, CommandOption *opts = 0) :
137 F_App(argc, argv, name, version, author, license, opts) {
138 driver_ = IBPP::DriverFactory();
145 app_specific_ui *ui() { return dynamic_cast<app_specific_ui *>(ui_); }
146 // void parse_command_options(void);
149 void load_module_conf(u32_t mid);
150 void get_sorted_path(u32_t slice_id, string *sorted_location);
151 bool make_sorted_path(u32_t slice_id);
152 u32_t parent_id(u32_t slice_id);
153 string slice_name(u32_t slice_id);
154 string slice_directory(u32_t slice_id);
156 friend class faraon_session;
160 extern sfinx_app *sfinx;