* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
- * Olivier Teulière <ipkiss@via.ecp.fr>
+ * Olivier Teulière <ipkiss@via.ecp.fr>
*
* 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
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include "theme_loader.hpp"
#include "../src/vlcproc.hpp"
#include "../src/window_manager.hpp"
+#include <cctype>
+
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif
#if defined( HAVE_ZLIB_H )
# include <zlib.h>
# include <errno.h>
-int gzopen_frontend ( char *pathname, int oflags, int mode );
+int gzopen_frontend ( const char *pathname, int oflags, int mode );
int gzclose_frontend( int );
int gzread_frontend ( int, void *, size_t );
int gzwrite_frontend( int, const void *, size_t );
bool ThemeLoader::load( const string &fileName )
{
+ string path = getFilePath( fileName );
+
+ //Before all, let's see if the file is present
+ struct stat p_stat;
+ if( utf8_stat( path.c_str(), &p_stat ) )
+ return false;
+
// First, we try to un-targz the file, and if it fails we hope it's a XML
// file...
- string path = getFilePath( fileName );
+
#if defined( HAVE_ZLIB_H )
- if( ! extract( fileName ) && ! parse( path, fileName ) )
+ if( ! extract( sToLocale( fileName ) ) && ! parse( path, fileName ) )
return false;
#else
if( ! parse( path, fileName ) )
// Show the windows
pNewTheme->getWindowManager().showAll( true );
}
- if( skin_last ) free( skin_last );
+ free( skin_last );
// The new theme cannot embed a video output yet
VlcProc::instance( getIntf() )->dropVout();
{
if( !extractFileInZip( file, rootDir ) )
{
- msg_Warn( getIntf(), "Error while unzipping %s",
+ msg_Warn( getIntf(), "error while unzipping %s",
zipFile.c_str() );
+ unzClose( file );
return false;
}
// Go the next file in the archive
if( unzGoToNextFile( file ) !=UNZ_OK )
{
- msg_Warn( getIntf(), "Error while unzipping %s",
+ msg_Warn( getIntf(), "error while unzipping %s",
zipFile.c_str() );
+ unzClose( file );
return false;
}
}
}
+ unzClose( file );
return true;
}
return false;
}
+ // Convert the file name to lower case, because some winamp skins
+ // use the wrong case...
+ for( size_t i=0; i< strlen( filenameInZip ); i++)
+ {
+ filenameInZip[i] = tolower( filenameInZip[i] );
+ }
+
// Allocate the buffer
void *pBuffer = malloc( ZIP_BUFFER_SIZE );
if( !pBuffer )
{
- msg_Err( getIntf(), "Failed to allocate memory" );
+ msg_Err( getIntf(), "failed to allocate memory" );
return false;
}
FILE *fout = fopen( fullPath.c_str(), "wb" );
if( fout == NULL )
{
- msg_Err( getIntf(), "Error opening %s", fullPath.c_str() );
+ msg_Err( getIntf(), "error opening %s", fullPath.c_str() );
free( pBuffer );
return false;
}
n = unzReadCurrentFile( file, pBuffer, ZIP_BUFFER_SIZE );
if( n < 0 )
{
- msg_Err( getIntf(), "Error while reading zip file" );
+ msg_Err( getIntf(), "error while reading zip file" );
free( pBuffer );
return false;
}
{
if( fwrite( pBuffer, n , 1, fout) != 1 )
{
- msg_Err( getIntf(), "Error while writing %s",
+ msg_Err( getIntf(), "error while writing %s",
fullPath.c_str() );
free( pBuffer );
return false;
{
bool result = true;
char *tmpdir = tempnam( NULL, "vlt" );
- string tempPath = tmpdir;
+ string tempPath = sFromLocale( tmpdir );
free( tmpdir );
// Extract the file in a temporary directory
if( ! extractTarGz( fileName, tempPath ) &&
! extractZip( fileName, tempPath ) )
+ {
+ deleteTempFiles( tempPath );
return false;
+ }
string path;
string xmlFile;
string mainBmp;
if( findFile( tempPath, "main.bmp", mainBmp ) )
{
- msg_Dbg( getIntf(), "Try to load a winamp2 skin" );
+ msg_Dbg( getIntf(), "trying to load a winamp2 skin" );
path = getFilePath( mainBmp );
// Look for winamp2.xml in the resource path
// Parse the XML file
if (! parse( path, xmlFile ) )
{
- msg_Err( getIntf(), "Error while parsing %s", xmlFile.c_str() );
+ msg_Err( getIntf(), "error while parsing %s", xmlFile.c_str() );
result = false;
}
}
else
{
- msg_Err( getIntf(), "No XML found in theme %s", fileName.c_str() );
+ msg_Err( getIntf(), "no XML found in theme %s", fileName.c_str() );
result = false;
}
bool ThemeLoader::parse( const string &path, const string &xmlFile )
{
// File loaded
- msg_Dbg( getIntf(), "Using skin file: %s", xmlFile.c_str() );
+ msg_Dbg( getIntf(), "using skin file: %s", xmlFile.c_str() );
// Start the parser
SkinParser parser( getIntf(), xmlFile, path );
if( ! parser.parse() )
{
- msg_Err( getIntf(), "Failed to parse %s", xmlFile.c_str() );
+ msg_Err( getIntf(), "failed to parse %s", xmlFile.c_str() );
return false;
}
// Build and store the theme
- Builder builder( getIntf(), parser.getData() );
+ Builder builder( getIntf(), parser.getData(), path );
getIntf()->p_sys->p_theme = builder.build();
return true;
const string &sep = OSFactory::instance( getIntf() )->getDirSeparator();
DIR *pCurrDir;
- struct dirent *pDirContent;
+ char *pszDirContent;
// Open the dir
- pCurrDir = opendir( rootDir.c_str() );
+ pCurrDir = utf8_opendir( rootDir.c_str() );
if( pCurrDir == NULL )
{
// An error occurred
- msg_Dbg( getIntf(), "Cannot open directory %s", rootDir.c_str() );
+ msg_Dbg( getIntf(), "cannot open directory %s", rootDir.c_str() );
return false;
}
- // Get the first directory entry
- pDirContent = (dirent*)readdir( pCurrDir );
-
// While we still have entries in the directory
- while( pDirContent != NULL )
+ while( ( pszDirContent = utf8_readdir( pCurrDir ) ) != NULL )
{
- string newURI = rootDir + sep + pDirContent->d_name;
+ string newURI = rootDir + sep + pszDirContent;
// Skip . and ..
- if( string( pDirContent->d_name ) != "." &&
- string( pDirContent->d_name ) != ".." )
+ if( string( pszDirContent ) != "." &&
+ string( pszDirContent ) != ".." )
{
#if defined( S_ISDIR )
struct stat stat_data;
- stat( newURI.c_str(), &stat_data );
- if( S_ISDIR(stat_data.st_mode) )
+
+ if( ( utf8_stat( newURI.c_str(), &stat_data ) == 0 )
+ && S_ISDIR(stat_data.st_mode) )
#elif defined( DT_DIR )
if( pDirContent->d_type & DT_DIR )
#else
// Can we find the file in this subdirectory?
if( findFile( newURI, rFileName, themeFilePath ) )
{
+ free( pszDirContent );
closedir( pCurrDir );
return true;
}
else
{
// Found the theme file?
- if( rFileName == string( pDirContent->d_name ) )
+ if( rFileName == string( pszDirContent ) )
{
themeFilePath = newURI;
+ free( pszDirContent );
closedir( pCurrDir );
return true;
}
}
}
- pDirContent = (dirent*)readdir( pCurrDir );
+ free( pszDirContent );
}
closedir( pCurrDir );
static int currentGzFd = -1;
static void * currentGzVp = NULL;
-int gzopen_frontend( char *pathname, int oflags, int mode )
+int gzopen_frontend( const char *pathname, int oflags, int mode )
{
- char *gzflags;
+ const char *gzflags;
gzFile gzf;
switch( oflags )