import com.evernote.edam.notestore.SyncChunk;\r
import com.evernote.edam.notestore.SyncState;\r
import com.evernote.edam.type.Data;\r
+import com.evernote.edam.type.LinkedNotebook;\r
import com.evernote.edam.type.Note;\r
import com.evernote.edam.type.Notebook;\r
import com.evernote.edam.type.Resource;\r
import com.evernote.edam.type.SavedSearch;\r
+import com.evernote.edam.type.SharedNotebook;\r
import com.evernote.edam.type.Tag;\r
import com.evernote.edam.type.User;\r
import com.evernote.edam.userstore.AuthenticationResult;\r
private final ApplicationLogger logger;\r
private DatabaseConnection conn;\r
private boolean idle;\r
- private boolean error;\r
+ public boolean error;\r
public volatile boolean isConnected;\r
public volatile boolean keepRunning;\r
public volatile String authToken;\r
if (isConnected && keepRunning) {\r
error = false;\r
logger.log(logger.EXTREME, "Synchronizing with Evernote");\r
- status.message.emit("Synchronizing with Evernote");\r
+ status.message.emit(tr("Synchronizing with Evernote"));\r
\r
// Get user information\r
try {\r
syncSignal.saveUserInformation.emit(user);\r
} catch (EDAMUserException e1) {\r
e1.printStackTrace();\r
- status.message.emit("User exception getting user account information. Aborting sync and disconnecting");\r
+ status.message.emit(tr("User exception getting user account information. Aborting sync and disconnecting"));\r
syncSignal.errorDisconnect.emit();\r
enDisconnect();\r
return;\r
} catch (EDAMSystemException e1) {\r
e1.printStackTrace();\r
- status.message.emit("System error user account information. Aborting sync and disconnecting!");\r
+ status.message.emit(tr("System error user account information. Aborting sync and disconnecting!"));\r
syncSignal.errorDisconnect.emit();\r
enDisconnect();\r
return;\r
} catch (TException e1) {\r
e1.printStackTrace();\r
syncSignal.errorDisconnect.emit();\r
- status.message.emit("Transaction error getting user account information. Aborting sync and disconnecting!");\r
+ status.message.emit(tr("Transaction error getting user account information. Aborting sync and disconnecting!"));\r
enDisconnect();\r
return;\r
}\r
evernoteUpdateCount = syncState.getUpdateCount();\r
} catch (EDAMUserException e) {\r
e.printStackTrace();\r
- status.message.emit("Error getting sync state! Aborting sync and disconnecting!");\r
+ status.message.emit(tr("Error getting sync state! Aborting sync and disconnecting!"));\r
syncSignal.errorDisconnect.emit();\r
enDisconnect();\r
return;\r
} catch (EDAMSystemException e) {\r
e.printStackTrace();\r
- status.message.emit("Error getting sync state! Aborting sync and disconnecting!");\r
+ status.message.emit(tr("Error getting sync state! Aborting sync and disconnecting!"));\r
syncSignal.errorDisconnect.emit();\r
enDisconnect();\r
return;\r
} catch (TException e) {\r
e.printStackTrace();\r
- status.message.emit("Error getting sync state! Aborting sync and disconnecting!");\r
+ status.message.emit(tr("Error getting sync state! Aborting sync and disconnecting!"));\r
syncSignal.errorDisconnect.emit();\r
enDisconnect();\r
return;\r
\r
if (syncState == null) {\r
logger.log(logger.EXTREME, "Sync State is null");\r
- status.message.emit("Syncronization Error!");\r
+ status.message.emit(tr("Syncronization Error!"));\r
return;\r
}\r
\r
updateSequenceNumber = 0;\r
conn.getSyncTable().setUpdateSequenceNumber(0);\r
}\r
-\r
+ // Check for "special" sync instructions\r
+ String syncLinked = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
+ String syncShared = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
+ if (syncLinked != null) {\r
+ downloadAllLinkedNotebooks();\r
+ }\r
+ if (syncShared != null) {\r
+ downloadAllSharedNotebooks();\r
+ }\r
+ \r
// If there are remote changes\r
logger.log(logger.LOW, "Update Count: " +syncState.getUpdateCount());\r
logger.log(logger.LOW, "Last Update Count: " +updateSequenceNumber);\r
syncSignal.refreshLists.emit();\r
if (!error) {\r
logger.log(logger.EXTREME, "Sync completed. Errors=" +error);\r
- if (!disableUploads)\r
- status.message.emit("Synchronizing complete");\r
+ if (!disableUploads) \r
+ status.message.emit(tr("Synchronizing complete"));\r
else\r
- status.message.emit("Download syncronization complete. Uploads have been disabled.");\r
+ status.message.emit(tr("Download syncronization complete. Uploads have been disabled."));\r
\r
logger.log(logger.EXTREME, "Saving sync time");\r
if (syncState.getCurrentTime() > sequenceDate)\r
\r
List<DeletedItemRecord> expunged = conn.getDeletedTable().getAllDeleted();\r
boolean error = false;\r
- for (int i=0; i<expunged.size(); i++) {\r
+ for (int i=0; i<expunged.size() && keepRunning; i++) {\r
\r
if (authRefreshNeeded)\r
refreshConnection();\r
if (syncDeletedContent)\r
return;\r
logger.log(logger.HIGH, "Entering SyncRunner.syncDeletedNotes");\r
- status.message.emit("Synchronizing deleted notes.");\r
+ status.message.emit(tr("Synchronizing deleted notes."));\r
\r
List<Note> notes = conn.getNoteTable().getDirty();\r
// Sync the local notebooks with Evernote's\r
//error = true;\r
} catch (EDAMSystemException e) {\r
logger.log(logger.LOW, "*** EDAM System Excepton syncLocalNotes "+e);\r
- status.message.emit("Error: " +e);\r
+ status.message.emit(tr("Error: ") +e);\r
logger.log(logger.LOW, e.toString()); \r
error = true;\r
} catch (EDAMNotFoundException e) {\r
//error = true;\r
} catch (TException e) {\r
logger.log(logger.LOW, "*** EDAM TExcepton syncLocalNotes "+e);\r
- status.message.emit("Error sending local note: " +e);\r
+ status.message.emit(tr("Error sending local note: ") +e);\r
logger.log(logger.LOW, e.toString()); \r
error = true;\r
} \r
// Sync notes with Evernote\r
private void syncLocalNotes() {\r
logger.log(logger.HIGH, "Entering SyncRunner.syncNotes");\r
- status.message.emit("Sending local notes.");\r
+ status.message.emit(tr("Sending local notes."));\r
\r
List<Note> notes = conn.getNoteTable().getDirty();\r
// Sync the local notebooks with Evernote's\r
logger.log(logger.EXTREME, "Active dirty note found - non new");\r
if (enNote.getUpdateSequenceNum() > 0) {\r
enNote = getNoteContent(enNote);\r
- System.out.println("--------");\r
- System.out.println("Note:" +enNote);\r
- System.out.println("--------");\r
logger.log(logger.MEDIUM, "Updating note : "+ enNote.getGuid() +" <title>" +enNote.getTitle()+"</title>");\r
enNote = noteStore.updateNote(authToken, enNote);\r
} else { \r
\r
} catch (EDAMUserException e) {\r
logger.log(logger.LOW, "*** EDAM User Excepton syncLocalNotes "+e);\r
- status.message.emit("Error sending local note: " +e.getParameter());\r
+ status.message.emit(tr("Error sending local note: ") +e.getParameter());\r
logger.log(logger.LOW, e.toString()); \r
error = true;\r
} catch (EDAMSystemException e) {\r
logger.log(logger.LOW, "*** EDAM System Excepton syncLocalNotes "+e);\r
- status.message.emit("Error: " +e);\r
+ status.message.emit(tr("Error: ") +e);\r
logger.log(logger.LOW, e.toString()); \r
error = true;\r
} catch (EDAMNotFoundException e) {\r
logger.log(logger.LOW, "*** EDAM Not Found Excepton syncLocalNotes " +e);\r
- status.message.emit("Error sending local note: " +e);\r
+ status.message.emit(tr("Error sending local note: ") +e);\r
logger.log(logger.LOW, e.toString()); \r
error = true;\r
} catch (TException e) {\r
logger.log(logger.LOW, "*** EDAM TExcepton syncLocalNotes "+e);\r
- status.message.emit("Error sending local note: " +e);\r
+ status.message.emit(tr("Error sending local note: ") +e);\r
logger.log(logger.LOW, e.toString()); \r
error = true;\r
}\r
private void syncLocalNotebooks() {\r
logger.log(logger.HIGH, "Entering SyncRunner.syncLocalNotebooks");\r
\r
- status.message.emit("Sending local notebooks.");\r
+ status.message.emit(tr("Sending local notebooks."));\r
List<Notebook> remoteList = new ArrayList<Notebook>();\r
try {\r
logger.log(logger.EXTREME, "Getting remote notebooks to compare with local");\r
remoteList = noteStore.listNotebooks(authToken);\r
} catch (EDAMUserException e1) {\r
logger.log(logger.LOW, "*** EDAM User Excepton syncLocalNotebooks getting remote Notebook List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} catch (EDAMSystemException e1) {\r
logger.log(logger.LOW, "*** EDAM System Excepton syncLocalNotebooks getting remote Notebook List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} catch (TException e1) {\r
logger.log(logger.LOW, "*** EDAM Transaction Excepton syncLocalNotebooks getting remote Notebook List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
}\r
private void syncLocalTags() {\r
logger.log(logger.HIGH, "Entering SyncRunner.syncLocalTags");\r
List<Tag> remoteList = new ArrayList<Tag>();\r
- status.message.emit("Sending local tags.");\r
+ status.message.emit(tr("Sending local tags."));\r
\r
try {\r
logger.log(logger.EXTREME, "Getting remote tags to compare names with the local tags");\r
remoteList = noteStore.listTags(authToken);\r
} catch (EDAMUserException e1) {\r
logger.log(logger.LOW, "*** EDAM User Excepton syncLocalTags getting remote Tag List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} catch (EDAMSystemException e1) {\r
logger.log(logger.LOW, "*** EDAM System Excepton syncLocalTags getting remote Tag List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} catch (TException e1) {\r
logger.log(logger.LOW, "*** EDAM Transaction Excepton syncLocalTags getting remote Tag List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} \r
private void syncLocalSavedSearches() {\r
logger.log(logger.HIGH, "Entering SyncRunner.syncLocalSavedSearches");\r
List<SavedSearch> remoteList = new ArrayList<SavedSearch>();\r
- status.message.emit("Sending saved searches.");\r
+ status.message.emit(tr("Sending saved searches."));\r
\r
logger.log(logger.EXTREME, "Getting saved searches to compare with local");\r
try {\r
remoteList = noteStore.listSearches(authToken);\r
} catch (EDAMUserException e1) {\r
logger.log(logger.LOW, "*** EDAM User Excepton syncLocalTags getting remote saved search List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} catch (EDAMSystemException e1) {\r
logger.log(logger.LOW, "*** EDAM System Excepton syncLocalTags getting remote saved search List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} catch (TException e1) {\r
logger.log(logger.LOW, "*** EDAM Transaction Excepton syncLocalTags getting remote saved search List");\r
- status.message.emit("Error: " +e1);\r
+ status.message.emit(tr("Error: ") +e1);\r
logger.log(logger.LOW, e1.toString()); \r
error = true;\r
} \r
if (updateSequenceNumber == 0)\r
fullSync = true;\r
\r
- status.message.emit("Downloading 0% complete.");\r
+ status.message.emit(tr("Downloading 0% complete."));\r
\r
while(more && keepRunning) {\r
\r
// Do the local deletes\r
logger.log(logger.EXTREME, "Doing local deletes");\r
List<String> guid = chunk.getExpungedNotes();\r
- if (guid != null) \r
+ if (guid != null) {\r
for (int i=0; i<guid.size() && keepRunning; i++) {\r
- logger.log(logger.EXTREME, "Expunging local note from database");\r
- conn.getNoteTable().expungeNote(guid.get(i), true, false);\r
+ String notebookGuid = "";\r
+ Note localNote = conn.getNoteTable().getNote(guid.get(i), false, false, false, false, false);\r
+ if (localNote != null) {\r
+ conn.getNoteTable().updateNoteSequence(guid.get(i), 0);\r
+ notebookGuid = localNote.getNotebookGuid();\r
+ }\r
+ if (!conn.getNotebookTable().isNotebookLocal(notebookGuid)) {\r
+ logger.log(logger.EXTREME, "Expunging local note from database");\r
+ conn.getNoteTable().expungeNote(guid.get(i), true, false);\r
+ }\r
}\r
+ }\r
guid = chunk.getExpungedNotebooks();\r
if (guid != null)\r
for (int i=0; i<guid.size() && keepRunning; i++) {\r
long pct = chunk.getChunkHighUSN() * 100;\r
conn.getSyncTable().setLastSequenceDate(chunk.getCurrentTime());\r
pct = pct/evernoteUpdateCount;\r
- status.message.emit("Downloading " +new Long(pct).toString()+"% complete.");\r
+ status.message.emit(tr("Downloading ") +new Long(pct).toString()+tr("% complete."));\r
}\r
}\r
\r
logger.log(logger.EXTREME, "Saving Note");\r
conn.getNoteTable().syncNote(n, false);\r
noteSignal.noteChanged.emit(n.getGuid(), null); // Signal to ivalidate note cache\r
+ noteSignal.noteDownloaded.emit(n, true); // Signal to add note to index\r
logger.log(logger.EXTREME, "Note Saved");\r
if (fullSync && n.getResources() != null) {\r
for (int q=0; q<n.getResources().size() && keepRunning; q++) {\r
// syncSignal.authRefreshComplete.emit(false);\r
// }\r
}\r
- \r
+ \r
public synchronized boolean addWork(String request) {\r
if (workQueue.offer(request))\r
return true;\r
n.setContent(conn.getNoteTable().getNoteContentBinary(n.getGuid()));\r
return n;\r
}\r
+\r
+\r
+\r
+ //*********************************************************\r
+ //* Special download instructions. Used for DB upgrades\r
+ //*********************************************************\r
+ private void downloadAllSharedNotebooks() {\r
+ try {\r
+ List<SharedNotebook> books = noteStore.listSharedNotebooks(authToken);\r
+ logger.log(logger.LOW, "Shared notebooks found = " +books.size());\r
+ for (int i=0; i<books.size(); i++) {\r
+ conn.getSharedNotebookTable().updateNotebook(books.get(i), false);\r
+ }\r
+ conn.getSyncTable().deleteRecord("FullSharedNotebookSync");\r
+ } catch (EDAMUserException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("User exception Listing shared notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ return;\r
+ } catch (EDAMSystemException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("System exception Listing shared notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ return;\r
+ } catch (TException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("Transaction exception Listing shared notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ return;\r
+ } catch (EDAMNotFoundException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("EDAM Not Found exception Listing shared notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ }\r
+ }\r
+ private void downloadAllLinkedNotebooks() {\r
+ try {\r
+ List<LinkedNotebook> books = noteStore.listLinkedNotebooks(authToken);\r
+ logger.log(logger.LOW, "Linked notebooks found = " +books.size());\r
+ for (int i=0; i<books.size(); i++) {\r
+ conn.getLinkedNotebookTable().updateNotebook(books.get(i), false);\r
+ }\r
+ conn.getSyncTable().deleteRecord("FullLinkedNotebookSync");\r
+ } catch (EDAMUserException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("User exception Listing linked notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ return;\r
+ } catch (EDAMSystemException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("System exception Listing linked notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ return;\r
+ } catch (TException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("Transaction exception Listing lineked notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ return;\r
+ } catch (EDAMNotFoundException e1) {\r
+ e1.printStackTrace();\r
+ status.message.emit(tr("EDAM Not Found exception Listing linked notebooks."));\r
+ logger.log(logger.LOW, e1.getMessage());\r
+ }\r
+ }\r
}\r