forked from gnachman/iTerm2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiTermClientServerProtocolMessageBox.m
53 lines (46 loc) · 1.85 KB
/
iTermClientServerProtocolMessageBox.m
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
//
// iTermClientServerProtocolMessageBox.m
// iTerm2SharedARC
//
// Created by George Nachman on 4/16/20.
//
#import "iTermClientServerProtocolMessageBox.h"
#import "iTermClientServerProtocol.h"
#include <sys/un.h>
@implementation iTermClientServerProtocolMessageBox {
iTermClientServerProtocolMessage _protocolMessage;
BOOL _haveDecodedMessage;
iTermMultiServerServerOriginatedMessage _decodedMessage;
}
+ (instancetype)withMessage:(iTermMultiServerMessage *)message {
iTermClientServerProtocolMessageBox *box = [[iTermClientServerProtocolMessageBox alloc] init];
iTermClientServerProtocolMessageInitialize(&box->_protocolMessage);
if (message.fileDescriptor) {
box->_protocolMessage.controlBuffer.cm.cmsg_len = CMSG_LEN(sizeof(int));
box->_protocolMessage.controlBuffer.cm.cmsg_level = SOL_SOCKET;
box->_protocolMessage.controlBuffer.cm.cmsg_type = SCM_RIGHTS;
*((int *)CMSG_DATA(&box->_protocolMessage.controlBuffer.cm)) = message.fileDescriptor.intValue;
}
iTermClientServerProtocolMessageEnsureSpace(&box->_protocolMessage, message.data.length);
memmove(box->_protocolMessage.message.msg_iov[0].iov_base, message.data.bytes, message.data.length);
box->_message = message;
return box;
}
- (iTermMultiServerServerOriginatedMessage *)decoded {
if (_haveDecodedMessage) {
return &_decodedMessage;
}
const int status = iTermMultiServerProtocolParseMessageFromServer(&_protocolMessage, &_decodedMessage);
if (status) {
DLog(@"Failed to decode message from server with status %d", status);
return nil;
}
_haveDecodedMessage = YES;
DLog(@"Decoded message from server:");
iTermMultiServerProtocolLogMessageFromServer(&_decodedMessage);
return &_decodedMessage;
}
- (void)dealloc {
iTermClientServerProtocolMessageFree(&_protocolMessage);
}
@end