@end
@implementation VLCMediaListAspectNode
+- (id)init
+{
+ if(self = [super init])
+ {
+ media = nil;
+ children = nil;
+ }
+ return self;
+}
+- (void)dealloc
+{
+ [media release];
+ [children release];
+ [super dealloc];
+}
+
@synthesize media;
@synthesize children;
- (BOOL)isLeaf
{
- return self.children == NULL;
+ return self.children == nil;
}
--(void)dealloc
-{
- [self.children release];
- [super dealloc];
-}
@end
@implementation VLCMediaListAspect (KeyValueCodingCompliance)
[parentMediaList release];
[super dealloc];
}
+
+- (void)release
+{
+ @synchronized(self)
+ {
+ if([self retainCount] <= 1)
+ {
+ /* We must make sure we won't receive new event after an upcoming dealloc
+ * We also may receive a -retain in some event callback that may occcur
+ * Before libvlc_event_detach. So this can't happen in dealloc */
+ libvlc_event_manager_t * p_em = libvlc_media_list_view_event_manager(p_mlv);
+ libvlc_event_detach(p_em, libvlc_MediaListViewItemDeleted, HandleMediaListViewItemDeleted, self, NULL);
+ libvlc_event_detach(p_em, libvlc_MediaListViewItemAdded, HandleMediaListViewItemAdded, self, NULL);
+ }
+ [super release];
+ }
+}
+
- (NSString *)description
{
NSMutableString * content = [NSMutableString string];
{
VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
[node setMedia:[self mediaAtIndex: index]];
+ libvlc_media_list_view_t * p_sub_mlv = libvlc_media_list_view_children_for_item([self libVLCMediaListView], [node.media libVLCMediaDescriptor], NULL);
+ if( p_sub_mlv )
+ {
+ [node setChildren:[VLCMediaListAspect mediaListAspectWithLibVLCMediaListView: p_sub_mlv]];
+ libvlc_media_list_view_release(p_sub_mlv);
+ }
return node;
}
VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
[node setMedia:[VLCMedia mediaWithLibVLCMediaDescriptor: p_md]];
[node setChildren: p_sub_mlv ? [VLCMediaListAspect mediaListAspectWithLibVLCMediaListView: p_sub_mlv] : nil];
+ if( p_sub_mlv ) NSAssert(![node isLeaf], @"Not leaf");
+
[cachedNode addObject:node];
libvlc_media_descriptor_release(p_md);
if( p_sub_mlv ) libvlc_media_list_view_release(p_sub_mlv);
VLCMedia * media = [args objectForKey:@"media"];
VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
[node setMedia:media];
- [node setChildren:[self childrenAtIndex:index]];
+
+ /* Set the sub media list view we enventually have */
+ libvlc_media_list_view_t * p_sub_mlv = libvlc_media_list_view_children_for_item([self libVLCMediaListView], [media libVLCMediaDescriptor], NULL);
+
+ if( p_sub_mlv )
+ {
+ [node setChildren:[VLCMediaListAspect mediaListAspectWithLibVLCMediaListView: p_sub_mlv]];
+ libvlc_media_list_view_release(p_sub_mlv);
+ NSAssert(![node isLeaf], @"Not leaf");
+ }
+
/* Sanity check */
if( index && index > [cachedNode count] )
index = [cachedNode count];