update.m
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * update.m: MacOS X Check-For-Update window
  3.  *****************************************************************************
  4.  * Copyright (C) 2005-2009 the VideoLAN team
  5.  * $Id: b35b85a487f8c3c6b1fadf2e04fee1ec24984e44 $
  6.  *
  7.  * Authors: Felix Paul Kühne <fkuehne@users.sf.net>
  8.  *          Rafaël Carré <funman@videolanorg>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. #import "update.h"
  25. #ifdef UPDATE_CHECK
  26. #include <assert.h>
  27. /*****************************************************************************
  28.  * Preamble
  29.  *****************************************************************************/
  30. static NSString * kPrefUpdateOnStartup = @"UpdateOnStartup";
  31. static NSString * kPrefUpdateLastTimeChecked = @"UpdateLastTimeChecked";
  32. /*****************************************************************************
  33.  * VLCUpdate implementation
  34.  *****************************************************************************/
  35. @implementation VLCUpdate
  36. static VLCUpdate *_o_sharedInstance = nil;
  37. + (VLCUpdate *)sharedInstance
  38. {
  39.     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
  40. }
  41. - (id)init
  42. {
  43.     if( _o_sharedInstance ) {
  44.         [self dealloc];
  45.     } else {
  46.         _o_sharedInstance = [super init];
  47.         b_checked = false;
  48.     }
  49.     return _o_sharedInstance;
  50. }
  51. - (void)dealloc
  52. {
  53.     if( p_update ) update_Delete( p_update );
  54.     [super dealloc];
  55. }
  56. - (void)awakeFromNib
  57. {
  58.     /* clean the interface */
  59.     [o_fld_releaseNote setString: @""];
  60.     [o_fld_currentVersion setStringValue: @""];
  61.     /* translate strings to the user's language */
  62.     [o_update_window setTitle: _NS("Check for Updates")];
  63.     [o_btn_DownloadNow setTitle: _NS("Download now")];
  64.     [o_btn_okay setTitle: _NS("OK")];
  65.     [o_chk_updateOnStartup setTitle: _NS("Automatically check for updates")];
  66.     /* we don't use - (BOOL)shouldCheckUpdateOnStartup because we don't want
  67.      * the Alert panel to pop up at this time */
  68.     [o_chk_updateOnStartup setState: [[NSUserDefaults standardUserDefaults] boolForKey: kPrefUpdateOnStartup]];
  69. }
  70. - (void)setShouldCheckUpdate: (BOOL)check
  71. {
  72.     [[NSUserDefaults standardUserDefaults] setBool: check forKey: kPrefUpdateOnStartup];
  73.     [o_chk_updateOnStartup setState: check];
  74.     /* make sure we got this set, even if we crash later on */
  75.     [[NSUserDefaults standardUserDefaults] synchronize];
  76. }
  77. - (BOOL)shouldCheckForUpdate
  78. {
  79.     NSDate *o_last_update;
  80.     NSDate *o_next_update;
  81.  
  82.     if( ![[NSUserDefaults standardUserDefaults] objectForKey: kPrefUpdateOnStartup] )
  83.     {
  84.         /* We don't have any preferences stored, ask the user. */
  85.         NSInteger res = NSRunInformationalAlertPanel( _NS("Do you want VLC to check for updates automatically?"),
  86.               _NS("You can change this option in VLC's update window later on."), _NS("Yes"), _NS("No"), nil );
  87.         [self setShouldCheckUpdate: res];
  88.     }
  89.     if( ![[NSUserDefaults standardUserDefaults] boolForKey: kPrefUpdateOnStartup] )
  90.         return NO;
  91.     o_last_update = [[NSUserDefaults standardUserDefaults] objectForKey: kPrefUpdateLastTimeChecked];
  92.     if( !o_last_update )
  93.         return YES;
  94.     o_next_update = [[[NSDate alloc] initWithTimeInterval: 60*60*24*7 /* every seven days */ sinceDate: o_last_update] autorelease];
  95.     if( !o_next_update )
  96.         return YES;
  97.     return [o_next_update compare: [NSDate date]] == NSOrderedAscending;
  98. }
  99. - (void)showUpdateWindow
  100. {
  101.     /* show the window and check for a potential update */
  102.     [o_update_window center];
  103.     [o_update_window displayIfNeeded];
  104.     [o_update_window makeKeyAndOrderFront:nil];
  105.     if( !b_checked )
  106.     {
  107.         [o_bar_checking startAnimation: self];
  108.         [self checkForUpdate];
  109.         b_checked = true;
  110.         [o_bar_checking stopAnimation: self];
  111.     }
  112. }
  113. - (IBAction)download:(id)sender
  114. {
  115.     /* provide a save dialogue */
  116.     SEL sel = @selector(getLocationForSaving:returnCode:contextInfo:);
  117.     NSSavePanel * saveFilePanel = [[NSSavePanel alloc] init];
  118.     [saveFilePanel setRequiredFileType: @"dmg"];
  119.     [saveFilePanel setCanSelectHiddenExtension: YES];
  120.     [saveFilePanel setCanCreateDirectories: YES];
  121.     update_release_t *p_release = update_GetRelease( p_update );
  122.     assert( p_release );
  123.     [saveFilePanel beginSheetForDirectory:@"~/Downloads" file:
  124.         [[[NSString stringWithUTF8String: p_release->psz_url] componentsSeparatedByString:@"/"] lastObject]
  125.                            modalForWindow: o_update_window 
  126.                             modalDelegate:self
  127.                            didEndSelector:sel
  128.                               contextInfo:nil];
  129. }
  130. - (void)getLocationForSaving: (NSSavePanel *)sheet
  131.                   returnCode: (int)returnCode 
  132.                  contextInfo: (void *)contextInfo
  133. {
  134.     if( returnCode == NSOKButton )
  135.     {
  136.         /* perform download and pass the selected path */
  137.         [NSThread detachNewThreadSelector:@selector(performDownload:) toTarget:self withObject:[sheet filename]];
  138.     }
  139.     [sheet release];
  140. }
  141. - (IBAction)okay:(id)sender
  142. {
  143.     /* just hides the window */
  144.     [o_update_window orderOut: self];
  145. }
  146. - (IBAction)changeCheckUpdateOnStartup:(id)sender
  147. {
  148.     [self setShouldCheckUpdate: [sender state]];
  149. }
  150. - (void)setUpToDate:(NSNumber *)uptodate
  151. {
  152.     if( [uptodate boolValue] )
  153.     {
  154.         [o_fld_releaseNote setString: @""];
  155.         [o_fld_currentVersion setStringValue: @""];
  156.         [o_fld_status setStringValue: _NS("This version of VLC is the latest available.")];
  157.         [o_btn_DownloadNow setEnabled: NO];
  158.     }
  159.     else
  160.     {
  161.         update_release_t *p_release = update_GetRelease( p_update );
  162.         [o_fld_releaseNote setString: [NSString stringWithUTF8String: (p_release->psz_desc ? p_release->psz_desc : "" )]];
  163.         [o_fld_status setStringValue: _NS("This version of VLC is outdated.")];
  164.         [o_fld_currentVersion setStringValue: [NSString stringWithFormat:
  165.             _NS("The current release is %d.%d.%d%c."), p_release->i_major,
  166.             p_release->i_minor, p_release->i_revision, p_release->extra]];
  167.         [o_btn_DownloadNow setEnabled: YES];
  168.         /* Make sure the update window is showed in case we have something */
  169.         [o_update_window center];
  170.         [o_update_window displayIfNeeded];
  171.         [o_update_window makeKeyAndOrderFront: self];
  172.     }
  173. }
  174. static void updateCallback( void * p_data, bool b_success )
  175. {
  176.     VLCUpdate * update = p_data;
  177.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  178.     NSNumber * state = [NSNumber numberWithBool:!b_success || !update_NeedUpgrade( update->p_update )];
  179.     [update performSelectorOnMainThread:@selector(setUpToDate:) withObject:state waitUntilDone:YES];
  180.     [pool release];
  181. }
  182. - (void)checkForUpdate
  183. {
  184.     p_update = update_New( VLCIntf );
  185.     if( !p_update )
  186.         return;
  187.     update_Check( p_update, updateCallback, self );
  188.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  189.     [[NSUserDefaults standardUserDefaults] setObject: [NSDate date] forKey: kPrefUpdateLastTimeChecked];
  190.     [pool release];
  191. }
  192. - (void)performDownload:(NSString *)path
  193. {
  194.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  195.     [o_update_window orderOut: self];
  196.     update_Download( p_update, [path UTF8String] );
  197.     [o_btn_DownloadNow setEnabled: NO];
  198.     [pool release];
  199. }
  200. @end
  201. #endif