diff options
Diffstat (limited to 'knights/resource.cpp')
-rw-r--r-- | knights/resource.cpp | 1048 |
1 files changed, 1048 insertions, 0 deletions
diff --git a/knights/resource.cpp b/knights/resource.cpp new file mode 100644 index 0000000..ba172b9 --- /dev/null +++ b/knights/resource.cpp @@ -0,0 +1,1048 @@ +/*************************************************************************** + resource.cpp - description + ------------------- + begin : Tue Jul 17 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@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. * + * * + ***************************************************************************/ +/* KDE */ +#include <kstddirs.h> +#include <kglobalsettings.h> +#include <ksimpleconfig.h> +#include <kconfig.h> +#include <kiconloader.h> +#include <kmdcodec.h> +#include <kio/netaccess.h> +/* Qt */ +#include <qdir.h> +#include <qimage.h> +/* Local */ +#include "resource.h" +#include "audio.h" +#include "knightspixcache.h" +#include "tabmanager.h" +#include "accel.h" +/* C & C++ */ +#include <unistd.h> +#include <sys/utsname.h> +#include <sys/types.h> +#include <pwd.h> +#include <time.h> + +#define CFG kapp->config() +/////////////////////////////////////// +// +// resource::resource +// +/////////////////////////////////////// +resource::resource(KCmdLineArgs *args) +{ + GlobalDataDir = ""; + Widget_Height = 20; // prevents max_size error for thinbuttons on init + Icons = new KIconLoader( QString( "knights" ) ); + Audio = new audio(); + + /* Define ConsoleStyle, our RichText */ + ConsoleStyle = new QStyleSheet( 0, "ConsoleStyle" ); + SSI_Default = new QStyleSheetItem( ConsoleStyle, "K_STD" ); + SSI_PrivateTell = new QStyleSheetItem( ConsoleStyle, "K_PVT" ); + SSI_ChannelTell = new QStyleSheetItem( ConsoleStyle, "K_CH" ); + SSI_Shout = new QStyleSheetItem( ConsoleStyle, "K_SHT" ); + SSI_Whisper = new QStyleSheetItem( ConsoleStyle, "K_WSP" ); + SSI_Notification = new QStyleSheetItem( ConsoleStyle, "K_NOT" ); + QStyleSheet::setDefaultSheet( ConsoleStyle ); + + /* Define GlobalDataDir... This is very important! */ + GlobalDataDir = args->getOption( "d" ); + if( GlobalDataDir.isEmpty() ) + GlobalDataDir = KGlobal::dirs()->findResourceDir("data", "knights/splash.png") + "knights/"; + if( GlobalDataDir.isEmpty() ) + { + kdWarning() << "resource::resource: Can not read GlobalDataDir from environment." << endl; + GlobalDataDir = "/usr/local/kde/"; + } + if( GlobalDataDir.right(1) != "/" ) GlobalDataDir += '/'; + + /* Allocate Accel */ + myAccel = new Accel( qApp->mainWidget() ); + + /* Allocate TabManager */ + tabManager = new TabManager( this ); + + ConfigRead(); + pixCache = new KnightsPixCache(); + pixCache->setCacheLimit( 2048 ); // 2meg +} +/////////////////////////////////////// +// +// resource::~resource +// +/////////////////////////////////////// +resource::~resource() +{ + ConfigWrite(); + delete Icons; + delete pixCache; + delete Audio; + delete tabManager; + delete myAccel; + + /* Remove temp files that we missed + QStringList temps = KGlobal::dirs()->findAllResources("tmp","knights*"); + for( int a=0; a < temps.count(); a++) + { + KIO::NetAccess::del( "file://" + temps[a] ); + } */ +} +/////////////////////////////////////// +// +// resource::ConfigRead +// +/////////////////////////////////////// +void resource::ConfigRead( void ) +{ + struct passwd *passwd; + QString sysName; + QString buffer; + QDesktopWidget *desktop = QApplication::desktop(); + + /* Get Initial Board Size In Case This Install Is New */ + int initSize = ( desktop->height() >> 3 ) - 32; + if( initSize > IMAGE_MAX ) + initSize = IMAGE_MAX; + if( initSize < IMAGE_MIN ) + initSize = IMAGE_MIN; + + /* Get user name from environment in case it's needed */ + passwd = getpwuid( getuid() ); + sysName = passwd->pw_gecos; + if( sysName.isEmpty() ) + sysName = QStringList::split( ",", QString(passwd->pw_name) ).first(); + + /* Cursors */ + CURSOR_Standard = KCursor::arrowCursor(); + CURSOR_Thinking = KCursor::waitCursor(); + CURSOR_Text = KCursor::ibeamCursor(); + + /* Themes */ + readThemeDir(); + CFG->setGroup( "Themes" ); + CurrentBoard = CFG->readEntry( "CurrentBoard", "KBDefault.tar.gz" ); + CurrentChessmen = CFG->readEntry( "CurrentChessmen", "KCDefault.tar.gz" ); + OPTION_3DBoard = CFG->readBoolEntry( "Use3DBoard", FALSE ); + ThemeSize = CFG->readNumEntry( "Size", initSize ); + if( ThemeSize > ( initSize + 16 ) ) + ThemeSize = initSize; + + /* General */ + ReadEngines(); + ReadServers(); + ReadMatchParam(); + ReadColors(); + ReadFonts(); + buildStyle(); + CFG->setGroup( "General" ); + Local_Player = CFG->readEntry( "UserName", sysName ); + Config_Version = CFG->readNumEntry( "ConfigVersion", 0 ); + OPTION_On_Init = CFG->readNumEntry( "OnInit", MENU_VS_PC ); + OPTION_Auto_Queen = CFG->readBoolEntry( "AlwaysQueen", FALSE ); + OPTION_Ponder = CFG->readBoolEntry( "Ponder", TRUE ); + OPTION_Book_White = CFG->readBoolEntry( "BookWhite", FALSE ); + OPTION_Book_Black = CFG->readBoolEntry( "BookBlack", FALSE ); + OPTION_Pause_On_Minimize = CFG->readBoolEntry( "PauseOnMinimize", TRUE ); + OPTION_Reuse_PGN = CFG->readBoolEntry( "ReusePGN", FALSE ); + PGN_Filename = CFG->readEntry( "PGNFilename", QString::null ); + SCID_Image_Path = CFG->readEntry( "SCIDImages", QString::null ); + OPTION_Auto_Close_Last_ICS = CFG->readBoolEntry( "AutoCloseLastICS", TRUE ); + OPTION_Show_Extended_PGN = CFG->readEntry( "ShowExtendedPGN", FALSE ); + OPTION_Auto_Call_Flag = CFG->readBoolEntry( "AutoCallFlag", TRUE ); + Email_Command_Line = CFG->readEntry( "EmailCommandLine", QString("kmail -s %s --attach %m %a") ); + Accepted_License = CFG->readBoolEntry( "Alg2p", FALSE ); + + /* Display */ + OPTION_Show_Splash = CFG->readBoolEntry( "ShowSplash", TRUE ); + OPTION_Auto_Preview = CFG->readBoolEntry( "AutoPreview", FALSE ); + OPTION_Show_Last_Move = CFG->readBoolEntry( "ShowLastMove", TRUE ); + OPTION_Animate_Moves = CFG->readBoolEntry( "AnimateMoves", FALSE ); + OPTION_Show_Coord = CFG->readBoolEntry( "ShowCoord", FALSE ); + OPTION_Board_Orientation = CFG->readBoolEntry( "BoardOrientation", 0 ); + + /* ICS */ + CFG->setGroup( "ICS" ); + OPTION_Premove = CFG->readBoolEntry( "Premove", TRUE ); + OPTION_Kibitz = CFG->readBoolEntry( "Kibitz", TRUE ); + OPTION_Private = CFG->readBoolEntry( "Private", FALSE ); + OPTION_Shout = CFG->readBoolEntry( "Shout", TRUE ); + OPTION_Tell = CFG->readBoolEntry( "Tell", TRUE ); + OPTION_Seek = CFG->readBoolEntry( "Seek", TRUE ); + OPTION_Profanity = CFG->readNumEntry( "Profanity", 1 ); + Seek_Timer = CFG->readNumEntry( "SeekTimer", 70 ); + + /* Audio */ + CFG->setGroup( "Audio" ); + OPTION_Audio = CFG->readBoolEntry( "useAudio", TRUE ); + CurrentAudio = CFG->readEntry( "CurrentAudio", "KSDefault.tar.gz" ); + OPTION_Audio_Current_Only = CFG->readBoolEntry( "AudioCurrentOnly", FALSE ); + Audio_Volume = CFG->readNumEntry( "AudioVolume", 0 ); + Audio->enabled = OPTION_Audio; + Audio->volume = Audio_Volume; + + /* Notification Prompts */ + CFG->setGroup( "Notification Messages" ); + PromptForSaving = CFG->readEntry( "PromptForSaving", QString::null ); +} +/////////////////////////////////////// +// +// resource::ConfigWrite +// +/////////////////////////////////////// +void resource::ConfigWrite( void ) +{ + /* Themes */ + CFG->setGroup( "Themes" ); + CFG->writeEntry( "CurrentBoard", CurrentBoard ); + CFG->writeEntry( "CurrentChessmen", CurrentChessmen ); + CFG->writeEntry( "Size", ThemeSize ); + CFG->writeEntry( "Use3DBoard", OPTION_3DBoard ); + + /* General */ + WriteEngines(); + WriteServers(); + WriteMatchParam(); + WriteColors(); + WriteFonts(); + CFG->setGroup( "General" ); + CFG->writeEntry( "UserName", Local_Player ); + CFG->writeEntry( "ConfigVersion", Config_Version ); + CFG->writeEntry( "OnInit", OPTION_On_Init ); + CFG->writeEntry( "ShowSplash", OPTION_Show_Splash ); + CFG->writeEntry( "AlwaysQueen", OPTION_Auto_Queen ); + CFG->writeEntry( "AutoPreview", OPTION_Auto_Preview ); + CFG->writeEntry( "ShowLastMove", OPTION_Show_Last_Move ); + CFG->writeEntry( "AnimateMoves", OPTION_Animate_Moves ); + CFG->writeEntry( "ShowCoord", OPTION_Show_Coord ); + CFG->writeEntry( "Ponder", OPTION_Ponder ); + CFG->writeEntry( "BookWhite", OPTION_Book_White ); + CFG->writeEntry( "BookBlack", OPTION_Book_Black ); + CFG->writeEntry( "BoardOrientation", OPTION_Board_Orientation ); + CFG->writeEntry( "PauseOnMinimize", OPTION_Pause_On_Minimize ); + CFG->writeEntry( "ReusePGN", OPTION_Reuse_PGN ); + CFG->writeEntry( "PGNFilename", PGN_Filename ); + CFG->writeEntry( "AutoCloseLastICS", OPTION_Auto_Close_Last_ICS ); + CFG->writeEntry( "ShowExtendedPGN", OPTION_Show_Extended_PGN ); + CFG->writeEntry( "EmailCommandLine", Email_Command_Line ); + CFG->writeEntry( "AutoCallFlag", OPTION_Auto_Call_Flag ); + CFG->writeEntry( "SCIDImages", SCID_Image_Path ); + CFG->writeEntry( "Alg2p", Accepted_License ); + + /* ICS */ + CFG->setGroup( "ICS" ); + CFG->writeEntry( "SeekTimer", Seek_Timer ); + CFG->writeEntry( "Profanity", OPTION_Profanity ); + CFG->writeEntry( "Premove", OPTION_Premove ); + CFG->writeEntry( "Shout", OPTION_Shout ); + CFG->writeEntry( "Kibitz", OPTION_Kibitz ); + CFG->writeEntry( "Private", OPTION_Private ); + CFG->writeEntry( "Tell", OPTION_Tell ); + CFG->writeEntry( "Seek", OPTION_Seek ); + + /* Audio */ + CFG->setGroup( "Audio" ); + CFG->writeEntry( "useAudio", OPTION_Audio ); + Audio->enabled = OPTION_Audio; + CFG->writeEntry( "CurrentAudio", CurrentAudio ); + CFG->writeEntry( "AudioCurrentOnly", OPTION_Audio_Current_Only ); + CFG->writeEntry( "AudioVolume", Audio_Volume ); + Audio->volume = Audio_Volume; + + /* Notification Prompts */ + CFG->setGroup( "Notification Messages" ); + CFG->writeEntry( "PromptForSaving", PromptForSaving ); + CFG->setReadOnly( FALSE ); + if( CFG->isReadOnly() ) + kdWarning() << "resource::ConfigWrite: Configuration is READ ONLY. Can not write changes." << endl; + CFG->sync(); +} +/////////////////////////////////////// +// +// resource::ReadMatchParam +// +/////////////////////////////////////// +void resource::ReadMatchParam( void ) +{ + QString buffer; + QStringList TCPs; + QStringList::Iterator QSL_IT; + TCP tempTCP; + + TCPWhite.clear(); + TCPBlack.clear(); + CFG->setGroup( "Match Paramaters" ); + + /* Handle Time Controls */ + buffer = CFG->readEntry( "WhiteTCP", "40,900,0" ); + TCPs = QStringList::split( QString(","), buffer, FALSE ); + for( QSL_IT = TCPs.begin(); QSL_IT != TCPs.end(); ++QSL_IT ) + { + tempTCP.Moves = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Seconds = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Increment = (*QSL_IT).toInt(); + TCPWhite.append( tempTCP ); + } + TCPs.clear(); + buffer = CFG->readEntry( "BlackTCP", "40,900,0" ); + TCPs = QStringList::split( QString(","), buffer, FALSE ); + for( QSL_IT = TCPs.begin(); QSL_IT != TCPs.end(); ++QSL_IT ) + { + tempTCP.Moves = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Seconds = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Increment = (*QSL_IT).toInt(); + TCPBlack.append( tempTCP ); + } + + /* Match Rules */ + MatchRules = CFG->readNumEntry( "MatchRules", Type_Standard ); + + /* Handle Players */ + Type[WHITE] = CFG->readNumEntry( "WhiteType", PLAYERLOCAL ); + Type[WHITE_HELPER] = CFG->readNumEntry( "WhiteHelperType", PLAYERPC ); + Type[BLACK] = CFG->readNumEntry( "BlackType", PLAYERLOCAL ); + Type[BLACK_HELPER] = CFG->readNumEntry( "BlackHelperType", PLAYERPC ); + + Strength[WHITE] = CFG->readNumEntry( "WhiteStr", 18 ); + Strength[WHITE_HELPER] = CFG->readNumEntry( "WhiteHelperStr", 18 ); + Strength[BLACK] = CFG->readNumEntry( "BlackStr", 18 ); + Strength[BLACK_HELPER] = CFG->readNumEntry( "BlackHelperStr", 18 ); +} +/////////////////////////////////////// +// +// resource::WriteMatchParam +// +/////////////////////////////////////// +void resource::WriteMatchParam( void ) +{ + QString buffer; + TCPList::Iterator TCP_IT; + + CFG->setGroup( "Match Paramaters" ); + /* Handle Time Controls */ + for( TCP_IT = TCPWhite.begin(); TCP_IT != TCPWhite.end(); ++TCP_IT ) + { + buffer += QString::number( (*TCP_IT).Moves ) + ","; + buffer += QString::number( (*TCP_IT).Seconds ) + ","; + buffer += QString::number( (*TCP_IT).Increment ) + ","; + } + CFG->writeEntry( "WhiteTCP", buffer ); + buffer = ""; + for( TCP_IT = TCPBlack.begin(); TCP_IT != TCPBlack.end(); ++TCP_IT ) + { + buffer += QString::number( (*TCP_IT).Moves ) + ","; + buffer += QString::number( (*TCP_IT).Seconds ) + ","; + buffer += QString::number( (*TCP_IT).Increment ) + ","; + } + CFG->writeEntry( "BlackTCP", buffer ); + /* Match Rules */ + CFG->writeEntry( "MatchRules", MatchRules ); + /* Handle Players */ + CFG->writeEntry( "WhiteType", Type[WHITE] ); + CFG->writeEntry( "WhiteHelperType", Type[WHITE_HELPER] ); + CFG->writeEntry( "BlackType", Type[BLACK] ); + CFG->writeEntry( "BlackHelperType", Type[BLACK_HELPER] ); + + CFG->writeEntry( "WhiteStr", Strength[WHITE] ); + CFG->writeEntry( "WhiteHelperStr", Strength[WHITE_HELPER] ); + CFG->writeEntry( "BlackStr", Strength[BLACK] ); + CFG->writeEntry( "BlackHelperStr", Strength[BLACK_HELPER] ); +} +/////////////////////////////////////// +// +// resource::ReadEngines +// +/////////////////////////////////////// +void resource::ReadEngines( void ) +{ + engineResource temp; + QStringList engineList; + QStringList::Iterator engineListIT; + QString buffer; + + engines.clear(); + CFG->setGroup( "General" ); + buffer = CFG->readEntry( "Engines" ); + if( buffer.isEmpty() ) return; + + engineList = QStringList::split( QString(","), buffer, FALSE ); + for ( engineListIT = engineList.begin(); engineListIT != engineList.end(); ++engineListIT ) + { + if( !CFG->hasGroup( (*engineListIT) ) ) continue; + CFG->setGroup( (*engineListIT) ); + temp.Name = (*engineListIT); + temp.Filename = CFG->readEntry( "Filename" ); + temp.Arguments = CFG->readEntry( "Arguments" ); + temp.LogFile = CFG->readEntry( "Log" ); + temp.Protocol = CFG->readNumEntry( "Protocol" ); + temp.Wins = CFG->readNumEntry( "Wins" ); + temp.Losses = CFG->readNumEntry( "Losses" ); + temp.Draws = CFG->readNumEntry( "Draws" ); + temp.CurrentRef = CFG->readNumEntry( "CurrentRef" ); + engines.append( temp ); + } +} +/////////////////////////////////////// +// +// resource::WriteEngines +// +/////////////////////////////////////// +void resource::WriteEngines( void ) +{ + QString buffer; + + CFG->setGroup( "General" ); + if( engines.isEmpty() ) + { + CFG->writeEntry( "Engines", QString( "" ) ); + return; + } + for ( enginesIT = engines.begin(); enginesIT != engines.end(); ++enginesIT ) + { + buffer += (*enginesIT).Name + ","; + CFG->setGroup( (*enginesIT).Name ); + CFG->writeEntry( "Filename", (*enginesIT).Filename ); + CFG->writeEntry( "Arguments", (*enginesIT).Arguments ); + CFG->writeEntry( "Log", (*enginesIT).LogFile ); + CFG->writeEntry( "Protocol", (*enginesIT).Protocol ); + CFG->writeEntry( "Wins", (*enginesIT).Wins ); + CFG->writeEntry( "Losses", (*enginesIT).Losses ); + CFG->writeEntry( "Draws", (*enginesIT).Draws ); + CFG->writeEntry( "CurrentRef", (*enginesIT).CurrentRef ); + } + CFG->setGroup( "General" ); + CFG->writeEntry( "Engines", buffer ); + CFG->sync(); +} +/////////////////////////////////////// +// +// resource::ReadServers +// +/////////////////////////////////////// +void resource::ReadServers( void ) +{ + serverResource temp; + QStringList serverList; + QStringList::Iterator serverListIT; + QString buffer; + + servers.clear(); + CFG->setGroup( "General" ); + buffer = CFG->readEntry( "Servers" ); + if( buffer.isEmpty() ) return; + + serverList = QStringList::split( QString(","), buffer, FALSE ); + for ( serverListIT = serverList.begin(); serverListIT != serverList.end(); ++serverListIT ) + { + if( !CFG->hasGroup( (*serverListIT) ) ) continue; + CFG->setGroup( (*serverListIT) ); + temp.Name = (*serverListIT); + temp.URL = CFG->readEntry( "URL" ); + temp.UserName = CFG->readEntry( "UserName" ); + temp.LogFile = CFG->readEntry( "LogFile" ); + temp.Password = decryptStr( CFG->readEntry( "Password" ) ); + temp.StorePass = CFG->readBoolEntry( "StorePass" ); + temp.Port = CFG->readNumEntry( "Port" ); + temp.CurrentRef = CFG->readNumEntry( "CurrentRef" ); + temp.Timeseal = CFG->readEntry( "Timeseal" ); + servers.append( temp ); + } +} +/////////////////////////////////////// +// +// resource::WriteServers +// +/////////////////////////////////////// +void resource::WriteServers( void ) +{ + QString buffer; + + CFG->setGroup( "General" ); + if( servers.isEmpty() ) + { + CFG->writeEntry( "Servers", QString( "" ) ); + return; + } + for ( serversIT = servers.begin(); serversIT != servers.end(); ++serversIT ) + { + buffer += (*serversIT).Name + ","; + CFG->setGroup( (*serversIT).Name ); + CFG->writeEntry( "URL", (*serversIT).URL ); + CFG->writeEntry( "UserName", (*serversIT).UserName ); + CFG->writeEntry( "LogFile", (*serversIT).LogFile ); + if( (*serversIT).StorePass ) + CFG->writeEntry( "Password", encryptStr( (*serversIT).Password ) ); + else + CFG->writeEntry( "Password", "" ); + CFG->writeEntry( "Port", (*serversIT).Port ); + CFG->writeEntry( "StorePass", (*serversIT).StorePass ); + CFG->writeEntry( "CurrentRef", (*serversIT).CurrentRef ); + CFG->writeEntry( "Timeseal", (*serversIT).Timeseal ); + } + CFG->setGroup( "General" ); + CFG->writeEntry( "Servers", buffer ); + CFG->sync(); +} +/////////////////////////////////////// +// +// resource::themeDir +// +/////////////////////////////////////// +QString resource::themeDir( void ) +{ + return QString( GlobalDataDir + "themes/" ); +} +/////////////////////////////////////// +// +// resource::readThemeDir +// +/////////////////////////////////////// +void resource::readThemeDir( void ) +{ + QDir themesDir; + + Boards.clear(); + Chessmen.clear(); + Sounds.clear(); + + themesDir.setNameFilter( "KB*" ); + themesDir = GlobalDataDir + "themes/"; + Boards += themesDir.entryList(); + themesDir = QDir::homeDirPath() + "/.knights/"; + if( themesDir.exists() ) Boards += themesDir.entryList(); + themesDir = "../media/"; + if( themesDir.exists() ) Boards += themesDir.entryList(); + Boards.sort(); + + themesDir.setNameFilter( "KC*" ); + themesDir = GlobalDataDir + "themes/"; + Chessmen += themesDir.entryList(); + themesDir = QDir::homeDirPath() + "/.knights/"; + if( themesDir.exists() ) Chessmen += themesDir.entryList(); + themesDir = "../media/"; + if( themesDir.exists() ) Chessmen += themesDir.entryList(); + Chessmen.sort(); + + themesDir.setNameFilter( "KS*" ); + themesDir = GlobalDataDir + "themes/"; + Sounds += themesDir.entryList(); + themesDir = QDir::homeDirPath() + "/.knights/"; + if( themesDir.exists() ) Sounds += themesDir.entryList(); + themesDir = "../media/"; + if( themesDir.exists() ) Sounds += themesDir.entryList(); + Sounds.sort(); +} +/////////////////////////////////////// +// +// resource::getBoard +// +/////////////////////////////////////// +QString resource::getBoard( int Index ) +{ + if( Index > (signed)Boards.count() ) return QString::null; + if( Index == -1 ) return CurrentBoard; + return Boards[Index]; +} +/////////////////////////////////////// +// +// resource::getChessmen +// +/////////////////////////////////////// +QString resource::getChessmen( int Index ) +{ + if( Index > (signed)Chessmen.count() ) return QString::null; + if( Index == -1 ) return CurrentChessmen; + return Chessmen[Index]; +} +/////////////////////////////////////// +// +// resource::getSounds +// +/////////////////////////////////////// +QString resource::getSounds( int Index ) +{ + if( Index > (signed)Sounds.count() ) return QString::null; + if( Index == -1 ) return CurrentAudio; + return Sounds[Index]; +} +/////////////////////////////////////// +// +// resource::setAudio +// +/////////////////////////////////////// +void resource::setAudio( int AudioIndex ) +{ + QString audioURL; + + /* Make sure the Indexes are valid */ + if( AudioIndex > (signed)Sounds.count() ) + { + kdWarning() << "Can not access audio theme[" << AudioIndex << "]... Index out of range." << endl; + return; + } + /* Change the theme */ + if( AudioIndex != -1 ) CurrentAudio = Sounds[AudioIndex]; + audioURL = themeURL( CurrentAudio ); + if( audioURL.isEmpty() ) + { + return; + } + QApplication::setOverrideCursor( CURSOR_Thinking ); + Audio->setTheme( audioURL ); + QApplication::restoreOverrideCursor(); + return; +} +/////////////////////////////////////// +// +// resource::setTheme +// +/////////////////////////////////////// +void resource::setTheme( int BoardIndex, int ChessmenIndex ) +{ + static bool firstTime( TRUE ); + QString boardURL; + QString chessmenURL; + QString boardConf; + QString chessmenConf; + KSimpleConfig *boardConfig; + KSimpleConfig *chessmenConfig; + + /* Make sure the Indexes are valid */ + if( BoardIndex > (signed)Boards.count() ) + { + kdWarning() << "Can not access board theme[" << BoardIndex << "]... Index out of range." << endl; + return; + } + if( ChessmenIndex > (signed)Chessmen.count() ) + { + kdWarning() << "Can not access chessmen theme[" << ChessmenIndex << "]... Index out of range." << endl; + return; + } + + /* Set the Cursor */ + QApplication::setOverrideCursor( CURSOR_Thinking ); + + /* Change the theme */ + if( BoardIndex != -1 ) + CurrentBoard = Boards[BoardIndex]; + if( ChessmenIndex != -1 ) + CurrentChessmen = Chessmen[ChessmenIndex]; + + boardURL = themeURL( CurrentBoard ); + chessmenURL = themeURL( CurrentChessmen ); + + if( ( boardURL.isEmpty() ) || ( chessmenURL.isEmpty() ) ) + { + QApplication::restoreOverrideCursor(); + return; + } + + /* load the theme.conf files */ + if( !KIO::NetAccess::download( boardURL + "theme.conf", boardConf ) ) + kdWarning() << "Can not read theme.conf from " << boardURL << endl; + boardConfig = new KSimpleConfig( boardConf, TRUE ); + + if( !KIO::NetAccess::download( chessmenURL + "theme.conf", chessmenConf ) ) + kdWarning() << "Can not read theme.conf from " << chessmenURL << endl; + chessmenConfig = new KSimpleConfig( chessmenConf, TRUE ); + + /* Read the headers */ + boardConfig->setGroup( "General" ); + boardHeader.name = boardConfig->readEntry( "Name", "Unknown" ); + boardHeader.version = boardConfig->readEntry( "Version", "Unknown" ); + boardHeader.author = boardConfig->readEntry( "Author", "Unknown" ); + boardHeader.authorEmail = boardConfig->readEntry( "AuthorEmail", "Unknown" ); + boardHeader.authorWWW = boardConfig->readEntry( "AuthorWWW", "Unknown" ); + boardHeader.notes = boardConfig->readEntry( "Notes", "Unknown" ); + chessmenConfig->setGroup( "General" ); + chessmenHeader.name = chessmenConfig->readEntry( "Name", "Unknown" ); + chessmenHeader.version = chessmenConfig->readEntry( "Version", "Unknown" ); + chessmenHeader.author = chessmenConfig->readEntry( "Author", "Unknown" ); + chessmenHeader.authorEmail = chessmenConfig->readEntry( "AuthorEmail", "Unknown" ); + chessmenHeader.authorWWW = chessmenConfig->readEntry( "AuthorWWW", "Unknown" ); + chessmenHeader.notes = chessmenConfig->readEntry( "Notes", "Unknown" ); + + /* Load the Board */ + boardConfig->setGroup( "2DBoard" ); + ThemeBorder = boardConfig->readBoolEntry( "HaveBorder", FALSE ); + loadThemeItem( boardURL + boardConfig->readEntry("Light", "square.light.png"), pixCache->Orig_SquareLight ); + loadThemeItem( boardURL + boardConfig->readEntry("Dark", "square.dark.png"), pixCache->Orig_SquareDark ); + loadThemeItem( boardURL + boardConfig->readEntry("Select", "square.select.png"), pixCache->Orig_HighlightSelect ); + loadThemeItem( boardURL + boardConfig->readEntry("Motion", "square.motion.png"), pixCache->Orig_HighlightMove ); + loadThemeItem( boardURL + boardConfig->readEntry("Danger", "square.danger.png"), pixCache->Orig_HighlightAttack ); + if( ThemeBorder ) + { + loadThemeItem( boardURL + boardConfig->readEntry("Border", "border.png"), pixCache->Orig_Border ); + loadThemeItem( boardURL + boardConfig->readEntry("BorderLightOn", "light_on.png"), pixCache->Orig_BorderLightOn ); + loadThemeItem( boardURL + boardConfig->readEntry("BorderLightOff", "light_off.png"), pixCache->Orig_BorderLightOff ); + } + boardConfig->setGroup( "2DBoard" ); + COLOR_Notation = boardConfig->readColorEntry( "TextColor", &COLOR_White ); + COLOR_Notation_Shadow = boardConfig->readColorEntry( "ShadowColor", &COLOR_Black ); + + /* Load 2D Chessmen */ + chessmenConfig->setGroup( "2DBlack" ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("King", "black.king.png"), pixCache->Orig_BlackKing ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Queen", "black.queen.png"), pixCache->Orig_BlackQueen ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Bishop", "black.bishop.png"), pixCache->Orig_BlackBishop ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Knight", "black.knight.png"), pixCache->Orig_BlackKnight ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Rook", "black.rook.png"), pixCache->Orig_BlackRook ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Pawn", "black.pawn.png"), pixCache->Orig_BlackPawn ); + chessmenConfig->setGroup( "2DWhite" ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("King", "white.king.png"), pixCache->Orig_WhiteKing ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Queen", "white.queen.png"), pixCache->Orig_WhiteQueen ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Bishop", "white.bishop.png"), pixCache->Orig_WhiteBishop ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Knight", "white.knight.png"), pixCache->Orig_WhiteKnight ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Rook", "white.rook.png"), pixCache->Orig_WhiteRook ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Pawn", "white.pawn.png"), pixCache->Orig_WhitePawn ); + + /* Remove the theme.conf files */ + delete boardConfig; + delete chessmenConfig; + KIO::NetAccess::removeTempFile( boardConf ); + KIO::NetAccess::removeTempFile( chessmenConf ); + + /* Cleanup */ + pixCache->clear(); + QApplication::restoreOverrideCursor(); + pixCache->resize( ThemeSize ); + firstTime = FALSE; + return; +} +/////////////////////////////////////// +// +// resource::loadThemeItem +// +/////////////////////////////////////// +void resource::loadThemeItem( const QString &URL, QImage &Image ) +{ + QString tempFile; + + if( KIO::NetAccess::download( URL, tempFile ) ) + { + if( !Image.load( tempFile ) ) + kdError() << "resource::LoadThemeItem: Can not load " << tempFile << ", which comes from " << URL << endl; + KIO::NetAccess::removeTempFile( tempFile ); + } + else + kdError() << "resource::LoadThemeItem: Can not extract " << URL << endl; + return; +} +/////////////////////////////////////// +// +// resource::resizeTheme +// +/////////////////////////////////////// +void resource::resizeTheme( const int &size ) +{ + /* Set the Cursor */ + QApplication::setOverrideCursor( CURSOR_Thinking ); + + ThemeSize = size; + if( ThemeSize > IMAGE_MAX ) + ThemeSize = IMAGE_MIN; + if( ThemeSize < IMAGE_MIN ) + ThemeSize = IMAGE_MAX; + pixCache->resize( ThemeSize ); + ConfigWrite(); + + QApplication::restoreOverrideCursor(); +} +/////////////////////////////////////// +// +// resource::LoadIcon +// +/////////////////////////////////////// +QPixmap resource::LoadIcon( QString Name, int Group ) +{ + return Icons->loadIcon( Name, (KIcon::Group)Group ); +} +/////////////////////////////////////// +// +// resource::encryptStr +// +/////////////////////////////////////// +// Borrowed from KMail +QString resource::encryptStr(const QString &aStr) const +{ + unsigned int i, val; + unsigned int len = aStr.length(); + QCString result; + result.resize(len+1); + for (i=0; i<len; i++) + { + val = aStr[i] - ' '; + val = (255-' ') - val; + result[i] = (char)(val + ' '); + } + result[i] = '\0'; + + return result; +} +/////////////////////////////////////// +// +// resource::decryptStr +// +/////////////////////////////////////// +// Borrowed from KMail +QString resource::decryptStr(const QString &aStr) const +{ + return encryptStr(aStr); +} +/////////////////////////////////////// +// +// resource::play +// +/////////////////////////////////////// +void resource::play( const char snd ) +{ + Audio->play( snd ); +} +/////////////////////////////////////// +// +// resource::ReadColors +// +/////////////////////////////////////// +void resource::ReadColors( void ) +{ + QColor tmp; + + COLOR_White = QColor( 255, 255, 255 ); + COLOR_Black = QColor( 0, 0, 0 ); + CFG->setGroup( "Colors" ); + COLOR_Background = CFG->readColorEntry( "BackgroundColor", &COLOR_White ); + COLOR_GraphBackground = CFG->readColorEntry( "GraphBackground", &COLOR_Background ); + COLOR_Standard = CFG->readColorEntry( "StandardColor", &COLOR_Black ); + COLOR_GraphForeground = CFG->readColorEntry( "GraphForeground", &COLOR_Standard ); + tmp = QColor( 128, 0, 128 ); // Purple + COLOR_PrivateTell = CFG->readColorEntry( "PrivateColor", &tmp ); + tmp = QColor( 0, 0, 160 ); // Blue + COLOR_ChannelTell = CFG->readColorEntry( "ChannelColor", &tmp ); + tmp = QColor( 160, 0, 0 ); // Red + COLOR_Shout = CFG->readColorEntry( "ShoutColor", &tmp ); + tmp = QColor( 0, 160, 0 ); // Green + COLOR_Whisper = CFG->readColorEntry( "WhisperColor", &tmp ); + tmp = QColor( 0, 128, 128 ); // Cyan + COLOR_Notification = CFG->readColorEntry( "NotificationColor", &tmp ); +} +/////////////////////////////////////// +// +// resource::WriteColors +// +/////////////////////////////////////// +void resource::WriteColors( void ) +{ + CFG->setGroup( "Colors" ); + CFG->writeEntry( "BackgroundColor", COLOR_Background ); + CFG->writeEntry( "StandardColor", COLOR_Standard ); + CFG->writeEntry( "PrivateColor", COLOR_PrivateTell ); + CFG->writeEntry( "ChannelColor", COLOR_ChannelTell ); + CFG->writeEntry( "ShoutColor", COLOR_Shout ); + CFG->writeEntry( "WhisperColor", COLOR_Whisper ); + CFG->writeEntry( "NotificationColor", COLOR_Notification ); + CFG->writeEntry( "GraphForeground", COLOR_GraphForeground ); + CFG->writeEntry( "GraphBackground", COLOR_GraphBackground ); +} +/////////////////////////////////////// +// +// resource::ReadFonts +// +/////////////////////////////////////// +void resource::ReadFonts( void ) +{ + QFont Fixed = KGlobalSettings::fixedFont(); + CFG->setGroup( "Fonts" ); + FONT_Standard = CFG->readFontEntry( "StandardFont", &Fixed ); + FONT_PrivateTell = CFG->readFontEntry( "PrivateFont", &Fixed ); + FONT_ChannelTell = CFG->readFontEntry( "ChannelFont", &Fixed ); + FONT_Shout = CFG->readFontEntry( "ShoutFont", &Fixed ); + FONT_Whisper = CFG->readFontEntry( "WhisperFont", &Fixed ); + FONT_Notification = CFG->readFontEntry( "NotificationFont", &Fixed ); +} +/////////////////////////////////////// +// +// resource::WriteFonts +// +/////////////////////////////////////// +void resource::WriteFonts( void ) +{ + CFG->setGroup( "Fonts" ); + CFG->writeEntry( "StandardFont", FONT_Standard ); + CFG->writeEntry( "PrivateFont", FONT_PrivateTell ); + CFG->writeEntry( "ChannelFont", FONT_ChannelTell ); + CFG->writeEntry( "ShoutFont", FONT_Shout ); + CFG->writeEntry( "WhisperFont", FONT_Whisper ); + CFG->writeEntry( "NotificationFont", FONT_Notification ); +} +/////////////////////////////////////// +// +// resource::buildStyle +// +/////////////////////////////////////// +void resource::buildStyle( void ) +{ + /* Configure SSI_Default */ + SSI_Default->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Default->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Default->setFontFamily( FONT_Standard.family() ); + SSI_Default->setFontSize( FONT_Standard.pointSize() ); + SSI_Default->setFontUnderline( FONT_Standard.underline() ); + SSI_Default->setFontItalic( FONT_Standard.italic() ); + SSI_Default->setFontWeight( FONT_Standard.weight() ); + SSI_Default->setColor( COLOR_Standard ); + /* Configure SSI_PrivateTell */ + SSI_PrivateTell->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_PrivateTell->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_PrivateTell->setFontFamily( FONT_PrivateTell.family() ); + SSI_PrivateTell->setFontSize( FONT_PrivateTell.pointSize() ); + SSI_PrivateTell->setFontUnderline( FONT_PrivateTell.underline() ); + SSI_PrivateTell->setFontItalic( FONT_PrivateTell.italic() ); + SSI_PrivateTell->setFontWeight( FONT_PrivateTell.weight() ); + SSI_PrivateTell->setColor( COLOR_PrivateTell ); + /* Configure SSI_ChannelTell */ + SSI_ChannelTell->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_ChannelTell->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_ChannelTell->setFontFamily( FONT_ChannelTell.family() ); + SSI_ChannelTell->setFontSize( FONT_ChannelTell.pointSize() ); + SSI_ChannelTell->setFontUnderline( FONT_ChannelTell.underline() ); + SSI_ChannelTell->setFontItalic( FONT_ChannelTell.italic() ); + SSI_ChannelTell->setFontWeight( FONT_ChannelTell.weight() ); + SSI_ChannelTell->setColor( COLOR_ChannelTell ); + /* Configure SSI_Shout */ + SSI_Shout->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Shout->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Shout->setFontFamily( FONT_Shout.family() ); + SSI_Shout->setFontSize( FONT_Shout.pointSize() ); + SSI_Shout->setFontUnderline( FONT_Shout.underline() ); + SSI_Shout->setFontItalic( FONT_Shout.italic() ); + SSI_Shout->setFontWeight( FONT_Shout.weight() ); + SSI_Shout->setColor( COLOR_Shout ); + /* Configure SSI_Whisper */ + SSI_Whisper->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Whisper->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Whisper->setFontFamily( FONT_Whisper.family() ); + SSI_Whisper->setFontSize( FONT_Whisper.pointSize() ); + SSI_Whisper->setFontUnderline( FONT_Whisper.underline() ); + SSI_Whisper->setFontItalic( FONT_Whisper.italic() ); + SSI_Whisper->setFontWeight( FONT_Whisper.weight() ); + SSI_Whisper->setColor( COLOR_Whisper ); + /* Configure SSI_Notification */ + SSI_Notification->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Notification->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Notification->setFontFamily( FONT_Notification.family() ); + SSI_Notification->setFontSize( FONT_Notification.pointSize() ); + SSI_Notification->setFontUnderline( FONT_Notification.underline() ); + SSI_Notification->setFontItalic( FONT_Notification.italic() ); + SSI_Notification->setFontWeight( FONT_Notification.weight() ); + SSI_Notification->setColor( COLOR_Notification ); +} +/////////////////////////////////////// +// +// resource::themeURL +// +/////////////////////////////////////// +QString resource::themeURL( const QString theme ) +{ + QString fullURL; + fullURL = "tar:" + GlobalDataDir + "themes/" + theme; + if( !KIO::NetAccess::exists( fullURL ) ) + { + fullURL = "tar:" + QDir::currentDirPath() + "../media/" + theme; + if( !KIO::NetAccess::exists( fullURL ) ) + { + fullURL = "tar:" + QDir::homeDirPath() + "/.knights/" + theme; + if( !KIO::NetAccess::exists( fullURL ) ) + { + kdWarning() << "The theme " << theme << " does not exist in any valid path." << endl; + return QString::null; + } + } + } + fullURL += "/"; + return fullURL; +} + +/////////////////////////////////////// +// +// resource::loadSCIDImage +// +/////////////////////////////////////// +QPixmap resource::loadSCIDImage( const QString &name ) +{ + const int BufferMax = 120; + const int ArrayMax = 21600; + const int SkipSize = 7200; + + QPixmap newPix; + QString searchName = '\"' + name + '\"'; + QByteArray base64Data( ArrayMax ); + QByteArray rawData( ArrayMax ); + char *array = base64Data.data(); + char buffer[BufferMax]; + char photo[12]; + unsigned int index = 0; + unsigned int buffSize = 0; + + QString source = locate( "appdata", "players.img" ); + if( source.isNull() ) + source = SCID_Image_Path; + + strcpy( photo, "photo" ); + QFile file( source ); + + if( file.open( IO_ReadOnly ) ) + { + while( !file.atEnd() ) + { + file.readLine( buffer, BufferMax ); + if( strstr( buffer, photo ) != NULL ) + { + if( strstr( buffer, searchName.latin1() ) != NULL ) + { + /* From here on, we're reading the image */ + index = file.readBlock( array, SkipSize ); + buffer[0] = 0; + while( ( buffer[0] != '}' ) && ( !file.atEnd() ) ) + { + memcpy( array + index, buffer, buffSize ); + index += buffSize; + buffSize = file.readLine( buffer, BufferMax ); + } + base64Data.truncate( index ); + KCodecs::base64Decode( base64Data, rawData ); + newPix.loadFromData( rawData ); + break; + } + else + { + file.at( file.at() + SkipSize ); + } + } + } + file.close(); + } + return newPix; +} + +#undef CFG + + |