GeckoReporter/Classes/Framework/MGMLog.m

103 lines
3.9 KiB
Mathematica
Raw Permalink Normal View History

2010-01-06 18:11:16 -06:00
//
// MGMLog.m
// GeckoReporter
//
// Created by Mr. Gecko on 1/1/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission to use, copy, modify, and/or distribute this software for any purpose
// with or without fee is hereby granted, provided that the above copyright notice
// and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
// OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
// ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2010-01-06 18:11:16 -06:00
//
#import "MGMLog.h"
@protocol NSFileManagerProtocol <NSObject>
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
- (NSDictionary *)fileSystemAttributesAtPath:(NSString *)path;
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
- (BOOL)removeFileAtPath:(NSString *)path handler:(id)handler;
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handler;
@end
static NSRecursiveLock *MGMLock = nil;
void MGMInitLock() {
if (MGMLock==nil) {
MGMLock = [NSRecursiveLock new];
}
}
void MGMLogs(NSString *string) {
MGMInitLock();
[MGMLock lock];
char *buffer;
int length;
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
if (data!=nil) {
buffer = (char *)[data bytes];
length = [data length];
} else {
buffer = (char *)[string UTF8String];
length = [string length];
}
NSFileManager<NSFileManagerProtocol> *manager = [NSFileManager defaultManager];
fwrite(buffer, 1, length, stderr);
NSString *applicationIdentifier = [[NSBundle mainBundle] bundleIdentifier];
NSString *logPath = [[NSString stringWithFormat:@"~/Library/Logs/%@.log", applicationIdentifier] stringByExpandingTildeInPath];
NSString *log2Path = [[NSString stringWithFormat:@"~/Library/Logs/%@_2.log", applicationIdentifier] stringByExpandingTildeInPath];
NSDictionary *attributes = nil;
if ([manager respondsToSelector:@selector(attributesOfItemAtPath:error:)])
attributes = [manager attributesOfItemAtPath:logPath error:nil];
else
attributes = [manager fileSystemAttributesAtPath:logPath];
if ([[attributes objectForKey:NSFileSize] intValue]>=262144) {
if ([manager fileExistsAtPath:log2Path]) {
if ([manager respondsToSelector:@selector(removeItemAtPath:error:)])
[manager removeItemAtPath:log2Path error:nil];
else
[manager removeFileAtPath:log2Path handler:nil];
}
if ([manager respondsToSelector:@selector(moveItemAtPath:toPath:error:)])
[manager moveItemAtPath:logPath toPath:log2Path error:nil];
else
[manager movePath:logPath toPath:log2Path handler:nil];
}
FILE *logFile = fopen([logPath fileSystemRepresentation], "a");
fwrite(buffer, 1, length, logFile);
fclose(logFile);
[MGMLock unlock];
}
void MGMLog(NSString *format, ...) {
va_list ap;
va_start(ap, format);
MGMLogv(format, ap);
va_end(ap);
}
void MGMLogv(NSString *format, va_list args) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
if (![format hasSuffix:@"\n"])
format = [format stringByAppendingString:@"\n"];
NSString *message = [[[NSString alloc] initWithFormat:format arguments:args] autorelease];
NSProcessInfo *procInfo = [NSProcessInfo processInfo];
NSString *logString = [NSString stringWithFormat:@"%@ %@[%d] %@",
[[NSCalendarDate calendarDate] descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S.%F"],
[procInfo processName],
[procInfo processIdentifier],
message
];
MGMLogs(logString);
[pool drain];
}