18 Commits
v2.5.2 ... 2.6

Author SHA1 Message Date
2d69dcc399 Moved Preference Strings into Constants 2016-10-16 18:28:42 +02:00
b5103c8f64 Worked around invisible statusbar text in macOS Sierra Dark mode 2016-10-12 03:48:56 +02:00
df287a7bf4 Adjusted version number 2016-10-12 03:01:17 +02:00
96aecc00f2 Merge pull request #53 from margaretmoser/patch-1
fixed brew install instructions
2016-06-09 00:50:36 +02:00
59ba7232fe fixed brew install instructions
brew cask install smsfancontrol   =>    brew cask install smcfancontrol
2016-06-08 15:48:49 -07:00
a37e18d227 Update Readme.md 2016-06-08 14:19:40 +02:00
3109288146 Merge pull request #47 from joelwallis/improvements-to-readme-file
Adds installation instructions using Homebrew & Cask
2016-06-08 14:18:51 +02:00
97683b91b7 2.6 Beta Release 2016-03-21 15:26:46 +01:00
6d2a6ed863 Bumped version number to 2.6, fixed crash on 12“ Macbook 2016-03-21 15:20:59 +01:00
3c84277cef Changed URLs to https, fixed Sparkle load error 2016-03-21 14:50:26 +01:00
411ba5a485 Fixed build error 2016-03-21 14:42:01 +01:00
2804ac0c85 Updated Sparkle 2016-03-21 14:34:34 +01:00
252fc40328 Adds installation instructions using Homebrew & Cask 2015-12-18 17:45:46 -03:00
3e00b8e79a Merge pull request #38 from stefancrain/master
Adding missing define in header, fixes #21
2015-12-18 15:36:27 +01:00
b956d0efe0 Merge pull request #40 from pyrou/patch-1
Add French localization
2015-12-18 15:35:45 +01:00
825feeebfc Fixed compile on OS X 10.11/ Xcode 7.x 2015-12-18 15:30:19 +01:00
b01a8cd165 Add French localization 2015-03-29 21:03:20 +02:00
2075ad0793 Adding missing define in header, fixes #21 2015-03-13 09:50:12 -04:00
196 changed files with 7096 additions and 5666 deletions

28
Classes/Constants.h Normal file
View File

@ -0,0 +1,28 @@
//
// Constants.h
// smcFanControl
//
// Created by Hendrik Holtmann on 16/10/16.
//
//
#define PREF_TEMP_UNIT @"Unit"
#define PREF_SELECTION_DEFAULT @"SelDefault"
#define PREF_AUTOSTART_ENABLED @"AutoStart"
#define PREF_AUTOMATIC_CHANGE @"AutomaticChange"
#define PREF_BATTERY_SELECTION @"selbatt"
#define PREF_AC_SELECTION @"selac"
#define PREF_CHARGING_SELECTION @"selload"
#define PREF_MENU_DISPLAYMODE @"MenuBar"
#define PREF_TEMPERATURE_SENSOR @"TSensor"
#define PREF_NUMBEROF_LAUNCHES @"NumLaunches"
#define PREF_DONATIONMESSAGE_DISPLAY @"DonationMessageDisplay"
#define PREF_MENU_TEXTCOLOR @"MenuColor"
#define PREF_FAVORITES_ARRAY @"Favorites"
#define PREF_FAN_ARRAY @"FanData"
#define PREF_FAN_TITLE @"Title"
#define PREF_FAN_MINSPEED @"Minspeed"
#define PREF_FAN_SELSPEED @"selspeed"
#define PREF_FAN_SYNC @"sync"
#define PREF_FAN_SHOWMENU @"menu"

View File

@ -34,6 +34,7 @@
#include <IOKit/pwr_mgt/IOPMLib.h>
#include <IOKit/IOMessage.h>
#import "Constants.h"
#define kMenuBarHeight 22

View File

@ -80,14 +80,14 @@ NSUserDefaults *defaults;
for (i=0;i<[rfavorites count];i++)
{
BOOL selected = NO;
NSArray *fans = rfavorites[i][@"FanData"];
NSArray *fans = rfavorites[i][PREF_FAN_ARRAY];
for (j=0;j<[fans count];j++) {
if ([fans[j][@"menu"] boolValue] == YES ) {
if ([fans[j][PREF_FAN_SHOWMENU] boolValue] == YES ) {
selected = YES;
}
}
if (selected==NO) {
rfavorites[i][@"FanData"][0][@"menu"] = @YES;
rfavorites[i][PREF_FAN_ARRAY][0][PREF_FAN_SHOWMENU] = @YES;
}
}
@ -111,8 +111,8 @@ NSUserDefaults *defaults;
NSMutableArray *favorites = [[NSMutableArray alloc] init];
NSMutableDictionary *defaultFav = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"Default", @"Title",
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:[[mdefaults get_machine_defaults] objectForKey:@"Fans"]]], @"FanData",nil];
NSMutableDictionary *defaultFav = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"Default", PREF_FAN_TITLE,
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:[[mdefaults get_machine_defaults] objectForKey:@"Fans"]]], PREF_FAN_ARRAY,nil];
[favorites addObject:defaultFav];
@ -120,12 +120,12 @@ NSUserDefaults *defaults;
NSRange range=[[MachineDefaults computerModel] rangeOfString:@"MacBook"];
if (range.length>0) {
//for macbooks add a second default
NSMutableDictionary *higherFav=[[NSMutableDictionary alloc] initWithObjectsAndKeys:@"Higher RPM", @"Title",
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:[[mdefaults get_machine_defaults] objectForKey:@"Fans"]]], @"FanData",nil];
NSMutableDictionary *higherFav=[[NSMutableDictionary alloc] initWithObjectsAndKeys:@"Higher RPM", PREF_FAN_TITLE,
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:[[mdefaults get_machine_defaults] objectForKey:@"Fans"]]], PREF_FAN_ARRAY,nil];
for (NSUInteger i=0;i<[_machineDefaultsDict[@"Fans"] count];i++) {
int min_value=([[[[_machineDefaultsDict objectForKey:@"Fans"] objectAtIndex:i] objectForKey:@"Minspeed"] intValue])*2;
[[[higherFav objectForKey:@"FanData"] objectAtIndex:i] setObject:[NSNumber numberWithInt:min_value] forKey:@"selspeed"];
int min_value=([[[[_machineDefaultsDict objectForKey:@"Fans"] objectAtIndex:i] objectForKey:PREF_FAN_MINSPEED] intValue])*2;
[[[higherFav objectForKey:PREF_FAN_ARRAY] objectAtIndex:i] setObject:[NSNumber numberWithInt:min_value] forKey:PREF_FAN_SELSPEED];
}
[favorites addObject:higherFav];
@ -141,19 +141,19 @@ NSUserDefaults *defaults;
defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:
[NSMutableDictionary dictionaryWithObjectsAndKeys:
@0, @"Unit",
@0, @"SelDefault",
@NO, @"AutoStart",
@NO,@"AutomaticChange",
@0,@"selbatt",
@0,@"selac",
@0,@"selload",
@0,@"MenuBar",
@"TC0D",@"TSensor",
@0,@"NumLaunches",
@NO,@"DonationMessageShown",
[NSArchiver archivedDataWithRootObject:[NSColor blackColor]],@"MenuColor",
favorites,@"Favorites",
@0, PREF_TEMP_UNIT,
@0, PREF_SELECTION_DEFAULT,
@NO,PREF_AUTOSTART_ENABLED,
@NO,PREF_AUTOMATIC_CHANGE,
@0, PREF_BATTERY_SELECTION,
@0, PREF_AC_SELECTION,
@0, PREF_CHARGING_SELECTION,
@0, PREF_MENU_DISPLAYMODE,
@"TC0D",PREF_TEMPERATURE_SENSOR,
@0, PREF_NUMBEROF_LAUNCHES,
@NO,PREF_DONATIONMESSAGE_DISPLAY,
[NSArchiver archivedDataWithRootObject:[NSColor blackColor]],PREF_MENU_TEXTCOLOR,
favorites,PREF_FAVORITES_ARRAY,
nil]];
@ -169,15 +169,15 @@ NSUserDefaults *defaults;
[FavoritesController bind:@"content"
toObject:[NSUserDefaultsController sharedUserDefaultsController]
withKeyPath:@"values.Favorites"
withKeyPath:[@"values." stringByAppendingString:PREF_FAVORITES_ARRAY]
options:nil];
[FavoritesController setEditable:YES];
// set slider sync - only for MBP
for (i=0;i<[[FavoritesController arrangedObjects] count];i++) {
if([[FavoritesController arrangedObjects][i][@"sync"] boolValue]==YES) {
if([[FavoritesController arrangedObjects][i][PREF_FAN_SYNC] boolValue]==YES) {
[FavoritesController setSelectionIndex:i];
[self syncBinder:[[FavoritesController arrangedObjects][i][@"sync"] boolValue]];
[self syncBinder:[[FavoritesController arrangedObjects][i][PREF_FAN_SYNC] boolValue]];
}
}
@ -198,8 +198,8 @@ NSUserDefaults *defaults;
[autochange setEnabled:false];
}
[faqText replaceCharactersInRange:NSMakeRange(0,0) withRTF: [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"F.A.Q" ofType:@"rtf"]]];
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"SelDefault"] intValue]];
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:[[defaults objectForKey:@"SelDefault"] intValue]] setState:NSOnState];
[self apply_settings:nil controllerindex:[[defaults objectForKey:PREF_SELECTION_DEFAULT] intValue]];
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:[[defaults objectForKey:PREF_SELECTION_DEFAULT] intValue]] setState:NSOnState];
[[sliderCell dataCell] setControlSize:NSSmallControlSize];
[self changeMenu:nil];
@ -222,12 +222,15 @@ NSUserDefaults *defaults;
[self upgradeFavorites];
//autostart
[[NSUserDefaults standardUserDefaults] setValue:@([self isInAutoStart]) forKey:@"AutoStart"];
NSUInteger numLaunches = [[[NSUserDefaults standardUserDefaults] objectForKey:@"NumLaunches"] integerValue];
[[NSUserDefaults standardUserDefaults] setObject:@(numLaunches+1) forKey:@"NumLaunches"];
if (numLaunches != 0 && (numLaunches % 5 == 0) && ![[[NSUserDefaults standardUserDefaults] objectForKey:@"DonationMessageShown"] boolValue]) {
[[NSUserDefaults standardUserDefaults] setValue:@([self isInAutoStart]) forKey:PREF_AUTOSTART_ENABLED];
NSUInteger numLaunches = [[[NSUserDefaults standardUserDefaults] objectForKey:PREF_NUMBEROF_LAUNCHES] integerValue];
[[NSUserDefaults standardUserDefaults] setObject:@(numLaunches+1) forKey:PREF_NUMBEROF_LAUNCHES];
if (numLaunches != 0 && (numLaunches % 3 == 0) && ![[[NSUserDefaults standardUserDefaults] objectForKey:PREF_DONATIONMESSAGE_DISPLAY] boolValue]) {
[self displayDonationMessage];
}
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(readFanData:) name:@"AppleInterfaceThemeChangedNotification" object:nil];
}
-(void)displayDonationMessage
@ -238,9 +241,9 @@ NSUserDefaults *defaults;
NSModalResponse code=[alert runModal];
if (code == NSAlertDefaultReturn) {
[self paypal:nil];
[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:@"DonationMessageShown"];
[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:PREF_DONATIONMESSAGE_DISPLAY];
} else if (code == NSAlertAlternateReturn) {
[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:@"DonationMessageShown"];
[[NSUserDefaults standardUserDefaults] setObject:@(YES) forKey:PREF_DONATIONMESSAGE_DISPLAY];
}
}
@ -293,7 +296,7 @@ NSUserDefaults *defaults;
- (IBAction)save_favorite:(id)sender{
MachineDefaults *msdefaults=[[MachineDefaults alloc] init:nil];
if ([[newfavorite_title stringValue] length]>0) {
NSMutableDictionary *toinsert=[[NSMutableDictionary alloc] initWithObjectsAndKeys:[newfavorite_title stringValue],@"Title",[msdefaults get_machine_defaults][@"Fans"],@"FanData",nil]; //default as template
NSMutableDictionary *toinsert=[[NSMutableDictionary alloc] initWithObjectsAndKeys:[newfavorite_title stringValue],@"Title",[msdefaults get_machine_defaults][@"Fans"],PREF_FAN_ARRAY,nil]; //default as template
[toinsert setValue:@0 forKey:@"Standard"];
[FavoritesController addObject:toinsert];
[newfavoritewindow close];
@ -315,9 +318,9 @@ NSUserDefaults *defaults;
{
if (returnCode==0) {
//delete favorite, but resets presets before
[self check_deletion:@"selbatt"];
[self check_deletion:@"selac"];
[self check_deletion:@"selload"];
[self check_deletion:PREF_BATTERY_SELECTION];
[self check_deletion:PREF_AC_SELECTION];
[self check_deletion:PREF_CHARGING_SELECTION];
[FavoritesController removeObjects:[FavoritesController selectedObjects]];
}
}
@ -346,7 +349,7 @@ NSUserDefaults *defaults;
// as low as possible.
bool bNeedTemp = false;
bool bNeedRpm = false;
const int menuBarSetting = [[defaults objectForKey:@"MenuBar"] intValue];
const int menuBarSetting = [[defaults objectForKey:PREF_MENU_DISPLAYMODE] intValue];
switch (menuBarSetting) {
default:
case 1:
@ -377,10 +380,10 @@ NSUserDefaults *defaults;
if (bNeedRpm == true) {
// Read the current fan speed for the desired fan and format text for display in the menubar.
NSArray *fans = [FavoritesController arrangedObjects][[FavoritesController selectionIndex]][@"FanData"];
NSArray *fans = [FavoritesController arrangedObjects][[FavoritesController selectionIndex]][PREF_FAN_ARRAY];
for (i=0; i<g_numFans && i<[fans count]; i++)
{
if ([fans[i][@"menu"] boolValue]==YES) {
if ([fans[i][PREF_FAN_SHOWMENU] boolValue]==YES) {
selectedRpm = [smcWrapper get_fan_rpm:i];
break;
}
@ -397,7 +400,7 @@ NSUserDefaults *defaults;
// Read current temperature and format text for the menubar.
c_temp = [smcWrapper get_maintemp];
if ([[defaults objectForKey:@"Unit"] intValue]==0) {
if ([[defaults objectForKey:PREF_TEMP_UNIT] intValue]==0) {
temp = [NSString stringWithFormat:@"%@%CC",@(c_temp),(unsigned short)0xb0];
} else {
NSNumberFormatter *ncf=[[NSNumberFormatter alloc] init];
@ -410,11 +413,19 @@ NSUserDefaults *defaults;
NSMutableAttributedString *s_status = nil;
NSMutableParagraphStyle *paragraphStyle = nil;
NSColor *menuColor = (NSColor*)[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:@"MenuColor"]];
NSColor *menuColor = (NSColor*)[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:PREF_MENU_TEXTCOLOR]];
BOOL setColor = NO;
if (!([[menuColor colorUsingColorSpaceName:
NSCalibratedWhiteColorSpace] whiteComponent] == 0.0) || ![statusItem respondsToSelector:@selector(button)]) setColor = YES;
NSString *osxMode = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
if (osxMode && !setColor) {
menuColor = [NSColor whiteColor];
setColor = YES;
}
switch (menuBarSetting) {
default:
case 1: {
@ -438,6 +449,7 @@ NSUserDefaults *defaults;
if (setColor) [s_status addAttribute:NSForegroundColorAttributeName value:menuColor range:NSMakeRange(0,[s_status length])];
if ([statusItem respondsToSelector:@selector(button)]) {
[statusItem.button setAttributedTitle:s_status];
[statusItem.button setImage:nil];
@ -505,7 +517,7 @@ NSUserDefaults *defaults;
- (IBAction)savePreferences:(id)sender{
[(NSUserDefaultsController *)DefaultsController save:sender];
[defaults setValue:[FavoritesController content] forKey:@"Favorites"];
[defaults setValue:[FavoritesController content] forKey:PREF_FAVORITES_ARRAY];
[defaults synchronize];
[mainwindow close];
[self apply_settings:sender controllerindex:[FavoritesController selectionIndex]];
@ -526,8 +538,8 @@ NSUserDefaults *defaults;
int i;
[FanControl setRights];
[FavoritesController setSelectionIndex:cIndex];
for (i=0;i<[[FavoritesController arrangedObjects][cIndex][@"FanData"] count];i++) {
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMn",i] value:[[FanController arrangedObjects][i][@"selspeed"] tohex]];
for (i=0;i<[[FavoritesController arrangedObjects][cIndex][PREF_FAN_ARRAY] count];i++) {
[smcWrapper setKey_external:[NSString stringWithFormat:@"F%dMn",i] value:[[FanController arrangedObjects][i][PREF_FAN_SELSPEED] tohex]];
}
NSMenu *submenu = [[NSMenu alloc] init];
@ -545,9 +557,9 @@ NSUserDefaults *defaults;
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:i] setState:NSOffState];
}
[[[[theMenu itemWithTag:1] submenu] itemAtIndex:cIndex] setState:NSOnState];
[defaults setObject:@(cIndex) forKey:@"SelDefault"];
[defaults setObject:@(cIndex) forKey:PREF_SELECTION_DEFAULT];
//change active setting display
[[theMenu itemWithTag:1] setTitle:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Active Setting",nil),[FavoritesController arrangedObjects][[FavoritesController selectionIndex]][@"Title"] ]];
[[theMenu itemWithTag:1] setTitle:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Active Setting",nil),[FavoritesController arrangedObjects][[FavoritesController selectionIndex]][PREF_FAN_TITLE] ]];
}
@ -587,7 +599,7 @@ NSUserDefaults *defaults;
- (IBAction) changeMenu:(id)sender{
if ([[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:@"MenuBar"] intValue]==2) {
if ([[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:PREF_MENU_DISPLAYMODE] intValue]==2) {
[colorSelector setEnabled:NO];
} else {
[colorSelector setEnabled:YES];
@ -600,7 +612,7 @@ NSUserDefaults *defaults;
int i;
for (i=0;i<[[FanController arrangedObjects] count];i++) {
if (i!=[sender selectedRow]) {
[[FanController arrangedObjects][i] setValue:@NO forKey:@"menu"];
[[FanController arrangedObjects][i] setValue:@NO forKey:PREF_FAN_SHOWMENU];
}
}
}
@ -676,7 +688,7 @@ NSUserDefaults *defaults;
}
- (IBAction)visitHomepage:(id)sender{
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.eidac.de/products"]];
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.eidac.de/products"]];
}
@ -688,11 +700,11 @@ NSUserDefaults *defaults;
//in case plist is corrupt, don't bind
if ([[FanController arrangedObjects] count]>1 ) {
if (bind==YES) {
[[FanController arrangedObjects][1] bind:@"selspeed" toObject:[FanController arrangedObjects][0] withKeyPath:@"selspeed" options:nil];
[[FanController arrangedObjects][0] bind:@"selspeed" toObject:[FanController arrangedObjects][1] withKeyPath:@"selspeed" options:nil];
[[FanController arrangedObjects][1] bind:PREF_FAN_SELSPEED toObject:[FanController arrangedObjects][0] withKeyPath:PREF_FAN_SELSPEED options:nil];
[[FanController arrangedObjects][0] bind:PREF_FAN_SELSPEED toObject:[FanController arrangedObjects][1] withKeyPath:PREF_FAN_SELSPEED options:nil];
} else {
[[FanController arrangedObjects][1] unbind:@"selspeed"];
[[FanController arrangedObjects][0] unbind:@"selspeed"];
[[FanController arrangedObjects][1] unbind:PREF_FAN_SELSPEED];
[[FanController arrangedObjects][0] unbind:PREF_FAN_SELSPEED];
}
}
}
@ -701,27 +713,27 @@ NSUserDefaults *defaults;
#pragma mark **Power Watchdog-Methods**
- (void)systemDidWakeFromSleep:(id)sender{
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"SelDefault"] intValue]];
[self apply_settings:nil controllerindex:[[defaults objectForKey:PREF_SELECTION_DEFAULT] intValue]];
}
- (void)powerChangeToBattery:(id)sender{
if ([[defaults objectForKey:@"AutomaticChange"] boolValue]==YES) {
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"selbatt"] intValue]];
[self apply_settings:nil controllerindex:[[defaults objectForKey:PREF_BATTERY_SELECTION] intValue]];
}
}
- (void)powerChangeToAC:(id)sender{
if ([[defaults objectForKey:@"AutomaticChange"] boolValue]==YES) {
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"selac"] intValue]];
[self apply_settings:nil controllerindex:[[defaults objectForKey:PREF_AC_SELECTION] intValue]];
}
}
- (void)powerChangeToACLoading:(id)sender{
if ([[defaults objectForKey:@"AutomaticChange"] boolValue]==YES) {
[self apply_settings:nil controllerindex:[[defaults objectForKey:@"selload"] intValue]];
[self apply_settings:nil controllerindex:[[defaults objectForKey:PREF_CHARGING_SELECTION] intValue]];
}
}
@ -873,6 +885,11 @@ NSUserDefaults *defaults;
}
-(void)dealloc
{
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
}
@end

