|
|
|
@ -43,19 +43,30 @@ |
|
|
|
@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) |
|
|
|
@ -113,6 +124,24 @@ static void HandleMediaListViewItemDeleted( const libvlc_event_t * event, void * |
|
|
|
[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]; |
|
|
|
@ -155,6 +184,12 @@ static void HandleMediaListViewItemDeleted( const libvlc_event_t * event, void * |
|
|
|
{ |
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
|
@ -218,6 +253,8 @@ static void HandleMediaListViewItemDeleted( const libvlc_event_t * event, void * |
|
|
|
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); |
|
|
|
@ -266,7 +303,17 @@ static void HandleMediaListViewItemDeleted( const libvlc_event_t * event, void * |
|
|
|
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]; |
|
|
|
|