// Copyright (c) 2002, Peter Bentley
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
// 
//   Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 
//   Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// 
//   The name Peter Bentley may not be used to endorse or promote
// products derived from this software without specific prior
// written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// $Id: OmdDisc.m,v 1.11 2002/11/24 13:02:33 pete Exp $


#import "OmdUnit.h"
#import "OmdDisc.h"
#import "OmdTime.h"

CVSID( "$Id: OmdDisc.m,v 1.11 2002/11/24 13:02:33 pete Exp $" );

@implementation OmdDisc

- (void) refresh
{
    discInserted = NO;
    if( unit && [unit discInserted: YES] )
    {
        discInserted = YES;
        if( omd_disc_get_info( [unit unit], &discInfo ) == NULL )
        {
            slog( LOG_WARNING, "Error fetching disc info" );
            discInserted = NO;
        }
    }
}


- (void) dealloc
{
    [unit release];
}

- (BOOL) isRecordable 
{
    return omd_disc_is_recordable( &discInfo ) ? YES : NO;
}

- (BOOL) isProtected 
{
    return omd_disc_is_protected( &discInfo ) ? YES : NO;
}

- (int) numTracks
{
    return discInserted ? discInfo.track_count : -1;
}

- (OmdTime *) timeConvert: (omd_time_t *) t
{
    OmdTime *omt = nil;

    if( t )
    {
        omt = [[OmdTime alloc] initWithTime: t];
        [omt autorelease];
    }
    return omt;
}

- (OmdTime *) capacity
{
    return discInserted ? [self timeConvert: &discInfo.time_max] : nil;
}


- (OmdTime *) timeRemaining
{
    return discInserted ? [self timeConvert: &discInfo.time_avail] : nil;
}


- (OmdTime *) timeUsed
{
    return discInserted ? [self timeConvert: &discInfo.time_used] : nil;
}





- (NSString *) discTypeString
{

    if( ! discInserted )
    {
        return @"No disc";
    }
    
    return [self isRecordable] ? @"Recordable" : @"Pre-mastered";
}


- (NSString *) discWritableString
{
    if( ! discInserted )
    {
        return @"";
    }

    return [self isProtected] ? @"Write Protected" : @"";
}

- (void) updateView
{
    [discType setStringValue: [self discTypeString]];
    [discType2 setStringValue: [self discWritableString]];
    
    if( discInserted )
    {
        [discTracks setIntValue: [self numTracks]];
        [discCapacity setStringValue: [[self capacity] stringValue]];
        [discUsed setStringValue: [[self timeUsed] stringValue]];
        [discRemaining setStringValue: [[self timeRemaining] stringValue]];
        
        [discIndicator setMinValue: 0.0];
        [discIndicator setMaxValue: [[self capacity] doubleValue]];
        [discIndicator setDoubleValue: [[self capacity] doubleValue]
                                        - [[self timeRemaining] doubleValue]];
    }
    else
    {
        [discTracks setStringValue: @"" ];
        [discCapacity setStringValue: @""];
        [discUsed setStringValue: @""];
        [discRemaining setStringValue: @""];
    }
}



@end
