darwin_specific.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:5k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * darwin_specific.m: Darwin specific features
  3.  *****************************************************************************
  4.  * Copyright (C) 2001-2009 the VideoLAN team
  5.  * $Id: 23ef2ff28f2439b0062a248bcdc16bb9a656ec69 $
  6.  *
  7.  * Authors: Sam Hocevar <sam@zoy.org>
  8.  *          Christophe Massiot <massiot@via.ecp.fr>
  9.  *          Pierre d'Herbemont <pdherbemont@free.fr>
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  24.  *****************************************************************************/
  25. #ifdef HAVE_CONFIG_H
  26. # include "config.h"
  27. #endif
  28. #include <vlc_common.h>
  29. #include "../libvlc.h"
  30. #include <dirent.h>                                                /* *dir() */
  31. #include <CoreFoundation/CoreFoundation.h>
  32. #ifdef HAVE_LOCALE_H
  33. #   include <locale.h>
  34. #endif
  35. #ifdef HAVE_MACH_O_DYLD_H
  36. #   include <mach-o/dyld.h>
  37. #endif
  38. #ifndef MAXPATHLEN
  39. # define MAXPATHLEN 1024
  40. #endif
  41. /*****************************************************************************
  42.  * system_Init: fill in program path & retrieve language
  43.  *****************************************************************************/
  44. void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
  45. {
  46.     VLC_UNUSED(p_this);
  47.     char i_dummy;
  48.     char *p_char = NULL;
  49.     char *p_oldchar = &i_dummy;
  50.     unsigned int i;
  51.     (void)pi_argc;
  52.     /* Get the full program path and name */
  53.     /* First try to see if we are linked to the framework */
  54.     for (i = 0; i < _dyld_image_count(); i++)
  55.     {
  56.         const char * psz_img_name = _dyld_get_image_name(i);
  57.         /* Check for "VLCKit.framework/Versions/Current/VLCKit",
  58.          * as well as "VLCKit.framework/Versions/A/VLCKit" and
  59.          * "VLC.framework/Versions/B/VLCKit" */
  60.         if( (p_char = strstr( psz_img_name, "VLCKit.framework/Versions/" )) )
  61.         {
  62.             /* Look for the next forward slash */
  63.             p_char += 26; /* p_char += strlen(" VLCKit.framework/Versions/" ) */
  64.             while( *p_char != '' && *p_char != '/')
  65.                 p_char++;
  66.             
  67.             /* If the string ends with VLC then we've found a winner */
  68.             if ( !strcmp( p_char, "/VLCKit" ) )
  69.             {
  70.                 p_char = strdup( psz_img_name );
  71.                 break;
  72.             }
  73.             else
  74.                 p_char = NULL;
  75.         }
  76.     }
  77.     if( !p_char )
  78.     {
  79.         char path[MAXPATHLEN+1];
  80.         uint32_t path_len = MAXPATHLEN;
  81.         if ( !_NSGetExecutablePath(path, &path_len) )
  82.             p_char = strdup(path);
  83.     }
  84.     if( !p_char )
  85.     {
  86.         /* We are not linked to the VLC.framework, return the executable path */
  87.         p_char = strdup( ppsz_argv[ 0 ] );
  88.     }
  89.     free(psz_vlcpath);
  90.     psz_vlcpath = p_char;
  91.     /* Remove trailing program name */
  92.     for( ; *p_char ; )
  93.     {
  94.         if( *p_char == '/' )
  95.         {
  96.             *p_oldchar = '/';
  97.             *p_char = '';
  98.             p_oldchar = p_char;
  99.         }
  100.         p_char++;
  101.     }
  102.     /* Check if $LANG is set. */
  103.     if( NULL == getenv("LANG") )
  104.     {
  105.         /*
  106.            Retrieve the preferred language as chosen in  System Preferences.app
  107.            (note that CFLocaleCopyCurrent() is not used because it returns the
  108.             preferred locale not language)
  109.         */
  110.         CFArrayRef all_locales, preferred_locales;
  111.         char psz_locale[50];
  112.         all_locales = CFLocaleCopyAvailableLocaleIdentifiers();
  113.         preferred_locales = CFBundleCopyLocalizationsForPreferences( all_locales, NULL );
  114.         if ( preferred_locales )
  115.         {
  116.             if ( CFArrayGetCount( preferred_locales ) )
  117.             {
  118.                 CFStringRef user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 );
  119.                 CFStringGetCString( user_language_string_ref, psz_locale, sizeof(psz_locale), kCFStringEncodingUTF8 );
  120.                 setenv( "LANG", psz_locale, 1 );
  121.             }
  122.             CFRelease( preferred_locales );
  123.         }
  124.         CFRelease( all_locales );
  125.     }
  126. }
  127. /*****************************************************************************
  128.  * system_Configure: check for system specific configuration options.
  129.  *****************************************************************************/
  130. void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
  131. {
  132.     (void)p_this;
  133.     (void)pi_argc;
  134.     (void)ppsz_argv;
  135. }
  136. /*****************************************************************************
  137.  * system_End: free the program path.
  138.  *****************************************************************************/
  139. void system_End( libvlc_int_t *p_this )
  140. {
  141.     (void)p_this;
  142.     free( psz_vlcpath );
  143.     psz_vlcpath = NULL;
  144. }