View File

@ -76,7 +76,14 @@
}
//save to plist for future
NSMutableArray *supported_m=[[NSMutableArray alloc] initWithContentsOfFile:[[[NSFileManager defaultManager] applicationSupportDirectory] stringByAppendingPathComponent:@"Machines.plist"]];
NSMutableDictionary *new_machine= [[NSMutableDictionary alloc] initWithDictionary:@{@"Fans": fans,@"NumFans": @(num_fans),@"Machine": machine,@"Comment": @"Autogenerated",@"Minspeed": min,@"Maxspeed": max}];
NSMutableDictionary *new_machine;
if (fans == nil)
{
new_machine= [[NSMutableDictionary alloc] initWithDictionary:@{@"Fans": [NSNull null],@"NumFans": @(0),@"Machine": machine,@"Comment": @"Autogenerated",@"Minspeed": min,@"Maxspeed": max}];
} else {
new_machine= [[NSMutableDictionary alloc] initWithDictionary:@{@"Fans": fans,@"NumFans": @(num_fans),@"Machine": machine,@"Comment": @"Autogenerated",@"Minspeed": min,@"Maxspeed": max}];
}
[supported_m addObject:new_machine];
//save to plist

View File

@ -21,10 +21,10 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <openssl/evp.h>
#import <Cocoa/Cocoa.h>
#import <smc.h>
#import <MachineDefaults.h>
#import "Constants.h"
@interface smcWrapper : NSObject {
}

View File

