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}