NS_IMETHODIMP nsMsgHdr::SetDate(PRTime date) { m_date = date; uint32_t seconds; PRTime2Seconds(date, &seconds); return SetUInt32Column((uint32_t) seconds, m_mdb->m_dateColumnToken); }
nsresult nsAbPalmHotSync::RenameAB(long aCategoryIndex, const char * aABUrl) { PRUint32 modTimeInSec; PRTime2Seconds(PR_Now(), &modTimeInSec); return ModifyAB(aABUrl, mAbName, modTimeInSec, aCategoryIndex); }
nsresult nsAbPalmHotSync::UpdateSyncInfo(long aCategoryIndex) { // aCategoryIndex = -1 means that callers want to reset the mod time as well. mDBOpen = PR_FALSE; PRUint32 modTimeInSec; PRTime2Seconds(PR_Now(), &modTimeInSec); if (aCategoryIndex >= 0) return(UpdateABInfo(modTimeInSec, aCategoryIndex)); else return(UpdateABInfo(0, aCategoryIndex)); // Reset mod time. }
nsresult nsAbPalmHotSync::Done(PRBool aSuccess, PRInt32 aPalmCatIndex, PRUint32 aPalmRecIDListCount, unsigned long * aPalmRecordIDList) { if(!mInitialized) return NS_ERROR_NOT_INITIALIZED; nsresult rv=NS_ERROR_UNEXPECTED; if(aPalmRecIDListCount == mNewCardCount) { for(PRUint32 i=0; i<aPalmRecIDListCount; i++) { nsCOMPtr<nsIAbMDBCard> dbCard; rv = mNewCardsArray->QueryElementAt(i, NS_GET_IID(nsIAbMDBCard), getter_AddRefs(dbCard)); if(NS_SUCCEEDED(rv) && dbCard) { ConvertAssignPalmIDAttrib(aPalmRecordIDList[i], dbCard); nsCOMPtr<nsIAbCard> newCard; newCard = do_QueryInterface(dbCard, &rv); if(NS_SUCCEEDED(rv)) mABDB->EditCard(newCard, PR_FALSE, nsnull); } } } if(mABDB && mDBOpen) { if(aSuccess) { rv = mABDB->Close(PR_TRUE); if(NS_SUCCEEDED(rv)) { mDBOpen = PR_FALSE; PRUint32 modTimeInSec; PRTime2Seconds(PR_Now(), &modTimeInSec); rv = UpdateABInfo(modTimeInSec, aPalmCatIndex); } } if(NS_FAILED(rv) || !aSuccess) { // get back the previous file rv = mABDB->ForceClosed(); if(NS_SUCCEEDED(rv)) { nsCAutoString leafName; mABFile->GetNativeLeafName(leafName); PRBool bExists=PR_FALSE; mPreviousABFile->Exists(&bExists); if(bExists) { nsCOMPtr<nsIFile> parent; rv = mABFile->GetParent(getter_AddRefs(parent)); if (NS_SUCCEEDED(rv)) { mABFile->Remove(PR_FALSE); mPreviousABFile->CopyToNative(parent, leafName); } } mDBOpen = PR_FALSE; } } } return rv; }
nsresult nsAbPalmHotSync::UpdateMozABWithPalmRecords() { if(!mInitialized || !mABDB || !mDBOpen) return NS_ERROR_NOT_INITIALIZED; nsresult rv = NS_OK; for(PRInt32 i=mPalmRecords.Count()-1; i >=0; i--) { nsABCOMCardStruct * palmRec = (nsABCOMCardStruct *)mPalmRecords.ElementAt(i); nsAbIPCCard ipcCard(palmRec, PR_FALSE); char recordIDBuf[128]; PRInt64 l; LL_UI2L(l, palmRec->dwRecordId); PRFloat64 f; LL_L2F(f, l); PR_cnvtf(recordIDBuf, 128, 0, f); // if the card already exists nsCOMPtr<nsIAbCard> existingCard; rv = mABDB->GetCardFromAttribute(nsnull, CARD_ATTRIB_PALMID, nsDependentCString(recordIDBuf), PR_FALSE, getter_AddRefs(existingCard)); if (!existingCard) { rv = mABDB->GetCardFromAttribute(nsnull, CARD_ATTRIB_DISPLAY, nsDependentCString((const char *) palmRec->displayName), PR_FALSE, getter_AddRefs(existingCard)); // if card with this display name exists, just continue; But, we should make sure // it's associated with the palm card going forward, so set the palmid. if (NS_SUCCEEDED(rv) && existingCard) { nsCOMPtr<nsIAbMDBCard> dbCard = do_QueryInterface(existingCard); dbCard->SetStringAttribute(CARD_ATTRIB_PALMID, NS_ConvertASCIItoUTF16(recordIDBuf).get()); continue; } } if(NS_SUCCEEDED(rv) && existingCard) { // Archived is the same as deleted in palm. if(palmRec->dwStatus & ATTR_DELETED || palmRec->dwStatus & ATTR_ARCHIVED) { mABDB->DeleteCard(existingCard, PR_FALSE, nsnull); continue; } if(palmRec->dwStatus & ATTR_NEW) continue; if(palmRec->dwStatus & ATTR_MODIFIED) { PRBool isEqual=PR_FALSE; ipcCard.Equals(existingCard, &isEqual); if(isEqual) continue; else { existingCard->Copy(&ipcCard); rv = mABDB->EditCard(existingCard, PR_FALSE, nsnull); continue; } } } nsCOMPtr<nsIAbMDBCard> dbCard; dbCard = do_CreateInstance(NS_ABMDBCARD_CONTRACTID, &rv); if(NS_FAILED(rv)) continue; nsCOMPtr<nsIAbCard> newCard; newCard = do_QueryInterface(dbCard, &rv); if(NS_FAILED(rv)) continue; rv = newCard->Copy(&ipcCard); if(NS_FAILED(rv)) continue; // if the card does not exist if((ipcCard.GetStatus() == ATTR_NEW) ||(ipcCard.GetStatus() == ATTR_MODIFIED) || (ipcCard.GetStatus() == ATTR_NONE)) { PRUint32 modTimeInSec; PRTime2Seconds(PR_Now(), &modTimeInSec); ipcCard.SetLastModifiedDate(modTimeInSec); rv = mABDB->CreateNewCardAndAddToDB(newCard, PR_FALSE, nsnull); if(NS_SUCCEEDED(rv)) { // now set the attribute for the PalmRecID in the card in the DB dbCard->SetAbDatabase(mABDB); dbCard->SetStringAttribute(CARD_ATTRIB_PALMID, NS_ConvertASCIItoUTF16(recordIDBuf).get()); newCard = do_QueryInterface(dbCard, &rv); if(NS_SUCCEEDED(rv)) rv = mABDB->EditCard(newCard, PR_FALSE, nsnull); } } } return rv; }
nsresult nsAbPalmHotSync::DoSyncAndGetUpdatedCards(PRInt32 aPalmCount, lpnsABCOMCardStruct aPalmRecords, PRInt32 * aMozCount, lpnsABCOMCardStruct * aMozCards) { NS_ENSURE_ARG_POINTER(aPalmRecords); NS_ENSURE_ARG_POINTER(aMozCount); NS_ENSURE_ARG_POINTER(aMozCards); if(!mInitialized) return NS_ERROR_NOT_INITIALIZED; // open the Moz AB database nsresult rv = OpenABDBForHotSync(PR_FALSE); if(NS_FAILED(rv)) return rv; // we are just storing the pointer array here, not record arrays for (PRInt32 i=0; i < aPalmCount; i++) { mPalmRecords.AppendElement(&aPalmRecords[i]); #ifdef DEBUG_bienvenu DisplayTestData(&aPalmRecords[i],PR_FALSE); #endif } // create the list to be sent back to Palm mABDB->GetCardCount(&mTotalCardCount); PRUint32 deletedCardCount=0; mABDB->GetDeletedCardCount(&deletedCardCount); mTotalCardCount += deletedCardCount; if(mTotalCardCount) { mCardListForPalm = (lpnsABCOMCardStruct) CoTaskMemAlloc(sizeof(nsABCOMCardStruct) * mTotalCardCount); if(!mCardListForPalm) { mABDB->Close(PR_FALSE); return NS_ERROR_OUT_OF_MEMORY; } } // initialize the flag for any new Moz cards to be added to Palm mIsNewCardForPalm = PR_FALSE; // deal with new / modified or first time sync rv = LoadNewModifiedCardsSinceLastSync(); if(NS_SUCCEEDED(rv)) // deal with deleted rv = LoadDeletedCardsSinceLastSync(); if(NS_SUCCEEDED(rv)) // first backup the existing DB as Previous rv = KeepCurrentStateAsPrevious(); if(NS_SUCCEEDED(rv)) // update local DB for sync rv = UpdateMozABWithPalmRecords(); // if there are no new cards to be added in Palm close DB // else wait for Done to be called. if(!mIsNewCardForPalm) { rv = mABDB->Close(NS_SUCCEEDED(rv) && mPalmRecords.Count()); if(NS_SUCCEEDED(rv)) { mDBOpen = PR_FALSE; PRUint32 modTimeInSec; PRTime2Seconds(PR_Now(), &modTimeInSec); rv = UpdateABInfo(modTimeInSec, mPalmCategoryIndex); } else { // get back the previous file rv = mABDB->ForceClosed(); if(NS_SUCCEEDED(rv)) { nsCAutoString leafName; mABFile->GetNativeLeafName(leafName); PRBool bExists=PR_FALSE; mPreviousABFile->Exists(&bExists); if(bExists) { nsCOMPtr<nsIFile> parent; rv = mABFile->GetParent(getter_AddRefs(parent)); if (NS_SUCCEEDED(rv)) { mABFile->Remove(PR_FALSE); mPreviousABFile->CopyToNative(parent, leafName); } } mDBOpen = PR_FALSE; } } } *aMozCount = mCardForPalmCount; *aMozCards = mCardListForPalm; return rv; }
nsresult nsAbPalmHotSync::AddAllRecordsToAB(PRBool existingAB, PRInt32 aCount, lpnsABCOMCardStruct aPalmRecords) { NS_ENSURE_ARG_POINTER(aPalmRecords); nsresult rv; // Create the new AB dir before adding cards/records. if (existingAB) { rv = Initialize(); NS_ENSURE_SUCCESS(rv, rv); rv = OpenABDBForHotSync(PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); // lets try deleting the db out from under ourselves. nsCOMPtr<nsIFile> abFile; rv = mABDB->GetDbPath(getter_AddRefs(abFile)); NS_ENSURE_SUCCESS(rv, rv); mABDB->ForceClosed(); mDBOpen = PR_FALSE; mABDB = nsnull; abFile->Remove(PR_FALSE); } else { nsresult rv = NewAB(mAbName); NS_ENSURE_SUCCESS(rv, rv); rv = Initialize(); // Find the new AB and and init some vars (set mDirectory etc). NS_ENSURE_SUCCESS(rv, rv); } // open the Moz AB database rv = OpenABDBForHotSync(PR_TRUE); NS_ENSURE_SUCCESS(rv, rv); // we are just storing the pointer array here not record arrays for (PRInt32 i=0; i < aCount; i++) mPalmRecords.AppendElement(&aPalmRecords[i]); // new DB here so no need to backup rv = UpdateMozABWithPalmRecords(); rv = mABDB->Close(NS_SUCCEEDED(rv)); if(NS_SUCCEEDED(rv)) { mDBOpen = PR_FALSE; PRUint32 modTimeInSec; PRTime2Seconds(PR_Now(), &modTimeInSec); rv = UpdateABInfo(modTimeInSec, mPalmCategoryIndex); } else { // get back the previous file rv = mABDB->ForceClosed(); if(NS_SUCCEEDED(rv)) { nsCAutoString leafName; mABFile->GetNativeLeafName(leafName); PRBool bExists=PR_FALSE; mPreviousABFile->Exists(&bExists); if(bExists) { nsCOMPtr<nsIFile> parent; rv = mABFile->GetParent(getter_AddRefs(parent)); if (NS_SUCCEEDED(rv)) { mABFile->Remove(PR_FALSE); mPreviousABFile->CopyToNative(parent, leafName); } } mDBOpen = PR_FALSE; } } return rv; }