OSDN Git Service

8e657f29578d8630fe97e4610579d251540caa5e
[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 #include "tmtext.h"
7
8 #include <QObject>
9 #include <QPointer>
10
11 #include <QString>
12 #include <QList>
13 #include <QMap>
14 #include <QJsonArray>
15
16 #include <QThread>
17 #include <QMutex>
18
19 #include <QWebSocket>
20 #include <QWebSocketServer>
21
22 QT_BEGIN_NAMESPACE
23 //class QSettings;
24 QT_END_NAMESPACE
25
26 class Settings;
27
28 namespace TM
29 {
30
31 class Service;
32
33 class SocketConnection : public QObject
34 {
35         Q_OBJECT
36
37 public:
38         typedef QPointer<SocketConnection> pointer;
39         typedef QMap<int, TextSegment::pointer> segment_map_type;
40         typedef segment_map_type::iterator segment_map_iterator;
41
42 public:
43         SocketConnection(Settings *settings, Service *service, QWebSocket *socket);
44         virtual ~SocketConnection();
45
46         //
47         TextSegmentList::pointer segment_list();
48         void insert_sentence(QString sstring, QString tstring,
49                                                  quint32 previous_crc, quint32 next_crc,
50                                                  QByteArray json = QByteArray());
51
52         // ブラウザとの通信。
53         QWebSocket* socket();
54         void send_message(QString const &message);
55         void send_message(QJsonObject const &json);
56
57         void set_edit_mode(bool edit_mode);
58
59         void save_sentence(TextSentence::pointer sentence);
60         void remove_sentence(TextSentence::pointer sentence);
61
62         void sentence_found(sentence_data_type result,
63                                                 TextSentence::pointer sentence);
64         void sentence_inserted(TextSentence::pointer sentence);
65
66         QUrl url() const;
67
68 signals:
69
70 public slots:
71         void changeEditMode(bool edit_mode);
72         void changeLanguage();
73
74 private:
75         void set_segment(int segment_id, QString html);
76
77         void do_edit_segment(QJsonObject const &json);
78         void do_focus(QJsonObject const &json);
79         void do_blur(QJsonObject const &json);
80         void do_load(QJsonObject const &json);
81         void do_load_segment(QJsonObject const &json);
82
83         Text::pointer to_text(HtmlRange range) const;
84         TextSegment::pointer find_segment(int segment_id);
85         void insert_segment(int segment_id, TextSegment::pointer segment);
86
87 private slots:
88         void onTextMessageReceived(QString const &message);
89         void onBinaryMessageReceived(QByteArray const &message);
90
91 private:
92         Settings *m_settings;
93         Service *m_service;
94
95         TextSegmentList::pointer m_segments; // スレッドを渡るため、共有ポインタの必要がある。
96
97 };
98
99 class SocketServer : public QObject
100 {
101         Q_OBJECT
102 public:
103         SocketServer(Settings *settings, Service* service, QObject *parent);
104         ~SocketServer();
105
106         quint16 port() const;
107
108 signals:
109
110 public slots:
111         void abort();
112         void onNewConnection();
113         void onDisconnected();
114
115 private:
116         void attachConnections(QWebSocket* socket);
117         void detachConnections(QWebSocket* socket);
118 signals:
119
120 private:
121         Settings *m_settings;
122         Service *m_service;
123
124         QWebSocketServer *m_server;
125         QList<QWebSocket*> m_sockets;
126 };
127
128 Q_DECLARE_METATYPE(SocketConnection::pointer)
129
130 } // namespace TM
131
132 #endif // TMSOCKET_H