+ PL_LOCK;
+ playlist_RecursiveNodeSort( p_playlist,
+ p_item->p_parent, i_mode, ORDER_NORMAL );
+ PL_UNLOCK;
+ }
+ vlc_object_release( p_playlist );
+ [self playlistUpdated];
+}
+
+- (input_item_t *)createItem:(NSDictionary *)o_one_item
+{
+ intf_thread_t * p_intf = VLCIntf;
+ playlist_t * p_playlist = pl_Yield( p_intf );
+
+ input_item_t *p_input;
+ int i;
+ BOOL b_rem = FALSE, b_dir = FALSE;
+ NSString *o_uri, *o_name;
+ NSArray *o_options;
+ NSURL *o_true_file;
+
+ /* Get the item */
+ o_uri = (NSString *)[o_one_item objectForKey: @"ITEM_URL"];
+ o_name = (NSString *)[o_one_item objectForKey: @"ITEM_NAME"];
+ o_options = (NSArray *)[o_one_item objectForKey: @"ITEM_OPTIONS"];
+
+ /* Find the name for a disc entry (i know, can you believe the trouble?) */
+ if( ( !o_name || [o_name isEqualToString:@""] ) && [o_uri rangeOfString: @"/dev/"].location != NSNotFound )
+ {
+ int i_count, i_index;
+ struct statfs *mounts = NULL;
+
+ i_count = getmntinfo (&mounts, MNT_NOWAIT);
+ /* getmntinfo returns a pointer to static data. Do not free. */
+ for( i_index = 0 ; i_index < i_count; i_index++ )
+ {
+ NSMutableString *o_temp, *o_temp2;
+ o_temp = [NSMutableString stringWithString: o_uri];
+ o_temp2 = [NSMutableString stringWithUTF8String: mounts[i_index].f_mntfromname];
+ [o_temp replaceOccurrencesOfString: @"/dev/rdisk" withString: @"/dev/disk" options:NSLiteralSearch range:NSMakeRange(0, [o_temp length]) ];
+ [o_temp2 replaceOccurrencesOfString: @"s0" withString: @"" options:NSLiteralSearch range:NSMakeRange(0, [o_temp2 length]) ];
+ [o_temp2 replaceOccurrencesOfString: @"s1" withString: @"" options:NSLiteralSearch range:NSMakeRange(0, [o_temp2 length]) ];
+
+ if( strstr( [o_temp fileSystemRepresentation], [o_temp2 fileSystemRepresentation] ) != NULL )
+ {
+ o_name = [[NSFileManager defaultManager] displayNameAtPath: [NSString stringWithUTF8String:mounts[i_index].f_mntonname]];
+ }
+ }
+ }
+ /* If no name, then make a guess */
+ if( !o_name) o_name = [[NSFileManager defaultManager] displayNameAtPath: o_uri];
+
+ if( [[NSFileManager defaultManager] fileExistsAtPath:o_uri isDirectory:&b_dir] && b_dir &&
+ [[NSWorkspace sharedWorkspace] getFileSystemInfoForPath: o_uri isRemovable: &b_rem
+ isWritable:NULL isUnmountable:NULL description:NULL type:NULL] && b_rem )
+ {
+ /* All of this is to make sure CD's play when you D&D them on VLC */
+ /* Converts mountpoint to a /dev file */
+ struct statfs *buf;
+ char *psz_dev;
+ NSMutableString *o_temp;
+
+ buf = (struct statfs *) malloc (sizeof(struct statfs));
+ statfs( [o_uri fileSystemRepresentation], buf );
+ psz_dev = strdup(buf->f_mntfromname);
+ o_temp = [NSMutableString stringWithUTF8String: psz_dev ];
+ [o_temp replaceOccurrencesOfString: @"/dev/disk" withString: @"/dev/rdisk" options:NSLiteralSearch range:NSMakeRange(0, [o_temp length]) ];
+ [o_temp replaceOccurrencesOfString: @"s0" withString: @"" options:NSLiteralSearch range:NSMakeRange(0, [o_temp length]) ];
+ [o_temp replaceOccurrencesOfString: @"s1" withString: @"" options:NSLiteralSearch range:NSMakeRange(0, [o_temp length]) ];
+ o_uri = o_temp;
+ }
+
+ p_input = input_ItemNew( p_playlist, [o_uri fileSystemRepresentation], [o_name UTF8String] );
+ if( !p_input )
+ return NULL;