|
|
|
/*
|
|
|
|
*
|
|
|
|
* $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $
|
|
|
|
* Copyright (C) 2006 Sebastian Trueg <trueg@k3b.org>
|
|
|
|
*
|
|
|
|
* This file is part of the K3b project.
|
|
|
|
* Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
* See the file "COPYING" for the exact licensing terms.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "k3bencodingconverter.h"
|
|
|
|
|
|
|
|
#include <tqwidget.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
|
|
|
|
#include <kdebug.h>
|
|
|
|
|
|
|
|
#ifdef HAVE_ICONV_H
|
|
|
|
#include <langinfo.h>
|
|
|
|
#include <iconv.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
class K3bEncodingConverter::Private
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
iconv_t ic;
|
|
|
|
TQString localEncoding;
|
|
|
|
TQString lastEncoding;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
K3bEncodingConverter::K3bEncodingConverter()
|
|
|
|
{
|
|
|
|
d = new Private;
|
|
|
|
#ifdef HAVE_ICONV_H
|
|
|
|
char* codec = nl_langinfo( CODESET );
|
|
|
|
d->localEncoding = TQString::fromLocal8Bit( codec );
|
|
|
|
kdDebug() << "(K3bDataUrlAddingDialog) using locale codec: " << codec << endl;
|
|
|
|
d->ic = ::iconv_open( "UCS-2BE", codec );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
K3bEncodingConverter::~K3bEncodingConverter()
|
|
|
|
{
|
|
|
|
#ifdef HAVE_ICONV_H
|
|
|
|
::iconv_close( d->ic );
|
|
|
|
#endif
|
|
|
|
delete d;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool K3bEncodingConverter::encodedLocally( const TQCString& s )
|
|
|
|
{
|
|
|
|
#ifdef HAVE_ICONV_H
|
|
|
|
TQCString utf8Encoded( s.length()*2 );
|
|
|
|
#if defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)
|
|
|
|
const char* in = s.data();
|
|
|
|
#else
|
|
|
|
char* in = const_cast<char*>(s.data());
|
|
|
|
#endif
|
|
|
|
char* out = utf8Encoded.data();
|
|
|
|
size_t inSize = s.length();
|
|
|
|
size_t outSize = utf8Encoded.size();
|
|
|
|
return( (size_t)-1 != ::iconv( d->ic, &in, &inSize, &out, &outSize ) );
|
|
|
|
#else
|
|
|
|
return true;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool K3bEncodingConverter::fixEncoding( const TQCString& s, TQCString& result, TQWidget* parent, bool cache )
|
|
|
|
{
|
|
|
|
#ifdef IMPLEMENT_THIS_METHOD // HAVE_ICONV_H
|
|
|
|
if( !d->lastEncoding.isEmpty() ) {
|
|
|
|
//
|
|
|
|
// try converting with the last encoding
|
|
|
|
//
|
|
|
|
if( convert( s, result, d->lastEncoding, d->localEncoding )
|
|
|
|
&& encodedLocally( result ) ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( cache ) {
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
d->lastEncoding = TQString();
|
|
|
|
#else
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool K3bEncodingConverter::convert( const TQCString& s, TQCString& result, const TQString& from, const TQString& to )
|
|
|
|
{
|
|
|
|
bool r = false;
|
|
|
|
|
|
|
|
#ifdef HAVE_ICONV_H
|
|
|
|
iconv_t ic = ::iconv_open( to.local8Bit(), from.local8Bit() );
|
|
|
|
|
|
|
|
result.resize( s.length() * 2 );
|
|
|
|
#if defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)
|
|
|
|
const char* in = s.data();
|
|
|
|
#else
|
|
|
|
char* in = const_cast<char*>(s.data());
|
|
|
|
#endif
|
|
|
|
char* out = result.data();
|
|
|
|
size_t inSize = s.length();
|
|
|
|
size_t outSize = result.size();
|
|
|
|
|
|
|
|
if( (size_t)-1 != ::iconv( ic, &in, &inSize, &out, &outSize ) )
|
|
|
|
r = true;
|
|
|
|
|
|
|
|
::iconv_close( ic );
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|