forked from treefrogframework/treefrog-framework
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtlogsender.cpp
127 lines (101 loc) · 2.7 KB
/
tlogsender.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* Copyright (c) 2010, AOYAMA Kazuharu
* All rights reserved.
*
* This software may be used and distributed according to the terms of
* the New BSD License, which is incorporated herein by reference.
*/
#include <QLocalSocket>
#include <QTimerEvent>
#include <TActionProcess>
#include "tlogsender.h"
const int QUEUE_MAX_SIZE = 1024 * 1024; // bytes
TLogSender::TLogSender(const QString &server)
: QObject(), serverName(server), socket(new QLocalSocket(this))
{
reopen();
}
TLogSender::~TLogSender()
{
socket->flush();
socket->close();
}
void TLogSender::reopen()
{
if (socket->state() != QLocalSocket::UnconnectedState) {
socket->abort();
}
socket->connectToServer(serverName, QIODevice::WriteOnly);
}
void TLogSender::writeLog(const QByteArray &log)
{
static bool forkFlag = false;
// fork check
if (forkFlag != TActionProcess::isChildProcess()) {
forkFlag = TActionProcess::isChildProcess();
reopen(); // re-connect
}
if (!queue.isEmpty()) {
queue += log;
sendFromQueue();
if (queue.length() > QUEUE_MAX_SIZE) {
fprintf(stderr, "queue overflow! len:%d [%s:%d]\n", queue.length(), __FILE__, __LINE__);
// Removes over logs
while (queue.length() > QUEUE_MAX_SIZE) {
int i = queue.indexOf('\n');
if (i >= 0) {
queue.remove(0, i + 1);
} else {
queue.clear();
}
}
}
if (socket->state() == QLocalSocket::UnconnectedState) {
reopen();
}
} else {
int len = send(log);
if (len < 0)
return;
if (len < log.length()) {
queue.append(log.data() + len, log.length() - len);
timer.start(1, this);
} else {
timer.stop();
}
}
}
bool TLogSender::waitForConnected(int msecs)
{
return socket->waitForConnected(msecs);
}
int TLogSender::send(const QByteArray &log) const
{
int len = 0;
if (!log.isEmpty() && socket->state() == QLocalSocket::ConnectedState) {
len = socket->write(log);
if (len < 0) {
fprintf(stderr, "log send failed [%s:%d]\n", __FILE__, __LINE__);
} else {
socket->flush();
}
}
return len;
}
void TLogSender::sendFromQueue()
{
int len = send(queue);
if (len > 0) {
queue.remove(0, len);
}
}
void TLogSender::timerEvent(QTimerEvent *event)
{
if (event->timerId() == timer.timerId()) {
sendFromQueue();
if (queue.isEmpty()) {
timer.stop();
}
} else {
QObject::timerEvent(event);
}
}