#
# This is a patch for the sync-plan package, which connects the netplan
# daemon with the 3Com PalmPilot. The original package can be found on
# ftp://ryeham.ee.ryerson.ca/pub/PalmOS . It has a bug that causes random
# aborts when large amounts of data are synced. This patch fixes it. Use
# the GNU "patch" utility to apply to sync-plan.
#
# Contributed by Joerg Weber <Joerg.Weber@interface-business.de>
#
# This patch was submitted to Kenneth Albanowski <kjahds@kjahds.com> for
# inclusion in the sync-plan on 10 Dec 1998. Newer versions of sync-plan
# may already contain this patch.
#

*** sync-plan	Fri Sep 25 19:12:09 1998
--- sync-plan_orig	Fri Sep 25 19:14:01 1998
***************
*** 7,19 ****
  use PDA::Pilot;
  use Data::Dumper;
  
- 
  sub id_v2netplan {
      $id="=plan<uid=$<,gid=$(,pid=$$>\n";
      SendPlanCommand($socket, $id);
  }
  
- 
  sub DatePlanToPerl {
  	my($PlanDate) = @_;
  	my($m,$d,$y) = split(m!/!,$PlanDate);
--- 7,17 ----
***************
*** 333,339 ****
  		splice @output, $i, 0, @US;
  	}
  	
! #	print "Generated record |",join("\n", @output),"|\n";
  
  	join("\n",@output);
  }
--- 331,337 ----
  		splice @output, $i, 0, @US;
  	}
  	
! 	print "Generated record |",join("\n", @output),"|\n";
  
  	join("\n",@output);
  }
