You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kchmviewer/src/kchmsettings.cpp

299 lines
7.3 KiB

/***************************************************************************
* Copyright (C) 2004-2007 by Georgy Yunaev, gyunaev@ulduzsoft.com *
* Please do not use email address above for bug reports; see *
* the README file *
* *
* 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., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <tqfile.h>
#include <tqfileinfo.h>
#include <tqdatastream.h>
#include "kchmsettings.h"
#include "kchmconfig.h"
static TQ_INT32 SETTINGS_MAGIC = 0xD8AB4E76;
static TQ_INT32 SETTINGS_VERSION = 4;
/*
* The order is important!
* To be compatible with next versions, you may add items ONLY before the MARKER_END!
*/
enum marker_t
{
MARKER_FILESIZE = 1,
MARKER_FILETIME,
MARKER_ACTIVETABSYSTEM,
MARKER_ACTIVETABWINDOW,
MARKER_ACTIVEENCODING,
MARKER_SEARCHHISTORY,
MARKER_WINDOW_SIZE,
MARKER_BOOKMARKS,
MARKER_VIEWINDOWS,
MARKER_CONTENTSDATA,
MARKER_INDEXDATA,
// This should be the last
MARKER_END = 0x7FFF
};
// Helpers for serialization of SavedBookmark through TQDataStream
static inline TQDataStream& operator<< ( TQDataStream& s, const KCHMSettings::SavedBookmark& b )
{
s << b.name;
s << b.url;
s << b.scroll_y;
return s;
}
static inline TQDataStream& operator>> ( TQDataStream& s, KCHMSettings::SavedBookmark& b )
{
s >> b.name;
s >> b.url;
s >> b.scroll_y;
return s;
}
// Helpers for serialization of SavedViewWindow through TQDataStream
static inline TQDataStream& operator<< ( TQDataStream& s, const KCHMSettings::SavedViewWindow& b )
{
// Store the version first. Later we can increase it when adding new members.
s << 1;
s << b.url;
s << b.scroll_y;
s << b.zoom;
return s;
}
static inline TQDataStream& operator>> ( TQDataStream& s, KCHMSettings::SavedViewWindow& b )
{
TQ_INT32 version;
s >> version;
s >> b.url;
s >> b.scroll_y;
s >> b.zoom;
return s;
}
KCHMSettings::KCHMSettings( )
{
m_activetabsystem = 0;
m_activetabwindow = 0;
m_activeencodinglcid = 0;
m_window_size_x = 700;
m_window_size_y = 500;
m_window_size_splitter = 200;
}
bool KCHMSettings::loadSettings( const TQString & filename )
{
m_activetabsystem = 0;
m_activetabwindow = 0;
m_activeencodinglcid = 0;
m_searchhistory.clear();
m_bookmarks.clear();
m_viewwindows.clear();
TQFileInfo finfo ( filename );
m_settingsFile = TQString();
m_searchDictFile = TQString();
m_searchDocFile = TQString();
if ( !finfo.size() )
return false;
// Init those params, as they'll be used during save the first time even if the file is not here
m_currentfilesize = finfo.size();
m_currentfiledate = finfo.lastModified().toTime_t();
getFilenames( filename, &m_settingsFile, &m_searchDictFile, &m_searchDocFile );
TQFile file( m_settingsFile );
if ( !file.open (IO_ReadOnly) )
return false; // it's ok, file may not exist
TQDataStream stream (&file);
// Read and check header
TQ_INT32 data;
bool complete_read = false;
stream >> data; // magic
if ( data != SETTINGS_MAGIC )
{
tqWarning ("file %s has bad magic value, ignoring it.", file.name().ascii());
return false;
}
stream >> data; // version
if ( data > SETTINGS_VERSION )
{
tqWarning ("file %s has unsupported data version %d, ignoring it.", file.name().ascii(), data);
return false;
}
// Read everything by marker
while ( 1 )
{
stream >> data; // marker
if ( data == MARKER_END )
{
complete_read = true;
break;
}
switch (data)
{
case MARKER_FILESIZE:
stream >> m_currentfilesize;
if ( m_currentfilesize != finfo.size() )
{
m_currentfilesize = finfo.size();
return false;
}
break;
case MARKER_FILETIME:
stream >> m_currentfiledate;
if ( m_currentfiledate != finfo.lastModified().toTime_t() )
{
m_currentfiledate = finfo.lastModified().toTime_t();
return false;
}
break;
case MARKER_ACTIVETABSYSTEM:
stream >> m_activetabsystem;
break;
case MARKER_ACTIVETABWINDOW:
stream >> m_activetabwindow;
break;
case MARKER_ACTIVEENCODING:
stream >> m_activeencodinglcid;
break;
case MARKER_WINDOW_SIZE:
stream >> m_window_size_x;
stream >> m_window_size_y;
stream >> m_window_size_splitter;
break;
case MARKER_SEARCHHISTORY:
stream >> m_searchhistory;
break;
case MARKER_BOOKMARKS:
stream >> m_bookmarks;
break;
case MARKER_VIEWINDOWS:
stream >> m_viewwindows;
break;
}
}
return complete_read;
}
bool KCHMSettings::saveSettings( )
{
TQFile file( m_settingsFile );
if ( !file.open (IO_WriteOnly) )
{
tqWarning ("Could not write settings into file %s: %s", TQString(file.name()).ascii(), TQString(file.errorString()).ascii());
return false;
}
TQDataStream stream (&file);
// Save header
stream << SETTINGS_MAGIC;
stream << SETTINGS_VERSION;
// Save size and last-modified
stream << MARKER_FILESIZE;
stream << m_currentfilesize;
stream << MARKER_FILETIME;
stream << m_currentfiledate;
// Save generic settings
stream << MARKER_ACTIVETABSYSTEM;
stream << m_activetabsystem;
// Save generic settings
stream << MARKER_ACTIVETABWINDOW;
stream << m_activetabwindow;
stream << MARKER_ACTIVEENCODING;
stream << m_activeencodinglcid;
// Save search history vector
stream << MARKER_SEARCHHISTORY;
stream << m_searchhistory;
// Save window size and splitter position
stream << MARKER_WINDOW_SIZE;
stream << m_window_size_x;
stream << m_window_size_y;
stream << m_window_size_splitter;
stream << MARKER_BOOKMARKS;
stream << m_bookmarks;
stream << MARKER_VIEWINDOWS;
stream << m_viewwindows;
stream << MARKER_END;
return true;
}
void KCHMSettings::removeSettings( const TQString & filename )
{
TQString settingsfile, dictfile, doclistfile;
getFilenames( filename, &settingsfile, &dictfile, &doclistfile );
TQFile::remove( settingsfile );
TQFile::remove( dictfile );
TQFile::remove( doclistfile );
}
void KCHMSettings::getFilenames(const TQString & helpfilename, TQString * settingsfile, TQString * dictfile, TQString * doclistfile )
{
TQFileInfo finfo ( helpfilename );
TQString prefix = appConfig.m_datapath + "/" + finfo.baseName();
*settingsfile = prefix + ".kchmviewer";
*dictfile = prefix + ".dict";
*doclistfile = prefix + ".doclist";
}