From 4d447b068cacdea5247f3a711aaeb43081904f6f Mon Sep 17 00:00:00 2001 From: Cyril Deguet Date: Sun, 6 Nov 2005 16:17:57 +0000 Subject: [PATCH] * winamp2.xml: generic theme file for winamp2 skins. Still a lot of things to do but it works ! * theme_loader.cpp: when a theme contains no XML file, assume we are trying to load a winamp skin, and use winamp2.xml * vlcproc.cpp: repaired text variables ($N was broken) --- modules/gui/skins2/parser/skin_parser.cpp | 4 +- modules/gui/skins2/src/theme_loader.cpp | 112 ++++++++++++++-------- modules/gui/skins2/src/theme_loader.hpp | 8 +- modules/gui/skins2/src/vlcproc.cpp | 6 +- share/Makefile.am | 1 + share/skins2/winamp2.xml | 45 +++++++++ 6 files changed, 128 insertions(+), 48 deletions(-) create mode 100644 share/skins2/winamp2.xml diff --git a/modules/gui/skins2/parser/skin_parser.cpp b/modules/gui/skins2/parser/skin_parser.cpp index 351d77f5af..3410055884 100644 --- a/modules/gui/skins2/parser/skin_parser.cpp +++ b/modules/gui/skins2/parser/skin_parser.cpp @@ -22,6 +22,7 @@ *****************************************************************************/ #include "skin_parser.hpp" +#include "../src/os_factory.hpp" #include SkinParser::SkinParser( intf_thread_t *pIntf, const string &rFileName, @@ -497,7 +498,8 @@ int SkinParser::convertColor( const char *transcolor ) const string SkinParser::convertFileName( const char *fileName ) const { - return m_path + string( fileName ); + OSFactory *pFactory = OSFactory::instance( getIntf() ); + return m_path + pFactory->getDirSeparator() + string( fileName ); } diff --git a/modules/gui/skins2/src/theme_loader.cpp b/modules/gui/skins2/src/theme_loader.cpp index 6f488c6113..cd760a22d1 100644 --- a/modules/gui/skins2/src/theme_loader.cpp +++ b/modules/gui/skins2/src/theme_loader.cpp @@ -67,6 +67,7 @@ int makedir( const char *newdir ); #endif #define DEFAULT_XML_FILE "theme.xml" +#define WINAMP2_XML_FILE "winamp2.xml" #define ZIP_BUFFER_SIZE 4096 @@ -74,11 +75,12 @@ bool ThemeLoader::load( const string &fileName ) { // 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( fileName ) ) + if( ! extract( fileName ) && ! parse( path, fileName ) ) return false; #else - if( ! parse( fileName ) ) + if( ! parse( path, fileName ) ) return false; #endif @@ -203,22 +205,10 @@ bool ThemeLoader::extractFileInZip( unzFile file, const string &rootDir ) // Get the path of the file string fullPath = rootDir + "/" + filenameInZip; - string::size_type pos = fullPath.rfind( '/' ); - string basePath; - if( pos != string::npos ) - { - if( pos < fullPath.size() - 1) - { - basePath = fullPath.substr( 0, pos ); - } - else - { - basePath = fullPath; - } - } + string basePath = getFilePath( fullPath ); // Extract the file if is not a directory - if( pos != fullPath.size() - 1 ) + if( basePath != fullPath ) { if( unzOpenCurrentFile( file ) ) { @@ -273,6 +263,7 @@ bool ThemeLoader::extractFileInZip( unzFile file, const string &rootDir ) bool ThemeLoader::extract( const string &fileName ) { + bool result = true; char *tmpdir = tempnam( NULL, "vlt" ); string tempPath = tmpdir; free( tmpdir ); @@ -282,19 +273,47 @@ bool ThemeLoader::extract( const string &fileName ) ! extractZip( fileName, tempPath ) ) return false; - // Find the XML file and parse it + string path; string xmlFile; - if( ! findThemeFile( tempPath, xmlFile ) || ! parse( xmlFile ) ) + OSFactory *pOsFactory = OSFactory::instance( getIntf() ); + // Find the XML file in the theme + if( findFile( tempPath, DEFAULT_XML_FILE, xmlFile ) ) { - msg_Err( getIntf(), "%s doesn't contain a " DEFAULT_XML_FILE " file", - fileName.c_str() ); - deleteTempFiles( tempPath ); - return false; + path = getFilePath( xmlFile ); + } + else + { + // No XML file, assume it is a winamp2 skin + path = tempPath; + + // Look for winamp2.xml in the resource path + list resPath = pOsFactory->getResourcePath(); + list::const_iterator it; + for( it = resPath.begin(); it != resPath.end(); it++ ) + { + if( findFile( *it, WINAMP2_XML_FILE, xmlFile ) ) + break; + } + } + + if( !xmlFile.empty() ) + { + // Parse the XML file + if (! parse( path, xmlFile ) ) + { + 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() ); + result = false; } // Clean-up deleteTempFiles( tempPath ); - return true; + return result; } @@ -305,24 +324,11 @@ void ThemeLoader::deleteTempFiles( const string &path ) #endif // HAVE_ZLIB_H -bool ThemeLoader::parse( const string &xmlFile ) +bool ThemeLoader::parse( const string &path, const string &xmlFile ) { // File loaded msg_Dbg( getIntf(), "Using skin file: %s", xmlFile.c_str() ); - // Extract the path of the XML file - string path; - const string &sep = OSFactory::instance( getIntf() )->getDirSeparator(); - string::size_type p = xmlFile.rfind( sep, xmlFile.size() ); - if( p != string::npos ) - { - path = xmlFile.substr( 0, p + 1 ); - } - else - { - path = ""; - } - // Start the parser SkinParser parser( getIntf(), xmlFile, path ); if( ! parser.parse() ) @@ -339,7 +345,30 @@ bool ThemeLoader::parse( const string &xmlFile ) } -bool ThemeLoader::findThemeFile( const string &rootDir, string &themeFilePath ) +string ThemeLoader::getFilePath( const string &rFullPath ) +{ + OSFactory *pOsFactory = OSFactory::instance( getIntf() ); + const string &sep = pOsFactory->getDirSeparator(); + // Find the last separator ('/' or '\') + string::size_type p = rFullPath.rfind( sep, rFullPath.size() ); + string basePath; + if( p != string::npos ) + { + if( p < rFullPath.size() - 1) + { + basePath = rFullPath.substr( 0, p ); + } + else + { + basePath = rFullPath; + } + } + return basePath; +} + + +bool ThemeLoader::findFile( const string &rootDir, const string &rFileName, + string &themeFilePath ) { // Path separator const string &sep = OSFactory::instance( getIntf() )->getDirSeparator(); @@ -379,8 +408,8 @@ bool ThemeLoader::findThemeFile( const string &rootDir, string &themeFilePath ) if( 0 ) #endif { - // Can we find the theme file in this subdirectory? - if( findThemeFile( newURI, themeFilePath ) ) + // Can we find the file in this subdirectory? + if( findFile( newURI, rFileName, themeFilePath ) ) { closedir( pCurrDir ); return true; @@ -389,8 +418,7 @@ bool ThemeLoader::findThemeFile( const string &rootDir, string &themeFilePath ) else { // Found the theme file? - if( string( DEFAULT_XML_FILE ) == - string( pDirContent->d_name ) ) + if( rFileName == string( pDirContent->d_name ) ) { themeFilePath = newURI; closedir( pCurrDir ); diff --git a/modules/gui/skins2/src/theme_loader.hpp b/modules/gui/skins2/src/theme_loader.hpp index 049b70f2db..4898a84d44 100644 --- a/modules/gui/skins2/src/theme_loader.hpp +++ b/modules/gui/skins2/src/theme_loader.hpp @@ -58,13 +58,17 @@ class ThemeLoader: public SkinObject #endif /// Parse the XML file given as a parameter and build the skin - bool parse( const string &xmlFile ); + bool parse( const string &path, const string &xmlFile ); /// Recursively look for the XML file from rootDir. /// The first corresponding file found will be chosen and themeFilePath /// will be updated accordingly. /// The method returns true if a theme file was found, false otherwise - bool findThemeFile( const string &rootDir, string &themeFilePath ); + bool findFile( const string &rootDir, const string &rFileName, + string &themeFilePath ); + + /// Get the base path of a file + string getFilePath( const string &rFullPath ); }; #endif diff --git a/modules/gui/skins2/src/vlcproc.cpp b/modules/gui/skins2/src/vlcproc.cpp index f5c7a0116b..5b25e977f7 100644 --- a/modules/gui/skins2/src/vlcproc.cpp +++ b/modules/gui/skins2/src/vlcproc.cpp @@ -403,7 +403,7 @@ int VlcProc::onItemChange( vlc_object_t *pObj, const char *pVariable, // Push the command in the asynchronous command queue AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() ); pQueue->push( CmdGenericPtr( pCmd ) ); - pQueue->push( CmdGenericPtr( pCmdTree ) ); + pQueue->push( CmdGenericPtr( pCmdTree ), false ); return VLC_SUCCESS; } @@ -479,8 +479,8 @@ void VlcProc::updateStreamName( playlist_t *p_playlist ) CmdSetText *pCmd2 = new CmdSetText( getIntf(), rStreamURI, srcURI ); // Push the commands in the asynchronous command queue AsyncQueue *pQueue = AsyncQueue::instance( getIntf() ); - pQueue->push( CmdGenericPtr( pCmd1 ) ); - pQueue->push( CmdGenericPtr( pCmd2 ) ); + pQueue->push( CmdGenericPtr( pCmd1 ), false ); + pQueue->push( CmdGenericPtr( pCmd2 ), false ); } } diff --git a/share/Makefile.am b/share/Makefile.am index ea820e4a20..4242138653 100644 --- a/share/Makefile.am +++ b/share/Makefile.am @@ -80,6 +80,7 @@ DIST_skins2 = \ skins2/fonts/FreeSans.ttf \ skins2/skin.dtd \ skins2/skin.catalog \ + skins2/winamp2.xml \ $(NULL) DIST_http = \ diff --git a/share/skins2/winamp2.xml b/share/skins2/winamp2.xml new file mode 100644 index 0000000000..7e924e0ad4 --- /dev/null +++ b/share/skins2/winamp2.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +