1
#include "clindexerprotocol.h"
6
clIndexerProtocol::clIndexerProtocol()
10
clIndexerProtocol::~clIndexerProtocol()
14
bool clIndexerProtocol::ReadReply(clNamedPipe* conn, clIndexerReply& reply)
16
std::auto_ptr<char> sp;
18
// first we read sizeof(size_t) to get the actual data size
20
size_t actual_read(0);
22
if ( !conn->read((void*)&buff_len, sizeof(buff_len), &actual_read, 10000) ) {
23
fprintf(stderr, "ERROR: ReadReply: Failed to read from the pipe, reason: %d\n", conn->getLastError());
27
if (actual_read != sizeof(buff_len)) {
28
fprintf(stderr, "ERROR: ReadReply: Protocol error: expected %d bytes, got %d. reason: %d\n",
31
conn->getLastError());
35
char *data = new char[buff_len];
38
int bytes_left(buff_len);
40
while (bytes_left > 0) {
41
if ( !conn->read(data+bytes_read, bytes_left, &actual_read, 10000) ) {
42
fprintf(stderr, "ERROR: Protocol error: expected %d bytes, got %d\n", buff_len, actual_read);
45
bytes_left -= actual_read;
46
bytes_read += actual_read;
49
reply.fromBinary(data);
52
// // send confirmation to the to server that we got data
53
// // and it can close the connection
54
// size_t ack(ACK_MAGIC);
55
// conn->write(&ack, sizeof(ack), &actual_read, -1);
60
bool clIndexerProtocol::ReadRequest(clNamedPipe* conn, clIndexerRequest& req)
62
std::auto_ptr<char> sp;
64
// first we read sizeof(size_t) to get the actual data size
66
size_t actual_read(0);
68
if ( !conn->read((void*)&buff_len, sizeof(buff_len), &actual_read, -1) ) {
69
fprintf(stderr, "ERROR: Failed to read from the pipe, reason: %d\n", conn->getLastError());
73
if (actual_read != sizeof(buff_len)) {
74
fprintf(stderr, "ERROR: Protocol error: expected %d bytes, got %d\n", sizeof(buff_len), actual_read);
78
char *data = new char[buff_len];
81
int bytes_left(buff_len);
83
while (bytes_left > 0) {
84
if ( !conn->read(data+bytes_read, bytes_left, &actual_read, -1) ) {
85
fprintf(stderr, "ERROR: [%s] Protocol error: expected %d bytes, got %d\n", __PRETTY_FUNCTION__, buff_len, actual_read);
88
bytes_left -= actual_read;
89
bytes_read += actual_read;
96
bool clIndexerProtocol::SendReply(clNamedPipe* conn, clIndexerReply& reply)
99
char *data = reply.toBinary(buff_size);
100
std::auto_ptr<char> sp(data);
102
// send the reply size
104
conn->write((void*)&buff_size, sizeof(buff_size), &written, -1);
107
int bytes_left(buff_size);
108
int bytes_to_write(0);
109
int bytes_written(0);
111
while (bytes_left > 0) {
112
// we write in chunks of 3000 bytes
113
if (bytes_left < 3000) {
114
bytes_to_write = bytes_left;
116
bytes_to_write = 3000;
119
size_t actual_written(0);
120
if ( !conn->write(data+bytes_written, bytes_to_write, &actual_written, -1) ) {
124
bytes_left -= actual_written;
125
bytes_written += actual_written;
128
// // to make sure that the message has been sent, we wait for the acknoldegment from the client
131
// conn->read(&ack, sizeof(ack), &rr, -1);
132
// if (ack == ACK_MAGIC) {
134
// printf("INFO: Got ACK!\n");
137
// printf("ERROR: Did not got the ack!\n");
141
// the above problem does not exist under Windows' NamedPipes
146
bool clIndexerProtocol::SendRequest(clNamedPipe* conn, clIndexerRequest& req)
151
char *data = req.toBinary(size);
152
std::auto_ptr<char> sp(data);
155
if (!conn->write((void*)&size, sizeof(size), &written, -1)) {
156
printf("ERROR: [%s] protocol error: rc %d\n", __PRETTY_FUNCTION__, conn->getLastError());
160
int bytes_left(size);
161
int bytes_to_write(0);
162
int bytes_written(0);
164
while (bytes_left > 0) {
165
// we write in chunks of 3000 bytes
166
if (bytes_left < 3000) {
167
bytes_to_write = bytes_left;
169
bytes_to_write = 3000;
172
size_t actual_written(0);
173
if ( !conn->write(data+bytes_written, bytes_to_write, &actual_written, -1) ) {
177
bytes_left -= actual_written;
178
bytes_written += actual_written;