/*
* Copyright (c) 2010-2019 Belledonne Communications SARL.
*
* This file is part of linphone-iphone
*
* 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 3 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, see .
*/
#import "HDLLinphoneLog.h"
#import
#import
#ifdef USE_CRASHLYTHICSS
#import
#endif
@implementation HDLLinphoneLog
#define FILE_SIZE 17
#define DOMAIN_SIZE 3
+ (NSString *)cacheDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
BOOL isDir = NO;
NSError *error;
// cache directory must be created if not existing
if (![[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
if (![[NSFileManager defaultManager] createDirectoryAtPath:cachePath
withIntermediateDirectories:NO
attributes:nil
error:&error]) {
// LOGE(@"Could not create cache directory: %@", error);
}
}
return cachePath;
}
+ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
const char *utf8str = [str cStringUsingEncoding:NSString.defaultCStringEncoding];
const char *filename = strchr(file, '/') ? strrchr(file, '/') + 1 : file;
ortp_log(severity, "(%*s:%-4d) %s", FILE_SIZE, filename + MAX((int)strlen(filename) - FILE_SIZE, 0), line, utf8str);
va_end(args);
}
+ (void)enableLogs:(OrtpLogLevel)level {
BOOL enabled = (level >= ORTP_DEBUG && level < ORTP_ERROR);
static BOOL stderrInUse = NO;
if (!stderrInUse) {
asl_add_log_file(NULL, STDERR_FILENO);
stderrInUse = YES;
}
linphone_core_set_log_collection_path([self cacheDirectory].UTF8String);
linphone_core_set_log_handler(linphone_iphone_log_handler);
linphone_core_enable_log_collection(enabled);
if (level == 0) {
linphone_core_set_log_level(ORTP_FATAL);
ortp_set_log_level("ios", ORTP_FATAL);
NSLog(@"I/%s/Disabling all logs", ORTP_LOG_DOMAIN);
} else {
NSLog(@"I/%s/Enabling %s logs", ORTP_LOG_DOMAIN, (enabled ? "all" : "application only"));
linphone_core_set_log_level(level);
ortp_set_log_level("ios", level == ORTP_DEBUG ? ORTP_DEBUG : ORTP_MESSAGE);
}
}
#pragma mark - Logs Functions callbacks
void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args) {
NSString *format = [[NSString alloc] initWithUTF8String:fmt];
NSString *formatedString = [[NSString alloc] initWithFormat:format arguments:args];
NSString *lvl;
if (!domain)
domain = "lib";
// since \r are interpreted like \n, avoid double new lines when logging network packets (belle-sip)
// output format is like: I/ios/some logs. We truncate domain to **exactly** DOMAIN_SIZE characters to have
// fixed-length aligned logs
switch (lev) {
case ORTP_FATAL:
lvl = @"Fatal";
break;
case ORTP_ERROR:
lvl = @"Error";
break;
case ORTP_WARNING:
lvl = @"Warning";
break;
case ORTP_MESSAGE:
lvl = @"Message";
break;
case ORTP_DEBUG:
lvl = @"Debug";
break;
case ORTP_TRACE:
lvl = @"Trace";
break;
case ORTP_LOGLEV_END:
return;
}
if ([formatedString containsString:@"\n"]) {
NSArray *myWords = [[formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]
componentsSeparatedByString:@"\n"];
for (int i = 0; i < myWords.count; i++) {
NSString *tab = i > 0 ? @"\t" : @"";
if (((NSString *)myWords[i]).length > 0) {
#ifdef USE_CRASHLYTHICSS
CLSNSLog(@"[%@] %@%@", lvl, tab, (NSString *)myWords[i]);
#else
NSLog(@"[%@] %@%@", lvl, tab, (NSString *)myWords[i]);
#endif
}
}
} else {
#ifdef USE_CRASHLYTHICSS
CLSNSLog(@"[%@] %@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]);
#else
NSLog(@"[%@] %@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]);
#endif
}
}
@end