Changeset 12142

Show
Ignore:
Timestamp:
09/12/07 09:05:58 (1 year ago)
Author:
piotras
Message:

Copied from trunk

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/branch-1-9/midgard/core/midgard/midgard/midgard_error.h

    r10128 r12142  
    126126 
    127127/** 
     128 * \ingroup midgard_error 
     129 * 
     130 * Default function for log messages. 
     131 * 
     132 * \param domain, domain for the given log message 
     133 * \param level, GLogLevelFlags 
     134 * \param msg, log message 
     135 * \param ptr, pointer to structure which holds loglevel  
     136 * 
     137 * \c ptr pointer may be a pointer to MidgardConnection or MidgardTypeHolder 
     138 * structure. This function checks pointer type using MIDGARD_IS_CONNECTION 
     139 * convention macro. Next midgard_connection_get_loglevel is called to get loglevel. 
     140 * If MidgardConnection check fails , a typecast to MidgardTypeHolder is made. 
     141 * In this case, level member is used to get loglevel. 
     142 * 
     143 * You are responsible to correctly set MidgardConnection or MidgardTypeHolder 
     144 * before passing ptr argument. The main approach is to follow configuration's 
     145 * loglevel even if MidgardConnection pointer is not yet available. 
     146 * 
     147 * Use midgard_connection_set_loglevel to set log level.         
     148 * 
     149 */ 
     150extern void midgard_error_default_log(const gchar *domain, GLogLevelFlags level, 
     151                const gchar *msg, gpointer ptr); 
     152 
     153/** 
     154 * \ingroup midgard_error 
     155 * 
     156 * Get GLogLevelFlags value from loglevel string. 
     157 * 
     158 * \param levelstring, string which should be parsed 
     159 * 
     160 * \return GLogLevelFlags or -1 on failure 
     161 * 
     162 */ 
     163extern gint midgard_error_parse_loglevel(const gchar *levelstring); 
     164 
     165/** 
    128166 * \ingroup midgard_error  
    129167 * 
     
    134172 
    135173#define MIDGARD_ERRNO_SET(str, errcode)  \ 
    136         str->errn = errcode;
     174        str->errn = errcode;
    137175        midgard_set_error(str->_mgd, \ 
    138         MGD_GENERIC_ERROR, \ 
    139         errcode, \ 
    140         NULL); \ 
    141         g_clear_error(&str->_mgd->err); 
     176                MGD_GENERIC_ERROR, \ 
     177                errcode, \ 
     178                NULL); \ 
     179        /* g_signal_emit_by_name(str, "error"); */ \ 
     180        g_clear_error(&str->_mgd->err);  
    142181 
    143182G_END_DECLS 
  • branches/branch-1-9/midgard/core/midgard/src/midgard_error.c

    r10192 r12142  
    1818 
    1919#include <midgard/midgard_error.h> 
    20 #include <midgard/midgard_legacy.h> 
     20#include "midgard_core_object.h" 
     21#include "midgard/midgard_datatypes.h" 
     22#include <sys/types.h> 
     23#include <unistd.h> 
    2124 
    2225GQuark midgard_error_generic(void) 
     
    178181        mgd->errstr = g_strdup(mgd->err->message);       
    179182 
    180         /* FIXME, remove later , this is legacy compatible stuff */ 
    181         if(mgd->mgd) 
    182                 mgd->mgd->errn = errcode;        
    183          
    184183        return;          
    185184} 
     185 
     186/* Default function for log messages. */ 
     187void midgard_error_default_log(const gchar *domain, GLogLevelFlags level, 
     188                const gchar *msg, gpointer ptr) 
     189{ 
     190        gchar *level_ad = NULL; 
     191        guint mlevel; 
     192        GIOChannel *channel = NULL; 
     193        MidgardConnection *mgd; 
     194        MidgardTypeHolder *holder; 
     195 
     196        if(ptr == NULL) { 
     197 
     198                mlevel = G_LOG_LEVEL_WARNING; 
     199         
     200        } else { 
     201                 
     202                if(MIDGARD_IS_CONNECTION((MidgardConnection *) ptr)) { 
     203                         
     204                        mgd = MIDGARD_CONNECTION(ptr); 
     205                        mlevel = midgard_connection_get_loglevel(mgd); 
     206                        if(mgd->priv->config != NULL && mgd->priv->config->private != NULL) 
     207                                channel = mgd->priv->config->private->log_channel; 
     208                 
     209                } else { 
     210                         
     211                        holder = (MidgardTypeHolder *) ptr; 
     212                        mlevel = holder->level; 
     213                } 
     214        } 
     215 
     216        switch (level) { 
     217                case G_LOG_FLAG_RECURSION: 
     218                        level_ad =  "RECURSION"; 
     219                        break; 
     220                         
     221                case G_LOG_FLAG_FATAL: 
     222                        level_ad = "FATAL! "; 
     223                        break; 
     224                         
     225                case G_LOG_LEVEL_ERROR: 
     226                        level_ad =  "ERROR"; 
     227                        break; 
     228                         
     229                case G_LOG_LEVEL_CRITICAL: 
     230                        level_ad = "CRITICAL "; 
     231                        break; 
     232                         
     233                case G_LOG_LEVEL_WARNING: 
     234                        level_ad =  "WARNING"; 
     235                        break; 
     236                         
     237                case G_LOG_LEVEL_MESSAGE: 
     238                        level_ad = "m"; 
     239                        break; 
     240                 
     241                case G_LOG_LEVEL_INFO: 
     242                        level_ad = "info"; 
     243                        break; 
     244                         
     245                case G_LOG_LEVEL_DEBUG: 
     246                        level_ad = "debug"; 
     247                        break; 
     248 
     249                default: 
     250                        level_ad = "midgard-unknown-log-level"; 
     251                        break; 
     252                         
     253        } 
     254 
     255        if (mlevel >= level) { 
     256         
     257                GString *logstr = g_string_new(""); 
     258                g_string_append_printf(logstr, 
     259                                "%s (pid:%ld):(%s):%s\n", 
     260                                domain, 
     261                                (unsigned long)getpid(), 
     262                                level_ad, 
     263                                msg); 
     264         
     265                gchar *tmpstr = g_string_free(logstr, FALSE); 
     266 
     267                if(channel) { 
     268 
     269                        g_io_channel_write_chars(channel, 
     270                                        (const gchar *)tmpstr, 
     271                                        -1, NULL, NULL); 
     272                        g_io_channel_flush(channel, NULL); 
     273                         
     274                } else { 
     275 
     276                        fprintf(stderr, "%s", tmpstr); 
     277                        fflush(stderr); 
     278                } 
     279 
     280                g_free(tmpstr); 
     281        } 
     282} 
     283 
     284/* Get GLogLevelFlags value from loglevel string */ 
     285gint midgard_error_parse_loglevel(const gchar *levelstring) 
     286{ 
     287        g_assert(levelstring != NULL); 
     288 
     289        guint level = 0, mask = 0; 
     290        guint len = strlen(levelstring); 
     291        gchar *newlevel = g_ascii_strdown(levelstring, len); 
     292 
     293        if(g_str_equal(newlevel, "error"))  
     294                level = G_LOG_LEVEL_ERROR; 
     295        if(g_str_equal(newlevel, "critical")) 
     296                level = G_LOG_LEVEL_CRITICAL; 
     297        if(g_str_equal(newlevel, "warn")) 
     298                level = G_LOG_LEVEL_WARNING; 
     299        if(g_str_equal(newlevel, "warning")) 
     300                level = G_LOG_LEVEL_WARNING; 
     301        if(g_str_equal(newlevel, "message"))     
     302                level = G_LOG_LEVEL_MESSAGE; 
     303        if(g_str_equal(newlevel, "info")) 
     304                level = G_LOG_LEVEL_INFO; 
     305        if(g_str_equal(newlevel, "debug")) 
     306                level = G_LOG_LEVEL_DEBUG; 
     307 
     308        g_free(newlevel); 
     309         
     310        switch(level){ 
     311 
     312                case G_LOG_LEVEL_ERROR: 
     313                case G_LOG_LEVEL_CRITICAL: 
     314                case G_LOG_LEVEL_WARNING: 
     315                case G_LOG_LEVEL_MESSAGE: 
     316                case G_LOG_LEVEL_INFO: 
     317                case G_LOG_LEVEL_DEBUG: 
     318                        for (; level && level > G_LOG_FLAG_FATAL; level >>= 1) { 
     319                                mask |= level; 
     320                        } 
     321                        return  mask; 
     322                        break; 
     323 
     324                default: 
     325                        return -1; 
     326        } 
     327         
     328        return -1;       
     329}