Fix for duplicating ABSync entries on sync operations - Bug #: 1680 - r: mozilla@bucksch.org

git-svn-id: svn://10.0.0.236/trunk@75150 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rhp%netscape.com
2000-07-29 05:04:43 +00:00
parent 5731633fc2
commit 56bedac9da
2 changed files with 177 additions and 16 deletions

View File

@@ -1372,11 +1372,11 @@ EarlyExit:
}
nsresult
nsAbSync::PatchHistoryTableWithNewID(PRInt32 clientID, PRInt32 serverID)
nsAbSync::PatchHistoryTableWithNewID(PRInt32 clientID, PRInt32 serverID, PRInt32 aMultiplier)
{
for (PRUint32 i = 0; i < mNewTableSize; i++)
{
if (mNewSyncMapingTable[i].localID == (clientID * -1))
if (mNewSyncMapingTable[i].localID == (clientID * aMultiplier))
{
#ifdef DEBUG_rhp
printf("ABSYNC: PATCHING History Table - Client: %d - Server: %d\n", clientID, serverID);
@@ -1529,7 +1529,7 @@ nsAbSync::ProcessOpReturn()
rv += ExtractInteger(renop, SERVER_OP_RETURN_SID, ' ', &serverID);
if (NS_SUCCEEDED(rv))
{
PatchHistoryTableWithNewID(clientID, serverID);
PatchHistoryTableWithNewID(clientID, serverID, -1);
}
}
}
@@ -2170,6 +2170,115 @@ nsAbSync::ProcessNewRecords()
return rv;
}
nsresult
nsAbSync::FindCardByClientID(PRInt32 aClientID,
nsIAddrDatabase *aDatabase,
nsIAbDirectory *directory,
nsIAbCard **aReturnCard)
{
nsIEnumerator *cardEnum = nsnull;
nsCOMPtr<nsISupports> obj = nsnull;
PRUint32 aKey;
nsresult rv = NS_ERROR_FAILURE;
// Time to find the entry to play with!
//
*aReturnCard = nsnull;
rv = aDatabase->EnumerateCards(directory, &cardEnum);
if (NS_FAILED(rv) || (!cardEnum))
{
rv = NS_ERROR_FAILURE;
goto EarlyExit;
}
//
// Now we have to find the entry and return it!
//
cardEnum->First();
do
{
if (NS_FAILED(cardEnum->CurrentItem(getter_AddRefs(obj))))
continue;
else
{
nsCOMPtr<nsIAbCard> card;
card = do_QueryInterface(obj, &rv);
if (NS_FAILED(card->GetKey(&aKey)))
continue;
// Found IT!
if ((PRInt32) aKey == aClientID)
{
*aReturnCard = card;
rv = NS_OK;
break;
}
}
} while (NS_SUCCEEDED(cardEnum->Next()));
EarlyExit:
if (cardEnum)
delete cardEnum;
return rv;
}
//
// This will look for an entry in the address book for this particular person and return
// the address book card and the client ID if found...otherwise, it will return ZERO
//
PRInt32
nsAbSync::HuntForExistingABEntryInServerRecord(PRInt32 aPersonIndex,
nsIAddrDatabase *aDatabase,
nsIAbDirectory *directory,
PRInt32 *aServerID,
nsIAbCard **newCard)
{
PRInt32 clientID;
PRInt32 j;
//
// Ok, first thing is to find out what the server ID is for this person?
//
*aServerID = 0;
*newCard = nsnull;
for (j = 0; j < mNewRecordTags->Count(); j++)
{
nsString *val = mNewRecordValues->StringAt((aPersonIndex*(mNewRecordTags->Count())) + j);
if ( (val) && (!val->IsEmpty()) )
{
// See if this is the record_id...
nsString *tagVal = mNewRecordTags->StringAt(j);
if (tagVal->CompareWithConversion("record_id") == 0)
{
PRInt32 errorCode;
*aServerID = val->ToInteger(&errorCode);
break;
}
}
}
// Hmm...no server ID...not good...well, better return anyway
if (*aServerID == 0)
return 0;
// If didn't find the client ID, better bail out!
if (NS_FAILED(LocateClientIDFromServerID(*aServerID, &clientID)))
return 0;
// Now, we have the clientID, need to find the address book card in the
// database for this client ID...
if (NS_FAILED(FindCardByClientID(clientID, aDatabase, directory, newCard)))
{
*aServerID = 0;
return 0;
}
else
return clientID;
}
nsresult
nsAbSync::AddNewUsers()
{
@@ -2180,7 +2289,9 @@ nsAbSync::AddNewUsers()
PRInt32 serverID;
PRUint32 localID;
nsCOMPtr<nsIAbCard> newCard;
nsIAbCard *tCard = nsnull;
nsString tempProtocolLine;
PRBool isNewCard = PR_TRUE;
// Get the address book entry
nsCOMPtr <nsIRDFResource> resource = nsnull;
@@ -2233,10 +2344,31 @@ nsAbSync::AddNewUsers()
// database...
//
for (i = 0; i < addCount; i++)
{
serverID = 0;
rv = nsComponentManager::CreateInstance(kAbCardPropertyCID, nsnull, NS_GET_IID(nsIAbCard),
getter_AddRefs(newCard));
{
serverID = 0; // for safety
//
// Ok, if we are here, then we need to figure out if this is really a NEW card
// or just an update of an existing card that is already on this client.
//
// NOTE: i is the entry of the person we are working on!
//
localID = HuntForExistingABEntryInServerRecord(i, aDatabase, directory, &serverID, &tCard);
if ( (localID > 0) && (nsnull != tCard))
{
// This is an existing entry in the local address book
// We need to dig out the card entry or just assign something here
newCard = tCard;
isNewCard = PR_FALSE;
}
else
{
// This is a new entry!
rv = nsComponentManager::CreateInstance(kAbCardPropertyCID, nsnull, NS_GET_IID(nsIAbCard),
getter_AddRefs(newCard));
isNewCard = PR_TRUE;
}
if (NS_FAILED(rv) || !newCard)
{
rv = NS_ERROR_OUT_OF_MEMORY;
@@ -2280,11 +2412,14 @@ nsAbSync::AddNewUsers()
// Now do the phone numbers...they are special???
ProcessPhoneNumbersTheyAreSpecial(newCard);
// Ok, now we need to add the card!
rv = aDatabase->CreateNewCardAndAddToDBWithKey(newCard, PR_TRUE, &localID);
// Ok, now we need to modify or add the card!
if (!isNewCard)
rv = aDatabase->EditCard(newCard, PR_TRUE);
else
rv = aDatabase->CreateNewCardAndAddToDBWithKey(newCard, PR_TRUE, &localID);
//
// Now, calculate the CRC for the new card...
// Now, calculate the NEW CRC for the new or updated card...
//
syncMappingRecord *newSyncRecord = (syncMappingRecord *)PR_Malloc(sizeof(syncMappingRecord));
if (newSyncRecord)
@@ -2297,11 +2432,25 @@ nsAbSync::AddNewUsers()
if (!tLine)
continue;
nsCRT::memset(newSyncRecord, 0, sizeof(syncMappingRecord));
newSyncRecord->CRC = GetCRC(tLine);
newSyncRecord->serverID = serverID;
newSyncRecord->localID = localID;
mNewServerTable->AppendElement((void *)newSyncRecord);
if (!isNewCard)
{
// First try to patch the old table if this is an old card...if that
// fails, then flip the flag to TRUE and have a new record created
// in newSyncRecord
//
if (NS_FAILED(PatchHistoryTableWithNewID(localID, serverID, 1)))
isNewCard = PR_TRUE;
}
if (isNewCard)
{
nsCRT::memset(newSyncRecord, 0, sizeof(syncMappingRecord));
newSyncRecord->CRC = GetCRC(tLine);
newSyncRecord->serverID = serverID;
newSyncRecord->localID = localID;
mNewServerTable->AppendElement((void *)newSyncRecord);
}
nsCRT::free(tLine);
}

View File

@@ -209,7 +209,7 @@ private:
nsresult ExtractInteger(char *aLine, char *aTag, char aDelim, PRInt32 *aRetVal);
char *ExtractCharacterString(char *aLine, char *aTag, char aDelim);
nsresult PatchHistoryTableWithNewID(PRInt32 clientID, PRInt32 serverID);
nsresult PatchHistoryTableWithNewID(PRInt32 clientID, PRInt32 serverID, PRInt32 aMultiplier);
nsresult DeleteRecord();
nsresult DeleteList();
nsresult DeleteGroup();
@@ -228,6 +228,18 @@ private:
nsresult ProcessPhoneNumbersTheyAreSpecial(nsIAbCard *aCard);
PRInt32 GetTypeOfPhoneNumber(nsString tagName);
// For updating...
PRInt32 HuntForExistingABEntryInServerRecord(PRInt32 aPersonIndex,
nsIAddrDatabase *aDatabase,
nsIAbDirectory *directory,
PRInt32 *aServerID,
nsIAbCard **newCard);
nsresult FindCardByClientID(PRInt32 aClientID,
nsIAddrDatabase *aDatabase,
nsIAbDirectory *directory,
nsIAbCard **aReturnCard);
nsString mLocale; // Charset of returned data!
nsStringArray *mDeletedRecordTags; // The deleted record tags from the server...
nsStringArray *mDeletedRecordValues; // The deleted record values from the server...