001/*******************************************************************************
002 * Copyright (c) 2024, 2026, Olivier Ayache.  All rights reserved.
003 *
004 * This file is part of AVPKit.
005 *
006 * AVPKit is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU Lesser General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * AVPKit is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with AVPKit.  If not, see <http://www.gnu.org/licenses/>.
018 *******************************************************************************/
019
020package com.avpkit.ferry;
021
022import org.slf4j.Logger;
023import org.slf4j.LoggerFactory;
024
025import com.avpkit.ferry.NativeLogger;
026
027/**
028 * Internal Only.
029 * <p>
030 * This object is called by Native code when it logs inside a JVM. It forwards
031 * to our SLF4J logger.
032 * </p>
033 * <p>
034 * <strong>Do not change the signatures of methods in this class without
035 * changing the corresponding native code that depends on it.</strong>
036 * </p>
037 * 
038 */
039public final class NativeLogger
040{
041  // This is a logger this class can use for its own logging
042  private static final Logger log = LoggerFactory.getLogger(NativeLogger.class);
043
044  public static NativeLogger getLogger(String loggerName)
045  {
046    log.trace("Native code asked for logger: {}", loggerName);
047    NativeLogger retval = null;
048    Logger logger = LoggerFactory.getLogger(loggerName);
049    if (logger != null)
050      retval = new NativeLogger(logger);
051    return retval;
052  }
053
054  private final Logger mLogger;
055
056  private NativeLogger(Logger logger)
057  {
058    mLogger = logger;
059  }
060
061  public String getName()
062  {
063    return mLogger.getName();
064  }
065
066  public boolean log(int level, String msg)
067  {
068    boolean didLog = false;
069    log.trace("log level: {}, msg: {}", level, msg);
070
071    switch (level)
072    {
073      case 1:
074        if (mLogger.isWarnEnabled())
075        {
076          mLogger.warn(msg);
077          didLog = true;
078        }
079        break;
080      case 2:
081        if (mLogger.isInfoEnabled())
082        {
083          mLogger.info(msg);
084          didLog = true;
085        }
086        break;
087      case 3:
088        if (mLogger.isDebugEnabled())
089        {
090          mLogger.debug(msg);
091          didLog = true;
092        }
093        break;
094      case 4:
095        if (mLogger.isTraceEnabled())
096        {
097          mLogger.trace(msg);
098          didLog = true;
099        }
100        break;
101      case 0:
102      default: // treat default as Error
103        if (mLogger.isErrorEnabled())
104        {
105          mLogger.error(msg);
106          didLog = true;
107        }
108        break;
109
110    }
111
112    return didLog;
113  }
114
115}