***************
*** 576,581 ****
--- 574,583 ----
  
  
  sub doafterplan {
+ 
+ 	$ticklecount = 0;	# Reset ticklecount
+ 	$doticklecount = 100;	# Tickle every 100 loop
+ 
  	my($db,$socket,$control) = @_;
  	print "After stuff:\n";
  
***************
*** 624,629 ****
--- 626,638 ----
  	print "Pilot loop\n";	
  
  	foreach (keys %pilotID) {
+ 
+ # Tickle the pilot so it will not time out during this
+ 	$ticklecount++;
+ 	if ($ticklecount >= $doticklecount) {
+ 		$dlp->tickle();
+ 		$ticklecount = 0;
+ 	}
  	
  		# Pilot records originally downloaded from a different Plan database
  		# are off-limits during this pass.
***************
*** 631,637 ****
  		next if $dbname{$_} ne $control->{name}; 
  		
  		
! #		print "Pilot record: ",PrintPilotRecord($pilotID{$_}),"\n";
  		#print "Pilot record: ",Dumper($pilotID{$_}),"\n";
  		if ($pilotID{$_}->{deleted} || $pilotID{$_}->{archived}) {
  		#	
--- 640,646 ----
  		next if $dbname{$_} ne $control->{name}; 
  		
  		
! 		print "Pilot record: ",PrintPilotRecord($pilotID{$_}),"\n";
  		#print "Pilot record: ",Dumper($pilotID{$_}),"\n";
  		if ($pilotID{$_}->{deleted} || $pilotID{$_}->{archived}) {
  		#	
***************
*** 684,690 ****
  					# Action: Install the Pilot record in Plan, regardless of
  					# changed status
  					
! #					print "Action: Install Pilot record in Plan.\n";
  					
  					#print "Installing pilot record in plan: ",Dumper($pilotID{$_});
  					
--- 693,699 ----
  					# Action: Install the Pilot record in Plan, regardless of
  					# changed status
  					
! 					print "Action: Install Pilot record in Plan.\n";
  					
  					#print "Installing pilot record in plan: ",Dumper($pilotID{$_});
  					
***************
*** 843,849 ****
  	print "Plan loop\n";
  
  	foreach (keys %planRecord) {
! #		print "Plan record: ",PrintPlanRecord($planRecord{$_}),"\n";
  		my($record) = $planRecord{$_};
  		my($pid) = $planRecord{$_}->{pilotid};
  		
--- 852,866 ----
  	print "Plan loop\n";
  
  	foreach (keys %planRecord) {
! 
! # Tickle the pilot so it will not time out during this
! 	$ticklecount++;
! 	if ($ticklecount >= $doticklecount) {
! 		$dlp->tickle();
! 		$ticklecount = 0;
! 	}
! 
! 		print "Plan record: ",PrintPlanRecord($planRecord{$_}),"\n";
  		my($record) = $planRecord{$_};
  		my($pid) = $planRecord{$_}->{pilotid};
  		
***************
*** 905,911 ****
  					# Action: Install the Plan record in Pilot, regardless of
  					# changed status
  					
! #					print "Action: Install Plan record in Pilot.\n";
  
  					#print "Installing plan record in pilot: ",Dumper($record);
  					#print "Trying to install Plan record: ",Dumper($record),"\n";
--- 922,928 ----
  					# Action: Install the Plan record in Pilot, regardless of
  					# changed status
  					
! 					print "Action: Install Plan record in Pilot.\n";
  
  					#print "Installing plan record in pilot: ",Dumper($record);
  					#print "Trying to install Plan record: ",Dumper($record),"\n";
***************
*** 932,938 ****
  						my($id) = WritePilotRecord($db,$control,$newrecord);
  						#$db->setRecord($newrecord);
  
! #						print "ID of new Pilot record is $id\n";
  						
  						#my ($hash) = HashPilotRecord($newrecord);						
  						#$pilothash{$id} = $hash;
--- 949,955 ----
  						my($id) = WritePilotRecord($db,$control,$newrecord);
  						#$db->setRecord($newrecord);
  
! 						print "ID of new Pilot record is $id\n";
  						
  						#my ($hash) = HashPilotRecord($newrecord);						
  						#$pilothash{$id} = $hash;
***************
*** 1028,1040 ****
  
  	foreach (keys %pilotID) {
  
  		# Pilot records originally downloaded from a different Plan database
  		# are off-limits during this pass.
  		
  		next if $dbname{$_} ne $control->{name}; 
  
  		#print "Pilot record: ",Dumper($pilotID{$_}),"\n";
! #		print "Pilot record: ",PrintPilotRecord($pilotID{$_}),"\n";
  		if ($pilotID{$_}->{deleted} || $pilotID{$_}->{archived}) {
  			
  			# At this point are seeing Pilot records marked as deleted or
--- 1045,1065 ----
  
  	foreach (keys %pilotID) {
  
+ # Tickle the pilot so it will not time out during this
+ 	$ticklecount++;
+ 	if ($ticklecount >= $doticklecount) {
+ 		$dlp->tickle();
+ 		$ticklecount = 0;
+ 	}
+ 
+ 	
  		# Pilot records originally downloaded from a different Plan database
  		# are off-limits during this pass.
  		
  		next if $dbname{$_} ne $control->{name}; 
  
  		#print "Pilot record: ",Dumper($pilotID{$_}),"\n";
! 		print "Pilot record: ",PrintPilotRecord($pilotID{$_}),"\n";
  		if ($pilotID{$_}->{deleted} || $pilotID{$_}->{archived}) {
  			
  			# At this point are seeing Pilot records marked as deleted or
***************
*** 1044,1053 ****
  			# Action: If there is an associated Plan record that has not
  			# already been deleted, delete it.
  			
! #			print "Log: Deleting Pilot record.\n";
  			
  			if (defined $planID{$_} and not $planID{$_}->{deleted}) {
! #				print "Log: ... and associated Plan record.\n";
  				DeletePlanRecord($socket, $planID{$_});
  				delete $planRecord{$planID{$_}->{id}};
  				delete $planID{$_};
--- 1069,1078 ----
  			# Action: If there is an associated Plan record that has not
  			# already been deleted, delete it.
  			
! 			print "Log: Deleting Pilot record.\n";
  			
  			if (defined $planID{$_} and not $planID{$_}->{deleted}) {
! 				print "Log: ... and associated Plan record.\n";
  				DeletePlanRecord($socket, $planID{$_});
  				delete $planRecord{$planID{$_}->{id}};
  				delete $planID{$_};
***************
*** 1067,1077 ****
  	print "Plan delete loop\n";
  
  	foreach (keys %planRecord) {
  	
  		my($record) = $planRecord{$_};
  		my($pid) = $planRecord{$_}->{pilotid};
! #	        print "Plan record: ",Dumper($record),"\n";
! #		print "Plan record: ",PrintPlanRecord($planRecord{$_}),"\n";
  	
  		# In a fast sync, we might not have loaded the record yet.
  		
--- 1092,1109 ----
  	print "Plan delete loop\n";
  
  	foreach (keys %planRecord) {
+ 
+ # Tickle the pilot so it will not time out during this
+ 	$ticklecount++;
+ 	if ($ticklecount >= $doticklecount) {
+ 		$dlp->tickle();
+ 		$ticklecount = 0;
+ 	}
  	
  		my($record) = $planRecord{$_};
  		my($pid) = $planRecord{$_}->{pilotid};
! 		#print "Plan record: ",Dumper($record),"\n";
! 		print "Plan record: ",PrintPlanRecord($planRecord{$_}),"\n";
  	
  		# In a fast sync, we might not have loaded the record yet.
  		
***************
*** 1101,1109 ****
  			# Action: If there is an associated Plan record that has not
  			# already been deleted, delete it.
  			
! #			print "Log: Deleting Plan record.\n";
  			if (defined $pid and defined $pilotID{$pid} and not $pilotID{$_}->{deleted}) {
! #				print "Log: ... and associated Pilot record.\n";
  				DeletePilotRecord($db, $pid);
  				#$db->deleteRecord($pid);
  				#delete $pilotID{$pid};
--- 1133,1141 ----
  			# Action: If there is an associated Plan record that has not
  			# already been deleted, delete it.
  			
! 			print "Log: Deleting Plan record.\n";
  			if (defined $pid and defined $pilotID{$pid} and not $pilotID{$_}->{deleted}) {
! 				print "Log: ... and associated Pilot record.\n";
  				DeletePilotRecord($db, $pid);
  				#$db->deleteRecord($pid);
  				#delete $pilotID{$pid};
***************
*** 1205,1223 ****
  					print "Plan message: $'";
  					next;
  				} else {
! 					# print stderr "Reply: |$reply|\n";
  					return $reply;
  				}
  				$reply = "";
  			}
  		}
! 		while ( $partialReply !~ /[^\\]\n$/ )
! 		{
! 		    $SysreadBytes=sysread
! 			($socket,$partialReply,1024,length($partialReply));
  		}
  	}
- 
  }
  	
  
--- 1237,1251 ----
  					print "Plan message: $'";
  					next;
  				} else {
! 					#print "Reply: |$reply|\n";
  					return $reply;
  				}
  				$reply = "";
  			}
  		}
! 		while (sysread($socket,$partialReply,1024,length($partialReply))==1024 or /\\\Z/) {
  		}
  	}
  }
  	
  
***************
*** 1247,1255 ****
  	}
  	
  	$netplanversion = $reply;
! 	# send the netplan v2.0 id string
! 	$id="=plan<uid=$<,gid=$(,pid=$$>\n";
! 	SendPlanCommand($socket, $id);
  	SendPlanCommand($socket, "o$dbname\n");
  	$reply = ReadPlanReply($socket);
  	
--- 1275,1285 ----
  	}
  	
  	$netplanversion = $reply;
! 	
!         # send the netplan v2.0 id string
!         $id="=plan<uid=$<,gid=$(,pid=$$>\n";
!         SendPlanCommand($socket, $id);
! 
  	SendPlanCommand($socket, "o$dbname\n");
  	$reply = ReadPlanReply($socket);
  	
***************
*** 1291,1297 ****
  		$reply = ReadPlanReply($socket);
  		
  		if ($reply !~ /\Art\d+\s+(\d+)\s+/s) {
! 		    die "Didn't get record I was looking for.\n";
  		}
  		
  		dorecord($db, $socket, $control, $_, $');
--- 1321,1327 ----
  		$reply = ReadPlanReply($socket);
  		
  		if ($reply !~ /\Art\d+\s+(\d+)\s+/s) {
! 			die "Didn't get record I was looking for.\n";
  		}
  		
  		dorecord($db, $socket, $control, $_, $');
***************
*** 1441,1446 ****
  
  
  close(C);
- 
- 
- 
--- 1471,1473 ----

