예제 #1
0
bool
IOI2CLM6x::start	(
						IOService*						provider
					)
{
	IOReturn								status;

	fRegistersAreSaved = false;

	sGetSensorValueSym = OSSymbol::withCString( "getSensorValue" );

	// Start I2CDriver first...
	if ( !( super::start( provider ) ) )
		return( false );

	nrequire( fInitHWFailed, IOI2CLM6x_start_fInitHWFailedErr );

	// Create child nubs.
	require_success( ( status = createChildNubs( fProvider ) ), IOI2CLM6x_start_createChildNubsErr );

	// Register so others can find us with a waitForService().
	registerService();

	return( true );


IOI2CLM6x_start_createChildNubsErr:
IOI2CLM6x_start_fInitHWFailedErr:
	freeI2CResources();
	return( false );
}
OSStatus BeginSave( NavDialogRef inDialog, NavReplyRecord* outReply, FSRef* outFileRef )
{
    OSStatus status = paramErr;
    AEDesc		dirDesc;
    AEKeyword	keyword;
    CFIndex		len;

    require( outReply, Return );
    require( outFileRef, Return );

    status = NavDialogGetReply( inDialog, outReply );
    nrequire( status, Return );

    status = AEGetNthDesc( &outReply->selection, 1, typeWildCard, &keyword, &dirDesc );
    nrequire( status, DisposeReply );

    len = CFStringGetLength( outReply->saveFileName );

    if ( dirDesc.descriptorType == typeFSRef )
    {
        const UInt32	kMaxNameLen = 255;
        FSRef		dirRef;
        UniChar		name[ kMaxNameLen ];

        if ( len > kMaxNameLen )
        {
            len = kMaxNameLen;
        }

        status = AEGetDescData( &dirDesc, &dirRef, sizeof( dirRef ));
        nrequire( status, DisposeDesc );

        CFStringGetCharacters( outReply->saveFileName, CFRangeMake( 0, len ), &name[0] );

        status = FSMakeFSRefUnicode( &dirRef, len, &name[0], GetApplicationTextEncoding(), outFileRef );
        if (status == fnfErr )
        {
            // file is not there yet - create it and return FSRef
            status = FSCreateFileUnicode( &dirRef, len, &name[0], 0, NULL, outFileRef, NULL );
        }
        else
        {
            // looks like file is there. Just make sure there is no error
            nrequire( status, DisposeDesc );
        }
    }
    else if ( dirDesc.descriptorType == typeFSS )
    {
        FSSpec	theSpec;
        status = AEGetDescData( &dirDesc, &theSpec, sizeof( FSSpec ));
        nrequire( status, DisposeDesc );

        if ( CFStringGetPascalString( outReply->saveFileName, &(theSpec.name[0]),
                                      sizeof( StrFileName ), GetApplicationTextEncoding()))
        {
            status = FSpMakeFSRef(&theSpec, outFileRef);
            nrequire( status, DisposeDesc );
            status = FSpCreate( &theSpec, 0, 0, smSystemScript );
            nrequire( status, DisposeDesc );
        }
        else
        {
            status = bdNamErr;
            nrequire( status, DisposeDesc );
        }
    }

DisposeDesc:
    AEDisposeDesc( &dirDesc );

DisposeReply:
    if ( status != noErr )
    {
        NavDisposeReply( outReply );
    }

Return:
    return status;
}