00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <qfile.h>
00022
00023
#include <kdebug.h>
00024
#include <kio/netaccess.h>
00025
#include <kio/scheduler.h>
00026
#include <klocale.h>
00027
#include <ktempfile.h>
00028
#include <kurlrequester.h>
00029
00030
#include "addressbook.h"
00031
#include "formatfactory.h"
00032
#include "resourcenetconfig.h"
00033
#include "stdaddressbook.h"
00034
00035
#include "resourcenet.h"
00036
00037
using namespace KABC;
00038
00039 ResourceNet::ResourceNet(
const KConfig *config )
00040 : Resource( config ), mFormat( 0 ),
00041 mLocalTempFile( 0 ), mUseLocalTempFile( false )
00042 {
00043
if ( config ) {
00044 init( config->
readPathEntry(
"NetUrl" ), config->
readEntry(
"NetFormat" ) );
00045 }
else {
00046 init(
KURL(),
"vcard" );
00047 }
00048 }
00049
00050 ResourceNet::ResourceNet(
const KURL &url,
const QString &format )
00051 : Resource( 0 ), mFormat( 0 ),
00052 mLocalTempFile( 0 ), mUseLocalTempFile( false )
00053 {
00054 init( url, format );
00055 }
00056
00057
void ResourceNet::init(
const KURL &url,
const QString &format )
00058 {
00059 mFormatName = format;
00060
00061
FormatFactory *factory =
FormatFactory::self();
00062 mFormat = factory->
format( mFormatName );
00063
if ( !mFormat ) {
00064 mFormatName =
"vcard";
00065 mFormat = factory->
format( mFormatName );
00066 }
00067
00068 setUrl( url );
00069 }
00070
00071 ResourceNet::~ResourceNet()
00072 {
00073
delete mFormat;
00074 mFormat = 0;
00075
00076
delete mLocalTempFile;
00077 mLocalTempFile = 0;
00078 }
00079
00080
void ResourceNet::writeConfig(
KConfig *config )
00081 {
00082 Resource::writeConfig( config );
00083
00084 config->
writePathEntry(
"NetUrl", mUrl.url() );
00085 config->
writeEntry(
"NetFormat", mFormatName );
00086 }
00087
00088
Ticket *ResourceNet::requestSaveTicket()
00089 {
00090
kdDebug(5700) <<
"ResourceNet::requestSaveTicket()" <<
endl;
00091
00092
if ( mTempFile.
isEmpty() )
00093
return 0;
00094
00095
return createTicket(
this );
00096 }
00097
00098
void ResourceNet::releaseSaveTicket(
Ticket *ticket )
00099 {
00100 KIO::NetAccess::removeTempFile( mTempFile );
00101
delete ticket;
00102 }
00103
00104
bool ResourceNet::doOpen()
00105 {
00106
return true;
00107 }
00108
00109
void ResourceNet::doClose()
00110 {
00111 }
00112
00113
bool ResourceNet::load()
00114 {
00115
if ( !KIO::NetAccess::exists( mUrl,
true, 0 ) ) {
00116 mLocalTempFile =
new KTempFile();
00117 mLocalTempFile->
setAutoDelete(
true );
00118 mUseLocalTempFile =
true;
00119 mTempFile = mLocalTempFile->
name();
00120 }
00121
00122
if ( !KIO::NetAccess::download( mUrl, mTempFile, 0 ) ) {
00123 addressBook()->error( i18n(
"Unable to download file '%1'." ).arg( mUrl.url() ) );
00124
return false;
00125 }
00126
00127
QFile file( mTempFile );
00128
if ( !file.open( IO_ReadOnly ) ) {
00129 addressBook()->error( i18n(
"Unable to open file '%1'." ).arg( mUrl.url() ) );
00130
return false;
00131 }
00132
00133
return mFormat->
loadAll( addressBook(),
this, &file );
00134 }
00135
00136
bool ResourceNet::asyncLoad()
00137 {
00138
if ( mLocalTempFile ) {
00139
kdDebug(5700) <<
"stale temp file dedected " << mLocalTempFile->
name() <<
endl;
00140 mLocalTempFile->
setAutoDelete(
true );
00141
delete mLocalTempFile;
00142 }
00143
00144 mLocalTempFile =
new KTempFile();
00145 mUseLocalTempFile =
true;
00146 mTempFile = mLocalTempFile->
name();
00147
00148
KURL dest;
00149 dest.
setPath( mTempFile );
00150
00151 KIO::Scheduler::checkSlaveOnHold(
true );
00152 KIO::Job * job = KIO::file_copy( mUrl, dest, -1,
true,
false,
false );
00153 connect( job, SIGNAL( result( KIO::Job* ) ),
00154
this, SLOT( downloadFinished( KIO::Job* ) ) );
00155
00156
return true;
00157 }
00158
00159
bool ResourceNet::save(
Ticket* )
00160 {
00161
QFile file( mTempFile );
00162
00163
if ( !file.open( IO_WriteOnly ) ) {
00164 addressBook()->error( i18n(
"Unable to open file '%1'." ).arg( mUrl.url() ) );
00165
return false;
00166 }
00167
00168 mFormat->
saveAll( addressBook(),
this, &file );
00169 file.close();
00170
00171
return KIO::NetAccess::upload( mTempFile, mUrl, 0 );
00172 }
00173
00174
bool ResourceNet::asyncSave(
Ticket* )
00175 {
00176
QFile file( mTempFile );
00177
00178
if ( !file.open( IO_WriteOnly ) ) {
00179 emit savingError(
this, i18n(
"Unable to open file '%1'." ).arg( mTempFile ) );
00180
return false;
00181 }
00182
00183 mFormat->
saveAll( addressBook(),
this, &file );
00184 file.close();
00185
00186
KURL src;
00187 src.
setPath( mTempFile );
00188
00189 KIO::Scheduler::checkSlaveOnHold(
true );
00190 KIO::Job * job = KIO::file_copy( src, mUrl, -1,
true,
false,
false );
00191 connect( job, SIGNAL( result( KIO::Job* ) ),
00192
this, SLOT( uploadFinished( KIO::Job* ) ) );
00193
00194
return true;
00195 }
00196
00197
void ResourceNet::setUrl(
const KURL &url )
00198 {
00199 mUrl = url;
00200 }
00201
00202
KURL ResourceNet::url()
const
00203
{
00204
return mUrl;
00205 }
00206
00207
void ResourceNet::setFormat(
const QString &name )
00208 {
00209 mFormatName =
name;
00210
if ( mFormat )
00211
delete mFormat;
00212
00213
FormatFactory *factory =
FormatFactory::self();
00214 mFormat = factory->
format( mFormatName );
00215 }
00216
00217
QString ResourceNet::format()
const
00218
{
00219
return mFormatName;
00220 }
00221
00222
void ResourceNet::downloadFinished( KIO::Job* )
00223 {
00224
if ( !mLocalTempFile )
00225 emit loadingError(
this, i18n(
"Download failed in some way!" ) );
00226
00227
QFile file( mTempFile );
00228
if ( !file.open( IO_ReadOnly ) ) {
00229 emit loadingError(
this, i18n(
"Unable to open file '%1'." ).arg( mTempFile ) );
00230
return;
00231 }
00232
00233
if ( !mFormat->
loadAll( addressBook(),
this, &file ) )
00234 emit loadingError(
this, i18n(
"Problems during parsing file '%1'." ).arg( mTempFile ) );
00235
else
00236 emit loadingFinished(
this );
00237 }
00238
00239
void ResourceNet::uploadFinished( KIO::Job *job )
00240 {
00241
if ( job->error() )
00242 emit savingError(
this, job->errorString() );
00243
else
00244 emit savingFinished(
this );
00245 }
00246
00247
#include "resourcenet.moc"