[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    KPilot critical bugfixes
From:       Adriaan de Groot <groot () kde ! org>
Date:       2005-05-27 14:53:16
Message-ID: 200505271653.16609.groot () kde ! org
[Download RAW message or body]

As usual, we have discovered some pretty critical bugs in KPilot moments - 
days - after the tarballs for a release are created. The memofile conduit 
(@since KDE 3.4.0) will eat all previously synced memos; in addition, 
category names will be broken because the last character of each category 
name is removed (blame qstrncpy() for being more like strlcpy() and less like 
strncpy()).

The attached patch applies from the tag; it fixes both problems. For 
packagers, I'd suggest not packaging KPilot without these fixes.

I swear, I am never touching BRANCH again. It just doesn't work.

-- 
As of September 1st, 2004, the University of Nijmegen will _still_ be the 
University of Nijmegen, but with a different nonsensical adjective in front.
    Reach me at groot@kde.org instead. GPG FEA2 A3FE

["kpilot-tag-to-branch.diff" (text/x-diff)]

Index: conduits/memofileconduit/memofile-conduit.cc
===================================================================
--- conduits/memofileconduit/memofile-conduit.cc	(.../tags/KDE/3.4.1/kdepim/kpilot)	(revision 418726)
+++ conduits/memofileconduit/memofile-conduit.cc	(.../branches/KDE/3.4/kdepim/kpilot)	(revision 418726)
@@ -114,7 +114,7 @@
 	setFirstSync( _memofiles->isFirstSync() );
 	addSyncLogEntry(i18n(" Syncing with %1.").arg(_memo_directory));
 
-	if ( (syncMode() == SyncAction::SyncMode::eCopyHHToPC) || isFirstSync() ) {
+	if ( (syncMode() == SyncAction::SyncMode::eCopyHHToPC) || _memofiles->isFirstSync() ) {
 		addSyncLogEntry(i18n(" Copying Pilot to PC..."));
 #ifdef DEBUG
 		DEBUGCONDUIT << fname << ": copying Pilot to PC." << endl;
@@ -474,17 +474,11 @@
 	// Note: This will reset both fCategories and fMemoAppInfo, so
 	//       after this, we need to reinitialize our memofiles object...
 	setAppInfo();
-	cleanup();
 
 	// re-create our memofiles helper...
 	delete _memofiles;
 	_memofiles = new Memofiles(fCategories, *fMemoAppInfo, _memo_directory);
 
-	// make sure we are starting with a clean database on both ends...
-	fDatabase->deleteRecord(0, true);
-	fLocalDatabase->deleteRecord(0, true);
-	cleanup();
-
 	_memofiles->load(true);
 
 	QPtrList<Memofile> memofiles = _memofiles->getAll();
@@ -496,11 +490,39 @@
 	}
 
 	_memofiles->save();
-
+	
+	// now that we've copied from the PC to our handheld, remove anything extra from the
+	// handheld...
+	deleteUnsyncedHHRecords();
+	
 	return true;
 
 }
 
+void MemofileConduit::deleteUnsyncedHHRecords()
+{
+	FUNCTIONSETUP;
+	if ( syncMode()==SyncMode::eCopyPCToHH )
+	{
+		RecordIDList ids=fDatabase->idList();
+		RecordIDList::iterator it;
+		for ( it = ids.begin(); it != ids.end(); ++it )
+		{
+			if (!_memofiles->find(*it))
+			{
+#ifdef DEBUG
+				DEBUGCONDUIT << fname
+				<< "Deleting record with ID "<<*it <<" from handheld "
+				<< "(is not on PC, and syncing with PC->HH direction)"
+				<< endl;
+#endif
+				fDatabase->deleteRecord(*it);
+				fLocalDatabase->deleteRecord(*it);
+			}
+		}
+	}
+}
+
 int MemofileConduit::writeToPilot(Memofile * memofile)
 {
 	FUNCTIONSETUP;
Index: conduits/memofileconduit/memofile-conduit.h
===================================================================
--- conduits/memofileconduit/memofile-conduit.h	(.../tags/KDE/3.4.1/kdepim/kpilot)	(revision 418726)
+++ conduits/memofileconduit/memofile-conduit.h	(.../branches/KDE/3.4/kdepim/kpilot)	(revision 418726)
@@ -88,6 +88,7 @@
 
 	bool	copyHHToPC();
 	bool	copyPCToHH();
+	void	deleteUnsyncedHHRecords();
 	bool	sync();
 
 	int 	writeToPilot(Memofile * memofile);
Index: lib/pilotDatabase.cc
===================================================================
--- lib/pilotDatabase.cc	(.../tags/KDE/3.4.1/kdepim/kpilot)	(revision 418726)
+++ lib/pilotDatabase.cc	(.../branches/KDE/3.4/kdepim/kpilot)	(revision 418726)
@@ -185,7 +185,7 @@
 	int len = CATEGORY_NAME_SIZE - 1;
 	QCString t = PilotAppCategory::codec()->fromUnicode(s,len);
 	memset(categoryInfo()->name[i],0,CATEGORY_NAME_SIZE);
-	qstrncpy(categoryInfo()->name[i],t,kMin(len,(int)CATEGORY_NAME_SIZE));
+	qstrncpy(categoryInfo()->name[i],t,CATEGORY_NAME_SIZE);
 	return true;
 }
 
Index: lib/data/MemoDB.pdb
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: lib/data/MemoDB.pdb
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Index: lib/pilotLocalDatabase.cc
===================================================================
--- lib/pilotLocalDatabase.cc	(.../tags/KDE/3.4.1/kdepim/kpilot)	(revision 418726)
+++ lib/pilotLocalDatabase.cc	(.../branches/KDE/3.4/kdepim/kpilot)	(revision 418726)
@@ -618,7 +618,7 @@
 
 	int count;
 	pi_file_get_entries(dbFile, &count);
-	if (count > 0)
+	if (count >= 0)
 	{
 		KPILOT_DELETE(d);
 		d = new Private(count);
Index: lib/pilotDatabase.h
===================================================================
--- lib/pilotDatabase.h	(.../tags/KDE/3.4.1/kdepim/kpilot)	(revision 418726)
+++ lib/pilotDatabase.h	(.../branches/KDE/3.4/kdepim/kpilot)	(revision 418726)
@@ -279,9 +279,12 @@
 		int appLen = MAX_APPINFO_SIZE;
 		unsigned char buffer[MAX_APPINFO_SIZE];
 
-		appLen = d->readAppBlock(buffer,appLen);
-
-		(*unpack)(&fInfo, buffer, appLen);
+		if (d && d->isDBOpen())
+		{
+			appLen = d->readAppBlock(buffer,appLen);
+			(*unpack)(&fInfo, buffer, appLen);
+		}
+		// fInfo is just a struct, so we can point to it anyway.
 		init(&fInfo.category,appLen);
 	} ;
 
@@ -289,6 +292,10 @@
 	{
 		FUNCTIONSETUP;
 		unsigned char buffer[MAX_APPINFO_SIZE];
+		if (!d || !d->isDBOpen())
+		{
+			return -1;
+		}
 		int appLen = (*pack)(&fInfo, buffer, length());
 		if (appLen > 0)
 		{


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic