/* $Id$ */
/* 
 * Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#include <pj/errno.h>
#include <pj/string.h>
#include <pj/compat/sprintf.h>

/* Prototype for platform specific error message, which will be defined 
 * in separate file.
 */
extern int platform_strerror( pj_os_err_type code, 
                              char *buf, pj_size_t bufsize );

/* PJLIB's own error codes/messages */
static const struct 
{
    int code;
    const char *msg;
} err_str[] = 
{
    { PJ_EUNKNOWN,      "Unknown Error" },
    { PJ_EPENDING,      "Pending operation" },
    { PJ_ETOOMANYCONN,  "Too many connecting sockets" },
    { PJ_EINVAL,        "Invalid value or argument" },
    { PJ_ENAMETOOLONG,  "Name too long" },
    { PJ_ENOTFOUND,     "Not found" },
    { PJ_ENOMEM,        "Not enough memory" },
    { PJ_EBUG,          "BUG DETECTED!" },
    { PJ_ETIMEDOUT,     "Operation timed out" },
    { PJ_ETOOMANY,      "Too many objects of the specified type"},
    { PJ_EBUSY,         "Object is busy"},
    { PJ_ENOTSUP,	"Option/operation is not supported"},
    { PJ_EINVALIDOP,	"Invalid operation"},
    { PJ_ECANCELLED,    "Operation cancelled"},
    { PJ_EEXISTS,       "Object already exists" }
};

/*
 * pjlib_error()
 *
 * Retrieve message string for PJLIB's own error code.
 */
static int pjlib_error(pj_status_t code, char *buf, pj_size_t size)
{
    unsigned i;

    for (i=0; i<sizeof(err_str)/sizeof(err_str[0]); ++i) {
        if (err_str[i].code == code) {
            pj_size_t len = strlen(err_str[i].msg);
            if (len >= size) len = size-1;
            pj_memcpy(buf, err_str[i].msg, len);
            buf[len] = '\0';
            return len;
        }
    }

    *buf++ = '?';
    *buf++ = '?';
    *buf++ = '?';
    *buf++ = '\0';
    return 3;
}

/*
 * pj_strerror()
 */
PJ_DEF(pj_str_t) pj_strerror( pj_status_t statcode, 
			      char *buf, pj_size_t bufsize )
{
    int len = -1;
    pj_str_t errstr;

    if (statcode < PJ_ERRNO_START + PJ_ERRNO_SPACE_SIZE) {
        len = pj_snprintf( buf, bufsize, "Unknown error %d", statcode);

    } else if (statcode < PJ_ERRNO_START_STATUS + PJ_ERRNO_SPACE_SIZE) {
        len = pjlib_error(statcode, buf, bufsize);

    } else if (statcode < PJ_ERRNO_START_SYS + PJ_ERRNO_SPACE_SIZE) {
        len = platform_strerror(PJ_STATUS_TO_OS(statcode), buf, bufsize);

    } else if (statcode < PJ_ERRNO_START_USER + PJ_ERRNO_SPACE_SIZE) {
        len = pj_snprintf( buf, bufsize, "User error %d", statcode);

    } else {
        len = pj_snprintf( buf, bufsize, "Invalid error %d", statcode);

    }

    if (len < 1) {
        *buf = '\0';
        len = 0;
    }

    errstr.ptr = buf;
    errstr.slen = len;

    return errstr;
}

