-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloc_request_message.cc
117 lines (95 loc) · 3.54 KB
/
loc_request_message.cc
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
#include <cstring>
#include <vector>
#include <sys/socket.h>
#include "loc_request_message.h"
#include "constants.h"
#include "helper_functions.h"
using namespace std;
// See interface (header file).
LocRequestMessage::LocRequestMessage(string name, int* argTypes)
: Message(), name(name), argTypes(argTypes) {} // Constructor
// See interface (header file).
LocRequestMessage::~LocRequestMessage() {} // Destructor
// See interface (header file).
string LocRequestMessage::getName() const {
return name;
}
// See interface (header file).
int *LocRequestMessage::getArgTypes() const {
return argTypes;
}
// See interface (header file).
unsigned int LocRequestMessage::getLength() const {
unsigned int numOfArgTypes = countNumOfArgTypes(argTypes);
return MAX_LENGTH_NAME + (numOfArgTypes * MAX_LENGTH_ARG_TYPE);
}
// See interface (header file).
int LocRequestMessage::send(int dataTransferSocket) {
char messageBuffer[getLength()] = {'\0'};
char *messageBufferPointer = messageBuffer;
// Writes the remote procedure name to the buffer
memcpy(messageBufferPointer, name.c_str(), name.length());
messageBufferPointer += MAX_LENGTH_NAME;
// Writes the argument types to the buffer
unsigned int numOfArgTypes = countNumOfArgTypes(argTypes);
memcpy(messageBufferPointer, argTypes,
numOfArgTypes * MAX_LENGTH_ARG_TYPE);
// Writes the message from the buffer out to the data transfer socket
unsigned int totalNumOfBytesMessage = getLength();
unsigned int numOfBytesLeft = totalNumOfBytesMessage;
unsigned int totalNumOfBytesSent = 0;
while (totalNumOfBytesSent < totalNumOfBytesMessage) {
int numOfBytesSent =
::send(dataTransferSocket, messageBuffer + totalNumOfBytesSent,
numOfBytesLeft, 0);
if (numOfBytesSent < 0) {
return ERROR_CODE_SOCKET_SENDING_FAILED;
}
totalNumOfBytesSent += numOfBytesSent;
numOfBytesLeft += numOfBytesSent;
}
return SUCCESS_CODE;
}
// See interface (header file).
int LocRequestMessage::receive(int dataTransferSocket,
Message *&parsedMessage, unsigned int length) {
// Reads the message into a buffer from the data transfer socket
char messageBuffer[length];
unsigned int totalNumOfBytesMessage = length;
unsigned int numOfBytesLeft = totalNumOfBytesMessage;
unsigned int totalNumOfBytesReceived = 0;
while (totalNumOfBytesReceived < totalNumOfBytesMessage) {
int numOfBytesReceived =
::recv(dataTransferSocket, messageBuffer + totalNumOfBytesReceived,
numOfBytesLeft, 0);
if (numOfBytesReceived <= 0) {
return ERROR_CODE_SOCKET_RECEIVING_FAILED;
}
totalNumOfBytesReceived += numOfBytesReceived;
numOfBytesLeft -= numOfBytesReceived;
}
// Parses the remote procedure name from the buffer
char *messageBufferPointer = messageBuffer;
char nameBuffer[MAX_LENGTH_NAME + 1] = {'\0'};
memcpy(nameBuffer, messageBufferPointer, MAX_LENGTH_NAME);
string name(nameBuffer);
messageBufferPointer += MAX_LENGTH_NAME;
// Parses the argument types from the buffer
vector<int> argTypesBuffer;
while (true) {
char argTypeBuffer[MAX_LENGTH_ARG_TYPE] = {'\0'};
memcpy(argTypeBuffer, messageBufferPointer, MAX_LENGTH_ARG_TYPE);
int argType = toInt(argTypeBuffer);
argTypesBuffer.push_back(argType);
messageBufferPointer += MAX_LENGTH_ARG_TYPE;
if (argType == 0) {
break;
}
}
int *argTypes = new int[argTypesBuffer.size()];
for (unsigned int i = 0; i < argTypesBuffer.size(); i++) {
argTypes[i] = argTypesBuffer[i];
}
parsedMessage = new LocRequestMessage(name, argTypes);
return SUCCESS_CODE;
}