mirror of
https://github.com/owntone/owntone-server.git
synced 2025-11-10 14:09:51 -05:00
Add OSX souces, courtesy of RokuMike
This commit is contained in:
229
osx/FireflyCommon.h
Normal file
229
osx/FireflyCommon.h
Normal file
@@ -0,0 +1,229 @@
|
||||
/*
|
||||
* FireflyCommonConstants.h
|
||||
*
|
||||
* Created by Mike Kobb on 7/12/06.
|
||||
* Copyright 2006 Roku LLC. All rights reserved.
|
||||
*
|
||||
* This file contains common constants and types needed by both the
|
||||
* prefs pane and helper apps.
|
||||
*/
|
||||
|
||||
#ifndef __ORG_FIREFLYMEDIASERVER_FIREFLY_COMMON_H
|
||||
#define __ORG_FIREFLYMEDIASERVER_FIREFLY_COMMON_H
|
||||
|
||||
#include <sys/sysctl.h> // used by GetProcesses
|
||||
|
||||
#define FIREFLY_SERVER_NAME "firefly"
|
||||
#define FIREFLY_DIR_NAME "Firefly"
|
||||
#define FIREFLY_CONF_NAME "firefly.conf"
|
||||
|
||||
#define FF_PREFS_DOMAIN "org.fireflymediaserver.firefly"
|
||||
#define FF_PREFS_LAUNCH_AT_LOGIN "org.fireflymediaserver.launchAtLogin"
|
||||
#define FF_PREFS_SHOW_MENU_EXTRA "org.fireflymediaserver.showMenuExtra"
|
||||
|
||||
// Define this to enable certain debug output
|
||||
//#define FIREFLY_DEBUG
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
kFireflyStartInvalid = 0,
|
||||
kFireflyStartSuccess = 1,
|
||||
kFireflyStartFail = 2
|
||||
} FireflyStartResult;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
kFireflyStopInvalid = 0,
|
||||
kFireflyStopSuccess = 1,
|
||||
kFireflyStopFail = 2
|
||||
} FireflyStopResult;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
kFireflyRestartInvalid = 0,
|
||||
kFireflyRestartSuccess = 1,
|
||||
kFireflyRestartFail = 2
|
||||
} FireflyRestartResult;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
kFireflyRescanInvalid = 0,
|
||||
kFireflyRescanSuccess = 1,
|
||||
kFireflyRescanFail = 2
|
||||
} FireflyRescanResult;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
kFireflyStatusInvalid,
|
||||
kFireflyStatusStopped,
|
||||
kFireflyStatusStarting,
|
||||
kFireflyStatusActive,
|
||||
kFireflyStatusScanning,
|
||||
kFireflyStatusStopping,
|
||||
kFireflyStatusRestarting,
|
||||
kFireflyStatusStartFailed,
|
||||
kFireflyStatusCrashed
|
||||
} FireflyServerStatus;
|
||||
|
||||
static NSString*
|
||||
StringForFireflyStatus( FireflyServerStatus inStatus )
|
||||
{
|
||||
NSString *retVal = nil;
|
||||
switch( inStatus )
|
||||
{
|
||||
case kFireflyStatusStopped:
|
||||
retVal = NSLocalizedString( @"Firefly is not running",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusStarting:
|
||||
retVal = NSLocalizedString( @"Firefly is starting",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusActive:
|
||||
retVal = NSLocalizedString( @"Firefly is running",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusScanning:
|
||||
retVal = NSLocalizedString( @"Firefly is scanning the library",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusStopping:
|
||||
retVal = NSLocalizedString( @"Firefly is stopping",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusRestarting:
|
||||
retVal = NSLocalizedString( @"Firefly is restarting",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusStartFailed:
|
||||
retVal = NSLocalizedString( @"Firefly failed to start",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusCrashed:
|
||||
retVal = NSLocalizedString( @"Firefly stopped unexpectedly",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
|
||||
case kFireflyStatusInvalid:
|
||||
default:
|
||||
retVal = NSLocalizedString( @"Firefly status is unknown",
|
||||
@"Status message for Firefly" );
|
||||
break;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// Process management the Unix way -- Finding if the server is already
|
||||
// running, or finding a specific process
|
||||
// ===========================================================================
|
||||
|
||||
// This just makes syntax more convenient (don't have to say 'struct' everyplace)
|
||||
typedef struct kinfo_proc kinfo_proc;
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// GetProcesses
|
||||
//
|
||||
// Static utility function allocates and returns an array of kinfo_proc
|
||||
// structures representing the currently-running processes on the machine.
|
||||
// The calling function is responsible for disposing the returned pointer
|
||||
// with free()
|
||||
//
|
||||
// Because Firefly runs as a BSD daemon, the Process Manager is not useful
|
||||
// in finding it. Instead, we have to talk to the BSD layer. This code
|
||||
// was provided by Apple in a tech note.
|
||||
// ------------------------------------------------------------------------
|
||||
static void
|
||||
GetProcesses( kinfo_proc **outResult, size_t *outLength)
|
||||
{
|
||||
int err;
|
||||
kinfo_proc * result;
|
||||
BOOL done;
|
||||
static const int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
|
||||
// Declaring name as const requires us to cast it when passing it to
|
||||
// sysctl because the prototype doesn't include the const modifier.
|
||||
// (That's the Apple comment, but they don't say *why* they made it const...)
|
||||
size_t length;
|
||||
|
||||
// We call sysctl with result == NULL and length == 0.
|
||||
// That will succeed, and set length to the appropriate length.
|
||||
// We then allocate a buffer of that size and call sysctl again
|
||||
// with that buffer. If that succeeds, we're done. If that fails
|
||||
// with ENOMEM, we have to throw away our buffer and loop. Note
|
||||
// that the loop causes use to call sysctl with NULL again; this
|
||||
// is necessary because the ENOMEM failure case sets length to
|
||||
// the amount of data returned, not the amount of data that
|
||||
// could have been returned.
|
||||
|
||||
result = NULL;
|
||||
done = NO;
|
||||
do
|
||||
{
|
||||
// Call sysctl with a NULL buffer.
|
||||
length = 0;
|
||||
err = sysctl( (int *) name, (sizeof(name) / sizeof(*name)) - 1,
|
||||
NULL, &length,
|
||||
NULL, 0);
|
||||
if (err == -1)
|
||||
err = errno;
|
||||
|
||||
// Allocate an appropriately sized buffer based on the results
|
||||
// from the previous call.
|
||||
if (err == 0)
|
||||
{
|
||||
result = malloc(length);
|
||||
if (result == NULL)
|
||||
err = ENOMEM;
|
||||
}
|
||||
|
||||
// Call sysctl again with the new buffer. If we get an ENOMEM
|
||||
// error, toss away our buffer and start again.
|
||||
if (err == 0)
|
||||
{
|
||||
err = sysctl( (int *) name, (sizeof(name) / sizeof(*name)) - 1,
|
||||
result, &length,
|
||||
NULL, 0);
|
||||
if (err == -1)
|
||||
err = errno;
|
||||
if (err == 0)
|
||||
done = YES;
|
||||
else if (err == ENOMEM)
|
||||
{
|
||||
free(result);
|
||||
result = NULL;
|
||||
err = 0;
|
||||
}
|
||||
}
|
||||
} while (err == 0 && !done);
|
||||
|
||||
// Clean up and establish post conditions.
|
||||
if( err != 0 )
|
||||
{
|
||||
if( result != NULL)
|
||||
free(result);
|
||||
*outResult = NULL;
|
||||
*outLength = 0;
|
||||
}
|
||||
|
||||
if( err == 0 )
|
||||
{
|
||||
*outResult = result;
|
||||
*outLength = length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// __ORG_FIREFLYMEDIASERVER_FIREFLY_COMMON_H
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user