midp_logging.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 268 行

C
268
字号
/* * * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program 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 * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */#include <kni.h>#include <stdio.h>#include <stdarg.h>#include <string.h>#include <midpMalloc.h>#include <midp_properties_port.h>#include <midp_logging.h>#include <pcsl_print.h>#include <midp_libc_ext.h>#include <midpNativeThread.h>/** * @file * * Logging and tracing API implementation used to output text to the * default display device. In the VM, terminal output for Java methods * <tt>System.out.println()</tt> and * <tt>Java.lang.Throwable.printStackTrace()</tt> happen via a call to * the <tt>JVMSPI_PrintRaw()</tt> method. This implementation emulates * the mechanism used there. * * To redirect the logging output to a file or a stream other than * stdout modify the behavior of the <tt>JVMSPI_PrintRaw()</tt> method. *//** * Argument for runMidlet to set the numbers of channels * for wich logging will be enabled. * If this argument is not used, logging will be enabled * for all channels. * * <p>NOTE: option '-Dlog.channels' is used to set up the *       corresponding system property that will be available *       in Java through System.getProperty("log.channels") *       and in native code through getSystemProperty(). * * <p>Examples: * <pre>    -Dlog.channels=5000,10000 *     -Dlog.channels=1000 *     -Dlog.channels=    - disables logging</pre> */#define LOG_CHANNELS_ARG "log.channels"/** Maximum number of channels selected for logging */#define MAX_LOG_CHANNELS 10/** Array containing the numbers of channels selected for logging */static int piChannelList[MAX_LOG_CHANNELS];/** Buffer used by logging facility */#define LOGGING_BUFFER_SIZE 400/** * Global buffers definitions */static char gLoggingBuffer[LOGGING_BUFFER_SIZE];/** * The number of channels selected for logging. * Initial value of -1 means that logging will be enabled * for all channels. If LOG_CHANNELS_ARG argument is given * to the midlet runner, createLogChannelsList() will be called * setting iChannelsNum to 0 if the logging is disabled or to * the number of channels for which logging is enabled. */static int iChannelsNum = -1;/** A flag indicating if the channel list was already parsed */static int fChannelSetupDone = 0;/** Forward declaration */static int channelInList(int channelId);/** Forward declaration */static void createLogChannelsList(const char* pStrChannelList);/** * Initializes the logging subsystem with the list of channels to log. * * @param pStrChannelList comma-separated list of channel numbers to log */voidsetupChannelsToLog(const char* pStrChannelList) {    iChannelsNum = -1;    createLogChannelsList(pStrChannelList);    fChannelSetupDone = 1;}/** * Report a message to the Logging service.  On the linux emulator * this will end up going to stdout.  On the Zaurus device it will * be written to a file. * * The <code>message</code> parameter is treated as a format * string to the standard C library call printf would be, with * conversion specifications (%s, %d, %c, etc) causing the * conversion and output of each successive argument after * <code>message</code>  As with printf, having a conversion * character in <code>message</code> without an associated argument * following it is an error. * * To ensure that no character in <code>message</code> is * interpreted as requiring conversion, a safe way to call * this method is: * <code> reportToLog(severity, chanID, "%s", message); </code> * @param severity severity level of report * @param channelID area report relates to, from midp_constants_data.h * @param message detail message to go with the report *                should not be NULL */voidreportToLog(int severity, int channelID, char* message, ...) {    va_list ap;    if (!fChannelSetupDone) {        /*         * Get the system property to check if the specific         * channels were set for logging.         */        const char* pChannelsArg = getSystemProperty(LOG_CHANNELS_ARG);        if (pChannelsArg) {            createLogChannelsList(pChannelsArg);        }        fChannelSetupDone = 1;    }    if (message != NULL && channelInList(channelID)) {        midp_snprintf(gLoggingBuffer, LOGGING_BUFFER_SIZE,                "REPORT: <level:%d> <channel:%d> ",                severity,  channelID);        pcsl_print(gLoggingBuffer);        va_start(ap, message);        midp_vsnprintf(gLoggingBuffer, LOGGING_BUFFER_SIZE, message, ap);        pcsl_print(gLoggingBuffer);        va_end(ap);        pcsl_print("\n");    }}/** * Checks if logging is enabled for the specified channel or not. * * @param channelId number of the channel to check. * @return 1 if logging is enabled for the channel, 0 otherwise. */static int channelInList(int channelId) {    int i;    /* assert(iChannelsNum <= MAX_LOG_CHANNELS); */    if (iChannelsNum == -1) {        /* -1 means that all channels must be logged. */        return 1; /* TRUE */    }    for (i = 0; i < iChannelsNum; i++) {        if (piChannelList[i] == channelId) {            return 1; /* TRUE */        }    }    return 0; /* FALSE */}/** * Sets the numbers of channels that should be logged. * * @param pStrChannelList comma-separated list of channel numbers to log. */static void createLogChannelsList(const char* pStrChannelList) {    int  isLastEntry = 0;    int  iChannelId = 0;    const char *pChannelStart;    char *pChannelEnd;    iChannelsNum = 0;    pChannelStart = pStrChannelList;    do {        /*         * IMPL_NOTE: remove.         * pChannelEnd = strchr(pChannelStart, ',');         * if (pChannelEnd) {         *     *pChannelEnd = 0;         * }         */        iChannelId = (int)strtol(pChannelStart, &pChannelEnd, 0);        if (*pChannelEnd != ',' && *pChannelEnd != '\0') {            if (pChannelEnd == pChannelStart) {                /* Error: invalid channel number! */                break;            } else {                isLastEntry = 1;            }        }        pChannelStart = pChannelEnd;        pChannelStart++;        if (!channelInList(iChannelId)) {            /* printf(">>> Adding channel %d...\n", iChannelId); */            piChannelList[iChannelsNum++] = iChannelId;            if (iChannelsNum == MAX_LOG_CHANNELS) {                /* Other channel values will be ignored. */                break;            }        }    } while (*pChannelEnd && !isLastEntry);}/** * Log the native thread ID for debugging on multi-thread platforms. * * @param message message to prefix the thread ID */void midp_logThreadId(char* message) {#if REPORT_LEVEL <= LOG_INFORMATION    char temp[80];    REPORT_WARN(LC_EVENTS, "midp_logThreadId: Stubbed out.");    //put code here to get the thread id    sprintf(temp, "%s: ThreadID = %d\n", message,            (int)midp_getCurrentThreadId());    REPORT_INFO(LC_EVENTS, temp);#else    (void)message; // avoid a compiler warning#endif}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?