]> git.sesse.net Git - vlc/commitdiff
Implemented the retrieval of the versions, files and mirrors. Both the size and the...
authorFelix Paul Kühne <fkuehne@videolan.org>
Sun, 2 Oct 2005 19:16:12 +0000 (19:16 +0000)
committerFelix Paul Kühne <fkuehne@videolan.org>
Sun, 2 Oct 2005 19:16:12 +0000 (19:16 +0000)
extras/MacOSX/Resources/English.lproj/Update.nib/classes.nib
extras/MacOSX/Resources/English.lproj/Update.nib/info.nib
extras/MacOSX/Resources/English.lproj/Update.nib/keyedobjects.nib
modules/gui/macosx/update.h
modules/gui/macosx/update.m

index a64036cc7abe0026483243e39ec64898e207f798..b19f698fc8d311616cd4f8af09263af114b0cd53 100644 (file)
@@ -15,7 +15,6 @@
                 "o_fld_dest" = id; 
                 "o_fld_elpTime" = id; 
                 "o_fld_releaseNote" = id; 
-                "o_fld_releasedOn" = id; 
                 "o_fld_remTime" = id; 
                 "o_fld_size" = id; 
                 "o_fld_source" = id; 
@@ -23,7 +22,6 @@
                 "o_lbl_checkForUpdate" = id; 
                 "o_lbl_currentVersion" = id; 
                 "o_lbl_mirror" = id; 
-                "o_lbl_releasedOn" = id; 
                 "o_lbl_size" = id; 
                 "o_lbl_userVersion" = id; 
                 "o_pop_mirror" = id; 
index 2cca7ef5d36096f4a314ecbf73ab75748712b0d5..663e2b497e1f97884ee9729886691680cae1d17e 100644 (file)
@@ -8,8 +8,8 @@
        <string>437.0</string>
        <key>IBOpenObjects</key>
        <array>
-               <integer>5</integer>
                <integer>7</integer>
+               <integer>5</integer>
        </array>
        <key>IBSystem Version</key>
        <string>8C46</string>
index 63f4317e23eb9b6f16679f5dbc9c8dda5b85b262..58b20048f00398d4053255c6b83be2ab6e6b9231 100644 (file)
Binary files a/extras/MacOSX/Resources/English.lproj/Update.nib/keyedobjects.nib and b/extras/MacOSX/Resources/English.lproj/Update.nib/keyedobjects.nib differ
index 41d2d8dbb0555f3550ca9b72d33f7c729aa07415..2fc6eb09012718f97c41ec02875996d20d4fcf4c 100644 (file)
@@ -32,7 +32,6 @@
     IBOutlet id o_fld_currentVersion;
     IBOutlet id o_fld_dest;
     IBOutlet id o_fld_elpTime;
-    IBOutlet id o_fld_releasedOn;
     IBOutlet id o_fld_releaseNote;
     IBOutlet id o_fld_remTime;
     IBOutlet id o_fld_size;
@@ -40,7 +39,6 @@
     IBOutlet id o_fld_userVersion;
     IBOutlet id o_lbl_currentVersion;
     IBOutlet id o_lbl_mirror;
-    IBOutlet id o_lbl_releasedOn;
     IBOutlet id o_lbl_size;
     IBOutlet id o_lbl_userVersion;
     IBOutlet id o_pop_mirror;
@@ -48,6 +46,9 @@
     IBOutlet id o_update_window;
     IBOutlet id o_bar_checking;
     IBOutlet id o_lbl_checkForUpdate;
+    
+    NSMutableArray * o_mirrors;
+    NSMutableDictionary * o_files;
 }
 
 
@@ -57,6 +58,7 @@
 
 - (void)showUpdateWindow;
 - (void)initStrings;
+- (void)getData;
 
 + (VLCUpdate *)sharedInstance;
 
index 425b5a7d8f33e6793741c22ff961e4cdc735c3e5..33fd09f795121009c7f2e0b15381afaed7a4de4d 100644 (file)
 #import "vlc_xml.h"
 
 #define UPDATE_VLC_OS "macosx"
