+}
+
+@end
+
+/*****************************************************************************
+ * extension to NSOutlineView's interface to fix compilation warnings
+ * and let us access these 2 functions properly
+ * this uses a private Apple-API, but works fine on all current OSX releases
+ * keep checking for compatiblity with future releases though
+ *****************************************************************************/
+
+@interface NSOutlineView (UndocumentedSortImages)
++ (NSImage *)_defaultTableHeaderSortImage;
++ (NSImage *)_defaultTableHeaderReverseSortImage;
+@end
+
+
+/*****************************************************************************
+ * VLCPlaylist implementation
+ *****************************************************************************/
+@implementation VLCPlaylist
+
+- (id)init
+{
+ self = [super init];
+ if ( self != nil )
+ {
+ o_nodes_array = [[NSMutableArray alloc] init];
+ o_items_array = [[NSMutableArray alloc] init];
+ }
+ return self;
+}
+
+- (void)awakeFromNib
+{
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
+
+ int i;
+
+ [super awakeFromNib];
+
+ [o_outline_view setDoubleAction: @selector(playItem:)];
+
+ [o_outline_view registerForDraggedTypes:
+ [NSArray arrayWithObjects: NSFilenamesPboardType,
+ @"VLCPlaylistItemPboardType", nil]];
+ [o_outline_view setIntercellSpacing: NSMakeSize (0.0, 1.0)];
+
+ /* This uses private Apple API which works fine until 10.4.
+ * We need to keep checking in the future!
+ * These methods are being added artificially to NSOutlineView's interface above */
+ o_ascendingSortingImage = [[NSOutlineView class] _defaultTableHeaderSortImage];
+ o_descendingSortingImage = [[NSOutlineView class] _defaultTableHeaderReverseSortImage];
+
+ o_tc_sortColumn = nil;
+
+ char ** ppsz_name;
+ char ** ppsz_services = services_discovery_GetServicesNames( p_playlist, &ppsz_name );
+
+ for( i = 0; ppsz_services[i]; i++ )
+ {
+ vlc_bool_t b_enabled;
+ char *objectname;
+ NSMenuItem *o_lmi;
+
+ char * name = ppsz_name[i] ? ppsz_name[i] : ppsz_services[i];
+ /* Check whether to enable these menuitems */
+ b_enabled = playlist_IsServicesDiscoveryLoaded( p_playlist, objectname );
+
+ /* Create the menu entries used in the playlist menu */
+ o_lmi = [[o_mi_services submenu] addItemWithTitle:
+ [NSString stringWithUTF8String: name]
+ action: @selector(servicesChange:)
+ keyEquivalent: @""];
+ [o_lmi setTarget: self];
+ [o_lmi setRepresentedObject: [NSString stringWithUTF8String: ppsz_services[i]]];
+ if( b_enabled ) [o_lmi setState: NSOnState];
+
+ /* Create the menu entries for the main menu */
+ o_lmi = [[o_mm_mi_services submenu] addItemWithTitle:
+ [NSString stringWithUTF8String: name]
+ action: @selector(servicesChange:)
+ keyEquivalent: @""];
+ [o_lmi setTarget: self];
+ [o_lmi setRepresentedObject: [NSString stringWithUTF8String: ppsz_services[i]]];
+ if( b_enabled ) [o_lmi setState: NSOnState];
+
+ free( ppsz_services[i] );
+ free( ppsz_name[i] );
+ }
+ free( ppsz_services );
+ free( ppsz_name );
+
+ vlc_object_release( p_playlist );