diff --git a/include/vlc_update.h b/include/vlc_update.h index 4bc7fd308d5c9d766714a6b67b1402220bb7c8ae..c7795c98622e4631f1c9379e9b882689fb0ebd26 100644 --- a/include/vlc_update.h +++ b/include/vlc_update.h @@ -59,6 +59,7 @@ VLC_EXPORT( void, update_Check, ( update_t *, void (*callback)( void*, bool ), v VLC_EXPORT( bool, update_NeedUpgrade, ( update_t * ) ); VLC_EXPORT( void, update_Download, ( update_t *, const char* ) ); VLC_EXPORT( update_release_t*, update_GetRelease, ( update_t * ) ); +VLC_EXPORT( void, update_WaitDownload, ( update_t * ) ); /** * @} diff --git a/modules/gui/macosx/update.m b/modules/gui/macosx/update.m index 4346af3b09893fa7658a21cb4cc80ca28122b53e..88ed6bd755596489bb4b6e9fc87f0e59d2bb239d 100644 --- a/modules/gui/macosx/update.m +++ b/modules/gui/macosx/update.m @@ -151,7 +151,7 @@ static VLCUpdate *_o_sharedInstance = nil; if( returnCode == NSOKButton ) { /* perform download and pass the selected path */ - [self performDownload: [sheet filename]]; + [NSThread detachNewThreadSelector:@selector(performDownload:) toTarget:self withObject:[sheet filename]]; } [sheet release]; } @@ -215,11 +215,14 @@ static void updateCallback( void * p_data, bool b_success ) - (void)performDownload:(NSString *)path { + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; update_Download( p_u, [path UTF8String] ); [o_btn_DownloadNow setEnabled: NO]; [o_update_window orderOut: self]; + update_WaitDownload( p_u ); update_Delete( p_u ); p_u = nil; + [pool release]; } @end diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 839260f6233e3c10a21ffc9ebfc5662110fadbda..c2937f523a791a0aee53276ab6836d76c99933f5 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -362,6 +362,7 @@ update_Download update_GetRelease update_NeedUpgrade __update_New +update_WaitDownload us_atof us_strtod utf8_fopen diff --git a/src/misc/update.c b/src/misc/update.c index d1620eb8483ad6b28a3857ed9d1ca5354058ff9d..96a3948992f7fdfe5aed37b0fe3d8565272d2237 100644 --- a/src/misc/update.c +++ b/src/misc/update.c @@ -1456,6 +1456,14 @@ static char *size_str( long int l_size ) return i_retval == -1 ? NULL : psz_tmp; } +void update_WaitDownload( update_t *p_update ) +{ + if(p_update->p_download) + vlc_thread_join( p_update->p_download ); + vlc_object_release( p_update->p_download ); + p_update->p_download = NULL; +} + static void* update_DownloadReal( vlc_object_t *p_this ); /** @@ -1504,6 +1512,8 @@ static void* update_DownloadReal( vlc_object_t *p_this ) update_t *p_update = p_udt->p_update; char *psz_destdir = p_udt->psz_destdir; + msg_Dbg( p_udt, "Opening Stream '%s'", p_update->release.psz_url ); + /* Open the stream */ p_stream = stream_UrlNew( p_udt, p_update->release.psz_url ); if( !p_stream ) @@ -1536,7 +1546,12 @@ static void* update_DownloadReal( vlc_object_t *p_this ) /* Create a buffer and fill it with the downloaded file */ p_buffer = (void *)malloc( 1 << 10 ); if( !p_buffer ) + { + msg_Err( p_udt, "Can't malloc (1 << 10) bytes! download cancelled." ); goto end; + } + + msg_Dbg( p_udt, "Downloading Stream '%s'", p_update->release.psz_url ); psz_size = size_str( l_size ); if( asprintf( &psz_status, "%s\nDownloading... O.O/%s %.1f%% done", @@ -1585,6 +1600,7 @@ static void* update_DownloadReal( vlc_object_t *p_this ) p_update->release.psz_url, psz_size ) != -1 ) { intf_ProgressUpdate( p_udt, i_progress, psz_status, 100.0, 0 ); + i_progress = 0; free( psz_status ); } } @@ -1674,6 +1690,10 @@ static void* update_DownloadReal( vlc_object_t *p_this ) free( p_hash ); end: + if( i_progress ) + { + intf_ProgressUpdate( p_udt, i_progress, "Cancelled", 100.0, 0 ); + } if( p_stream ) stream_Delete( p_stream ); if( p_file ) @@ -1715,6 +1735,11 @@ bool update_NeedUpgrade( update_t *p_update ) return false; } +void update_WaitDownload( update_t *p_update ) +{ + (void)p_update; +} + void update_Download( update_t *p_update, const char *psz_destdir ) { (void)p_update; (void)psz_destdir;