+
+#ifdef i386
+#define UPDATE_VLC_ARCH "i386"
+#else
 #define UPDATE_VLC_ARCH "ppc"
+#endif
+
+#define UPDATE_VLC_STATUS_URL "http://update.videolan.org/vlc/status"
+#define UPDATE_VLC_MIRRORS_URL "http://update.videolan.org/mirrors"
 
+#define UPDATE_VLC_DOWNLOAD_BUFFER_SIZE 2048
 
 /*****************************************************************************
  * VLCExtended implementation
@@ -77,7 +86,6 @@ static VLCUpdate *_o_sharedInstance = nil;
     [o_fld_userVersion setStringValue: [[[NSBundle mainBundle] infoDictionary] \
         objectForKey:@"CFBundleVersion"]];
     [o_fld_releaseNote setString: @""];
-    [o_fld_releasedOn setStringValue: @""];
     [o_fld_size setStringValue: @""];
     [o_fld_currentVersion setStringValue: @""];
     
@@ -87,13 +95,12 @@ static VLCUpdate *_o_sharedInstance = nil;
 - (void)initStrings
 {
     /* translate strings to the user's language */
+    [o_update_window setTitle: _NS("Check for update")];
     [o_btn_cancel setTitle: _NS("Cancel")];
     [o_btn_DownloadNow setTitle: _NS("Download now")];
     [o_btn_okay setTitle: _NS("OK")];
     [o_lbl_currentVersion setStringValue: [_NS("Current version") \
         stringByAppendingString: @":"]];
-    [o_lbl_releasedOn setStringValue: [_NS("Released on") \
-        stringByAppendingString: @":"]];
     [o_lbl_size setStringValue: [_NS("Size") \
         stringByAppendingString: @":"]];
     [o_lbl_userVersion setStringValue: [_NS("Your version") \
@@ -109,6 +116,14 @@ static VLCUpdate *_o_sharedInstance = nil;
     [o_update_window center];
     [o_update_window displayIfNeeded];
     [o_update_window makeKeyAndOrderFront:nil];
+    
+    /* alloc some dictionaries first */
+    o_mirrors = [[NSMutableArray alloc] init];
+    o_files = [[NSMutableDictionary alloc] init];
+    
+    [o_bar_checking startAnimation:nil];
+    [self getData];
+    [o_bar_checking stopAnimation:nil];
 }
 
 - (IBAction)cancel:(id)sender
@@ -127,4 +142,382 @@ static VLCUpdate *_o_sharedInstance = nil;
     [o_update_window close];
 }
 
