NS_IMETHODIMP ImportAddressImpl::ImportAddressBook(nsIImportABDescriptor *pSource, nsIAddrDatabase *pDestination, nsIImportFieldMap *fieldMap, nsISupports *aSupportService, PRUnichar ** pErrorLog, PRUnichar ** pSuccessLog, bool * fatalError) { NS_PRECONDITION(pSource != nsnull, "null ptr"); NS_PRECONDITION(pDestination != nsnull, "null ptr"); NS_PRECONDITION(fatalError != nsnull, "null ptr"); m_bytesImported = 0; nsString success, error; if (!pSource || !pDestination || !fatalError) { IMPORT_LOG0("*** Bad param passed to text address import\n"); nsImportStringBundle::GetStringByID(TEXTIMPORT_ADDRESS_BADPARAM, m_notProxyBundle, error); SetLogs(success, error, pErrorLog, pSuccessLog); if (fatalError) *fatalError = true; return NS_ERROR_NULL_POINTER; } ClearSampleFile(); bool addrAbort = false; nsString name; pSource->GetPreferredName(name); PRUint32 addressSize = 0; pSource->GetSize(&addressSize); if (addressSize == 0) { IMPORT_LOG0("Address book size is 0, skipping import.\n"); ReportSuccess(name, &success, m_notProxyBundle); SetLogs(success, error, pErrorLog, pSuccessLog); return NS_OK; } nsCOMPtr<nsIFile> inFile; if (NS_FAILED(pSource->GetAbFile(getter_AddRefs(inFile)))) { ReportError(TEXTIMPORT_ADDRESS_BADSOURCEFILE, name, &error, m_notProxyBundle); SetLogs(success, error, pErrorLog, pSuccessLog); return NS_ERROR_FAILURE; } if (!aSupportService) { IMPORT_LOG0("Missing support service to import call"); return NS_ERROR_FAILURE; } bool isLDIF = false; nsresult rv; nsCOMPtr<nsIAbLDIFService> ldifService(do_QueryInterface(aSupportService, &rv)); if (NS_SUCCEEDED(rv)) { rv = ldifService->IsLDIFFile(inFile, &isLDIF); if (NS_FAILED(rv)) { IMPORT_LOG0("*** Error reading address file\n"); } } if (NS_FAILED(rv)) { ReportError(TEXTIMPORT_ADDRESS_CONVERTERROR, name, &error, m_notProxyBundle); SetLogs(success, error, pErrorLog, pSuccessLog); return rv; } if (isLDIF) { if (ldifService) rv = ldifService->ImportLDIFFile(pDestination, inFile, false, &m_bytesImported); else return NS_ERROR_FAILURE; } else { rv = m_text.ImportAddresses(&addrAbort, name.get(), inFile, pDestination, fieldMap, error, &m_bytesImported); SaveFieldMap(fieldMap); } if (NS_SUCCEEDED(rv) && error.IsEmpty()) { ReportSuccess(name, &success, m_notProxyBundle); SetLogs(success, error, pErrorLog, pSuccessLog); } else { ReportError(TEXTIMPORT_ADDRESS_CONVERTERROR, name, &error, m_notProxyBundle); SetLogs(success, error, pErrorLog, pSuccessLog); } IMPORT_LOG0("*** Text address import done\n"); return rv; }
NS_IMETHODIMP nsImportGenericAddressBooks::BeginImport(nsISupportsString *successLog, nsISupportsString *errorLog, PRBool isAddrLocHome, PRBool *_retval) { NS_PRECONDITION(_retval != nsnull, "null ptr"); if (!_retval) return NS_ERROR_NULL_POINTER; nsString success; nsString error; if (!m_doImport) { *_retval = PR_TRUE; nsImportStringBundle::GetStringByID(IMPORT_NO_ADDRBOOKS, m_stringBundle, success); SetLogs( success, error, successLog, errorLog); return( NS_OK); } if (!m_pInterface || !m_pBooks) { nsImportStringBundle::GetStringByID(IMPORT_ERROR_AB_NOTINITIALIZED, m_stringBundle, error); SetLogs( success, error, successLog, errorLog); *_retval = PR_FALSE; return( NS_OK); } PRBool needsFieldMap = PR_FALSE; if (NS_FAILED(m_pInterface->GetNeedsFieldMap(m_pLocation, &needsFieldMap)) || (needsFieldMap && !m_pFieldMap)) { nsImportStringBundle::GetStringByID(IMPORT_ERROR_AB_NOTINITIALIZED, m_stringBundle, error); SetLogs(success, error, successLog, errorLog); *_retval = PR_FALSE; return NS_OK; } if (m_pThreadData) { m_pThreadData->DriverAbort(); m_pThreadData = nsnull; } NS_IF_RELEASE( m_pSuccessLog); NS_IF_RELEASE( m_pErrorLog); m_pSuccessLog = successLog; m_pErrorLog = errorLog; NS_IF_ADDREF( m_pSuccessLog); NS_IF_ADDREF( m_pErrorLog); // kick off the thread to do the import!!!! m_pThreadData = new AddressThreadData(); m_pThreadData->books = m_pBooks; NS_ADDREF( m_pBooks); m_pThreadData->addressImport = m_pInterface; NS_ADDREF( m_pInterface); m_pThreadData->fieldMap = m_pFieldMap; NS_IF_ADDREF( m_pFieldMap); m_pThreadData->errorLog = m_pErrorLog; NS_IF_ADDREF( m_pErrorLog); m_pThreadData->successLog = m_pSuccessLog; NS_IF_ADDREF( m_pSuccessLog); if (m_pDestinationUri) m_pThreadData->pDestinationUri = strdup( m_pDestinationUri); m_pThreadData->bAddrLocInput = isAddrLocHome ; NS_IF_ADDREF(m_pThreadData->stringBundle = m_stringBundle); nsresult rv; nsCOMPtr<nsIAbLDIFService> ldifService(do_GetService(NS_ABLDIFSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIProxyObjectManager> proxyObjectManager = do_GetService(NS_XPCOMPROXY_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIAbLDIFService> proxyLDIFService; rv = proxyObjectManager->GetProxyForObject(NS_PROXY_TO_CURRENT_THREAD, NS_GET_IID(nsIAbLDIFService), ldifService, NS_PROXY_SYNC | NS_PROXY_ALWAYS, getter_AddRefs(proxyLDIFService)); NS_ENSURE_SUCCESS(rv, rv); NS_IF_ADDREF(m_pThreadData->ldifService = proxyLDIFService); PRThread *pThread = PR_CreateThread( PR_USER_THREAD, &ImportAddressThread, m_pThreadData, PR_PRIORITY_NORMAL, PR_LOCAL_THREAD, PR_UNJOINABLE_THREAD, 0); if (!pThread) { m_pThreadData->ThreadDelete(); m_pThreadData->DriverDelete(); m_pThreadData = nsnull; *_retval = PR_FALSE; nsImportStringBundle::GetStringByID(IMPORT_ERROR_AB_NOTHREAD, m_stringBundle, error); SetLogs( success, error, successLog, errorLog); } else *_retval = PR_TRUE; return( NS_OK); }