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.
k3b/src/projects/k3bencodingconverter.cpp

131 lines
2.8 KiB

/*
*
* $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;
}