+
+
+- (void)getData
+{
+    /* This function gets all the info from the xml files hosted on
+    http://update.videolan.org/ and stores it in appropriate lists.
+    It was taken from the WX-interface and ported from C++ to Obj-C. */
+
+    stream_t *p_stream = NULL;
+    char *psz_eltname = NULL;
+    char *psz_name = NULL;
+    char *psz_value = NULL;
+    char *psz_eltvalue = NULL;
+    xml_t *p_xml = NULL;
+    xml_reader_t *p_xml_reader = NULL;
+    bool b_os = false;
+    bool b_arch = false;
+    
+    intf_thread_t * p_intf = VLCIntf;
+
+    if( UPDATE_VLC_ARCH == "i386" )
+    {
+        /* since we don't provide any binaries for MacTel atm, doing the
+         * update-check is not necessary (this would fail in fact). That's why 
+         * we just provide a sheet telling the user about that and skip 
+         * the rest. */
+        /* FIXME: remove me, if a i386-binary is available */
+        NSBeginInformationalAlertSheet(_NS("Unsupported architecture"), \
+                    _NS("OK"), @"", @"", o_update_window, nil, nil, nil, nil, \
+                    _NS("Binary builds are only available for Mac OS X on " \
+                    "the PowerPC-platform. Official builds for Intel-Macs " \
+                    "are not available at this time. \n\n If you want to " \
+                    "help us here, feel free to contact us."));
+        return;
+    }
+    
+    NSMutableDictionary * temp_version;
+    temp_version = [[NSMutableDictionary alloc] init];
+    NSMutableDictionary * temp_file;
+    temp_file = [[NSMutableDictionary alloc] init];
+    NSMutableDictionary * temp_mirror;
+    temp_mirror = [[NSMutableDictionary alloc] init];
+
+    //struct update_mirror_t tmp_mirror;
+
+    p_xml = xml_Create( p_intf );
+    if( !p_xml )
+    {
+        msg_Err( p_intf, "Failed to open XML parser" );
+        // FIXME: display error message in dialog
+        return;
+    }
+
+    p_stream = stream_UrlNew( p_intf, UPDATE_VLC_STATUS_URL );
+    if( !p_stream )
+    {
+        msg_Err( p_intf, "Failed to open %s for reading",
+                 UPDATE_VLC_STATUS_URL );
+        // FIXME: display error message in dialog
+        return;
+    }
+
+    p_xml_reader = xml_ReaderCreate( p_xml, p_stream );
+
+    if( !p_xml_reader )
+    {
+        msg_Err( p_intf, "Failed to open %s for parsing",
+                 UPDATE_VLC_STATUS_URL );
+        // FIXME: display error message in dialog
+        return;
+    }
+
+    /* build tree */
+    while( xml_ReaderRead( p_xml_reader ) == 1 )
+    {
+        switch( xml_ReaderNodeType( p_xml_reader ) )
+        {
+            // Error
+            case -1:
+                // TODO: print message
+                return;
+
+            case XML_READER_STARTELEM:
+                psz_eltname = xml_ReaderName( p_xml_reader );
+                if( !psz_eltname )
+                {
+                    // TODO: print message
+                    return;
+                }
+                msg_Dbg( p_intf, "element name: %s", psz_eltname );
+                while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS )
+                {
+                    psz_name = xml_ReaderName( p_xml_reader );
+                    psz_value = xml_ReaderValue( p_xml_reader );
+                    if( !psz_name || !psz_value )
+                    {
+                        // TODO: print message
+                        free( psz_eltname );
+                        return;
+                    }
+                    msg_Dbg( p_intf, "  attribute %s = %s",
+                             psz_name, psz_value );
+                    
+                    if( !strcmp( psz_name, "name" )
+                        && ( !strcmp( psz_value, "macosx" ) 
+                            || !strcmp( psz_value, "*" ) )
+                        && !strcmp( psz_eltname, "os" ) )
+                    {
+                        b_os = true;
+                    }
+                    if( b_os && !strcmp( psz_name, "name" )
+                        && ( !strcmp( psz_value, UPDATE_VLC_ARCH ) 
+                            || !strcmp( psz_value, "*" ) )
+                        && !strcmp( psz_eltname, "arch" ) )
+                    {
+                        b_arch = true;
+                    }
+                    
+                    if( b_os && b_arch )
+                    {
+                        if( strcmp( psz_eltname, "version" ) == 0 )
+                        {
+                            [temp_version setObject: [NSString \
+                                stringWithUTF8String: psz_value] forKey: \
+                                [NSString stringWithUTF8String: psz_name]];
+                        }
+                        if( !strcmp( psz_eltname, "file" ) )
+                        {
+                            [temp_file setObject: [NSString \
+                                stringWithUTF8String: psz_value] forKey: \
+                                [NSString stringWithUTF8String: psz_name]];
+                        }
+                    }
+                    free( psz_name );
+                    free( psz_value );
+                }
+                if( ( b_os && b_arch && strcmp( psz_eltname, "arch" ) ) )
+                {
+                    /*if( !strcmp( psz_eltname, "version" ) )
+                    {
+                        it = m_versions.begin();
+                        while( it != m_versions.end() )
+                        {
+                            if( it->type == tmp_version.type
+                                && it->major == tmp_version.major
+                                && it->minor == tmp_version.minor
+                                && it->revision == tmp_version.revision
+                                && it->extra == tmp_version.extra )
+                            {
+                                break;
+                            }
+                            it++;
+                        }
+                        if( it == m_versions.end() )
+                        {
+                            m_versions.push_back( tmp_version );
+                            it = m_versions.begin();
+                            while( it != m_versions.end() )
+                            {
+                                if( it->type == tmp_version.type
+                                    && it->major == tmp_version.major
+                                    && it->minor == tmp_version.minor
+                                    && it->revision == tmp_version.revision
+                                    && it->extra == tmp_version.extra )
+                                {
+                                    break;
+                                }
+                                it++;
+                            }
+                        }
+                        tmp_version.type = wxT( "" );
+                        tmp_version.major = wxT( "" );
+                        tmp_version.minor = wxT( "" );
+                        tmp_version.revision = wxT( "" );
+                        tmp_version.extra = wxT( "" );
+                    }
+                    if( !strcmp( psz_eltname, "file" ) )
+                    {
+                        it->m_files.push_back( tmp_file );
+                        tmp_file.type = wxT( "" );
+                        tmp_file.md5 = wxT( "" );
+                        tmp_file.size = wxT( "" );
+                        tmp_file.url = wxT( "" );
+                        tmp_file.description = wxT( "" );
+                    }*/
+                     
+                    if(! [temp_version objectForKey: @"extra"] == @"0")
+                    {
+                        [o_fld_currentVersion setStringValue: [NSString \
+                            stringWithFormat: @"%@.%@.%@-%@ (%@)", \
+                            [temp_version objectForKey: @"major"], \
+                            [temp_version objectForKey: @"minor"], \
+                            [temp_version objectForKey: @"revision"], \
+                            [temp_version objectForKey: @"extra"], \
+                            [temp_version objectForKey: @"type"]]];
+                    }
+                    else
+                    {
+                        [o_fld_currentVersion setStringValue: [NSString \
+                            stringWithFormat: @"%@.%@.%@ (%@)", \
+                            [temp_version objectForKey: @"major"], \
+                            [temp_version objectForKey: @"minor"], \
+                            [temp_version objectForKey: @"revision"], \
+                            [temp_version objectForKey: @"type"]]];
+                    }
+                }
+                free( psz_eltname );
+                break;
+
+            case XML_READER_ENDELEM:
+                psz_eltname = xml_ReaderName( p_xml_reader );
+                if( !psz_eltname )
+                {
+                    // TODO: print message
+                    return;
+                }
+                msg_Dbg( p_intf, "element end: %s", psz_eltname );
+                if( !strcmp( psz_eltname, "os" ) )
+                    b_os = false;
+                if( !strcmp( psz_eltname, "arch" ) )
+                    b_arch = false;
+                    
+                if( !strcmp( psz_eltname, "file") )
+                {
+                    if( [temp_file objectForKey: @"type"] == @"info" )
+                    {
+                        /* this is the announce file, store it correctly */
+                        [o_files setObject: temp_file forKey: @"announce"];
+                    }
+                    else if( [temp_file objectForKey: @"type"] == @"binary" )
+                    {
+                        /* that's our binary */
+                        [o_files setObject: temp_file forKey: @"binary"];
+                    }
+                    else if( [temp_file objectForKey: @"type"] == @"source" )
+                    {
+                        /* that's the source. not needed atm, but store it 
+                         * anyway to make possible enhancement of this dialogue
+                         * a bit easier */
+                        [o_files setObject: temp_file forKey: @"source"];
+                    }
+                    
+                    /* clean the temp-dict */
+                    [temp_file removeAllObjects];
+                }
+                free( psz_eltname );
+                break;
+
+            case XML_READER_TEXT:
+                /* you can check the content of a file here (e.g. \
+                 * "Installer-less binaries", "Disk-Image", etc.). That's not
+                 * needed on OSX atm, but print debug-info anyway. */
+                psz_eltvalue = xml_ReaderValue( p_xml_reader );
+                msg_Dbg( p_intf, "  text: %s", psz_eltvalue );
+                free( psz_eltvalue );
+                break;
+        }
+    }
+
+    if( p_xml_reader && p_xml ) xml_ReaderDelete( p_xml, p_xml_reader );
+    if( p_stream ) stream_Delete( p_stream );
+
+    p_stream = stream_UrlNew( p_intf, UPDATE_VLC_MIRRORS_URL );
+    if( !p_stream )
+    {
+        msg_Err( p_intf, "Failed to open %s for reading",
+                 UPDATE_VLC_MIRRORS_URL );
+        // FIXME: display error message in dialog
+        return;
+    }
+
+    p_xml_reader = xml_ReaderCreate( p_xml, p_stream );
+
+    if( !p_xml_reader )
+    {
+        msg_Err( p_intf, "Failed to open %s for parsing",
+                 UPDATE_VLC_MIRRORS_URL );
+        // FIXME: display error message in dialog
+        return;
+    }
+    
+    /* build list */
+    while( xml_ReaderRead( p_xml_reader ) == 1 )
+    {
+        switch( xml_ReaderNodeType( p_xml_reader ) )
+        {
+            // Error
+            case -1:
+                // TODO: print message
+                return;
+
+            case XML_READER_STARTELEM:
+                psz_eltname = xml_ReaderName( p_xml_reader );
+                if( !psz_eltname )
+                {
+                    // TODO: print message
+                    return;
+                }
+                msg_Dbg( p_intf, "element name: %s", psz_eltname );
+                while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS )
+                {
+                    psz_name = xml_ReaderName( p_xml_reader );
+                    psz_value = xml_ReaderValue( p_xml_reader );
+                    if( !psz_name || !psz_value )
+                    {
+                        // TODO: print message
+                        free( psz_eltname );
+                        return;
+                    }
+                    msg_Dbg( p_intf, "  attribute %s = %s",
+                             psz_name, psz_value );
+                    
+                    if( !strcmp( psz_eltname, "mirror" ) )
+                    {
+                        [temp_mirror setObject: [NSString stringWithUTF8String: psz_name] forKey: [NSString stringWithUTF8String: psz_value]];
+                    
+                        /*if( !strcmp( psz_name, "name" ) )
+                            tmp_mirror.name = wxU( psz_value );
+                        if( !strcmp( psz_name, "location" ) )
+                            tmp_mirror.location = wxU( psz_value );*/
+                    }
+                    if( !strcmp( psz_eltname, "url" ) )
+                    {
+                        [temp_mirror setObject: [NSString stringWithUTF8String: psz_name] forKey: [NSString stringWithUTF8String: psz_value]];
+                        
+                        /*
+                        if( !strcmp( psz_name, "type" ) )
+                            tmp_mirror.type = wxU( psz_value );
+                        if( !strcmp( psz_name, "base" ) )
+                            tmp_mirror.base_url = wxU( psz_value );*/
+                    }
+                    free( psz_name );
+                    free( psz_value );
+                }
+                /*if( !strcmp( psz_eltname, "url" ) )
+                {
+                    m_mirrors.push_back( tmp_mirror );
+                    tmp_mirror.type = wxT( "" );
+                    tmp_mirror.base_url = wxT( "" );
+                }*/
+                free( psz_eltname );
+                break;
+
+            case XML_READER_ENDELEM:
+                psz_eltname = xml_ReaderName( p_xml_reader );
+                if( !psz_eltname )
+                {
+                    // TODO: print message
+                    return;
+                }
+                msg_Dbg( p_intf, "element end: %s", psz_eltname );
+                /*if( !strcmp( psz_eltname, "mirror" ) )
+                {
+                    tmp_mirror.name = wxT( "" );
+                    tmp_mirror.location = wxT( "" );
+                }*/
+                
+                /* store our mirror correctly */
+                [o_mirrors addObject: temp_mirror];
+                [temp_mirror removeAllObjects];
+                
+                free( psz_eltname );
+                break;
+
+            case XML_READER_TEXT:
+                psz_eltvalue = xml_ReaderValue( p_xml_reader );
+                msg_Dbg( p_intf, "  text: %s", psz_eltvalue );
+                free( psz_eltvalue );
+                break;
+        }
+    }
+
+
+    if( p_xml_reader && p_xml ) xml_ReaderDelete( p_xml, p_xml_reader );
+    if( p_stream ) stream_Delete( p_stream );
+    if( p_xml ) xml_Delete( p_xml );
+}
+
 @end