OSDN Git Service

Editorのデータ構造変更前、一時保存。
[wordring-tm/wordring-tm.git] / proxy / tmsocket.h
1 #ifndef TMSOCKET_H
2 #define TMSOCKET_H
3
4 #include "html.h"
5 #include "text.h"
6
7 #include <QObject>
8
9 #include <QString>
10 #include <QList>
11 #include <QMap>
12 #include <QJsonArray>
13
14 #include <QThread>
15 #include <QMutex>
16
17 #include <QWebSocket>
18 #include <QWebSocketServer>
19
20 QT_BEGIN_NAMESPACE
21 //class QSettings;
22 QT_END_NAMESPACE
23
24 class Settings;
25
26 namespace TM
27 {
28
29 class Service;
30 class EditorWidget;
31
32 class HtmlData : public RangeData
33 {
34 public:
35         typedef std::shared_ptr<HtmlData> pointer;
36
37         enum : int { Type = UserData::User + 1, };
38
39 private:
40         HtmlData(HtmlNode node_, int begin_, int tail_);
41
42 public:
43         int type() const;
44
45         static pointer create(HtmlNode node_, int begin_, int tail_);
46
47 private:
48         HtmlNode m_node;
49 };
50
51 /*!
52  * \brief HtmlRangeから構造化テキストに変換するためのクラスです。
53  */
54 class TextConverter
55 {
56 public:
57         Text::pointer to_text(HtmlRange range);
58         Text::pointer stuff_text(Text::pointer parent, QString const &string);
59
60         bool is_ignorable_white_space(QChar const &ch);
61
62         static bool is_white_space(QChar const &ch);
63
64 private:
65         int m_state;
66 };
67
68 class TextSentence
69 {
70 public:
71         typedef std::shared_ptr<TextSentence> pointer;
72
73 private:
74         TextSentence(Text::pointer source_sentence);
75 public:
76         Text::pointer source_sentence();
77         Text::pointer target_sentence();
78         void set_terget_sentence(Text::pointer target_sentence);
79
80         QJsonArray link_data();
81         void set_link_data(QJsonArray json);
82
83         static pointer create(Text::pointer source_sentence);
84
85         QString debug_dump();
86
87 private:
88         Text::pointer m_source_sentence;
89         Text::pointer m_target_sentence;
90         QJsonArray m_link_data;
91 };
92
93 class TextSegment
94 {
95 public:
96         typedef std::shared_ptr<TextSegment> pointer;
97         typedef QList<TextSentence::pointer> storage_type;
98         typedef storage_type::iterator iterator;
99
100 private:
101         TextSegment(Service *service, int scode, int segment_id, QString source);
102 public:
103
104         int segment_id() const;
105
106         TextSentence::pointer at(int index);
107         iterator begin();
108         iterator end();
109
110         static pointer create(
111                         Service *service, int scode, int segment_id, QString source);
112
113 private:
114         int m_segment_id; /*!< data-wordring-segmentの値によるセグメントのID。 */
115         HtmlDocument m_document; /*!< セグメントのHtmlDocument。 */
116         Text::pointer m_text; /*!< セグメントのHtmlData付テキスト。 */
117
118         storage_type m_sentences; /*!< 編集用センテンスのリスト。 */
119 };
120
121 class SocketConnection : public QObject
122 {
123         Q_OBJECT
124
125 public:
126         typedef QMap<int, TextSegment::pointer> segment_map_type;
127         typedef segment_map_type::iterator segment_map_iterator;
128
129 public:
130         SocketConnection(Settings *settings, Service *service,
131                                         EditorWidget *editor_widget, QWebSocket *socket);
132         virtual ~SocketConnection();
133
134         QWebSocket* socket();
135         void send_message(QString const &message);
136         void send_message(QJsonObject const &json);
137
138         void set_edit_mode(bool edit_mode);
139
140         void save_sentence(int segment_id, int index,
141                                                 Text::pointer target_sentence, QJsonArray link);
142
143 signals:
144         void editCmd(int id, QString html);
145
146 public slots:
147         void changeEditMode(bool edit_mode);
148
149 private:
150         void do_edit(QJsonObject const &json);
151         void do_focus(QJsonObject const &json);
152         void do_blur(QJsonObject const &json);
153         void do_load(QJsonObject const &json);
154
155         Text::pointer to_text(HtmlRange range) const;
156         TextSegment::pointer find_segment(int segment_id);
157         void insert_segment(int segment_id, TextSegment::pointer segment);
158
159 private slots:
160         void onTextMessageReceived(QString const &message);
161         void onBinaryMessageReceived(QByteArray const &message);
162
163 private:
164         Settings *m_settings;
165         Service *m_service;
166
167         QMutex m_mutex;
168
169         bool m_edit_mode;
170         int m_source_language;
171         int m_target_language;
172
173         EditorWidget *m_editor_widget;
174
175         QMap<int, TextSegment::pointer> m_segments;
176         TextSegment::pointer m_current_segment;
177 };
178
179 class SocketServer : public QObject
180 {
181         Q_OBJECT
182 public:
183         SocketServer(Settings *settings, Service* service,
184                                 EditorWidget *editor_widget, QObject *parent);
185         ~SocketServer();
186
187         quint16 port() const;
188
189 signals:
190
191 public slots:
192         void abort();
193         void onNewConnection();
194         void onDisconnected();
195
196 private:
197         void attachConnections(QWebSocket* socket);
198         void detachConnections(QWebSocket* socket);
199 signals:
200
201 private:
202         Settings *m_settings;
203         Service *m_service;
204
205         QWebSocketServer *m_server;
206         QList<QWebSocket*> m_sockets;
207
208         EditorWidget *m_editor_widget;
209 };
210
211 } // namespace TM
212
213 #endif // TMSOCKET_H