
at.yawk.dbus.protocol.DbusChannelImpl Maven / Gradle / Ivy
The newest version!
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package at.yawk.dbus.protocol;
import io.netty.channel.Channel;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicInteger;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* @author yawkat
*/
@Slf4j
@RequiredArgsConstructor
class DbusChannelImpl implements DbusChannel {
private final Channel channel;
private final SwappableMessageConsumer protocol;
private final AtomicInteger nextSerial = new AtomicInteger(1);
@Override
public int createSerial() {
int serial;
do {
serial = nextSerial.getAndIncrement();
} while (serial == 0);
return serial;
}
@Override
public void setMessageConsumer(MessageConsumer consumer) {
protocol.setConsumer(consumer);
}
@Override
public void write(DbusMessage message) {
if (message.getHeader().getSerial() == 0) {
message.getHeader().setSerial(createSerial());
}
channel.writeAndFlush(message, channel.voidPromise());
}
@Override
public void disconnect() {
channel.disconnect();
}
@Override
public void close() {
channel.close();
}
@Override
public CompletableFuture> closeStage() {
return nettyFutureToStage(channel.closeFuture());
}
private static CompletableFuture nettyFutureToStage(Future future) {
CompletableFuture stage = new CompletableFuture<>();
future.addListener(new GenericFutureListener>() {
@Override
public void operationComplete(Future future) throws Exception {
try {
stage.complete(future.get());
} catch (ExecutionException e) {
stage.completeExceptionally(e.getCause());
}
}
});
return stage;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy