/* * Copyright (C) 2015 - EfficiOS Inc., Alexandre Montplaisir * Copyright (C) 2013 - David Goulet * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License, version 2.1 only, * as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package org.lttng.ust.agent.client; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Collection; /** * Session daemon command asking the Java agent to list its registered loggers, * which corresponds to event names in the tracing session. * * @author Alexandre Montplaisir * @author David Goulet */ class SessiondListLoggersCommand extends SessiondCommand { @Override public LttngAgentResponse execute(ILttngTcpClientListener agent) { final Collection loggerList = agent.listAvailableEvents(); return new SessiondListLoggersResponse(loggerList); } private static class SessiondListLoggersResponse extends LttngAgentResponse { private final static int SIZE = 12; private final Collection loggers; public SessiondListLoggersResponse(Collection loggers) { this.loggers = loggers; } @Override public ReturnCode getReturnCode() { /* This command can't really fail */ return ReturnCode.CODE_SUCCESS_CMD; } @Override public byte[] getBytes() { /* * Compute the data size, which is the number of bytes of each * encoded string, +1 per string for the \0 */ int dataSize = 0; for (String logger : loggers) { dataSize += logger.getBytes(SESSIOND_PROTOCOL_CHARSET).length + 1; } /* Prepare the buffer */ byte data[] = new byte[SIZE + dataSize]; ByteBuffer buf = ByteBuffer.wrap(data); buf.order(ByteOrder.BIG_ENDIAN); /* Write the header section of the response */ buf.putInt(getReturnCode().getCode()); buf.putInt(dataSize); buf.putInt(loggers.size()); /* Write the payload */ for (String logger : loggers) { buf.put(logger.getBytes(SESSIOND_PROTOCOL_CHARSET)); /* NULL terminated byte after the logger name. */ buf.put((byte) 0x0); } return data; } } }