OSDN Git Service

チケット #35438 訳文を元に戻せない 対応完了♪
[wordring-tm/wordring-tm.git] / proxy / tmservice.h
1 #ifndef TMSERVICE_H
2 #define TMSERVICE_H
3
4 #include "language.h"
5 #include "tmtext.h"
6 #include "tmdatabase.h"
7 #include "tmsocket.h"
8
9 #include <QObject>
10 #include <QString>
11 #include <QByteArray>
12 #include <QJsonArray>
13 #include <QMap>
14 #include <QQueue>
15
16 #include <QIcon>
17
18 #include <QMutex>
19
20 QT_BEGIN_NAMESPACE
21 class QWebSocket;
22 QT_END_NAMESPACE
23
24 class Language;
25 class Settings;
26
27 namespace TM
28 {
29
30 class Service;
31
32 template <typename T>
33 class Dispatcher
34 {
35 public:
36         Dispatcher() : m_token_count(0) { }
37
38         int size() const { return m_map.size(); }
39
40         void clear() { m_map.clear(); }
41
42         int set(T p)
43         {
44                 int token = 0;
45                 if(m_tokens.isEmpty()) token = ++m_token_count;
46                 else token = m_tokens.dequeue();
47
48                 m_map.insert(token, p);
49                 return token;
50         }
51
52         T get(int token)
53         {
54                 T result;
55                 QMap<int, T>::iterator it = m_map.find(token);
56
57                 if(it != m_map.end())
58                 {
59                         result = it.value();
60                         m_tokens.append(it.key());
61                         m_map.erase(it);
62                 }
63                 return result;
64         }
65
66 private:
67         QMap<int, T> m_map;
68         QQueue<int> m_tokens;
69         int m_token_count;
70 };
71
72 class WordringConnection : public QObject
73 {
74         Q_OBJECT
75 public:
76         WordringConnection(Settings *settings, Service *service);
77
78         bool find_sentence(QString site_name, int scode, int tcode,
79                                                 QString ssentence, qint32 token);
80
81         bool insert_sentence(QString site_name, int scode, int tcode,
82                         QString ssentence, QString tsentence, QByteArray word_link);
83         bool remove_sentence(QString site_name, int scode, int tcode,
84                                                 QString ssentence);
85
86 public slots:
87         void onConnected();
88         void onDisconnected();
89         void onError(QAbstractSocket::SocketError e);
90
91         void onTextMessageReceived(QString const &message);
92         void onBinaryMessageReceived(QByteArray const &message);
93
94 private:
95         void open();
96         void send();
97
98         void sentence_found(QJsonObject json);
99         void sentence_not_found(QJsonObject json);
100
101 private:
102         Settings *m_settings;
103         Service *m_service;
104         QWebSocket *m_socket;
105
106         QQueue<QByteArray> m_requests;
107         int m_request_limit; /*!< 待機できるリクエストの制限値 */
108 };
109
110 class Service : public QObject
111 {
112         Q_OBJECT
113
114         struct dispatcher_data_type
115         {
116                 SocketConnection::pointer connection;
117                 int segment_id;
118                 int index;
119         };
120
121 public:
122         Service(Settings *settings, QObject *parent = 0);
123         ~Service();
124
125         // CRC32
126         void setup_crc_table();
127         quint32 crc32(QString const &string);
128         quint32 crc32(int code, QString const &string);
129
130         // 言語プラグイン
131         void load_languages(QString const &path);
132
133         Text::pointer divide_into_sentences(int code, QString string);
134         Text::pointer divide_into_words(int code, Text::pointer sentence);
135
136         // データベース
137         quint32 find_site_id(QString host_name);
138
139         void insert_sentence(int segment_id, int index,
140                                          QString site_name, int scode, int tcode,
141                                         TextSentence::pointer sentence, SocketConnection::pointer socket);
142         void remove_sentence(QString site_name, int scode, int tcode,
143                         TextSentence::pointer sentence);
144
145         void find_sentence(int segment_id, int index,
146                                                 QString site_name, int scode, int tcode,
147                                                 TextSentence::pointer sentence,
148                                                 SocketConnection::pointer socket);
149 private:
150         sentence_data_type::pointer stuff_sentence_data(int code, Text::pointer text);
151         sentence_data_type::pointer stuff_source_sentence_data(
152                         int code, Text::pointer text, quint32 crc, quint32 previous_crc,
153                         quint32 next_crc);
154 public:
155 signals:
156         /*!
157          * \brief 言語プラグインが読み込まれたときに発火するシグナルです。
158          * \param code 言語コードです。
159          * \param name 言語名です。
160          * \param icon 言語を表現するアイコンです。
161          */
162         void languageLoaded(int code, QString name, QIcon icon);
163
164 public slots:
165         // データベースから
166         void sentence_found(sentence_data_type::pointer result, qint32 token);
167         void sentence_not_found(QString site_name, qint32 scode, qint32 tcode,
168                                                         QString ssentence, qint32 token);
169         void sentence_inserted(quint32 source_id, quint32 target_id, qint32 token);
170
171 public:
172         // サーバから
173         void sentence_found(QString site, qint32 scode, qint32 tcode,
174                                         QString ssentence, QString tsentence, QByteArray json,
175                                         quint32 user_id, qint32 token);
176         void sentence_not_found(quint32 token);
177
178         void do_wordring_disconnected();
179
180 private:
181         Settings *m_settings;
182         quint32 m_crc_table[256];
183
184         QMap<int, Language*> m_languages;
185
186         QThread *m_database_thread;
187         Database *m_database;
188         Dispatcher<dispatcher_data_type> m_database_dispatcher;
189
190         WordringConnection *m_wordring;
191         Dispatcher<dispatcher_data_type> m_wordring_dispatcher;
192         int m_wordring_dispatcher_limit;
193 };
194
195 } // namespace TM
196
197 #endif // TMSERVICE_H