summaryrefslogtreecommitdiffabout
path: root/kabc/plugins
Unidiff
Diffstat (limited to 'kabc/plugins') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/plugins/dir/resourcedir.cpp10
-rw-r--r--kabc/plugins/file/resourcefile.cpp10
-rw-r--r--kabc/plugins/opie/resourceopie.cpp12
-rw-r--r--kabc/plugins/qtopia/resourceqtopia.cpp9
4 files changed, 30 insertions, 11 deletions
diff --git a/kabc/plugins/dir/resourcedir.cpp b/kabc/plugins/dir/resourcedir.cpp
index 7825c6f..52863d5 100644
--- a/kabc/plugins/dir/resourcedir.cpp
+++ b/kabc/plugins/dir/resourcedir.cpp
@@ -23,60 +23,59 @@ Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28 28
29#include <sys/types.h> 29#include <sys/types.h>
30#include <sys/stat.h> 30#include <sys/stat.h>
31#ifndef _WIN32_ 31#ifndef _WIN32_
32#include <unistd.h> 32#include <unistd.h>
33#endif 33#endif
34 34
35#include <qregexp.h> 35#include <qregexp.h>
36#include <qtimer.h> 36#include <qtimer.h>
37#include <qwidget.h> 37#include <qwidget.h>
38 38
39#include <kapplication.h> 39#include <kapplication.h>
40#include <kconfig.h> 40#include <kconfig.h>
41#include <kdebug.h> 41#include <kdebug.h>
42//US #include <kgenericfactory.h> 42//US #include <kgenericfactory.h>
43#include <kglobal.h> 43#include <kglobal.h>
44#include <klocale.h> 44#include <klocale.h>
45#include <kstandarddirs.h> 45#include <kstandarddirs.h>
46#include <kurlrequester.h> 46#include <kurlrequester.h>
47#include <kmessagebox.h>
47 48
48#include "addressbook.h" 49#include "addressbook.h"
49 50
50#include "formatfactory.h" 51#include "formatfactory.h"
51 52
52#include "resourcedirconfig.h" 53#include "resourcedirconfig.h"
53#include "stdaddressbook.h" 54#include "stdaddressbook.h"
54 55
55//US 56//US
56#include <qdir.h> 57#include <qdir.h>
57//US #include "../../formats/vcardformatplugin2.h"
58//US #include "../../formats/binaryformat.h"
59 58
60#include "resourcedir.h" 59#include "resourcedir.h"
61 60
62using namespace KABC; 61using namespace KABC;
63 62
64extern "C" 63extern "C"
65#ifdef _WIN32_ 64#ifdef _WIN32_
66__declspec(dllexport) 65__declspec(dllexport)
67#else 66#else
68{ 67{
69#endif 68#endif
70 69
71//US void *init_kabc_dir() 70//US void *init_kabc_dir()
72 void *init_microkabc_dir() 71 void *init_microkabc_dir()
73 { 72 {
74 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig>(); 73 return new KRES::PluginFactory<ResourceDir,ResourceDirConfig>();
75 } 74 }
76#ifndef _WIN32_ 75#ifndef _WIN32_
77} 76}
78#endif 77#endif
79 78
80ResourceDir::ResourceDir( const KConfig *config ) 79ResourceDir::ResourceDir( const KConfig *config )
81 : Resource( config ) 80 : Resource( config )
82{ 81{
@@ -324,39 +323,42 @@ void ResourceDir::setFormat( const QString &format )
324 FormatFactory *factory = FormatFactory::self(); 323 FormatFactory *factory = FormatFactory::self();
325 mFormat = factory->format( mFormatName ); 324 mFormat = factory->format( mFormatName );
326/*US 325/*US
327qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1()); 326qDebug("ResourceDir::setFormat initialized with format %s ", format.latin1());
328 if (mFormatName == "vcard") 327 if (mFormatName == "vcard")
329 mFormat = new VCardFormatPlugin2(); 328 mFormat = new VCardFormatPlugin2();
330 else if (mFormatName == "binary") 329 else if (mFormatName == "binary")
331 mFormat = new BinaryFormat(); 330 mFormat = new BinaryFormat();
332 else 331 else
333 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1()); 332 qDebug("ResourceDir::setFormat format unknown !!! %s ", format.latin1());
334*/ 333*/
335 334
336} 335}
337 336
338QString ResourceDir::format() const 337QString ResourceDir::format() const
339{ 338{
340 return mFormatName; 339 return mFormatName;
341} 340}
342 341
343void ResourceDir::pathChanged() 342void ResourceDir::pathChanged()
344{ 343{
345 if ( !addressBook() ) 344 if ( !addressBook() )
346 return; 345 return;
347 346
348 load(); 347 QString text( i18n( "Dir resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mPath ) );
349 addressBook()->emitAddressBookChanged(); 348 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
349 load();
350 addressBook()->emitAddressBookChanged();
351 }
350} 352}
351 353
352void ResourceDir::removeAddressee( const Addressee& addr ) 354void ResourceDir::removeAddressee( const Addressee& addr )
353{ 355{
354 QFile::remove( mPath + "/" + addr.uid() ); 356 QFile::remove( mPath + "/" + addr.uid() );
355} 357}
356 358
357void ResourceDir::cleanUp() 359void ResourceDir::cleanUp()
358{ 360{
359 unlock( mPath ); 361 unlock( mPath );
360} 362}
361 363
362//US #include "resourcedir.moc" 364//US #include "resourcedir.moc"
diff --git a/kabc/plugins/file/resourcefile.cpp b/kabc/plugins/file/resourcefile.cpp
index 9f9b00f..1d3acec 100644
--- a/kabc/plugins/file/resourcefile.cpp
+++ b/kabc/plugins/file/resourcefile.cpp
@@ -21,48 +21,49 @@
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <sys/types.h> 28#include <sys/types.h>
29#include <sys/stat.h> 29#include <sys/stat.h>
30#ifndef _WIN32_ 30#ifndef _WIN32_
31#include <unistd.h> 31#include <unistd.h>
32#endif 32#endif
33 33
34#include <qfile.h> 34#include <qfile.h>
35#include <qfileinfo.h> 35#include <qfileinfo.h>
36#include <qregexp.h> 36#include <qregexp.h>
37#include <qtimer.h> 37#include <qtimer.h>
38 38
39#include <kapplication.h> 39#include <kapplication.h>
40#include <kconfig.h> 40#include <kconfig.h>
41#include <kdebug.h> 41#include <kdebug.h>
42#include <klocale.h> 42#include <klocale.h>
43//US #include <ksavefile.h> 43//US #include <ksavefile.h>
44#include <kstandarddirs.h> 44#include <kstandarddirs.h>
45#include <kmessagebox.h>
45 46
46#include "formatfactory.h" 47#include "formatfactory.h"
47 48
48#include "resource.h" 49#include "resource.h"
49#include "resourcefileconfig.h" 50#include "resourcefileconfig.h"
50#include "stdaddressbook.h" 51#include "stdaddressbook.h"
51 52
52#include "resourcefile.h" 53#include "resourcefile.h"
53 54
54using namespace KABC; 55using namespace KABC;
55 56
56extern "C" 57extern "C"
57#ifdef _WIN32_ 58#ifdef _WIN32_
58__declspec(dllexport) 59__declspec(dllexport)
59#else 60#else
60{ 61{
61#endif 62#endif
62 63
63//US void *init_kabc_file() 64//US void *init_kabc_file()
64 void *init_microkabc_file() 65 void *init_microkabc_file()
65 { 66 {
66 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig>(); 67 return new KRES::PluginFactory<ResourceFile,ResourceFileConfig>();
67 } 68 }
68#ifndef _WIN32_ 69#ifndef _WIN32_
@@ -351,41 +352,46 @@ void ResourceFile::setFormat( const QString &format )
351 mFormat = new VCardFormatPlugin2(); 352 mFormat = new VCardFormatPlugin2();
352// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 353// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
353 } 354 }
354 else if (mFormatName == "binary") { 355 else if (mFormatName == "binary") {
355 mFormat = new BinaryFormat(); 356 mFormat = new BinaryFormat();
356// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1()); 357// qDebug("ResourceFile::setFormat format %s", mFormatName.latin1());
357 } 358 }
358 else 359 else
359 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1()); 360 qDebug("ResourceFile::setFormat format unknown !!! %s ", format.latin1());
360*/ 361*/
361 362
362} 363}
363 364
364QString ResourceFile::format() const 365QString ResourceFile::format() const
365{ 366{
366 return mFormatName; 367 return mFormatName;
367} 368}
368 369
369void ResourceFile::fileChanged() 370void ResourceFile::fileChanged()
370{ 371{
371 // There is a small theoretical chance that KDirWatch calls us before 372 // There is a small theoretical chance that KDirWatch calls us before
372 // we are fully constructed 373 // we are fully constructed
373 if (!addressBook()) 374 if (!addressBook())
374 return; 375 return;
375 load(); 376
376 addressBook()->emitAddressBookChanged(); 377
378 QString text( i18n( "File resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mFileName ) );
379 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
380 load();
381 addressBook()->emitAddressBookChanged();
382 }
377} 383}
378 384
379void ResourceFile::removeAddressee( const Addressee &addr ) 385void ResourceFile::removeAddressee( const Addressee &addr )
380{ 386{
381 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) ); 387 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/photos/" ) + addr.uid() ) );
382 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) ); 388 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/logos/" ) + addr.uid() ) );
383 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) ); 389 QFile::remove( QFile::encodeName( locateLocal( "data", "kabc/sounds/" ) + addr.uid() ) );
384} 390}
385 391
386void ResourceFile::cleanUp() 392void ResourceFile::cleanUp()
387{ 393{
388 unlock( mFileName ); 394 unlock( mFileName );
389} 395}
390 396
391//US #include "resourcefile.moc" 397//US #include "resourcefile.moc"
diff --git a/kabc/plugins/opie/resourceopie.cpp b/kabc/plugins/opie/resourceopie.cpp
index 1436508..aaee801 100644
--- a/kabc/plugins/opie/resourceopie.cpp
+++ b/kabc/plugins/opie/resourceopie.cpp
@@ -19,48 +19,49 @@
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <sys/types.h> 28#include <sys/types.h>
29#include <sys/stat.h> 29#include <sys/stat.h>
30#include <unistd.h> 30#include <unistd.h>
31 31
32#include <qdir.h> 32#include <qdir.h>
33#include <qfile.h> 33#include <qfile.h>
34#include <qfileinfo.h> 34#include <qfileinfo.h>
35#include <qregexp.h> 35#include <qregexp.h>
36 36
37#include <kapplication.h> 37#include <kapplication.h>
38#include <kconfig.h> 38#include <kconfig.h>
39#include <kdebug.h> 39#include <kdebug.h>
40#include <klocale.h> 40#include <klocale.h>
41//US #include <ksavefile.h> 41//US #include <ksavefile.h>
42#include <kstandarddirs.h> 42#include <kstandarddirs.h>
43#include <kmessagebox.h>
43 44
44//US #include "formatfactory.h" 45//US #include "formatfactory.h"
45//US #include <qpe/qpeapplication.h> 46//US #include <qpe/qpeapplication.h>
46 47
47#include <opie/ocontactaccess.h> 48#include <opie/ocontactaccess.h>
48#include <opie/ocontactaccessbackend_xml.h> 49#include <opie/ocontactaccessbackend_xml.h>
49 50
50#include "resourceopieconfig.h" 51#include "resourceopieconfig.h"
51#include "stdaddressbook.h" 52#include "stdaddressbook.h"
52 53
53#include "opieconverter.h" 54#include "opieconverter.h"
54 55
55#include "resourceopie.h" 56#include "resourceopie.h"
56 57
57using namespace KABC; 58using namespace KABC;
58extern "C" 59extern "C"
59{ 60{
60 void *init_microkabc_opie() 61 void *init_microkabc_opie()
61 { 62 {
62 return new KRES::PluginFactory<ResourceOpie,ResourceOpieConfig>(); 63 return new KRES::PluginFactory<ResourceOpie,ResourceOpieConfig>();
63 } 64 }
64} 65}
65 66
66ResourceOpie::ResourceOpie( const KConfig *config ) 67ResourceOpie::ResourceOpie( const KConfig *config )
@@ -71,51 +72,49 @@ ResourceOpie::ResourceOpie( const KConfig *config )
71 KConfig *cfg = (KConfig *)config; 72 KConfig *cfg = (KConfig *)config;
72 if ( cfg ) { 73 if ( cfg ) {
73 fileName = cfg->readEntry( "FileName", fileName ); 74 fileName = cfg->readEntry( "FileName", fileName );
74 75
75 } 76 }
76 77
77// qDebug("ResourceOpie::ResourceOpie : %s", fileName.latin1() ); 78// qDebug("ResourceOpie::ResourceOpie : %s", fileName.latin1() );
78 79
79 init( fileName ); 80 init( fileName );
80} 81}
81 82
82ResourceOpie::ResourceOpie( const QString &fileName ) 83ResourceOpie::ResourceOpie( const QString &fileName )
83 : Resource( 0 ) 84 : Resource( 0 )
84{ 85{
85// qDebug("ResourceOpie::ResourceOpie : 3 %s", fileName.latin1()); 86// qDebug("ResourceOpie::ResourceOpie : 3 %s", fileName.latin1());
86 init( fileName ); 87 init( fileName );
87} 88}
88 89
89void ResourceOpie::init( const QString &fileName ) 90void ResourceOpie::init( const QString &fileName )
90{ 91{
91 92
92 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); 93 connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) );
93 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); 94 connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) );
94 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); 95 connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) );
95 96
96 //US opie addressbook is always readonly
97//US setReadOnly( true );
98 97
99 setFileName( fileName ); 98 setFileName( fileName );
100 99
101} 100}
102 101
103ResourceOpie::~ResourceOpie() 102ResourceOpie::~ResourceOpie()
104{ 103{
105 if (mConverter != 0) 104 if (mConverter != 0)
106 delete mConverter; 105 delete mConverter;
107} 106}
108 107
109void ResourceOpie::writeConfig( KConfig *config ) 108void ResourceOpie::writeConfig( KConfig *config )
110{ 109{
111 Resource::writeConfig( config ); 110 Resource::writeConfig( config );
112 111
113 config->writeEntry( "FileName", mFileName ); 112 config->writeEntry( "FileName", mFileName );
114 113
115// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1()); 114// qDebug("ResourceFile::writeConfig format %s, %s", mFileName.latin1(), mFormatName.latin1());
116 115
117} 116}
118 117
119Ticket *ResourceOpie::requestSaveTicket() 118Ticket *ResourceOpie::requestSaveTicket()
120{ 119{
121 kdDebug(5700) << "ResourceOpie::requestSaveTicket()" << endl; 120 kdDebug(5700) << "ResourceOpie::requestSaveTicket()" << endl;
@@ -350,40 +349,47 @@ void ResourceOpie::setFileName( const QString &fileName )
350{ 349{
351 mDirWatch.stopScan(); 350 mDirWatch.stopScan();
352 mDirWatch.removeFile( mFileName ); 351 mDirWatch.removeFile( mFileName );
353 352
354 mFileName = fileName; 353 mFileName = fileName;
355 354
356 mDirWatch.addFile( mFileName ); 355 mDirWatch.addFile( mFileName );
357 mDirWatch.startScan(); 356 mDirWatch.startScan();
358 357
359//US simulate KDirWatch event 358//US simulate KDirWatch event
360//US fileChanged(); 359//US fileChanged();
361} 360}
362 361
363QString ResourceOpie::fileName() const 362QString ResourceOpie::fileName() const
364{ 363{
365 return mFileName; 364 return mFileName;
366} 365}
367 366
368void ResourceOpie::fileChanged() 367void ResourceOpie::fileChanged()
369{ 368{
370 // There is a small theoretical chance that KDirWatch calls us before 369 // There is a small theoretical chance that KDirWatch calls us before
371 // we are fully constructed 370 // we are fully constructed
372 if (!addressBook()) 371 if (!addressBook())
373 return; 372 return;
373
374 QString text( i18n( "Opie resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mFileName ) );
375 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
376 load();
377 addressBook()->emitAddressBookChanged();
378 }
379
374 load(); 380 load();
375 addressBook()->emitAddressBookChanged(); 381 addressBook()->emitAddressBookChanged();
376} 382}
377 383
378void ResourceOpie::removeAddressee( const Addressee &addr ) 384void ResourceOpie::removeAddressee( const Addressee &addr )
379{ 385{
380} 386}
381 387
382void ResourceOpie::cleanUp() 388void ResourceOpie::cleanUp()
383{ 389{
384// qDebug("ResourceOpie::cleanup() %s", mFileName.latin1()); 390// qDebug("ResourceOpie::cleanup() %s", mFileName.latin1());
385 391
386 unlock( mFileName ); 392 unlock( mFileName );
387} 393}
388 394
389//US #include "resourceopie.moc" 395//US #include "resourceopie.moc"
diff --git a/kabc/plugins/qtopia/resourceqtopia.cpp b/kabc/plugins/qtopia/resourceqtopia.cpp
index 4854197..7475685 100644
--- a/kabc/plugins/qtopia/resourceqtopia.cpp
+++ b/kabc/plugins/qtopia/resourceqtopia.cpp
@@ -19,48 +19,49 @@
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27#include <sys/types.h> 27#include <sys/types.h>
28#include <sys/stat.h> 28#include <sys/stat.h>
29#include <unistd.h> 29#include <unistd.h>
30 30
31#include <qdir.h> 31#include <qdir.h>
32#include <qfile.h> 32#include <qfile.h>
33#include <qfileinfo.h> 33#include <qfileinfo.h>
34#include <qregexp.h> 34#include <qregexp.h>
35//US #include <qtimer.h> 35//US #include <qtimer.h>
36 36
37#include <kapplication.h> 37#include <kapplication.h>
38#include <kconfig.h> 38#include <kconfig.h>
39#include <kdebug.h> 39#include <kdebug.h>
40#include <klocale.h> 40#include <klocale.h>
41//US #include <ksavefile.h> 41//US #include <ksavefile.h>
42#include <kstandarddirs.h> 42#include <kstandarddirs.h>
43#include <kmessagebox.h>
43 44
44#include <qpe/pim/addressbookaccess.h> 45#include <qpe/pim/addressbookaccess.h>
45 46
46 47
47#include "resourceqtopiaconfig.h" 48#include "resourceqtopiaconfig.h"
48#include "stdaddressbook.h" 49#include "stdaddressbook.h"
49 50
50#include "qtopiaconverter.h" 51#include "qtopiaconverter.h"
51 52
52#include "resourceqtopia.h" 53#include "resourceqtopia.h"
53 54
54using namespace KABC; 55using namespace KABC;
55extern "C" 56extern "C"
56{ 57{
57 void *init_microkabc_qtopia() 58 void *init_microkabc_qtopia()
58 { 59 {
59 return new KRES::PluginFactory<ResourceQtopia,ResourceQtopiaConfig>(); 60 return new KRES::PluginFactory<ResourceQtopia,ResourceQtopiaConfig>();
60 } 61 }
61} 62}
62 63
63ResourceQtopia::ResourceQtopia( const KConfig *config ) 64ResourceQtopia::ResourceQtopia( const KConfig *config )
64 : Resource( config ), mConverter (0) 65 : Resource( config ), mConverter (0)
65{ 66{
66 // we can not choose the filename. Therefore use the default to display 67 // we can not choose the filename. Therefore use the default to display
@@ -314,38 +315,42 @@ void ResourceQtopia::setFileName( const QString &fileName )
314{ 315{
315 mDirWatch.stopScan(); 316 mDirWatch.stopScan();
316 mDirWatch.removeFile( mFileName ); 317 mDirWatch.removeFile( mFileName );
317 318
318 mFileName = fileName; 319 mFileName = fileName;
319 320
320 mDirWatch.addFile( mFileName ); 321 mDirWatch.addFile( mFileName );
321 mDirWatch.startScan(); 322 mDirWatch.startScan();
322 323
323//US simulate KDirWatch event 324//US simulate KDirWatch event
324//US fileChanged(); 325//US fileChanged();
325} 326}
326 327
327QString ResourceQtopia::fileName() const 328QString ResourceQtopia::fileName() const
328{ 329{
329 return mFileName; 330 return mFileName;
330} 331}
331 332
332void ResourceQtopia::fileChanged() 333void ResourceQtopia::fileChanged()
333{ 334{
334 // There is a small theoretical chance that KDirWatch calls us before 335 // There is a small theoretical chance that KDirWatch calls us before
335 // we are fully constructed 336 // we are fully constructed
336 if (!addressBook()) 337 if (!addressBook())
337 return; 338 return;
338 load(); 339
339 addressBook()->emitAddressBookChanged(); 340 QString text( i18n( "Qtopia resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( mFileName ) );
341 if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) {
342 load();
343 addressBook()->emitAddressBookChanged();
344 }
340} 345}
341 346
342void ResourceQtopia::removeAddressee( const Addressee &addr ) 347void ResourceQtopia::removeAddressee( const Addressee &addr )
343{ 348{
344} 349}
345 350
346void ResourceQtopia::cleanUp() 351void ResourceQtopia::cleanUp()
347{ 352{
348 unlock( mFileName ); 353 unlock( mFileName );
349} 354}
350 355
351//US #include "resourceqtopia.moc" 356//US #include "resourceqtopia.moc"