mirror of
https://github.com/qvacua/vimr.git
synced 2024-11-28 02:54:31 +03:00
Add error handling when NvimServer could not be started correctly
This commit is contained in:
parent
77847f70e9
commit
b84cfb1f3c
@ -30,6 +30,7 @@ int main(int argc, const char *argv[]) {
|
|||||||
"Started NvimServer '%s' and connected it with GUI '%s'.",
|
"Started NvimServer '%s' and connected it with GUI '%s'.",
|
||||||
local_port_name, remote_port_name
|
local_port_name, remote_port_name
|
||||||
);
|
);
|
||||||
|
|
||||||
CFRunLoopRun();
|
CFRunLoopRun();
|
||||||
os_log_debug(logger, "NvimServer exiting.");
|
os_log_debug(logger, "NvimServer exiting.");
|
||||||
|
|
||||||
|
@ -84,6 +84,12 @@ static void do_autocmd_guienter(void **argv);
|
|||||||
// We declare nvim_main because it's not declared in any header files of neovim
|
// We declare nvim_main because it's not declared in any header files of neovim
|
||||||
extern int nvim_main(int argc, const char **argv);
|
extern int nvim_main(int argc, const char **argv);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
void debug_function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void server_set_nvim_args(int argc, const char **const argv) {
|
void server_set_nvim_args(int argc, const char **const argv) {
|
||||||
nvim_argc = argc + 1;
|
nvim_argc = argc + 1;
|
||||||
@ -108,6 +114,14 @@ void server_init_local_port(const char *name) {
|
|||||||
);
|
);
|
||||||
CFRelease(name_cf);
|
CFRelease(name_cf);
|
||||||
|
|
||||||
|
if (local_port == NULL) {
|
||||||
|
send_msg_packing(NvimServerMsgIdFatalError, ^(msgpack_packer *packer) {
|
||||||
|
msgpack_pack_int64(packer, NvimServerFatalErrorCodeLocalPort);
|
||||||
|
});
|
||||||
|
|
||||||
|
exit(NvimServerFatalErrorCodeLocalPort);
|
||||||
|
}
|
||||||
|
|
||||||
cond_var_t cond_var;
|
cond_var_t cond_var;
|
||||||
cond_var_init(&cond_var, 5, false);
|
cond_var_init(&cond_var, 5, false);
|
||||||
|
|
||||||
@ -136,6 +150,14 @@ void server_init_remote_port(const char *name) {
|
|||||||
);
|
);
|
||||||
remote_port = CFMessagePortCreateRemote(kCFAllocatorDefault, name_cf);
|
remote_port = CFMessagePortCreateRemote(kCFAllocatorDefault, name_cf);
|
||||||
CFRelease(name_cf);
|
CFRelease(name_cf);
|
||||||
|
|
||||||
|
if (remote_port == NULL) {
|
||||||
|
send_msg_packing(NvimServerMsgIdFatalError, ^(msgpack_packer *packer) {
|
||||||
|
msgpack_pack_int64(packer, NvimServerFatalErrorCodeRemotePort);
|
||||||
|
});
|
||||||
|
|
||||||
|
exit(NvimServerFatalErrorCodeRemotePort);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void server_destroy_remote_port() {
|
void server_destroy_remote_port() {
|
||||||
|
@ -24,4 +24,8 @@ void send_msg_packing(NvimServerMsgId msgid, pack_block body);
|
|||||||
void msgpack_pack_bool(msgpack_packer *packer, bool value);
|
void msgpack_pack_bool(msgpack_packer *packer, bool value);
|
||||||
void msgpack_pack_cstr(msgpack_packer *packer, const char *cstr);
|
void msgpack_pack_cstr(msgpack_packer *packer, const char *cstr);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
void debug_function(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // NVIMSERVER_SERVER_H
|
#endif // NVIMSERVER_SERVER_H
|
||||||
|
@ -46,9 +46,16 @@ typedef CF_ENUM(NSInteger, NvimServerMsgId) {
|
|||||||
NvimServerMsgIdAutoCommandEvent,
|
NvimServerMsgIdAutoCommandEvent,
|
||||||
NvimServerMsgIdRpcEventSubscribed,
|
NvimServerMsgIdRpcEventSubscribed,
|
||||||
|
|
||||||
|
NvimServerMsgIdFatalError,
|
||||||
|
|
||||||
NvimServerMsgIdDebug1,
|
NvimServerMsgIdDebug1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef CF_ENUM(NSInteger, NvimServerFatalErrorCode) {
|
||||||
|
NvimServerFatalErrorCodeLocalPort = 1,
|
||||||
|
NvimServerFatalErrorCodeRemotePort,
|
||||||
|
};
|
||||||
|
|
||||||
typedef CF_ENUM(NSInteger, NvimBridgeMsgId) {
|
typedef CF_ENUM(NSInteger, NvimBridgeMsgId) {
|
||||||
NvimBridgeMsgIdAgentReady = 0,
|
NvimBridgeMsgIdAgentReady = 0,
|
||||||
NvimBridgeMsgIdReadyForRpcEvents,
|
NvimBridgeMsgIdReadyForRpcEvents,
|
||||||
|
@ -431,6 +431,41 @@ extension NvimView {
|
|||||||
self.eventsSubject.onNext(.rpcEventSubscribed)
|
self.eventsSubject.onNext(.rpcEventSubscribed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final func bridgeHasFatalError(_ value: MessagePackValue?) {
|
||||||
|
gui.async {
|
||||||
|
let alert = NSAlert()
|
||||||
|
alert.addButton(withTitle: "OK")
|
||||||
|
alert.messageText = "Error launching background neovim process"
|
||||||
|
alert.alertStyle = .critical
|
||||||
|
|
||||||
|
if let rawCode = value?.intValue,
|
||||||
|
let code = NvimServerFatalErrorCode(rawValue: rawCode) {
|
||||||
|
|
||||||
|
switch code {
|
||||||
|
|
||||||
|
case .localPort:
|
||||||
|
alert.informativeText = "GUI could not connect to the background " +
|
||||||
|
"neovim process. The window will close."
|
||||||
|
|
||||||
|
case .remotePort:
|
||||||
|
alert.informativeText = "The remote message port could not " +
|
||||||
|
"connect to GUI. The window will close."
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
alert.informativeText = "There was an unknown error launching the " +
|
||||||
|
"background neovim Process. " +
|
||||||
|
"The window will close."
|
||||||
|
}
|
||||||
|
|
||||||
|
alert.runModal()
|
||||||
|
self.queue.async {
|
||||||
|
self.eventsSubject.onNext(.neoVimStopped)
|
||||||
|
self.eventsSubject.onCompleted()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final func setAttr(with value: MessagePackValue) {
|
final func setAttr(with value: MessagePackValue) {
|
||||||
guard let array = value.arrayValue else {
|
guard let array = value.arrayValue else {
|
||||||
self.bridgeLogger.error("Could not convert \(value)")
|
self.bridgeLogger.error("Could not convert \(value)")
|
||||||
|
@ -311,6 +311,8 @@ public class NvimView: NSView,
|
|||||||
case .rpcEventSubscribed:
|
case .rpcEventSubscribed:
|
||||||
self?.rpcEventSubscribed()
|
self?.rpcEventSubscribed()
|
||||||
|
|
||||||
|
case let .fatalError(value):
|
||||||
|
self?.bridgeHasFatalError(value)
|
||||||
|
|
||||||
case .debug1:
|
case .debug1:
|
||||||
self?.debug1(nil)
|
self?.debug1(nil)
|
||||||
|
@ -46,9 +46,16 @@ typedef CF_ENUM(NSInteger, NvimServerMsgId) {
|
|||||||
NvimServerMsgIdAutoCommandEvent,
|
NvimServerMsgIdAutoCommandEvent,
|
||||||
NvimServerMsgIdRpcEventSubscribed,
|
NvimServerMsgIdRpcEventSubscribed,
|
||||||
|
|
||||||
|
NvimServerMsgIdFatalError,
|
||||||
|
|
||||||
NvimServerMsgIdDebug1,
|
NvimServerMsgIdDebug1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef CF_ENUM(NSInteger, NvimServerFatalErrorCode) {
|
||||||
|
NvimServerFatalErrorCodeLocalPort = 1,
|
||||||
|
NvimServerFatalErrorCodeRemotePort,
|
||||||
|
};
|
||||||
|
|
||||||
typedef CF_ENUM(NSInteger, NvimBridgeMsgId) {
|
typedef CF_ENUM(NSInteger, NvimBridgeMsgId) {
|
||||||
NvimBridgeMsgIdAgentReady = 0,
|
NvimBridgeMsgIdAgentReady = 0,
|
||||||
NvimBridgeMsgIdReadyForRpcEvents,
|
NvimBridgeMsgIdReadyForRpcEvents,
|
||||||
|
@ -37,6 +37,7 @@ class UiBridge {
|
|||||||
case autoCommandEvent(MessagePackValue)
|
case autoCommandEvent(MessagePackValue)
|
||||||
case highlightAttrs(MessagePackValue)
|
case highlightAttrs(MessagePackValue)
|
||||||
case rpcEventSubscribed
|
case rpcEventSubscribed
|
||||||
|
case fatalError(MessagePackValue?)
|
||||||
case debug1
|
case debug1
|
||||||
case unknown
|
case unknown
|
||||||
}
|
}
|
||||||
@ -255,6 +256,9 @@ class UiBridge {
|
|||||||
case .rpcEventSubscribed:
|
case .rpcEventSubscribed:
|
||||||
self.streamSubject.onNext(.rpcEventSubscribed)
|
self.streamSubject.onNext(.rpcEventSubscribed)
|
||||||
|
|
||||||
|
case .fatalError:
|
||||||
|
self.streamSubject.onNext(.fatalError(MessagePackUtils.value(from: data)))
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user