1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2024-12-26 01:27:28 +00:00
transmission/qt/add-data.cc

108 lines
2.4 KiB
C++

/*
* This file Copyright (C) Mnemosyne LLC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* $Id$
*/
#include <QFile>
#include <libtransmission/transmission.h>
#include <libtransmission/bencode.h> // tr_base64_encode()
#include <libtransmission/utils.h> // tr_base64_encode()
#include "add-data.h"
#include "utils.h"
int
AddData :: set( const QString& key )
{
if( Utils::isMagnetLink( key ) )
{
magnet = key;
type = MAGNET;
}
else if ( Utils::isUriWithSupportedScheme( key ) )
{
url = key;
type = URL;
}
else if( QFile(key).exists( ) )
{
filename = key;
type = FILENAME;
QFile file( key );
file.open( QIODevice::ReadOnly );
metainfo = file.readAll( );
file.close( );
}
else if( Utils::isHexHashcode( key ) )
{
magnet = QString::fromAscii("magnet:?xt=urn:btih:") + key;
type = MAGNET;
}
else
{
int len;
char * raw = tr_base64_decode( key.toUtf8().constData(), key.toUtf8().size(), &len );
if( raw ) {
metainfo.append( raw, len );
tr_free( raw );
type = METAINFO;
}
else type = NONE;
}
return type;
}
QByteArray
AddData :: toBase64( ) const
{
QByteArray ret;
if( !metainfo.isEmpty( ) )
{
int len = 0;
char * b64 = tr_base64_encode( metainfo.constData(), metainfo.size(), &len );
ret = QByteArray( b64, len );
tr_free( b64 );
}
return ret;
}
QString
AddData :: readableName( ) const
{
QString ret;
switch( type )
{
case FILENAME: ret = filename; break;
case MAGNET: ret = magnet; break;
case URL: ret = url.toString(); break;
case METAINFO: {
tr_info inf;
tr_ctor * ctor = tr_ctorNew( NULL );
tr_ctorSetMetainfo( ctor, (const uint8_t*)metainfo.constData(), metainfo.size() );
if( tr_torrentParse( ctor, &inf ) == TR_PARSE_OK ) {
ret = QString::fromUtf8( inf.name ); // metainfo is required to be UTF-8
tr_metainfoFree( &inf );
}
tr_ctorFree( ctor );
break;
}
}
return ret;
}