📄 open.m
字号:
/***************************************************************************** * open.m: MacOS X module for vlc ***************************************************************************** * Copyright (C) 2002-2003 VideoLAN * $Id: open.m,v 1.43 2004/01/27 22:19:04 bigben Exp $ * * Authors: Jon Lech Johansen <jon-vl@nanocrew.net> * Christophe Massiot <massiot@via.ecp.fr> * Derk-Jan Hartman <thedj@users.sourceforge.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <stdlib.h> /* malloc(), free() */#include <sys/param.h> /* for MAXPATHLEN */#include <string.h>#include <paths.h>#include <IOKit/IOKitLib.h>#include <IOKit/IOBSD.h>#include <IOKit/storage/IOMedia.h>#include <IOKit/storage/IOCDMedia.h>#include <IOKit/storage/IODVDMedia.h>#include "intf.h"#include "playlist.h"#include "open.h"#include "output.h"/***************************************************************************** * GetEjectableMediaOfClass *****************************************************************************/NSArray *GetEjectableMediaOfClass( const char *psz_class ){ io_object_t next_media; mach_port_t master_port; kern_return_t kern_result; NSArray *o_devices = nil; NSMutableArray *p_list = nil; io_iterator_t media_iterator; CFMutableDictionaryRef classes_to_match; kern_result = IOMasterPort( MACH_PORT_NULL, &master_port ); if( kern_result != KERN_SUCCESS ) { return( nil ); } classes_to_match = IOServiceMatching( psz_class ); if( classes_to_match == NULL ) { return( nil ); } CFDictionarySetValue( classes_to_match, CFSTR( kIOMediaEjectableKey ), kCFBooleanTrue ); kern_result = IOServiceGetMatchingServices( master_port, classes_to_match, &media_iterator ); if( kern_result != KERN_SUCCESS ) { return( nil ); } p_list = [NSMutableArray arrayWithCapacity: 1]; next_media = IOIteratorNext( media_iterator ); if( next_media != NULL ) { char psz_buf[0x32]; size_t dev_path_length; CFTypeRef str_bsd_path; do { str_bsd_path = IORegistryEntryCreateCFProperty( next_media, CFSTR( kIOBSDNameKey ), kCFAllocatorDefault, 0 ); if( str_bsd_path == NULL ) { IOObjectRelease( next_media ); continue; } snprintf( psz_buf, sizeof(psz_buf), "%s%c", _PATH_DEV, 'r' ); dev_path_length = strlen( psz_buf ); if( CFStringGetCString( str_bsd_path, (char*)&psz_buf + dev_path_length, sizeof(psz_buf) - dev_path_length, kCFStringEncodingASCII ) ) { [p_list addObject: [NSString stringWithCString: psz_buf]]; } CFRelease( str_bsd_path ); IOObjectRelease( next_media ); } while( ( next_media = IOIteratorNext( media_iterator ) ) != NULL ); } IOObjectRelease( media_iterator ); o_devices = [NSArray arrayWithArray: p_list]; return( o_devices );}/***************************************************************************** * VLCOpen implementation *****************************************************************************/@implementation VLCOpen- (void)awakeFromNib{ intf_thread_t * p_intf = [NSApp getIntf]; [o_panel setTitle: _NS("Open Source")]; [o_mrl_lbl setTitle: _NS("Media Resource Locator (MRL)")]; [o_btn_ok setTitle: _NS("OK")]; [o_btn_cancel setTitle: _NS("Cancel")]; [[o_tabview tabViewItemAtIndex: 0] setLabel: _NS("File")]; [[o_tabview tabViewItemAtIndex: 1] setLabel: _NS("Disc")]; [[o_tabview tabViewItemAtIndex: 2] setLabel: _NS("Network")]; [o_file_btn_browse setTitle: _NS("Browse...")]; [o_file_stream setTitle: _NS("Treat as a pipe rather than as a file")]; [o_disc_device_lbl setStringValue: _NS("Device name")]; [o_disc_title_lbl setStringValue: _NS("Title")]; [o_disc_chapter_lbl setStringValue: _NS("Chapter")]; [o_disc_videots_btn_browse setTitle: _NS("Browse...")]; [o_disc_dvd_menus setTitle: _NS("Use DVD menus")]; [[o_disc_type cellAtRow:0 column:0] setTitle: _NS("VIDEO_TS folder")]; [[o_disc_type cellAtRow:1 column:0] setTitle: _NS("DVD")]; [[o_disc_type cellAtRow:2 column:0] setTitle: _NS("VCD")]; [[o_disc_type cellAtRow:3 column:0] setTitle: _NS("Audio CD")]; [o_net_udp_port_lbl setStringValue: _NS("Port")]; [o_net_udpm_addr_lbl setStringValue: _NS("Address")]; [o_net_udpm_port_lbl setStringValue: _NS("Port")]; [o_net_http_url_lbl setStringValue: _NS("URL")]; [[o_net_mode cellAtRow:0 column:0] setTitle: _NS("UDP/RTP")]; [[o_net_mode cellAtRow:1 column:0] setTitle: _NS("UDP/RTP Multicast")]; [[o_net_mode cellAtRow:2 column:0] setTitle: _NS("HTTP/FTP/MMS")]; [o_net_udp_port setIntValue: config_GetInt( p_intf, "server-port" )]; [o_net_udp_port_stp setIntValue: config_GetInt( p_intf, "server-port" )]; [o_file_sub_ckbox setTitle: _NS("Load subtitles file:")]; [o_file_sub_btn_settings setTitle: _NS("Settings...")]; [o_file_sub_btn_browse setTitle: _NS("Browse...")]; [o_file_sub_override setTitle: _NS("Override")]; [o_file_sub_delay_lbl setStringValue: _NS("delay")]; [o_file_sub_delay_stp setEnabled: NO]; [o_file_sub_fps_lbl setStringValue: _NS("fps")]; [o_file_sub_fps_stp setEnabled: NO]; [o_file_sub_ok_btn setStringValue: _NS("OK")]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openFilePathChanged:) name: NSControlTextDidChangeNotification object: o_file_path]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openDiscInfoChanged:) name: NSControlTextDidChangeNotification object: o_disc_device]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openDiscInfoChanged:) name: NSControlTextDidChangeNotification object: o_disc_title]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openDiscInfoChanged:) name: NSControlTextDidChangeNotification object: o_disc_chapter]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openDiscInfoChanged:) name: NSControlTextDidChangeNotification object: o_disc_videots_folder]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openNetInfoChanged:) name: NSControlTextDidChangeNotification object: o_net_udp_port]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openNetInfoChanged:) name: NSControlTextDidChangeNotification object: o_net_udpm_addr]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openNetInfoChanged:) name: NSControlTextDidChangeNotification object: o_net_udpm_port]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(openNetInfoChanged:) name: NSControlTextDidChangeNotification object: o_net_http_url];}- (void)openTarget:(int)i_type{ int i_result; [o_tabview selectTabViewItemAtIndex: i_type]; [o_file_sub_ckbox setState: NSOffState]; i_result = [NSApp runModalForWindow: o_panel]; [o_panel close]; if( i_result ) { NSMutableDictionary *o_dic; NSMutableArray *o_options = [NSMutableArray array]; o_dic = [NSMutableDictionary dictionaryWithObject: [o_mrl stringValue] forKey: @"ITEM_URL"]; if( [o_file_sub_ckbox state] == NSOnState ) { [o_options addObject: [NSString stringWithFormat: @"sub-file=%s", [[o_file_sub_path stringValue] UTF8String]]]; if( [o_file_sub_override state] == NSOnState ) { [o_options addObject: [NSString stringWithFormat: @"sub-delay=%i", (int)( [o_file_sub_delay intValue] * 10 )]]; [o_options addObject: [NSString stringWithFormat: @"sub-fps=%f", [o_file_sub_fps floatValue]]]; } } if( [o_output_ckbox state] == NSOnState ) { [o_options addObject: [NSString stringWithString: [(VLCOutput *)o_sout_options getMRL]]]; } [o_dic setObject: (NSArray *)[o_options copy] forKey: @"ITEM_OPTIONS"]; [o_playlist appendArray: [NSArray arrayWithObject: o_dic] atPos: -1 enqueue:NO]; }}- (void)tabView:(NSTabView *)o_tv didSelectTabViewItem:(NSTabViewItem *)o_tvi{ NSString *o_label = [o_tvi label]; if( [o_label isEqualToString: _NS("File")] ) { [self openFilePathChanged: nil]; } else if( [o_label isEqualToString: _NS("Disc")] ) { [self openDiscTypeChanged: nil]; } else if( [o_label isEqualToString: _NS("Network")] ) { [self openNetModeChanged: nil]; } }- (IBAction)openFileGeneric:(id)sender{ [self openFilePathChanged: nil]; [self openTarget: 0];}- (IBAction)openDisc:(id)sender{ [self openDiscTypeChanged: nil]; [self openTarget: 1];}- (IBAction)openNet:(id)sender{ [self openNetModeChanged: nil]; [self openTarget: 2];}- (void)openFilePathChanged:(NSNotification *)o_notification{ NSString *o_mrl_string; NSString *o_filename = [o_file_path stringValue]; NSString *o_ext = [o_filename pathExtension]; vlc_bool_t b_stream = [o_file_stream state]; BOOL b_dir = NO; [[NSFileManager defaultManager] fileExistsAtPath:o_filename isDirectory:&b_dir]; if( b_dir ) { o_mrl_string = [NSString stringWithFormat: @"dir:%@", o_filename]; } else if( [o_ext isEqualToString: @"bin"] || [o_ext isEqualToString: @"cue"] || [o_ext isEqualToString: @"vob"] || [o_ext isEqualToString: @"iso"] ) { o_mrl_string = o_filename; } else { o_mrl_string = [NSString stringWithFormat: @"%s://%@", b_stream ? "stream" : "file", o_filename]; } [o_mrl setStringValue: o_mrl_string]; }- (IBAction)openFileBrowse:(id)sender{ NSOpenPanel *o_open_panel = [NSOpenPanel openPanel]; [o_open_panel setAllowsMultipleSelection: NO]; [o_open_panel setCanChooseDirectories: YES]; [o_open_panel setTitle: _NS("Open File")]; [o_open_panel setPrompt: _NS("Open")]; [o_open_panel beginSheetForDirectory:nil file:nil types:nil modalForWindow:[sender window] modalDelegate: self didEndSelector: @selector(pathChosenInPanel: withReturn: contextInfo:) contextInfo: nil];}- (void)pathChosenInPanel: (NSOpenPanel *) sheet withReturn:(int)returnCode contextInfo:(void *)contextInfo{ if (returnCode == NSFileHandlingPanelOKButton) { NSString *o_filename = [[sheet filenames] objectAtIndex: 0]; [o_file_path setStringValue: o_filename]; [self openFilePathChanged: nil]; }}- (IBAction)openFileStreamChanged:(id)sender{ [self openFilePathChanged: nil];}- (IBAction)openDiscTypeChanged:(id)sender{ NSString *o_type; vlc_bool_t b_device, b_menus, b_title_chapter; [o_disc_device removeAllItems]; b_title_chapter = ![o_disc_dvd_menus state];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -