macosx preferences: more memleaks
authorDerk-Jan Hartman <hartman@videolan.org>
Fri, 29 May 2009 11:18:01 +0000 (13:18 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 29 May 2009 22:32:43 +0000 (00:32 +0200)
* initmethods returning nil. checks moved outside init.
* leaking module_config_get. Keep better track of those.
* spurious strdup
* leaked hotkeys NSMutableArray when resetting the preferences.
(cherry picked from commit 27d841889c9116d46be643fa482f9ca562d233f3)

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/gui/macosx/prefs.m
modules/gui/macosx/prefs_widgets.m
modules/gui/macosx/simple_prefs.m

index f22ed19..2eb1b90 100644 (file)
     NSMutableArray *_children;
     NSMutableArray *_options;
     NSMutableArray *_subviews;
-    module_config_t * _configItem;
 }
-- (id)initWithConfigItem:(module_config_t *)configItem;
 
-- (id)initWithName:(NSString*)name andConfigItem:(module_config_t *)configItem;
+- (id)initWithName:(NSString*)name;
 
 - (int)numberOfChildren;
 - (VLCTreeItem *)childAtIndex:(int)i_index;
 
-- (module_config_t *)configItem;
-
 - (NSString *)name;
 - (NSMutableArray *)children;
 - (NSMutableArray *)options;
 /* Plugin daughters */
 @interface VLCTreePluginItem : VLCTreeItem
 {
+    module_config_t * _configItems;
+    unsigned int _configSize;
 }
 + (VLCTreePluginItem *)pluginTreeItemWithPlugin:(module_t *)plugin;
 - (id)initWithPlugin:(module_t *)plugin;
+
+- (module_config_t *)configItems;
+- (unsigned int)configSize;
 @end
 
 /* CONFIG_CAT */
 }
 + (VLCTreeCategoryItem *)categoryTreeItemWithCategory:(int)category;
 - (id)initWithCategory:(int)category;
+
 - (int)category;
 - (VLCTreeSubCategoryItem *)itemRepresentingSubCategory:(int)category;
 @end
 
 /* individual options. */
 @interface VLCTreeLeafItem : VLCTreeItem
-{ }
+{
+    module_config_t * _configItem;
+}
+- (id)initWithConfigItem:(module_config_t *)configItem;
+
+- (module_config_t *)configItem;
 @end
 
-@interface VLCTreeMainItem : VLCTreeItem
+@interface VLCTreeMainItem : VLCTreePluginItem
 {
-    module_config_t * _configItems;
 }
 - (VLCTreeCategoryItem *)itemRepresentingCategory:(int)category;
 @end
@@ -298,12 +304,6 @@ static VLCPrefs *_o_sharedMainInstance = nil;
     return nil;
 }
 
