/*!
@header ECFileLoggingWriter
@abstract Module of Encore
@availability OS X, GNUstep
@copyright 2004, 2005, 2006 Oliver Langer
Author: Oliver Langer
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-------------------------------------------------------------------------
Modification history
03.02.06 ola initial version
22.08.06 ola license changed
-------------------------------------------------------------------------
*/
#include
#include
@implementation ECFileLoggingWriter
- init {
self = [super init];
self->logBaseFilename = nil;
self->logBackupFilenameSuffix = [[NSString alloc]
initWithString: ECFileLoggingWriter_DEFAULT_BACKUSUFFIX];
self->maxFilesize = ECFileLoggingWriter_DEFAULT_MAXFILESIZE;
self->lock = [[NSLock alloc] init];
self->fileHandle = nil;
self->encoding = NSASCIIStringEncoding;
return self;
}
- (void) dealloc {
[self->logBaseFilename release];
[self->logBackupFilenameSuffix release];
[self->lock release];
[self->fileHandle release];
[super dealloc];
}
- checkFilestatus {
/* check for log rotation: */
if( nil != self->fileHandle ) {
if( [self->fileHandle offsetInFile] > maxFilesize ) {
[self closeAndMoveFile];
}
}
/* check for file opening/creation: */
if( nil == self->fileHandle ) {
[self openFile];
}
return self;
}
- closeAndMoveFile {
NSString *backupFilename;
[self->fileHandle closeFile];
self->fileHandle = nil;
backupFilename = [self createBackupFilename];
if( ![[NSFileManager defaultManager]
movePath: self->logBaseFilename
toPath: backupFilename
handler:nil] ) {
[[[ECIllegalStateException alloc]
initWithIllegalStateInfo:
[NSString stringWithFormat:
@"ECFileLoggingWriter::closeAndMoveFile:"\
" Unable to move logging file %@ to %@!", self->logBaseFilename,
backupFilename]]
raise];
}
return self;
}
- (NSString *) createBackupFilename {
NSString *backupFilename;
unsigned int counter = 0;
NSString *toReturn = nil;
/* crate suffix */
backupFilename = [[NSDate date]
descriptionWithCalendarFormat: self->logBackupFilenameSuffix
timeZone: nil
locale: nil];
/* create full file name by adding prefix: */
backupFilename = [NSString stringWithFormat: @"%@.%@",
self->logBaseFilename, backupFilename];
toReturn = backupFilename;
while( [[NSFileManager defaultManager]
fileExistsAtPath: toReturn] ) {
toReturn = [NSString
stringWithFormat: @"%@-%u", backupFilename, counter++];
}
return toReturn;
}
- openFile {
/* open or create file: */
if( ![[NSFileManager defaultManager]
fileExistsAtPath: self->logBaseFilename] ) {
/* create file */
if( ![[NSFileManager defaultManager]
createFileAtPath: self->logBaseFilename
contents: nil
attributes: nil] ) {
[[[ECIllegalStateException alloc]
initWithIllegalStateInfo:
[NSString stringWithFormat: @"ECSimpleFileLogWriter::"\
"checkFilestatus: Unable to create file with name=%@"]
] raise];
}
}
/* open file: */
self->fileHandle = [[NSFileHandle
fileHandleForUpdatingAtPath: self->logBaseFilename] retain];
if( nil == self->fileHandle ) {
[[[ECIllegalStateException alloc]
initWithIllegalStateInfo:
[NSString stringWithFormat: @"ECSimpleFileLogWriter::"\
"checkFilestatus: Unable to create file with name=%@",
self->logBaseFilename]
] raise];
}
[self->fileHandle seekToEndOfFile];
return self;
}
- setEncoding: (NSStringEncoding) anEncoding {
self->encoding = anEncoding;
return self;
}
- setBaseFilename: (NSString *) aBaseFilename {
id tmp;
tmp = self->logBaseFilename;
self->logBaseFilename = [aBaseFilename retain];
[tmp release];
return self;
}
- setBackupFilenameSuffix: (NSString *) aBackupname {
id tmp = self->logBackupFilenameSuffix;
self->logBackupFilenameSuffix = [aBackupname retain];
[tmp release];
return self;
}
- setMaxFilesize: (unsigned int) nrBytes {
self->maxFilesize = nrBytes;
return self;
}
- writeLog: (NSString *) logEntry {
[self->lock lock];
NS_DURING
[self checkFilestatus];
[self->fileHandle writeData:
[logEntry dataUsingEncoding: self->encoding]];
NS_HANDLER
[self->lock unlock];
[localException raise];
NS_ENDHANDLER
[self->lock unlock];
return self;
}
@end