@ -23,7 +23,7 @@
#import "smcWrapper.h"
#import <CommonCrypto/CommonDigest.h>
NSString * const smc_checksum=@"4c9919172e1111c660f12015a7324767";
NSString * const smc_checksum=@"b8e7e0f50c1d837cedd91d9af54b167f";
NSArray *allSensors;
@ -41,7 +41,7 @@ NSArray *allSensors;
{
float retValue;
SMCVal_t val;
NSString *sensor = [[NSUserDefaults standardUserDefaults] objectForKey:@"TSensor"];
NSString *sensor = [[NSUserDefaults standardUserDefaults] objectForKey:PREF_TEMPERATURE_SENSOR];
SMCReadKey2((char*)[sensor UTF8String], &val,conn);
retValue= ((val.bytes[0] * 256 + val.bytes[1]) >> 2)/64;
allSensors = [NSArray arrayWithObjects:@"TC0D",@"TC0P",@"TCAD",@"TC0H",@"TC0F",@"TCAH",@"TCBH",nil];
@ -50,7 +50,7 @@ NSArray *allSensors;
SMCReadKey2((char*)[sensor UTF8String], &val,conn);
retValue= ((val.bytes[0] * 256 + val.bytes[1]) >> 2)/64;
if (retValue>0 && floor(retValue) != 129 ) {
[[NSUserDefaults standardUserDefaults] setObject:sensor forKey:@"TSensor"];
[[NSUserDefaults standardUserDefaults] setObject:sensor forKey:PREF_TEMPERATURE_SENSOR];
[[NSUserDefaults standardUserDefaults] synchronize];
break;
}

View File

@ -7,11 +7,11 @@
<key>CFBundleExecutable</key>
<string>smcFanControl</string>
<key>CFBundleGetInfoString</key>
<string>smcFanControl 2.5.2, Hendrik Holtmann (GPL)</string>
<string>smcFanControl 2.6, Hendrik Holtmann (GPL)</string>
<key>CFBundleIconFile</key>
<string>smcfancontrol_v2</string>
<key>CFBundleIdentifier</key>
<string>com.eidac.smcFanControl2</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
@ -19,11 +19,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.5.2</string>
<string>2.6</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>2.5.2</string>
<string>2.6</string>
<key>LSUIElement</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
@ -33,6 +33,6 @@
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>SUFeedURL</key>
<string>http://www.eidac.de/smcfancontrol/smcfancontrol.xml</string>
<string>https://www.eidac.de/smcfancontrol/smcfancontrol.xml</string>
</dict>
</plist>

View File

@ -1,13 +1,27 @@
smcFanControl
=============
# smcFanControl
smcFanControl lets the user set a minimum speed for built-in fans. It allows you to increase your minimum fan speed to make your Intel Mac run cooler. In order to not damage your machine, smcFanControl does not let you set a minimum speed to a value below Apple's defaults.
![My image](https://dl.dropbox.com/u/363242/screenshots/smc_screenshot.png)
Requirements: Intel Mac / OS X 10.5 or higher
Compiled version: http://www.eidac.de/smcfancontrol/smcfancontrol_2_4.zip
## Installing it using Homebrew & Cask
Make sure you have both [Homebrew](http://brew.sh/) and [Cask](http://caskroom.io/) installed. You'll find intructions to install both tools on their respective websites.
After installing Homebrew and Cask, run:
```
$ brew cask install smcfancontrol
```
After that you'll be able to use Spotilight to launch smcFanControl normally. :-)
Requirements: Intel Mac / OS X 10.6 or higher
Compiled version: http://www.eidac.de/smcfancontrol/smcfancontrol_2_5_2.zip
FAQ / More info: Found in project under "Ressources/*.lproj/F.A.Q.rtf" or included in above .zip

View File

@ -1,14 +1,14 @@
{\rtf1\ansi\ansicpg1252\cocoartf1187
{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf340
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}
{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}
\paperw12240\paperh15840\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.4\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.6\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\fs24 \cf0 \
@ -87,7 +87,7 @@ Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?
\
\b What are the main-differences between Version 1.2x and Version 2.x of smcFanControl?\
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0
\ls1\ilvl0
\b0 \cf0 {\listtext \'95 }Version 2.x is a completely rewritten application.\
{\listtext \'95 }Version 1.x was a "regular" application located in the dock. Version 2.x sits in the menubar for quicker access to the fan settings, easier monitoring and a better overall user-experience\
@ -97,16 +97,16 @@ Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?
{\listtext \'95 }Version 2.x has got an "add to login-items option" now\
{\listtext \'95 }Version 2.x uses standard OS X authentication now\
{\listtext \'95 }Version 2.x uses the Sparkle-Framework to automatically check for updates\
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\b \cf0 \
Sourcecode: https://github.com/hholtmann/smcFanControl
\b0 \
\b \
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\b0 \cf0 \
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0
\ls2\ilvl0\cf0 \
}

View File

@ -1,13 +1,13 @@
{\rtf1\ansi\ansicpg1252\cocoartf1187
{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf340
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
\paperw12240\paperh15840\vieww10800\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.4\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.6\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\fs24 \cf0 \
@ -86,10 +86,10 @@ Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?
\b \
\b0 \
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\ls1\ilvl0
\b \cf0 {\listtext \'95 }What are the main-differences between Version 1.2x and Version 2.x of smcFanControl?\
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0
\ls1\ilvl0
\b0 \cf0 {\listtext \'95 }Version 2.x is a completely rewritten application.\
{\listtext \'95 }Version 1.x was a "regular" application located in the dock. Version 2.x sits in the menubar for quicker access to the fan settings, easier monitoring and a better overall user-experience\
@ -100,7 +100,7 @@ Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?
{\listtext \'95 }Version 2.x uses standard OS X authentication now\
{\listtext \'95 }Version 2.x uses the Sparkle-Framework to automatically check for updates\
{\listtext \'95 }\
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\cf0 \
\b Sourcecode: https://github.com/hholtmann/smcFanControl

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,95 @@
{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf340
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
\paperw12240\paperh15840\vieww10800\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs62 \cf0 F.A.Q smcFanControl 2.6\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\fs24 \cf0 \
\b Comment installer ou d\'e9sinstaller smcFanControl?\
\b0 smcFanControl est une simple application. Ainsi apr\'e8s son t\'e9l\'e9chargement, d\'e9placez-le o\'f9 vous le souhaitez (ex. le dossier Applications). Pour le d\'e9sinstaller, il suffit de le d\'e9placer dans la corbeille. smcFanControl n'installer aucun d\'e9mon ou processus en arri\'e8re plan. \
To les changements op\'e9r\'e9s par smcFanControl sur le contr\'f4leur de ventilation sont perdus \'e0 l'extinction de la machine (pas lors d'un red\'e9marrage) ou lorsque la machine entre veille (si smcFanControl n'est plus en cours d'ex\'e9cution \'e0 la reprise d'activit\'e9). La vitesse minimum de rotation revient alors \'e0 la valeur par d\'e9faut d\'e9finie par le syst\'e8me.\
\
\b Lorsque j'utilise smcFanControl et d\'e9finis une vitesse minimum, la vitesse augmente-t-elle tout de m\'eame lorsque la temp\'e9rature du CPU augmente ?\
Oui
\b0 , la vitesse augmentera comme d\'e9fini par Apple. smcFanControl laissera toujours vos ventilateur en mode automatique et ne modifiera \ul que la vitesse minimum\ulnone du ventilateur. Ainsi, plus la vitesse minimum d\'e9finie est \'e9lev\'e9e, plus le contr\'f4leur de ventilation mettra du temps \'e0 juger n\'e9c\'e9ssaire l'augmentation de vitesse \'e0 mesure que la temp\'e9rature augmente.\
\
\b Pourquoi smcFanControl me demande un identifiant et un mot de passe et quels identifiants dois-je utiliser ?\
\b0 smcFanControl a besoin des identifiants d'un compte administrateur afin de pouvoir modifier la vitesse de rotation des ventilateurs. Vous n'aurez \'e0 les rentrer qu'une seuls fois. Pour autant, ces identifiants ne sont pas sauvegard\'e9s par smcFanControl. Ils sont justes utilis\'e9s pour voir d\'e9finir correctement les droits d'ex\'e9cution du programme.\
\
\b J'obtiens le message d'avertissement "smcFanControl n'a pas encore \'e9t\'e9 test\'e9 sur cette machine". Qu'est ce que cela signifie?\
\b0 Techniquement, smcFanControl fonctionne avec tous les Mac intel, mais ces machines ont des valeurs par d\'e9faut diff\'e9rente. Si vous obtenez ce message, smcFanControl tente de lire la valeur par d\'e9faut directement du System Management Controller. Si vous suivez les instructions (ne pas lancer d'autres logiciels de gestion de ventilation, etc.) vous devriez pouvoir utiliser smcFanControl sur une machine que n'a pas encore \'e9t\'e9 test\'e9e par nos soins.\
\
\b Comment revenir au valeur par d\'e9fauts d\'e9finies par Apple ?\
\b0 Placer les curseurs \'e0 gaucher et cliquer "enregistrer". Les valeurs minimales autoris\'e9es sont celles d\'e9finies par d\'e9faut par Apple. Depuis la derni\'e8re mise \'e0 jour Apple du contr\'f4leur SMC les valeurs minimum par d\'e9faut sont de 1000rpm pour les MBP 15,4", 1500rpm pour le MB 13,3". 2000rpm les MBP Core2Duo et 1800rpm pour les MB Core2Duo.\
\b \
Pourquoi ne puis-je pas d\'e9finir 0 rpm?\
\b0 smcFanControl ne vous permet que de d\'e9finir une valeur comprise entre les minimum et maximum d'Apple. D\'e9finir une valeur \'e0 0 est possible sur le plan technique mais provoquerait probablement des dommages \'e0 votre mat\'e9riel.\
\
\b Quand les r\'e9glages smcFanControl sont-ils perdus ?\
\b0 Les r\'e9glages de vitesse minimum de rotation des ventilateurs sont perdus dans deux sc\'e9narios :\
a) L'ordinateur est entr\'e9 en veille et smcFanControl n'est plus en cours d'ex\'e9cution (dans le cas contraire, smcFanControl v\'e9rifie l'\'e9tat de veille et applique \'e0 nouveau les r\'e9glages au r\'e9veil de la machine).\
b) \'c9teindre votre machine.\
\
\b Quelle sonde est utilis\'e9e pour lire la temp\'e9rature affich\'e9e?\
\b0 Ce n'est pas directement la sonde du CPU CoreDuo. Cela permet en outre de ne pas charg\'e9 une extension Kernel afin de lire la temp\'e9rature. La sonde utilis\'e9e est tr\'e8s proche de celle du CoreDuo, mais n'est effectivement pas exactement pareil.\
\
\b Qu'en est il de Windows avec Bootcamp?\
\
\b0 smcFanControl \'e9tant une application native OSX, vous ne pouvez d\'e9finir la valeur minimum des rotation lorsque vous \'eates sous windows.\
Toutefois, vous pouvez d\'e9finir une vitesse minimale sous OSX puis red\'e9marrer sous windows, vos r\'e9glages n'\'e9tant pas perdu lors du red\'e9marrage. Certes personnes ont report\'e9s que cette m\'e9thode permettait de se pr\'e9venir de certain crash de jeux sous Windows.\
\
\b Ne serait-il pas mieux de d\'e9finir la vitesse de rotation en fonction de la temp\'e9rature plut\'f4t que de choisir une vitesse minimale et laisse Apple faire le reste ?\
\b0 Oui, cette approche serait probablement plus int\'e9ressante. MAIS : cette m\'e9thode n'a pas \'e9t\'e9 retenue car elle comporte des risques. D\'e9finir la vitesse en fonction de la temp\'e9rature requiert un programme qui tourne en continue. Si ce programme crash ou devient incompatible \'e0 la suite d'une mise \'e0 jour, le ventilateur pourrait \'eatre d\'e9fini \'e0 une valeur trop basse qui pourrait endommager votre machine. D'autre part, cette logique est complexe \'e0 mettre en oeuvre. Un mac intel poss\'e8de une dizaine de sondes de temp\'e9rature, lues continuellement afin de d\'e9finir la vitesse ad\'e9quate de rotation des ventilateurs. Ainsi il ne serait pas judicieux de se reposer sur la lecture d'une seule sonde pour le contr\'f4le de la ventilation.\
\
\b Je poss\'e8de un MBP et smcFanControl m'indique 0 rpm pour l'un des ventilateurs\
\b0 Dans ce cas, le ventilateur n'a remont\'e9 aucune information \'e0 smcFanControl.
\b
\b0 Il est possible que le ventilateur subisse un disfonctionnement. Vous pouvez diagnostiquer vitre Mac \'e0 l'aide du Test Hardware d'Apple (cette outils est livr\'e9 avec le DVD d'installation de votre machine).
\b \
\b0 \
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\ls1\ilvl0
\b \cf0 Quelles sont les principales diff\'e9rence entre les versions 1.2x et 2.x de smcFanControl ?\
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0
\ls1\ilvl0
\b0 \cf0 {\listtext \'95 }La version 2.x a \'e9t\'e9 enti\'e8rement r\'e9\'e9crites.\
{\listtext \'95 }La version 1.x \'e9tait une application "normale" plac\'e9e dans le dock. La version 2.x se trouve d\'e9sormais dans la bar des menus, permettant un acc\'e8s rapide ainsi qu'un contr\'f4le plus simple de la temp\'e9rature et vitesse de rotation.\
{\listtext \'95 }La version 2.x supporte tous les Macs intel.\
{\listtext \'95 }Dans la version 2.x vous pouvez d\'e9finir plusieurs r\'e9glages favoris et les activer en un clic.\
{\listtext \'95 }Sur les Macs portables, vous pouvez activer automatiquement un r\'e9glage favoris en fonction de la source d'alimentation. Ainsi vous pouvez choisir de rafraichir automatique votre mac lorsque que celui-ci est branch\'e9 ou en charge (et que typiquement dans ces conditions il chauffe davantage).\
{\listtext \'95 }La version 2.x poss\'e8de d\'e9sormais une option de d\'e9marrage automatique avec la session.\
{\listtext \'95 }La version 2.x utilise la fen\'eatre standard d'authentification d'OSX\
{\listtext \'95 }La version 2.x uses the Framework Sparkle pour v\'e9rifier automatiquement les mises \'e0 jour\
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\cf0 \
\b Code source : https://github.com/hholtmann/smcFanControl
\b0 \
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,14 +1,14 @@
{\rtf1\ansi\ansicpg1252\cocoartf1187
{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf340
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}
{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}
\paperw12240\paperh15840\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.4\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\f0\fs62 \cf0 F.A.Q for smcFanControl 2.6\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\fs24 \cf0 \
@ -89,7 +89,7 @@ Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?
\b0 \
\b What are the main-differences between Version 1.2x and Version 2.x of smcFanControl?\
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0
\ls1\ilvl0
\b0 \cf0 {\listtext \'95 }Version 2.x is a completely rewritten application.\
{\listtext \'95 }Version 1.x was a "regular" application located in the dock. Version 2.x sits in the menubar for quicker access to the fan settings, easier monitoring and a better overall user-experience\
@ -99,12 +99,12 @@ Will there be a version of smcFanControl for Powerbooks or other PPC based Macs?
{\listtext \'95 }Version 2.x has got an "add to login-items option" now\
{\listtext \'95 }Version 2.x uses standard OS X authentication now\
{\listtext \'95 }Version 2.x uses the Sparkle-Framework to automatically check for updates\
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\b \cf0 \
Sourcecode: https://github.com/hholtmann/smcFanControl
\b0 \
\
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0
\ls2\ilvl0\cf0 \
}

View File

@ -1,13 +1,13 @@
{\rtf1\ansi\ansicpg1252\cocoartf1187
{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf340
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}}
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
\paperw12240\paperh15840\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs62 \cf0 F.A.Q para smcFanControl 2.4\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\f0\fs62 \cf0 F.A.Q para smcFanControl 2.6\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\fs24 \cf0 \
@ -84,7 +84,7 @@ b) La m\'e1quina se apaga.\
\
\b \'bfCuales son las principales diferencias entre las versiones 1.2.x y 2.x de smcFanControl?\
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural
\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0
\ls1\ilvl0
\b0 \cf0 {\listtext \'95 }La versi\'f3n 2.x est\'e1 completamente rescrita.\
{\listtext \'95 }La versi\'f3n 1.x era una aplicaci\'f3n "regular" en el dock. La versi\'f3n 2.x se coloca en la barra de menu, por lo que se accede r\'e1pidamente a los ajustes de los ventiladores, al control de temperatura y en general un uso m\'e1s agradable\
@ -94,11 +94,10 @@ b) La m\'e1quina se apaga.\
{\listtext \'95 }La versi\'f3n 2.x tiene la opci\'f3n de "a\'f1adir a los elementos de inicio"\
{\listtext \'95 }La versi\'f3n 2.x usa la autenticaci\'f3n est\'e1ndard de OS X\
{\listtext \'95 }La versi\'f3n 2.x usa el "Sparkle-Framework" para busca autom\'e1ticamente actualizaciones\
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\cf0 \
\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\b \cf0 Sourcecode: https://github.com/hholtmann/smcFanControl
\b Sourcecode: https://github.com/hholtmann/smcFanControl
\b0 \
\
}

1
Sparkle.framework/Modules Symbolic link
View File

@ -0,0 +1 @@
Versions/Current/Modules

View File

@ -0,0 +1 @@
Versions/Current/PrivateHeaders

View File

@ -9,29 +9,19 @@
#ifndef SUAPPCAST_H
#define SUAPPCAST_H
@protocol SUAppcastDelegate;
#import <Foundation/Foundation.h>
#import "SUExport.h"
@class SUAppcastItem;
@interface SUAppcast : NSObject<NSURLDownloadDelegate>
{
@private
NSArray *items;
NSString *userAgentString;
id<SUAppcastDelegate> delegate;
NSString *downloadFilename;
NSURLDownload *download;
}
@property (assign) id<SUAppcastDelegate> delegate;
SU_EXPORT @interface SUAppcast : NSObject<NSURLDownloadDelegate>
@property (copy) NSString *userAgentString;
@property (copy) NSDictionary *httpHeaders;
- (void)fetchAppcastFromURL:(NSURL *)url;
- (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))err;
- (SUAppcast *)copyWithoutDeltaUpdates;
- (NSArray *)items;
@end
@protocol SUAppcastDelegate <NSObject>
- (void)appcastDidFinishLoading:(SUAppcast *)appcast;
- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error;
@property (readonly, copy) NSArray *items;
@end
#endif

View File

@ -9,53 +9,35 @@
#ifndef SUAPPCASTITEM_H
#define SUAPPCASTITEM_H
@interface SUAppcastItem : NSObject
{
@private
NSString *title;
NSDate *date;
NSString *itemDescription;
#import <Foundation/Foundation.h>
#import "SUExport.h"
NSURL *releaseNotesURL;
NSString *DSASignature;
NSString *minimumSystemVersion;
NSString *maximumSystemVersion;
NSURL *fileURL;
NSString *versionString;
NSString *displayVersionString;
NSDictionary *deltaUpdates;
NSDictionary *propertiesDictionary;
NSURL *infoURL; // UK 2007-08-31
}
SU_EXPORT @interface SUAppcastItem : NSObject
@property (copy, readonly) NSString *title;
@property (copy, readonly) NSDate *date;
@property (copy, readonly) NSString *itemDescription;
@property (retain, readonly) NSURL *releaseNotesURL;
@property (strong, readonly) NSURL *releaseNotesURL;
@property (copy, readonly) NSString *DSASignature;
@property (copy, readonly) NSString *minimumSystemVersion;
@property (copy, readonly) NSString *maximumSystemVersion;
@property (retain, readonly) NSURL *fileURL;
@property (strong, readonly) NSURL *fileURL;
@property (copy, readonly) NSString *versionString;
@property (copy, readonly) NSString *displayVersionString;
@property (copy, readonly) NSDictionary *deltaUpdates;
@property (retain, readonly) NSURL *infoURL;
@property (strong, readonly) NSURL *infoURL;
// Initializes with data from a dictionary provided by the RSS class.
- (id)initWithDictionary:(NSDictionary *)dict;
- (id)initWithDictionary:(NSDictionary *)dict failureReason:(NSString**)error;
- (instancetype)initWithDictionary:(NSDictionary *)dict;
- (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error;
- (BOOL)isDeltaUpdate;
- (BOOL)isCriticalUpdate;
@property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate;
@property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate;
@property (getter=isInformationOnlyUpdate, readonly) BOOL informationOnlyUpdate;
// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.
- (NSDictionary *)propertiesDictionary;
@property (readonly, copy) NSDictionary *propertiesDictionary;
- (NSURL *)infoURL; // UK 2007-08-31
- (NSURL *)infoURL;
@end

View File

@ -0,0 +1,47 @@
//
// SUErrors.h
// Sparkle
//
// Created by C.W. Betts on 10/13/14.
// Copyright (c) 2014 Sparkle Project. All rights reserved.
//
#ifndef SUERRORS_H
#define SUERRORS_H
#import <Foundation/Foundation.h>
#import "SUExport.h"
/**
* Error domain used by Sparkle
*/
SU_EXPORT extern NSString *const SUSparkleErrorDomain;
typedef NS_ENUM(OSStatus, SUError) {
// Appcast phase errors.
SUAppcastParseError = 1000,
SUNoUpdateError = 1001,
SUAppcastError = 1002,
SURunningFromDiskImageError = 1003,
// Downlaod phase errors.
SUTemporaryDirectoryError = 2000,
// Extraction phase errors.
SUUnarchivingError = 3000,
SUSignatureError = 3001,
// Installation phase errors.
SUFileCopyFailure = 4000,
SUAuthenticationFailure = 4001,
SUMissingUpdateError = 4002,
SUMissingInstallerToolError = 4003,
SURelaunchError = 4004,
SUInstallationError = 4005,
SUDowngradeError = 4006,
// System phase errors
SUSystemPowerOffError = 5000
};
#endif

View File

@ -0,0 +1,18 @@
//
// SUExport.h
// Sparkle
//
// Created by Jake Petroules on 2014-08-23.
// Copyright (c) 2014 Sparkle Project. All rights reserved.
//
#ifndef SUEXPORT_H
#define SUEXPORT_H
#ifdef BUILDING_SPARKLE
#define SU_EXPORT __attribute__((visibility("default")))
#else
#define SU_EXPORT
#endif
#endif

View File

@ -0,0 +1,38 @@
//
// SUStandardVersionComparator.h
// Sparkle
//
// Created by Andy Matuschak on 12/21/07.
// Copyright 2007 Andy Matuschak. All rights reserved.
//
#ifndef SUSTANDARDVERSIONCOMPARATOR_H
#define SUSTANDARDVERSIONCOMPARATOR_H
#import <Foundation/Foundation.h>
#import "SUExport.h"
#import "SUVersionComparisonProtocol.h"
/*!
Sparkle's default version comparator.
This comparator is adapted from MacPAD, by Kevin Ballard.
It's "dumb" in that it does essentially string comparison,
in components split by character type.
*/
SU_EXPORT @interface SUStandardVersionComparator : NSObject <SUVersionComparison>
/*!
Returns a singleton instance of the comparator.
*/
+ (SUStandardVersionComparator *)defaultComparator;
/*!
Compares version strings through textual analysis.
See the implementation for more details.
*/
- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB;
@end
#endif

View File

@ -9,67 +9,114 @@
#ifndef SUUPDATER_H
#define SUUPDATER_H
#import <Foundation/Foundation.h>
#import "SUExport.h"
#import "SUVersionComparisonProtocol.h"
#import "SUVersionDisplayProtocol.h"
@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;
@class SUAppcastItem, SUAppcast;
@interface SUUpdater : NSObject
{
@private
NSTimer *checkTimer;
SUUpdateDriver *driver;
@protocol SUUpdaterDelegate;
NSString *customUserAgentString;
SUHost *host;
IBOutlet id delegate;
}
@property (assign) id delegate;
/*!
The main API in Sparkle for controlling the update mechanism.
This class is used to configure the update paramters as well as manually
and automatically schedule and control checks for updates.
*/
SU_EXPORT @interface SUUpdater : NSObject
@property (unsafe_unretained) IBOutlet id<SUUpdaterDelegate> delegate;
+ (SUUpdater *)sharedUpdater;
+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;
- (id)initForBundle:(NSBundle *)bundle;
- (instancetype)initForBundle:(NSBundle *)bundle;
- (NSBundle *)hostBundle;
@property (readonly, strong) NSBundle *hostBundle;
@property (strong, readonly) NSBundle *sparkleBundle;
- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks;
- (BOOL)automaticallyChecksForUpdates;
@property BOOL automaticallyChecksForUpdates;
- (void)setUpdateCheckInterval:(NSTimeInterval)interval;
- (NSTimeInterval)updateCheckInterval;
@property NSTimeInterval updateCheckInterval;
- (void)setFeedURL:(NSURL *)feedURL;
- (NSURL *)feedURL; // *** MUST BE CALLED ON MAIN THREAD ***
/*!
* The URL of the appcast used to download update information.
*
* This property must be called on the main thread.
*/
@property (copy) NSURL *feedURL;
- (void)setUserAgentString:(NSString *)userAgent;
- (NSString *)userAgentString;
@property (nonatomic, copy) NSString *userAgentString;
- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile;
- (BOOL)sendsSystemProfile;
@property (copy) NSDictionary *httpHeaders;
- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates;
- (BOOL)automaticallyDownloadsUpdates;
@property BOOL sendsSystemProfile;
// This IBAction is meant for a main menu item. Hook up any menu item to this action,
// and Sparkle will check for updates and report back its findings verbosely.
@property BOOL automaticallyDownloadsUpdates;
@property (nonatomic, copy) NSString *decryptionPassword;
/*!
Explicitly checks for updates and displays a progress dialog while doing so.
This method is meant for a main menu item.
Connect any menu item to this action in Interface Builder,
and Sparkle will check for updates and report back its findings verbosely
when it is invoked.
*/
- (IBAction)checkForUpdates:(id)sender;
// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update,
// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an
// update is found, it will be downloaded and prepped for installation.
/*!
Checks for updates, but does not display any UI unless an update is found.
This is meant for programmatically initating a check for updates. That is,
it will display no UI unless it actually finds an update, in which case it
proceeds as usual.
If the fully automated updating is turned on, however, this will invoke that
behavior, and if an update is found, it will be downloaded and prepped for
installation.
*/
- (void)checkForUpdatesInBackground;
// Date of last update check. Returns nil if no check has been performed.
- (NSDate*)lastUpdateCheckDate;
/*!
Checks for updates and, if available, immediately downloads and installs them.
A progress dialog is shown but the user will never be prompted to read the
release notes.
// This begins a "probing" check for updates which will not actually offer to update to that version. The delegate methods, though,
// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI.
You may want to respond to the userDidCancelDownload delegate method in case
the user clicks the "Cancel" button while the update is downloading.
*/
- (void)installUpdatesIfAvailable;
/*!
Returns the date of last update check.
\returns \c nil if no check has been performed.
*/
@property (readonly, copy) NSDate *lastUpdateCheckDate;
/*!
Begins a "probing" check for updates which will not actually offer to
update to that version.
However, the delegate methods
SUUpdaterDelegate::updater:didFindValidUpdate: and
SUUpdaterDelegate::updaterDidNotFindUpdate: will be called,
so you can use that information in your UI.
*/
- (void)checkForUpdateInformation;
// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer.
/*!
Appropriately schedules or cancels the update checking timer according to
the preferences for time interval and automatic checks.
This call does not change the date of the next check,
but only the internal NSTimer.
*/
- (void)resetUpdateCycle;
- (BOOL)updateInProgress;
@property (readonly) BOOL updateInProgress;
@end
@ -77,106 +124,243 @@
// SUUpdater Notifications for events that might be interesting to more than just the delegate
// The updater will be the notification object
// -----------------------------------------------------------------------------
extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification;
extern NSString *const SUUpdaterDidFindValidUpdateNotification;
extern NSString *const SUUpdaterDidNotFindUpdateNotification;
extern NSString *const SUUpdaterWillInstallUpdateNotification;
extern NSString *const SUUpdaterWillRelaunchApplicationNotification;
SU_EXPORT extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification;
SU_EXPORT extern NSString *const SUUpdaterDidFindValidUpdateNotification;
SU_EXPORT extern NSString *const SUUpdaterDidNotFindUpdateNotification;
SU_EXPORT extern NSString *const SUUpdaterWillRestartNotification;
#define SUUpdaterWillRelaunchApplicationNotification SUUpdaterWillRestartNotification;
#define SUUpdaterWillInstallUpdateNotification SUUpdaterWillRestartNotification;
// Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification & SUUpdaterWillInstallUpdateNotification userInfos
extern NSString *const SUUpdaterAppcastItemNotificationKey;
// Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification userInfo
SU_EXPORT extern NSString *const SUUpdaterAppcastItemNotificationKey;
// Key for the SUAppcast object in the SUUpdaterDidFinishLoadingAppCastNotification userInfo
extern NSString *const SUUpdaterAppcastNotificationKey;
SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey;
// -----------------------------------------------------------------------------
// SUUpdater Delegate:
// -----------------------------------------------------------------------------
@interface NSObject (SUUpdaterDelegateInformalProtocol)
/*!
Provides methods to control the behavior of an SUUpdater object.
*/
@protocol SUUpdaterDelegate <NSObject>
@optional
// Use this to keep Sparkle from popping up e.g. while your setup assistant is showing:
- (BOOL)updaterMayCheckForUpdates:(SUUpdater *)bundle;
/*!
Returns whether to allow Sparkle to pop up.
// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user.
For example, this may be used to prevent Sparkle from interrupting a setup assistant.
\param updater The SUUpdater instance.
*/
- (BOOL)updaterMayCheckForUpdates:(SUUpdater *)updater;
/*!
Returns additional parameters to append to the appcast URL's query string.
This is potentially based on whether or not Sparkle will also be sending along the system profile.
\param updater The SUUpdater instance.
\param sendingProfile Whether the system profile will also be sent.
\return An array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user.
*/
- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;
// Override this to dynamically specify the entire URL.
- (NSString*)feedURLStringForUpdater:(SUUpdater*)updater;
/*!
Returns a custom appcast URL.
// Use this to override the default behavior for Sparkle prompting the user about automatic update checks.
- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle;
Override this to dynamically specify the entire URL.
// Implement this if you want to do some special handling with the appcast once it finishes loading.
\param updater The SUUpdater instance.
*/
- (NSString *)feedURLStringForUpdater:(SUUpdater *)updater;
/*!
Returns whether Sparkle should prompt the user about automatic update checks.
Use this to override the default behavior.
\param updater The SUUpdater instance.
*/
- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)updater;
/*!
Called after Sparkle has downloaded the appcast from the remote server.
Implement this if you want to do some special handling with the appcast once it finishes loading.
\param updater The SUUpdater instance.
\param appcast The appcast that was downloaded from the remote server.
*/
- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;
// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding
// a valid update, if any, in the given appcast.
- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle;
/*!
Returns the item in the appcast corresponding to the update that should be installed.
// Sent when a valid update is found by the update driver.
- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;
If you're using special logic or extensions in your appcast,
implement this to use your own logic for finding a valid update, if any,
in the given appcast.
// Sent when a valid update is not found.
- (void)updaterDidNotFindUpdate:(SUUpdater *)update;
\param appcast The appcast that was downloaded from the remote server.
\param updater The SUUpdater instance.
*/
- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)updater;
// Sent immediately before installing the specified update.
- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update;
/*!
Called when a valid update is found by the update driver.
// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue.
// This is not called if the user didn't relaunch on the previous update, in that case it will immediately
// restart.
- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that is proposed to be installed.
*/
- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)item;
// Some apps *can not* be relaunched in certain circumstances. They can use this method
// to prevent a relaunch "hard":
/*!
Called when a valid update is not found.
\param updater The SUUpdater instance.
*/
- (void)updaterDidNotFindUpdate:(SUUpdater *)updater;
/*!
Called immediately before downloading the specified update.
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that is proposed to be downloaded.
\param request The mutable URL request that will be used to download the update.
*/
- (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request;
/*!
Called after the specified update failed to download.
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that failed to download.
\param error The error generated by the failed download.
*/
- (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error;
/*!
Called when the user clicks the cancel button while and update is being downloaded.
\param updater The SUUpdater instance.
*/
- (void)userDidCancelDownload:(SUUpdater *)updater;
/*!
Called immediately before installing the specified update.
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that is proposed to be installed.
*/
- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)item;
/*!
Returns whether the relaunch should be delayed in order to perform other tasks.
This is not called if the user didn't relaunch on the previous update,
in that case it will immediately restart.
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that is proposed to be installed.
\param invocation The invocation that must be completed before continuing with the relaunch.
\return \c YES to delay the relaunch until \p invocation is invoked.
*/
- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)item untilInvoking:(NSInvocation *)invocation;
/*!
Returns whether the application should be relaunched at all.
Some apps \b cannot be relaunched under certain circumstances.
This method can be used to explicitly prevent a relaunch.
\param updater The SUUpdater instance.
*/
- (BOOL)updaterShouldRelaunchApplication:(SUUpdater *)updater;
// Called immediately before relaunching.
/*!
Called immediately before relaunching.
\param updater The SUUpdater instance.
*/
- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;
// This method allows you to provide a custom version comparator.
// If you don't implement this method or return nil, the standard version comparator will be used.
- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;
/*!
Returns an object that compares version numbers to determine their arithmetic relation to each other.
// This method allows you to provide a custom version comparator.
// If you don't implement this method or return nil, the standard version displayer will be used.
- (id <SUVersionDisplay>)versionDisplayerForUpdater:(SUUpdater *)updater;
This method allows you to provide a custom version comparator.
If you don't implement this method or return \c nil,
the standard version comparator will be used.
// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle.
\sa SUStandardVersionComparator
\param updater The SUUpdater instance.
*/
- (id<SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;
/*!
Returns an object that formats version numbers for display to the user.
If you don't implement this method or return \c nil,
the standard version formatter will be used.
\sa SUUpdateAlert
\param updater The SUUpdater instance.
*/
- (id<SUVersionDisplay>)versionDisplayerForUpdater:(SUUpdater *)updater;
/*!
Returns the path which is used to relaunch the client after the update is installed.
The default is the path of the host bundle.
\param updater The SUUpdater instance.
*/
- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;
// Called before and after, respectively, an updater shows a modal alert window, to give the host
// the opportunity to hide attached windows etc. that may get in the way:
-(void) updaterWillShowModalAlert:(SUUpdater *)updater;
-(void) updaterDidShowModalAlert:(SUUpdater *)updater;
/*!
Called before an updater shows a modal alert window,
to give the host the opportunity to hide attached windows that may get in the way.
// Called when an update is scheduled to be silently installed on quit.
// The invocation can be used to trigger an immediate silent install and relaunch.
- (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)update immediateInstallationInvocation:(NSInvocation *)invocation;
- (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)update;
\param updater The SUUpdater instance.
*/
- (void)updaterWillShowModalAlert:(SUUpdater *)updater;
/*!
Called after an updater shows a modal alert window,
to give the host the opportunity to hide attached windows that may get in the way.
\param updater The SUUpdater instance.
*/
- (void)updaterDidShowModalAlert:(SUUpdater *)updater;
/*!
Called when an update is scheduled to be silently installed on quit.
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that is proposed to be installed.
\param invocation Can be used to trigger an immediate silent install and relaunch.
*/
- (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationInvocation:(NSInvocation *)invocation;
/*!
Calls after an update that was scheduled to be silently installed on quit has been canceled.
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that was proposed to be installed.
*/
- (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item;
/*!
Called after an update is aborted due to an error.
\param updater The SUUpdater instance.
\param error The error that caused the abort
*/
- (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error;
@end
// -----------------------------------------------------------------------------
// Constants:
// -----------------------------------------------------------------------------
#ifndef DEBUG
#define DEBUG 0
#endif
// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds.
#if defined(DEBUG) && DEBUG && 0
#define SU_MIN_CHECK_INTERVAL 60
#else
#define SU_MIN_CHECK_INTERVAL 60*60
#endif
#if defined(DEBUG) && DEBUG && 0
#define SU_DEFAULT_CHECK_INTERVAL 60
#else
#define SU_DEFAULT_CHECK_INTERVAL 60*60*24
#endif
#endif

View File

@ -10,17 +10,18 @@
#define SUVERSIONCOMPARISONPROTOCOL_H
#import <Cocoa/Cocoa.h>
#import "SUExport.h"
/*!
@protocol
@abstract Implement this protocol to provide version comparison facilities for Sparkle.
Provides version comparison facilities for Sparkle.
*/
@protocol SUVersionComparison
/*!
@method
@abstract An abstract method to compare two version strings.
@discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.
An abstract method to compare two version strings.
Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a,
and NSOrderedSame if they are equivalent.
*/
- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD!

View File

@ -7,21 +7,19 @@
//
#import <Cocoa/Cocoa.h>
#import "SUExport.h"
/*!
@protocol
@abstract Implement this protocol to apply special formatting to the two
version numbers.
Applies special display formatting to version numbers.
*/
@protocol SUVersionDisplay
/*!
@method
@abstract An abstract method to format two version strings.
@discussion You get both so you can display important distinguishing
information, but leave out unnecessary/confusing parts.
Formats two version strings.
Both versions are provided so that important distinguishing information
can be displayed while also leaving out unnecessary/confusing parts.
*/
-(void) formatVersion: (NSString**)inOutVersionA andVersion: (NSString**)inOutVersionB;
- (void)formatVersion:(NSString **)inOutVersionA andVersion:(NSString **)inOutVersionB;
@end

View File

@ -9,13 +9,17 @@
#ifndef SPARKLE_H
#define SPARKLE_H
#import <Cocoa/Cocoa.h>
// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless
// there are name-space collisions) so we can list all of them to start with:
#import <Sparkle/SUUpdater.h>
#import <Sparkle/SUAppcast.h>
#import <Sparkle/SUAppcastItem.h>
#import <Sparkle/SUVersionComparisonProtocol.h>
#import "SUAppcast.h"
#import "SUAppcastItem.h"
#import "SUStandardVersionComparator.h"
#import "SUUpdater.h"
#import "SUVersionComparisonProtocol.h"
#import "SUVersionDisplayProtocol.h"
#import "SUErrors.h"
#endif

View File

@ -0,0 +1,6 @@
framework module Sparkle {
umbrella header "Sparkle.h"
export *
module * { export * }
}

View File

@ -0,0 +1,36 @@
//
// SUUnarchiver.h
// Sparkle
//
// Created by Andy Matuschak on 3/16/06.
// Copyright 2006 Andy Matuschak. All rights reserved.
//
#ifndef SUUNARCHIVER_H
#define SUUNARCHIVER_H
#import <Foundation/Foundation.h>
@class SUHost;
@protocol SUUnarchiverDelegate;
@interface SUUnarchiver : NSObject
@property (copy, readonly) NSString *archivePath;
@property (copy, readonly) NSString *updateHostBundlePath;
@property (copy, readonly) NSString *decryptionPassword;
@property (weak) id<SUUnarchiverDelegate> delegate;
+ (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHostBundlePath:(NSString *)host withPassword:(NSString *)decryptionPassword;
- (void)start;
@end
@protocol SUUnarchiverDelegate <NSObject>
- (void)unarchiverDidFinish:(SUUnarchiver *)unarchiver;
- (void)unarchiverDidFail:(SUUnarchiver *)unarchiver;
@optional
- (void)unarchiver:(SUUnarchiver *)unarchiver extractedProgress:(double)progress;
@end
#endif

View File

@ -3,43 +3,47 @@
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>13C64</string>
<string>15E49a</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>Autoupdate</string>
<key>CFBundleIconFile</key>
<string>Sparkle</string>
<string>AppIcon</string>
<key>CFBundleIdentifier</key>
<string>org.andymatuschak.sparkle.Autoupdate</string>
<string>org.sparkle-project.Sparkle.Autoupdate</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.6</string>
<string>1.14.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>1.6</string>
<string>1.14.0</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>5B103i</string>
<string>7C1002</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>13A595</string>
<string>15C43</string>
<key>DTSDKName</key>
<string>macosx10.9</string>
<string>macosx10.11</string>
<key>DTXcode</key>
<string>0510</string>
<string>0721</string>
<key>DTXcodeBuild</key>
<string>5B103i</string>
<string>7C1002</string>
<key>LSBackgroundOnly</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>10.6</string>
<string>10.7</string>
<key>LSUIElement</key>
<string>1</string>
<key>NSMainNibFile</key>

View File

@ -1,573 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Resources/SUStatus.nib</key>
<data>
AY4YXjlQrzqM9SfsrxpSB1B1u+k=
</data>
<key>Resources/Sparkle.icns</key>
<data>
RAPi1GDm7RjA+JlOSVD1eYK+1VA=
</data>
<key>Resources/ar.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
dM38Ha/cZwg8Sls9xWHXg0+oKvQ=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/cs.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
FlXetLwR0j5/1odm0Db+H2CctTg=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/da.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
/IwCWEjabs9+XPC2kpnVYBcIsAU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/de.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
QtXxl9WDwzVVxXrSvEcYxzgYnp8=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/en.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
zzMk9fvGPMnNUAXXV/+jnYJnziE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/es.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
GrNcWzFjNuy3aBJY7IG8OL9BnEM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/fr.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
5z8VRMQoNLwAyzB9My8omBTkKZA=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/is.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
d0sFFGqw9ifMmvrnHhIgvezLdfE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/it.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
HodRH2wN987WiLqfo9YkRcEa1AM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ja.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
iRM0gMYfeAM58HxcdGHlGJqSFYc=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ko.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
72vg45GkQZIgSVEw6gTdm4ewl8c=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/nl.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
8FkGwpespW8x/FyRktfq1gF03Rk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pl.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
JBZVMxBpAMwrWcyc+dgE6K4wv3Y=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt_BR.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
m0/z0E7FyKhR88ARE7krxlBddIE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt_PT.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
WnZVm2N1QLkSKFEXroDxWwQaEaI=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ro.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
H7PP1/P5528PLJWO/CMO22lrYSk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ru.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
zk1n3RGCHav3+MVeWQsPfR+ZSJo=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sk.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
zt6PAVDMa8jGWGNq3+Ji28mrbBs=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sl.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
dgUB5F/WJ5Td9OA6QTa8c0FNn1I=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sv.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
BYZnFFxRUyXZshGKoeGKOKZUhvA=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/th.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
egT6SGyVhdOvD7rEK46LORU4AcI=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/tr.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
5DY87FLxTqUqML4xDc2ijrL/U/Y=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/uk.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
hL54lBspraUdyo0J8GLbd35jROY=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh_CN.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
wSKJNIlrBnFcVPjJctSy9AHpIlU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh_TW.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
bkwIz4OBKwtmku2hCdjEC3hUCYo=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>files2</key>
<dict>
<key>Resources/SUStatus.nib</key>
<data>
AY4YXjlQrzqM9SfsrxpSB1B1u+k=
</data>
<key>Resources/Sparkle.icns</key>
<data>
RAPi1GDm7RjA+JlOSVD1eYK+1VA=
</data>
<key>Resources/ar.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
dM38Ha/cZwg8Sls9xWHXg0+oKvQ=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/cs.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
FlXetLwR0j5/1odm0Db+H2CctTg=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/da.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
/IwCWEjabs9+XPC2kpnVYBcIsAU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/de.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
QtXxl9WDwzVVxXrSvEcYxzgYnp8=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/en.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
zzMk9fvGPMnNUAXXV/+jnYJnziE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/es.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
GrNcWzFjNuy3aBJY7IG8OL9BnEM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/fr.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
5z8VRMQoNLwAyzB9My8omBTkKZA=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/is.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
d0sFFGqw9ifMmvrnHhIgvezLdfE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/it.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
HodRH2wN987WiLqfo9YkRcEa1AM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ja.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
iRM0gMYfeAM58HxcdGHlGJqSFYc=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ko.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
72vg45GkQZIgSVEw6gTdm4ewl8c=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/nl.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
8FkGwpespW8x/FyRktfq1gF03Rk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pl.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
JBZVMxBpAMwrWcyc+dgE6K4wv3Y=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt_BR.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
m0/z0E7FyKhR88ARE7krxlBddIE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt_PT.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
WnZVm2N1QLkSKFEXroDxWwQaEaI=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ro.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
H7PP1/P5528PLJWO/CMO22lrYSk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ru.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
zk1n3RGCHav3+MVeWQsPfR+ZSJo=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sk.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
zt6PAVDMa8jGWGNq3+Ji28mrbBs=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sl.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
dgUB5F/WJ5Td9OA6QTa8c0FNn1I=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sv.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
BYZnFFxRUyXZshGKoeGKOKZUhvA=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/th.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
egT6SGyVhdOvD7rEK46LORU4AcI=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/tr.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
5DY87FLxTqUqML4xDc2ijrL/U/Y=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/uk.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
hL54lBspraUdyo0J8GLbd35jROY=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh_CN.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
wSKJNIlrBnFcVPjJctSy9AHpIlU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh_TW.lproj/Sparkle.strings</key>
<dict>
<key>hash</key>
<data>
bkwIz4OBKwtmku2hCdjEC3hUCYo=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@ -3,13 +3,13 @@
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>13C64</string>
<string>15E49a</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>Sparkle</string>
<key>CFBundleIdentifier</key>
<string>org.andymatuschak.Sparkle</string>
<string>org.sparkle-project.Sparkle</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
@ -17,24 +17,28 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.6.0</string>
<string>1.14.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>6f24f56</string>
<string>1.14.0</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>5B103i</string>
<string>7C1002</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>13A595</string>
<string>15C43</string>
<key>DTSDKName</key>
<string>macosx10.9</string>
<string>macosx10.11</string>
<key>DTXcode</key>
<string>0510</string>
<string>0721</string>
<key>DTXcodeBuild</key>
<string>5B103i</string>
<string>7C1002</string>
</dict>
</plist>

View File

@ -1,38 +0,0 @@
Copyright (c) 2006 Andy Matuschak
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
=================
EXTERNAL LICENSES
=================
License for bspatch.c and bsdiff.c, from bsdiff 4.3 (<http://www.daemonology.net/bsdiff/>:
/*-
* Copyright 2003-2005 Colin Percival
* All rights reserved
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted providing that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
*/

View File

@ -9,27 +9,91 @@
<key>iMac4,1</key>
<string>iMac (Core Duo)</string>
<key>iMac4,2</key>
<string>iMac for Education (17-inch, Core Duo)</string>
<string>iMac for Education (17 inch, Core Duo)</string>
<key>iMac5,1</key>
<string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>
<key>iMac5,2</key>
<string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>
<key>iMac6,1</key>
<string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>
<key>iMac7,1</key>
<string>iMac Intel Core 2 Duo (aluminum enclosure)</string>
<key>iMac8,1</key>
<string>iMac (April 2008)</string>
<string>iMac (Core 2 Duo, 20 or 24 inch, Early 2008 )</string>
<key>iMac9,1</key>
<string>iMac (Core 2 Duo, 20 or 24 inch, Early or Mid 2009 )</string>
<key>iMac10,1</key>
<string>iMac (Core 2 Duo, 21.5 or 27 inch, Late 2009 )</string>
<key>iMac11,1</key>
<string>iMac (Core i5 or i7, 27 inch Late 2009)</string>
<key>iMac11,2</key>
<string>21.5&quot; iMac (mid 2010)</string>
<key>iMac11,3</key>
<string>iMac (Core i5 or i7, 27 inch Mid 2010)</string>
<key>iMac12,1</key>
<string>iMac (Core i3 or i5 or i7, 21.5 inch Mid 2010 or Late 2011)</string>
<key>iMac12,2</key>
<string>iMac (Core i5 or i7, 27 inch Mid 2011)</string>
<key>iMac13,1</key>
<string>iMac (Core i3 or i5 or i7, 21.5 inch Late 2012 or Early 2013)</string>
<key>iMac13,2</key>
<string>iMac (Core i5 or i7, 27 inch Late 2012)</string>
<key>iMac14,1</key>
<string>iMac (Core i5, 21.5 inch Late 2013)</string>
<key>iMac14,2</key>
<string>iMac (Core i5 or i7, 27 inch Late 2013)</string>
<key>iMac14,3</key>
<string>iMac (Core i5 or i7, 21.5 inch Late 2013)</string>
<key>iMac14,4</key>
<string>iMac (Core i5, 21.5 inch Mid 2014)</string>
<key>iMac15,1</key>
<string>iMac (Retina 5K Core i5 or i7, 27 inch Late 2014 or Mid 2015)</string>
<key>iMac16,1</key>
<string>iMac (Core i5, 21,5 inch Late 2015)</string>
<key>iMac16,2</key>
<string>iMac (Retina 4K Core i5 or i7, 21.5 inch Late 2015)</string>
<key>iMac17,1</key>
<string>iMac (Retina 5K Core i5 or i7, 27 inch Late 2015)</string>
<key>MacBook1,1</key>
<string>MacBook (Core Duo)</string>
<key>MacBook2,1</key>
<string>MacBook (Core 2 Duo)</string>
<key>MacBook4,1</key>
<string>MacBook (Core 2 Duo Feb 2008)</string>
<key>MacBook5,1</key>
<string>MacBook (Core 2 Duo, Late 2008, Unibody)</string>
<key>MacBook5,2</key>
<string>MacBook (Core 2 Duo, Early 2009, White)</string>
<key>MacBook6,1</key>
<string>MacBook (Core 2 Duo, Late 2009, Unibody)</string>
<key>MacBook7,1</key>
<string>MacBook (Core 2 Duo, Mid 2010, White)</string>
<key>MacBook8,1</key>
<string>MacBook (Core M, 12 inch, Early 2015)</string>
<key>MacBookAir1,1</key>
<string>MacBook Air (January 2008)</string>
<string>MacBook Air (Core 2 Duo, 13 inch, Early 2008)</string>
<key>MacBookAir2,1</key>
<string>MacBook Air (June 2009)</string>
<string>MacBook Air (Core 2 Duo, 13 inch, Mid 2009)</string>
<key>MacBookAir3,1</key>
<string>MacBook Air (October 2010)</string>
<string>MacBook Air (Core 2 Duo, 11 inch, Late 2010)</string>
<key>MacBookAir3,2</key>
<string>MacBook Air (Core 2 Duo, 13 inch, Late 2010)</string>
<key>MacBookAir4,1</key>
<string>MacBook Air (Core i5 or i7, 11 inch, Mid 2011)</string>
<key>MacBookAir4,2</key>
<string>MacBook Air (Core i5 or i7, 13 inch, Mid 2011)</string>
<key>MacBookAir5,1</key>
<string>MacBook Air (Core i5 or i7, 11 inch, Mid 2012)</string>
<key>MacBookAir5,2</key>
<string>MacBook Air (Core i5 or i7, 13 inch, Mid 2012)</string>
<key>MacBookAir6,1</key>
<string>MacBook Air (Core i5 or i7, 11 inch, Mid 2013 or Early 2014)</string>
<key>MacBookAir6,2</key>
<string>MacBook Air (Core i5 or i7, 13 inch, Mid 2013 or Early 2014)</string>
<key>MacBookAir7,1</key>
<string>MacBook Air (Core i5 or i7, 11 inch, Early 2015)</string>
<key>MacBookAir7,2</key>
<string>MacBook Air (Core i5 or i7, 13 inch, Early 2015)</string>
<key>MacBookPro1,1</key>
<string>MacBook Pro Core Duo (15-inch)</string>
<key>MacBookPro1,2</key>
@ -44,8 +108,70 @@
<string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>
<key>MacBookPro4,1</key>
<string>MacBook Pro (Core 2 Duo Feb 2008)</string>
<key>MacBookPro5,1</key>
<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
<key>MacBookPro5,2</key>
<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
<key>MacBookPro5,3</key>
<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
<key>MacBookPro5,4</key>
<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
<key>MacBookPro5,5</key>
<string>MacBook Pro Intel Core 2 Duo (aluminum unibody)</string>
<key>MacBookPro6,1</key>
<string>MacBook Pro Intel Core i5, Intel Core i7 (mid 2010)</string>
<key>MacBookPro6,2</key>
<string>MacBook Pro Intel Core i5, Intel Core i7 (mid 2010)</string>
<key>MacBookPro7,1</key>
<string>MacBook Pro Intel Core 2 Duo (mid 2010)</string>
<key>MacBookPro8,1</key>
<string>MacBook Pro Intel Core i5, Intel Core i7, 13&quot; (early 2011)</string>
<key>MacBookPro8,2</key>
<string>MacBook Pro Intel Core i7, 15&quot; (early 2011)</string>
<key>MacBookPro8,3</key>
<string>MacBook Pro Intel Core i7, 17&quot; (early 2011)</string>
<key>MacBookPro9,1</key>
<string>MacBook Pro (15-inch, Mid 2012)</string>
<key>MacBookPro9,2</key>
<string>MacBook Pro (13-inch, Mid 2012)</string>
<key>MacBookPro10,1</key>
<string>MacBook Pro (Retina, Mid 2012)</string>
<key>MacBookPro10,2</key>
<string>MacBook Pro (Retina, 13-inch, Late 2012)</string>
<key>MacBookPro11,1</key>
<string>MacBook Pro (Retina, 13-inch, Late 2013)</string>
<key>MacBookPro11,2</key>
<string>MacBook Pro (Retina, 15-inch, Late 2013)</string>
<key>MacBookPro11,3</key>
<string>MacBook Pro (Retina, 15-inch, Late 2013)</string>
<key>MacbookPro11,4</key>
<string>MacBook Pro (Retina, 15-inch, Mid 2015)</string>
<key>MacbookPro11,5</key>
<string>MacBook Pro (Retina, 15-inch, Mid 2015)</string>
<key>MacbookPro12,1 </key>
<string>MacBook Pro (Retina, 13-inch, Early 2015)</string>
<key>Macmini1,1</key>
<string>Mac Mini (Core Solo/Duo)</string>
<key>Macmini2,1</key>
<string>Mac mini Intel Core</string>
<key>Macmini3,1</key>
<string>Mac mini Intel Core</string>
<key>Macmini4,1</key>
<string>Mac mini Intel Core (Mid 2010)</string>
<key>Macmini5,1</key>
<string>Mac mini (Core i5, Mid 2011)</string>
<key>Macmini5,2</key>
<string>Mac mini (Core i5 or Core i7, Mid 2011)</string>
<key>Macmini5,3</key>
<string>Mac mini (Core i7, Server, Mid 2011)</string>
<key>Macmini6,1</key>
<string>Mac mini (Core i5, Late 2012)</string>
<key>Macmini6,2</key>
<string>Mac mini (Core i7, Normal or Server, Late 2012)</string>
<key>Macmini7,1</key>
<string>Mac mini (Core i5 or Core i7, Late 2014)</string>
<key>MacPro1,1,Quad</key>
<string>Mac Pro</string>
<key>MacPro1,1</key>
<string>Mac Pro (four-core)</string>
<key>MacPro2,1</key>
@ -55,7 +181,9 @@
<key>MacPro4,1</key>
<string>Mac Pro (March 2009)</string>
<key>MacPro5,1</key>
<string>Mac Pro (August 2010)</string>
<string>Mac Pro (2010 or 2012)</string>
<key>MacPro6,1</key>
<string>Mac Pro (Late 2013)</string>
<key>PowerBook1,1</key>
<string>PowerBook G3</string>
<key>PowerBook2,1</key>
@ -118,14 +246,6 @@
<string>Power Macintosh G3 (Blue &amp; White)</string>
<key>PowerMac1,2</key>
<string>Power Macintosh G4 (PCI Graphics)</string>
<key>PowerMac10,1</key>
<string>Mac Mini G4</string>
<key>PowerMac10,2</key>
<string>Mac Mini (Late 2005)</string>
<key>PowerMac11,2</key>
<string>Power Macintosh G5 (Late 2005)</string>
<key>PowerMac12,1</key>
<string>iMac G5 (iSight)</string>
<key>PowerMac2,1</key>
<string>iMac G3 (Slot-loading CD-ROM)</string>
<key>PowerMac2,2</key>
@ -152,6 +272,8 @@
<string>iMac G4 (17-inch Flat Panel)</string>
<key>PowerMac5,1</key>
<string>Power Macintosh G4 Cube</string>
<key>PowerMac5,2</key>
<string>Power Mac G4 Cube</string>
<key>PowerMac6,1</key>
<string>iMac G4 (USB 2.0)</string>
<key>PowerMac6,3</key>
@ -168,6 +290,14 @@
<string>iMac G5 (Ambient Light Sensor)</string>
<key>PowerMac9,1</key>
<string>Power Macintosh G5 (Late 2005)</string>
<key>PowerMac10,1</key>
<string>Mac Mini G4</string>
<key>PowerMac10,2</key>
<string>Mac Mini (Late 2005)</string>
<key>PowerMac11,2</key>
<string>Power Macintosh G5 (Late 2005)</string>
<key>PowerMac12,1</key>
<string>iMac G5 (iSight)</string>
<key>RackMac1,1</key>
<string>Xserve G4</string>
<key>RackMac1,2</key>
@ -178,5 +308,7 @@
<string>Xserve (Intel Xeon)</string>
<key>Xserve2,1</key>
<string>Xserve (January 2008 quad-core)</string>
<key>Xserve3,1</key>
<string>Xserve (early 2009)</string>
</dict>
</plist>

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More