-- (void)dealloc
-{
-    module_config_free( _configItems );
-    [super dealloc];
-}
-
 - (bool)isSubCategoryGeneral:(int)category
 {
     if(category == SUBCAT_VIDEO_GENERAL ||
@@ -337,34 +337,44 @@ static VLCPrefs *_o_sharedMainInstance = nil;
     /* Add the capabilities */
     for( i = 0; i < count; i++ )
     {
-        module_t * p_module = modules[i];
-
-        /* Exclude empty plugins (submodules don't have config */
-        /* options, they are stored in the parent module) */
-        unsigned int confsize;
-        _configItems = module_config_get( p_module, &confsize );
-
         VLCTreeCategoryItem * categoryItem = nil;
         VLCTreeSubCategoryItem * subCategoryItem = nil;
         VLCTreePluginItem * pluginItem = nil;
+        module_config_t *p_configs = NULL;
         int lastsubcat = 0;
+        unsigned int confsize;
+
+        module_t * p_module = modules[i];
+
+        /* Exclude empty plugins (submodules don't have config */
+        /* options, they are stored in the parent module) */
+        if( module_is_main( p_module) )
+        {
+            pluginItem = self;
+            _configItems = module_config_get( p_module, &confsize );
+            _configSize = confsize;
+        } else {
+            pluginItem = [VLCTreePluginItem pluginTreeItemWithPlugin: p_module];
+            confsize = [pluginItem configSize];
+        }
+        p_configs = [pluginItem configItems];
 
         unsigned int j;
         for( j = 0; j < confsize; j++ )
         {
-            int configType = _configItems[j].i_type;
+            int configType = p_configs[j].i_type;
             if( configType == CONFIG_CATEGORY )
             {
-                categoryItem = [self itemRepresentingCategory:_configItems[j].value.i];
+                categoryItem = [self itemRepresentingCategory:p_configs[j].value.i];
                 if(!categoryItem)
                 {
-                    categoryItem = [VLCTreeCategoryItem categoryTreeItemWithCategory:_configItems[j].value.i];
+                    categoryItem = [VLCTreeCategoryItem categoryTreeItemWithCategory:p_configs[j].value.i];
                     if(categoryItem) [[self children] addObject:categoryItem];
                 }
             }
             else if( configType == CONFIG_SUBCATEGORY )
             {
-                lastsubcat = _configItems[j].value.i;
+                lastsubcat = p_configs[j].value.i;
                 if( categoryItem && ![self isSubCategoryGeneral:lastsubcat] )
                 {
                     subCategoryItem = [categoryItem itemRepresentingSubCategory:lastsubcat];
@@ -380,22 +390,21 @@ static VLCPrefs *_o_sharedMainInstance = nil;
             {
                 if( categoryItem && [self isSubCategoryGeneral:lastsubcat] )
                 {
-                    [[categoryItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&_configItems[j]]];
+                    [[categoryItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&p_configs[j]]];
                 }
                 else if( subCategoryItem )
                 {
-                    [[subCategoryItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&_configItems[j]]];
+                    [[subCategoryItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&p_configs[j]]];
                 }
             }
             else if( !module_is_main( p_module) && (configType & CONFIG_ITEM))
             {
-                if( !pluginItem )
+                if( ![[subCategoryItem children] containsObject: pluginItem] )
                 {
-                    pluginItem = [VLCTreePluginItem pluginTreeItemWithPlugin: p_module];
-                    if(pluginItem) [[subCategoryItem children] addObject:pluginItem];
+                    [[subCategoryItem children] addObject:pluginItem];
                 }
                 if( pluginItem )
-                    [[pluginItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&_configItems[j]]];
+                    [[pluginItem options] addObject:[[VLCTreeLeafItem alloc] initWithConfigItem:&p_configs[j]]];
             }
         }
     }
@@ -408,13 +417,13 @@ static VLCPrefs *_o_sharedMainInstance = nil;
 @implementation VLCTreeCategoryItem
 + (VLCTreeCategoryItem *)categoryTreeItemWithCategory:(int)category
 {
+    if(!config_CategoryNameGet( category )) return nil;
     return [[[[self class] alloc] initWithCategory:category] autorelease];
 }
 - (id)initWithCategory:(int)category
 {
-    if(!config_CategoryNameGet( category )) return nil;
     NSString * name = [[VLCMain sharedInstance] localizedString: config_CategoryNameGet( category )];
-    if(self = [super initWithName:name andConfigItem:nil])
+    if(self = [super initWithName:name])
     {
         _category = category;
         //_help = [[[VLCMain sharedInstance] localizedString: config_CategoryHelpGet( category )] retain];
@@ -444,9 +453,8 @@ static VLCPrefs *_o_sharedMainInstance = nil;
 @implementation VLCTreeSubCategoryItem
 - (id)initWithSubCategory:(int)subCategory
 {
-    if(!config_CategoryNameGet( subCategory )) return nil;
     NSString * name = [[VLCMain sharedInstance] localizedString: config_CategoryNameGet( subCategory )];
-    if(self = [super initWithName:name andConfigItem:NULL])
+    if(self = [super initWithName:name])
     {
         _subCategory = subCategory;
         //_help = [[[VLCMain sharedInstance] localizedString: config_CategoryHelpGet( subCategory )] retain];
@@ -456,6 +464,7 @@ static VLCPrefs *_o_sharedMainInstance = nil;
 
 + (VLCTreeSubCategoryItem *)subCategoryTreeItemWithSubCategory:(int)subCategory
 {
+    if(!config_CategoryNameGet( subCategory )) return nil;
     return [[[[self class] alloc] initWithSubCategory:subCategory] autorelease];
 }
 
@@ -470,9 +479,10 @@ static VLCPrefs *_o_sharedMainInstance = nil;
 @implementation VLCTreePluginItem
 - (id)initWithPlugin:(module_t *)plugin
 {
-    NSString * name = [[VLCMain sharedInstance] localizedString: module_get_name( plugin, false )];
-    if(self = [super initWithName:name andConfigItem:NULL])
+    NSString * name = [[VLCMain sharedInstance] localizedString: module_get_name( plugin, false )?:""];
+    if(self = [super initWithName:name])
     {
+        _configItems = module_config_get( plugin, &_configSize );
         //_plugin = plugin;
         //_help = [[[VLCMain sharedInstance] localizedString: config_CategoryHelpGet( subCategory )] retain];
     }
@@ -484,29 +494,54 @@ static VLCPrefs *_o_sharedMainInstance = nil;
     return [[[[self class] alloc] initWithPlugin:plugin] autorelease];
 }
 
+- (void)dealloc
+{
+    module_config_free( _configItems );
+    [super dealloc];
+}
+
+- (module_config_t *)configItems
+{
+    return _configItems;
+}
+
+- (unsigned int)configSize
+{
+    return _configSize;
+}
+
 @end
 
 #pragma mark -
 @implementation VLCTreeLeafItem
+
+- (id)initWithConfigItem: (module_config_t *) configItem
+{
+    NSString * name = [[[VLCMain sharedInstance] localizedString:configItem->psz_name] autorelease];
+    self = [super initWithName:name];
+    if( self != nil )
+    {
+        _configItem = configItem;
+    }
+    return self;
+}
+
+- (module_config_t *)configItem
+{
+    return _configItem;
+}
 @end
 
 #pragma mark -
 #pragma mark (Root class for all TreeItems)
 @implementation VLCTreeItem
 
-- (id)initWithConfigItem: (module_config_t *) configItem
-{
-    NSString * name = [[VLCMain sharedInstance] localizedString:configItem->psz_name];
-    return [self initWithName:name andConfigItem:configItem];
-}
-
-- (id)initWithName:(NSString*)name andConfigItem:(module_config_t *)configItem
+- (id)initWithName:(NSString*)name
 {
     self = [super init];
     if( self != nil )
     {
         _name = [name retain];
-        _configItem = configItem;
     }
     return self;
 }
@@ -552,7 +587,7 @@ static VLCPrefs *_o_sharedMainInstance = nil;
         long i;
         for( i = 0; i < [[self options] count]; i++)
         {
-            VLCTreeItem * item = [[self options] objectAtIndex:i];
+            VLCTreeLeafItem * item = [[self options] objectAtIndex:i];
 
             VLCConfigControl *control;
             control = [VLCConfigControl newControl:[item configItem] withView:view];
@@ -632,11 +667,6 @@ static VLCPrefs *_o_sharedMainInstance = nil;
     if(!_options) _options = [[NSMutableArray alloc] init];
     return _options;
 }
-
-- (module_config_t *)configItem
-{
-    return _configItem;
-}
 @end
 
 #pragma mark -
index 044f0e6..47a03a9 100644 (file)
@@ -1017,8 +1017,8 @@ o_textfield = [[[NSSecureTextField alloc] initWithFrame: s_rc] retain];       \
 
 - (char *)stringValue
 {
-    return strdup( [[VLCMain sharedInstance] delocalizeString:
-                        [o_textfield stringValue]] );
+    return [[VLCMain sharedInstance] delocalizeString:
+                        [o_textfield stringValue]];
 }
 @end
 
@@ -1282,10 +1282,10 @@ o_textfield = [[[NSSecureTextField alloc] initWithFrame: s_rc] retain];       \
                     continue;
                 unsigned int confsize;
                 unsigned int unused;
-                module_config_get( p_parser, &confsize );
+                module_config_t *p_configlist = module_config_get( p_parser, &confsize );
                 for ( i = 0; i < confsize; i++ )
                 {
-                    module_config_t *p_config = module_config_get( p_parser, &unused ) + i;
+                    module_config_t *p_config = &p_configlist[i];
                     /* Hack: required subcategory is stored in i_min */
                     if( p_config->i_type == CONFIG_SUBCATEGORY &&
                         p_config->value.i == p_item->min.i )
@@ -1299,6 +1299,7 @@ o_textfield = [[[NSSecureTextField alloc] initWithFrame: s_rc] retain];       \
                             [o_popup selectItem:[o_popup lastItem]];
                     }
                 }
+                module_config_free( p_configlist );
             }
         }
         module_list_free( p_list );
@@ -2033,12 +2034,12 @@ if( _p_item->i_type == CONFIG_ITEM_MODULE_LIST )
             continue;
 
         unsigned int confsize;
-        module_config_get( p_parser, &confsize );
+        module_config_t *p_configlist = module_config_get( p_parser, &confsize );
 
         for ( i = 0; i < confsize; i++ )
         {
             unsigned int unused;
-            module_config_t *p_config = module_config_get( p_parser, &unused ) + i;
+            module_config_t *p_config = &p_configlist[i];
             NSString *o_modulelongname, *o_modulename;
             NSNumber *o_moduleenabled = nil;
 
@@ -2062,6 +2063,7 @@ if( _p_item->i_type == CONFIG_ITEM_MODULE_LIST )
                     o_moduleenabled, nil]];
             }
         }
+        module_config_free( p_configlist );
     }
     module_list_free( p_list );
 
index 0ddf9de..94eaa50 100644 (file)
@@ -574,6 +574,7 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
      * hotkeys settings *
      ********************/
     const struct hotkey *p_hotkeys = p_intf->p_libvlc->p_hotkeys;
+    [o_hotkeySettings release];
     o_hotkeySettings = [[NSMutableArray alloc] init];
     NSMutableArray *o_tempArray_desc = [[NSMutableArray alloc] init];
     i = 1;