OSDN Git Service

Cleanup shared notebook logic and add shortcut to jump to the search box.
authorRandy Baumgarte <randy@fbn.cx>
Sat, 5 Mar 2011 22:33:13 +0000 (17:33 -0500)
committerRandy Baumgarte <randy@fbn.cx>
Sun, 3 Apr 2011 18:01:58 +0000 (14:01 -0400)
shortcuts_sample.txt
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/dialog/ShareNotebook.java
src/cx/fbn/nevernote/sql/NoteResourceTable.java
src/cx/fbn/nevernote/threads/SyncRunner.java
src/cx/fbn/nevernote/xml/NoteFormatter.java

index 202aa1c..08ed61d 100644 (file)
@@ -96,3 +96,4 @@ Focus_Tag                                     // Focus on the tag line
 Focus_Note                                     // Focus on the note itself
 Focus_Author                                   // Focus on the author field
 Focus_Url                                      // Focus on the source URL field
+Focus_Search                                   // Focus on the search field
index 7374b88..3f4a0d7 100644 (file)
@@ -106,6 +106,7 @@ import com.trolltech.qt.gui.QGridLayout;
 import com.trolltech.qt.gui.QHBoxLayout;
 import com.trolltech.qt.gui.QIcon;
 import com.trolltech.qt.gui.QImage;
+import com.trolltech.qt.gui.QKeySequence;
 import com.trolltech.qt.gui.QLabel;
 import com.trolltech.qt.gui.QMainWindow;
 import com.trolltech.qt.gui.QMenu;
@@ -116,6 +117,7 @@ import com.trolltech.qt.gui.QPalette.ColorRole;
 import com.trolltech.qt.gui.QPixmap;
 import com.trolltech.qt.gui.QPrintDialog;
 import com.trolltech.qt.gui.QPrinter;
+import com.trolltech.qt.gui.QShortcut;
 import com.trolltech.qt.gui.QSizePolicy;
 import com.trolltech.qt.gui.QSizePolicy.Policy;
 import com.trolltech.qt.gui.QSpinBox;
@@ -212,6 +214,7 @@ public class NeverNote extends QMainWindow{
     public BrowserWindow       browserWindow;                          // Window containing browser & labels
     public QToolBar            toolBar;                                        // The tool bar under the menu
     QComboBox                          searchField;                            // search filter bar on the toolbar;
+    QShortcut                          searchShortcut;                         // Shortcut to search bar
     boolean                                    searchPerformed = false;        // Search was done?
     QuotaProgressBar           quotaBar;                                       // The current quota usage
     
@@ -514,6 +517,9 @@ public class NeverNote extends QMainWindow{
        searchField.activatedIndex.connect(this, "searchFieldChanged()");
        searchField.setDuplicatesEnabled(false);
        searchField.editTextChanged.connect(this,"searchFieldTextChanged(String)");
+       searchShortcut = new QShortcut(this);
+       setupShortcut(searchShortcut, "Focus_Search");
+       searchShortcut.activated.connect(this, "focusSearch()");
         
        quotaBar = new QuotaProgressBar();
        
@@ -1106,6 +1112,15 @@ public class NeverNote extends QMainWindow{
            browser.resourceSignal.contentChanged.connect(this, "externalFileEdited(String)");
        }
 
+       //**************************************************
+       //* Setup shortcuts
+       //**************************************************
+       private void setupShortcut(QShortcut action, String text) {
+               if (!Global.shortcutKeys.containsAction(text))
+                       return;
+               action.setKey(new QKeySequence(Global.shortcutKeys.getShortcut(text)));
+       }
+       
        //***************************************************************
        //***************************************************************
        //* Settings and look & feel
@@ -2624,7 +2639,12 @@ public class NeverNote extends QMainWindow{
     //***************************************************************
     //** These functions deal with the Toolbar
     //***************************************************************
-    //***************************************************************  
+    //*************************************************************** 
+       @SuppressWarnings("unused")
+       private void focusSearch() {
+               searchField.setFocus();
+       }
+
        // Text in the search bar has been cleared
        private void searchFieldCleared() {
                saveNote();
@@ -4170,7 +4190,8 @@ public class NeverNote extends QMainWindow{
                menuBar.noteTags.setEnabled(!readOnly);
                browser.setNote(currentNote);
                
-               if (conn.getNotebookTable().isLinked(currentNote.getNotebookGuid())) {
+               if (currentNote != null && currentNote.getNotebookGuid() != null && 
+                               conn.getNotebookTable().isLinked(currentNote.getNotebookGuid())) {
                        deleteButton.setEnabled(false);
                        menuBar.notebookDeleteAction.setEnabled(false);
                } else {
@@ -4868,10 +4889,10 @@ public class NeverNote extends QMainWindow{
        versions = null;
        try {
                if (Global.isPremium())
-                       versions = syncRunner.noteStore.listNoteVersions(syncRunner.authToken, currentNoteGuid);
+                       versions = syncRunner.localNoteStore.listNoteVersions(syncRunner.authToken, currentNoteGuid);
                else
                        versions = new ArrayList<NoteVersionId>();
-               currentOnlineNote = syncRunner.noteStore.getNote(syncRunner.authToken, currentNoteGuid, true, true, false, false);
+               currentOnlineNote = syncRunner.localNoteStore.getNote(syncRunner.authToken, currentNoteGuid, true, true, false, false);
                } catch (EDAMUserException e) {
                        setMessage("EDAMUserException: " +e.getMessage());
                        return;
@@ -4926,9 +4947,9 @@ public class NeverNote extends QMainWindow{
                        try {
                                if (index > -1) {
                                        usn = versions.get(index).getUpdateSequenceNum();
-                                       historyNote = syncRunner.noteStore.getNoteVersion(syncRunner.authToken, currentNoteGuid, usn, true, true, true);
+                                       historyNote = syncRunner.localNoteStore.getNoteVersion(syncRunner.authToken, currentNoteGuid, usn, true, true, true);
                                } else
-                                       historyNote = syncRunner.noteStore.getNote(syncRunner.authToken, currentNoteGuid, true,true,true,true);
+                                       historyNote = syncRunner.localNoteStore.getNote(syncRunner.authToken, currentNoteGuid, true,true,true,true);
                        } catch (EDAMUserException e) {
                                setMessage("EDAMUserException: " +e.getMessage());
                                waitCursor(false);
@@ -4989,9 +5010,9 @@ public class NeverNote extends QMainWindow{
        List<Tag> tags = null;
        List<LinkedNotebook> linkedNotebooks = null;
        try {
-                       notebooks = syncRunner.noteStore.listNotebooks(syncRunner.authToken);
-                       tags = syncRunner.noteStore.listTags(syncRunner.authToken);
-                       linkedNotebooks = syncRunner.noteStore.listLinkedNotebooks(syncRunner.authToken);
+                       notebooks = syncRunner.localNoteStore.listNotebooks(syncRunner.authToken);
+                       tags = syncRunner.localNoteStore.listTags(syncRunner.authToken);
+                       linkedNotebooks = syncRunner.localNoteStore.listLinkedNotebooks(syncRunner.authToken);
                } catch (EDAMUserException e) {
                        setMessage("EDAMUserException: " +e.getMessage());
                        return;
index 8f3eace..18cb51a 100644 (file)
@@ -219,7 +219,7 @@ public class ShareNotebook extends QDialog {
                \r
                if (ids.size() > 0) {\r
                        try {\r
-                               syncRunner.noteStore.expungeSharedNotebooks(syncRunner.authToken, ids);\r
+                               syncRunner.localNoteStore.expungeSharedNotebooks(syncRunner.authToken, ids);\r
                        } catch (EDAMUserException e) {\r
                                e.printStackTrace();\r
                        } catch (EDAMNotFoundException e) {\r
index 9c612e4..6c32981 100644 (file)
@@ -82,6 +82,8 @@ public class NoteResourceTable  {
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
                        logger.log(logger.EXTREME, "Error resetting noteresource dirty field. " +query.lastError());\r
+               else\r
+                       query.exec("commit");\r
        }\r
        // Set if the resource should be indexed\r
        public void  setIndexNeeded(String guid, Boolean indexNeeded) {\r
@@ -91,6 +93,8 @@ public class NoteResourceTable  {
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
                        logger.log(logger.EXTREME, "Error setting noteresource indexneeded field: " +query.lastError());\r
+               else\r
+                       query.exec("commit");\r
        }\r
        // get any unindexed resource\r
        public List<String> getNextUnindexed(int limit) {\r
@@ -228,7 +232,8 @@ public class NoteResourceTable  {
                        if (!check) {\r
                                logger.log(logger.MEDIUM, "*** NoteResource Table insert failed.");             \r
                                logger.log(logger.MEDIUM, query.lastError());\r
-                       }\r
+                       } else\r
+                               query.exec("commit");\r
                        \r
                                                \r
                        logger.log(logger.HIGH, "Leaving DBRunner.saveNoteResources");\r
@@ -239,10 +244,13 @@ public class NoteResourceTable  {
                query.prepare("delete from NoteResources where guid=:guid");\r
                query.bindValue(":guid", guid);\r
                query.exec();\r
-\r
-               query.prepare("delete from InkImages where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               query.exec();\r
+               query.exec("commit");\r
+               \r
+               NSqlQuery query2 = new NSqlQuery(db.getConnection());\r
+               query2.prepare("Delete from InkImages where guid=:guid");\r
+               query2.bindValue(":guid", guid);\r
+               query2.exec();\r
+               query2.exec("commit");\r
 \r
        }\r
 \r
@@ -521,12 +529,8 @@ public class NoteResourceTable  {
        // Save Note Resource\r
        public void updateNoteResource(Resource r, boolean isDirty) {\r
                logger.log(logger.HIGH, "Entering ListManager.updateNoteResource");\r
-               NSqlQuery query = new NSqlQuery(db.getResourceConnection());\r
-               query.prepare("delete from NoteResources where guid=:recGuid");\r
-               query.bindValue(":recGuid", r.getGuid());\r
-               query.exec();\r
+               expungeNoteResource(r.getGuid());\r
                saveNoteResource(r, isDirty);\r
-               query = null;\r
                logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResource");\r
        }\r
        // Update note resource GUID\r
@@ -538,6 +542,7 @@ public class NoteResourceTable  {
                query.bindValue(":isDirty", isDirty);\r
                query.bindValue(":oldGuid", oldGuid);\r
                query.exec();\r
+               query.exec("commit");\r
                logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResourceGuid");\r
        }\r
        // Update note resource GUID\r
@@ -548,6 +553,7 @@ public class NoteResourceTable  {
                query.bindValue(":isDirty", isDirty);\r
                query.bindValue(":guid", guid);\r
                query.exec();\r
+               query.exec("commit");\r
                logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResourceGuid");\r
        }\r
        \r
@@ -555,6 +561,7 @@ public class NoteResourceTable  {
        public void reindexAll() {              \r
                NSqlQuery query = new NSqlQuery(db.getResourceConnection());\r
                query.exec("Update NoteResources set indexneeded=true");\r
+               query.exec("commit");\r
        }\r
        // Count attachments\r
        public int getResourceCount() {\r
index a53afd4..d24aa23 100644 (file)
@@ -54,6 +54,7 @@ import com.evernote.edam.error.EDAMNotFoundException;
 import com.evernote.edam.error.EDAMSystemException;\r
 import com.evernote.edam.error.EDAMUserException;\r
 import com.evernote.edam.notestore.NoteStore;\r
+import com.evernote.edam.notestore.NoteStore.Client;\r
 import com.evernote.edam.notestore.SyncChunk;\r
 import com.evernote.edam.notestore.SyncState;\r
 import com.evernote.edam.type.Data;\r
@@ -99,7 +100,7 @@ public class SyncRunner extends QObject implements Runnable {
                                                                +"/"+System.getProperty("java.vendor") + "/"\r
                                                                + System.getProperty("java.version") +";";\r
                \r
-               public volatile NoteStore.Client                noteStore;\r
+               public volatile NoteStore.Client                localNoteStore;\r
                private UserStore.Client                                userStore;\r
                \r
                public volatile StatusSignal                    status;\r
@@ -207,7 +208,7 @@ public class SyncRunner extends QObject implements Runnable {
                                        updateSequenceNumber = conn.getSyncTable().getUpdateSequenceNumber();\r
                                        try {\r
                                                logger.log(logger.EXTREME, "Beginning sync");\r
-                                               evernoteSync();\r
+                                               evernoteSync(localNoteStore);\r
                                                logger.log(logger.EXTREME, "Sync finished");\r
                                        } catch (UnknownHostException e) {\r
                                                status.message.emit(e.getMessage());\r
@@ -247,7 +248,7 @@ public class SyncRunner extends QObject implements Runnable {
        }\r
        public void setNoteStore(NoteStore.Client c) {\r
                logger.log(logger.EXTREME, "Setting NoteStore in sync thread");\r
-               noteStore = c;\r
+               localNoteStore = c;\r
        }\r
        public void setUserStore(UserStore.Client c) {\r
                logger.log(logger.EXTREME, "Setting UserStore in sync thread");\r
@@ -266,7 +267,7 @@ public class SyncRunner extends QObject implements Runnable {
     //***************************************************************\r
        // Synchronize changes with Evernote\r
        @SuppressWarnings("unused")\r
-       private void evernoteSync() throws java.net.UnknownHostException {\r
+       private void evernoteSync(Client noteStore) throws java.net.UnknownHostException {\r
                logger.log(logger.HIGH, "Entering SyncRunner.evernoteSync");\r
                \r
                // Rebuild list of tags & notebooks to ignore\r
@@ -371,13 +372,13 @@ public class SyncRunner extends QObject implements Runnable {
                        String syncNotebooks = conn.getSyncTable().getRecord("FullNotebookSync");\r
                        String syncInkNoteImages = conn.getSyncTable().getRecord("FullInkNoteImageSync");\r
                        if (syncLinked != null) {\r
-                               downloadAllLinkedNotebooks();\r
+                               downloadAllLinkedNotebooks(localNoteStore);\r
                        }\r
                        if (syncShared != null) {\r
-                               downloadAllSharedNotebooks();\r
+                               downloadAllSharedNotebooks(localNoteStore);\r
                        }\r
                        if (syncNotebooks != null) {\r
-                               downloadAllNotebooks();\r
+                               downloadAllNotebooks(localNoteStore);\r
                        }\r
                        \r
                        if (syncInkNoteImages != null) {\r
@@ -396,7 +397,7 @@ public class SyncRunner extends QObject implements Runnable {
                                logger.log(logger.EXTREME, "Refresh needed is true");\r
                                refreshNeeded = true;\r
                                logger.log(logger.EXTREME, "Downloading changes");\r
-                               syncRemoteToLocal();\r
+                               syncRemoteToLocal(localNoteStore);\r
                        }\r
                        \r
                        //*****************************************\r
@@ -408,19 +409,19 @@ public class SyncRunner extends QObject implements Runnable {
                                logger.log(logger.EXTREME, "Uploading changes");\r
                                // Synchronize remote changes\r
                                if (!error)\r
-                                       syncExpunged();\r
+                                       syncExpunged(localNoteStore);\r
                                if (!error)\r
-                                       syncLocalTags();\r
+                                       syncLocalTags(localNoteStore);\r
                                if (!error)\r
-                                       syncLocalNotebooks();\r
+                                       syncLocalNotebooks(localNoteStore);\r
                                if (!error)\r
-                                       syncLocalLinkedNotebooks();\r
+                                       syncLocalLinkedNotebooks(localNoteStore);\r
                                if (!error) \r
-                                       syncDeletedNotes();\r
+                                       syncDeletedNotes(localNoteStore);\r
                                if (!error)\r
                                        syncLocalNotes();\r
                                if (!error)\r
-                                       syncLocalSavedSearches();\r
+                                       syncLocalSavedSearches(localNoteStore);\r
                        }\r
                        \r
                        status.message.emit(tr("Cleaning up"));\r
@@ -455,13 +456,13 @@ public class SyncRunner extends QObject implements Runnable {
        }\r
        \r
        // Sync deleted items with Evernote\r
-       private void syncExpunged() {\r
+       private void syncExpunged(Client noteStore) {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncExpunged");\r
                \r
                List<DeletedItemRecord> expunged = conn.getDeletedTable().getAllDeleted();\r
                boolean error = false;\r
                for (int i=0; i<expunged.size() && keepRunning; i++) {\r
-                       \r
+\r
                        if (authRefreshNeeded)\r
                                if (!refreshConnection())\r
                                        return;\r
@@ -481,6 +482,7 @@ public class SyncRunner extends QObject implements Runnable {
                                if (expunged.get(i).type.equalsIgnoreCase("NOTE")) {\r
                                        logger.log(logger.EXTREME, "Note expunged");\r
                                        updateSequenceNumber = noteStore.deleteNote(authToken, expunged.get(i).guid);\r
+                                       refreshNeeded = true;\r
                                        conn.getSyncTable().setUpdateSequenceNumber(updateSequenceNumber);\r
                                }\r
                                if (expunged.get(i).type.equalsIgnoreCase("SAVEDSEARCH")) {\r
@@ -512,7 +514,7 @@ public class SyncRunner extends QObject implements Runnable {
                logger.log(logger.HIGH, "Leaving SyncRunner.syncExpunged");\r
 \r
        }\r
-       private void syncDeletedNotes() {\r
+       private void syncDeletedNotes(Client noteStore) {\r
                if (syncDeletedContent)\r
                        return;\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncDeletedNotes");\r
@@ -579,13 +581,13 @@ public class SyncRunner extends QObject implements Runnable {
                List<Note> notes = conn.getNoteTable().getDirty();\r
                // Sync the local notebooks with Evernote's\r
                for (int i=0; i<notes.size() && keepRunning; i++) {\r
-                       syncLocalNote(notes.get(i), authToken);\r
+                       syncLocalNote(localNoteStore, notes.get(i), authToken);\r
                }\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncNotes");\r
 \r
        }\r
        // Sync notes with Evernote\r
-       private void syncLocalNote(Note enNote, String token) {\r
+       private void syncLocalNote(Client noteStore, Note enNote, String token) {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncNotes");\r
                status.message.emit(tr("Sending local notes."));\r
 \r
@@ -659,7 +661,7 @@ public class SyncRunner extends QObject implements Runnable {
        }\r
 \r
        // Sync Notebooks with Evernote\r
-       private void syncLocalNotebooks() {\r
+       private void syncLocalNotebooks(Client noteStore) {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalNotebooks");\r
                \r
                status.message.emit(tr("Sending local notebooks."));\r
@@ -749,7 +751,7 @@ public class SyncRunner extends QObject implements Runnable {
 \r
        }\r
        // Sync Tags with Evernote\r
-       private void syncLocalTags() {\r
+       private void syncLocalTags(Client noteStore) {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalTags");\r
                List<Tag> remoteList = new ArrayList<Tag>();\r
                status.message.emit(tr("Sending local tags."));\r
@@ -851,7 +853,7 @@ public class SyncRunner extends QObject implements Runnable {
                }\r
                logger.log(logger.HIGH, "Leaving SyncRunner.syncLocalTags");\r
        }\r
-       private void syncLocalLinkedNotebooks() {\r
+       private void syncLocalLinkedNotebooks(Client noteStore) {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalLinkedNotebooks");\r
                \r
                List<String> list = conn.getLinkedNotebookTable().getDirtyGuids();\r
@@ -888,7 +890,7 @@ public class SyncRunner extends QObject implements Runnable {
                logger.log(logger.HIGH, "Leaving SyncRunner.syncLocalLinkedNotebooks");\r
        }\r
        // Sync Saved Searches with Evernote\r
-       private void syncLocalSavedSearches() {\r
+       private void syncLocalSavedSearches(Client noteStore) {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalSavedSearches");\r
                List<SavedSearch> remoteList = new ArrayList<SavedSearch>();\r
                status.message.emit(tr("Sending saved searches."));\r
@@ -979,7 +981,7 @@ public class SyncRunner extends QObject implements Runnable {
        }       \r
 \r
        // Sync evernote changes with local database\r
-       private void syncRemoteToLocal() {\r
+       private void syncRemoteToLocal(Client noteStore) {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncRemoteToLocal");\r
 \r
                List<Note> dirtyNotes = conn.getNoteTable().getDirty();\r
@@ -1030,9 +1032,13 @@ public class SyncRunner extends QObject implements Runnable {
                        syncRemoteTags(chunk.getTags());\r
                        syncRemoteSavedSearches(chunk.getSearches());\r
                        syncRemoteNotebooks(chunk.getNotebooks());\r
-                       syncRemoteNotes(chunk.getNotes(), fullSync, authToken);\r
-                       syncRemoteResources(chunk.getResources());\r
+                       syncRemoteNotes(noteStore, chunk.getNotes(), fullSync, authToken);\r
+                       syncRemoteResources(noteStore, chunk.getResources());\r
                        syncRemoteLinkedNotebooks(chunk.getLinkedNotebooks());\r
+                       \r
+                       // Signal about any updated notes to invalidate the cache\r
+                       for (int i=0; i<chunk.getNotesSize(); i++) \r
+                               noteSignal.noteChanged.emit(chunk.getNotes().get(i).getGuid(), null); \r
                        syncExpungedNotes(chunk);\r
                        \r
                        \r
@@ -1174,17 +1180,17 @@ public class SyncRunner extends QObject implements Runnable {
 //             List<SharedNotebook> books = noteStore.getSharedNotebookByAuth(authToken);\r
 //     }\r
        // Sync remote Resources\r
-       private void syncRemoteResources(List<Resource> resource) {\r
+       private void syncRemoteResources(Client noteStore, List<Resource> resource) {\r
                logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteResources");\r
                if (resource != null) {\r
                        for (int i=0; i<resource.size() && keepRunning; i++) {\r
-                               syncRemoteResource(resource.get(i), authToken);\r
+                               syncRemoteResource(noteStore, resource.get(i), authToken);\r
                        }\r
                }\r
                logger.log(logger.EXTREME, "Leaving SyncRunner.syncRemoteResources");\r
        }\r
        // Sync remote resource\r
-       private void syncRemoteResource(Resource resource, String authToken) {\r
+       private void syncRemoteResource(Client noteStore, Resource resource, String authToken) {\r
                // This is how the logic for this works.\r
                // 1.) If the resource is not in the local database, we add it.\r
                // 2.) If a copy of the resource is in the local database and the note isn't dirty, we update the local copy\r
@@ -1192,7 +1198,7 @@ public class SyncRunner extends QObject implements Runnable {
                //     is a conflict.  The note conflict should get a copy of the resource at that time.\r
                \r
                boolean saveNeeded = false;\r
-               /* #1 */                Resource r = getEvernoteResource(resource.getGuid(), true,true,true, authToken);\r
+               /* #1 */                Resource r = getEvernoteResource(noteStore, resource.getGuid(), true,true,true, authToken);\r
                                                Resource l = conn.getNoteTable().noteResourceTable.getNoteResource(r.getGuid(), false);\r
                                                if (l == null) {\r
                                                        saveNeeded = true;\r
@@ -1220,11 +1226,11 @@ public class SyncRunner extends QObject implements Runnable {
 \r
        }\r
        // Sync remote notes\r
-       private void syncRemoteNotes(List<Note> note, boolean fullSync, String token) {\r
+       private void syncRemoteNotes(Client noteStore, List<Note> note, boolean fullSync, String token) {\r
                logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteNotes");\r
                if (note != null) {\r
                        for (int i=0; i<note.size() && keepRunning; i++) {\r
-                               Note n = getEvernoteNote(note.get(i).getGuid(), true, fullSync, true,true, token);\r
+                               Note n = getEvernoteNote(noteStore, note.get(i).getGuid(), true, fullSync, true,true, token);\r
                                syncRemoteNote(n, fullSync, token);\r
                        }\r
                }\r
@@ -1264,7 +1270,9 @@ public class SyncRunner extends QObject implements Runnable {
                        if ((conflictingNote || fullSync) && !ignoreNote) {\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
+                               // The following was commented out because it caused a race condition on the database where resources \r
+                               // may be lost.  We do the same thing elsewhere;.\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
@@ -1278,7 +1286,7 @@ public class SyncRunner extends QObject implements Runnable {
                        }\r
                }\r
        }\r
-       private Note getEvernoteNote(String guid, boolean withContent, boolean withResourceData, boolean withResourceRecognition, boolean withResourceAlternateData, String token) { \r
+       private Note getEvernoteNote(Client noteStore, String guid, boolean withContent, boolean withResourceData, boolean withResourceRecognition, boolean withResourceAlternateData, String token) { \r
                Note n = null;\r
                try {\r
                        logger.log(logger.EXTREME, "Retrieving note " +guid);\r
@@ -1307,7 +1315,7 @@ public class SyncRunner extends QObject implements Runnable {
                }\r
                return n;\r
        }\r
-       private Resource getEvernoteResource(String guid, boolean withData, boolean withRecognition, boolean withAttributes, String token) { \r
+       private Resource getEvernoteResource(Client noteStore, String guid, boolean withData, boolean withRecognition, boolean withAttributes, String token) { \r
                Resource n = null;\r
                try {\r
                        logger.log(logger.EXTREME, "Retrieving resource " +guid);\r
@@ -1521,7 +1529,7 @@ public class SyncRunner extends QObject implements Runnable {
                authToken = authResult.getAuthenticationToken(); \r
                noteStoreUrl = noteStoreUrlBase + user.getShardId();\r
                syncSignal.saveAuthToken.emit(authToken);\r
-               syncSignal.saveNoteStore.emit(noteStore);\r
+               syncSignal.saveNoteStore.emit(localNoteStore);\r
                \r
         \r
                try {\r
@@ -1534,7 +1542,7 @@ public class SyncRunner extends QObject implements Runnable {
                        isConnected = false;\r
                } \r
                noteStoreProt = new TBinaryProtocol(noteStoreTrans);\r
-               noteStore = \r
+               localNoteStore = \r
                        new NoteStore.Client(noteStoreProt, noteStoreProt); \r
                isConnected = true;\r
                authTimeRemaining = authResult.getExpiration() - authResult.getCurrentTime();\r
@@ -1654,7 +1662,7 @@ public class SyncRunner extends QObject implements Runnable {
     //*********************************************************\r
     //* Special download instructions.  Used for DB upgrades\r
     //*********************************************************\r
-    private void downloadAllSharedNotebooks() {\r
+    private void downloadAllSharedNotebooks(Client noteStore) {\r
        try {\r
                        List<SharedNotebook> books = noteStore.listSharedNotebooks(authToken);\r
                        logger.log(logger.LOW, "Shared notebooks found = " +books.size());\r
@@ -1683,7 +1691,7 @@ public class SyncRunner extends QObject implements Runnable {
                        logger.log(logger.LOW, e1.getMessage());\r
                }\r
     }\r
-    private void downloadAllNotebooks() {\r
+    private void downloadAllNotebooks(Client noteStore) {\r
        try {\r
                        List<Notebook> books = noteStore.listNotebooks(authToken);\r
                        logger.log(logger.LOW, "Shared notebooks found = " +books.size());\r
@@ -1708,7 +1716,7 @@ public class SyncRunner extends QObject implements Runnable {
                        return;\r
                }\r
     }\r
-    private void downloadAllLinkedNotebooks() {\r
+    private void downloadAllLinkedNotebooks(Client noteStore) {\r
        try {\r
                        List<LinkedNotebook> books = noteStore.listLinkedNotebooks(authToken);\r
                        logger.log(logger.LOW, "Linked notebooks found = " +books.size());\r
@@ -1757,7 +1765,6 @@ public class SyncRunner extends QObject implements Runnable {
             try {\r
                                post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));\r
                        } catch (UnsupportedEncodingException e1) {\r
-                               // TODO Auto-generated catch block\r
                                e1.printStackTrace();\r
                        }\r
                try {\r
@@ -1818,21 +1825,27 @@ public class SyncRunner extends QObject implements Runnable {
                try {\r
                                long lastSyncDate = conn.getLinkedNotebookTable().getLastSequenceDate(books.get(i).getGuid());\r
                                int lastSequenceNumber = conn.getLinkedNotebookTable().getLastSequenceNumber(books.get(i).getGuid());\r
-                               linkedAuthResult = noteStore.authenticateToSharedNotebook(books.get(i).getShareKey(), authToken);\r
+\r
+                               // Authenticate to the owner's shard\r
+                               String linkedNoteStoreUrl       = noteStoreUrlBase + books.get(i).getShardId();\r
+                               THttpClient linkedNoteStoreTrans        = new THttpClient(linkedNoteStoreUrl);\r
+                               TBinaryProtocol linkedNoteStoreProt     = new TBinaryProtocol(linkedNoteStoreTrans);\r
+                               Client linkedNoteStore = new NoteStore.Client(linkedNoteStoreProt, linkedNoteStoreProt);                                \r
+                               \r
+                               linkedAuthResult = linkedNoteStore.authenticateToSharedNotebook(books.get(i).getShareKey(), authToken);\r
                                SyncState linkedSyncState = \r
-                                       noteStore.getLinkedNotebookSyncState(linkedAuthResult.getAuthenticationToken(), books.get(i));\r
+                                       linkedNoteStore.getLinkedNotebookSyncState(linkedAuthResult.getAuthenticationToken(), books.get(i));\r
                                if (linkedSyncState.getUpdateCount() > lastSequenceNumber) {\r
                                        if (lastSyncDate < linkedSyncState.getFullSyncBefore()) {\r
                                                lastSequenceNumber = 0;\r
                                        } \r
-                                       syncLinkedNotebook(books.get(i), lastSequenceNumber, linkedSyncState.getUpdateCount());\r
+                                       syncLinkedNotebook(linkedNoteStore, books.get(i), lastSequenceNumber, linkedSyncState.getUpdateCount());\r
                                }\r
                        \r
                        // Synchronize local changes\r
-                       syncLocalLinkedNoteChanges(books.get(i));\r
+                       syncLocalLinkedNoteChanges(linkedNoteStore, books.get(i));\r
                                \r
                } catch (EDAMUserException e) {\r
-                       // TODO Auto-generated catch block\r
                        e.printStackTrace();\r
                } catch (EDAMNotFoundException e) {\r
                        status.message.emit(tr("Error synchronizing \" " +\r
@@ -1844,7 +1857,6 @@ public class SyncRunner extends QObject implements Runnable {
                                        "Key: "+books.get(i).getShareKey() +" Error:" +e.getMessage());\r
                        e.printStackTrace();\r
                } catch (TException e) {\r
-                       // TODO Auto-generated catch block\r
                        e.printStackTrace();\r
                }\r
        }\r
@@ -1859,8 +1871,9 @@ public class SyncRunner extends QObject implements Runnable {
     //**************************************************************\r
     //* Linked notebook contents (from someone else's account)\r
     //*************************************************************\r
-       private void syncLinkedNotebook(LinkedNotebook book, int usn, int highSequence) {\r
-               \r
+       private void syncLinkedNotebook(Client linkedNoteStore, LinkedNotebook book, int usn, int highSequence) {\r
+               if (ignoreLinkedNotebooks.contains(book.getGuid()))\r
+                       return;\r
                List<Note> dirtyNotes = conn.getNoteTable().getDirtyLinkedNotes();\r
                if (dirtyNoteGuids == null) \r
                        dirtyNoteGuids = new Vector<String>();\r
@@ -1872,39 +1885,43 @@ public class SyncRunner extends QObject implements Runnable {
                if (usn == 0)\r
                        fullSync = true;\r
                while (usn < highSequence) {\r
+                       refreshNeeded = true;\r
                        try {\r
                                SyncChunk chunk = \r
-                                       noteStore.getLinkedNotebookSyncChunk(authToken, book, usn, 10, fullSync);\r
+                                       linkedNoteStore.getLinkedNotebookSyncChunk(authToken, book, usn, 10, fullSync);\r
+                               \r
+                               // Expunge notes\r
+                               syncExpungedNotes(chunk);\r
 \r
-                               if (!ignoreLinkedNotebooks.contains(book.getGuid()))\r
-                                       syncRemoteNotes(chunk.getNotes(), fullSync, linkedAuthResult.getAuthenticationToken());\r
-                               findNewLinkedTags(chunk.getNotes(), linkedAuthResult.getAuthenticationToken());\r
+                               syncRemoteNotes(linkedNoteStore, chunk.getNotes(), fullSync, linkedAuthResult.getAuthenticationToken());\r
+                               findNewLinkedTags(linkedNoteStore, chunk.getNotes(), linkedAuthResult.getAuthenticationToken());\r
+                               // Sync resources\r
                                for (int i=0; i<chunk.getResourcesSize(); i++) {\r
-                                       syncRemoteResource(chunk.getResources().get(i), linkedAuthResult.getAuthenticationToken());\r
+                                       syncRemoteResource(linkedNoteStore, chunk.getResources().get(i), linkedAuthResult.getAuthenticationToken());\r
                                }\r
-                               syncRemoteLinkedNotebooks(chunk.getNotebooks(), false, book);\r
-                               SharedNotebook s = noteStore.getSharedNotebookByAuth(linkedAuthResult.getAuthenticationToken());\r
+                               syncRemoteLinkedNotebooks(linkedNoteStore, chunk.getNotebooks(), false, book);\r
+                               SharedNotebook s = linkedNoteStore.getSharedNotebookByAuth(linkedAuthResult.getAuthenticationToken());\r
                                syncLinkedTags(chunk.getTags(), s.getNotebookGuid());\r
                                \r
-                               \r
-                               // Expunge records\r
+                               // Go through & signal any notes that have changed so we can refresh the user's view\r
+                               for (int i=0; i<chunk.getNotesSize(); i++) \r
+                                       noteSignal.noteChanged.emit(chunk.getNotes().get(i).getGuid(), null);\r
+\r
+                               // Expunge Notebook records\r
                                for (int i=0; i<chunk.getExpungedLinkedNotebooksSize(); i++) {\r
                                        conn.getLinkedNotebookTable().expungeNotebook(chunk.getExpungedLinkedNotebooks().get(i), false);\r
                                }\r
+                               \r
                                usn = chunk.getChunkHighUSN();\r
                                conn.getLinkedNotebookTable().setLastSequenceDate(book.getGuid(),chunk.getCurrentTime());\r
                                conn.getLinkedNotebookTable().setLastSequenceNumber(book.getGuid(),chunk.getChunkHighUSN());\r
                        } catch (EDAMUserException e) {\r
-                               // TODO Auto-generated catch block\r
                                e.printStackTrace();\r
                        } catch (EDAMSystemException e) {\r
-                               // TODO Auto-generated catch block\r
                                e.printStackTrace();\r
                        } catch (EDAMNotFoundException e) {\r
-                               // TODO Auto-generated catch block\r
                                e.printStackTrace();\r
                        } catch (TException e) {\r
-                               // TODO Auto-generated catch block\r
                                e.printStackTrace();\r
                        }\r
                }\r
@@ -1921,7 +1938,7 @@ public class SyncRunner extends QObject implements Runnable {
        }\r
        \r
        // Sync notebooks from a linked notebook\r
-       private void syncRemoteLinkedNotebooks(List<Notebook> notebooks, boolean readOnly, LinkedNotebook linked) {\r
+       private void syncRemoteLinkedNotebooks(Client noteStore, List<Notebook> notebooks, boolean readOnly, LinkedNotebook linked) {\r
                logger.log(logger.EXTREME, "Entering SyncRunner.syncRemoteNotebooks");\r
                if (notebooks != null) {\r
                        for (int i=0; i<notebooks.size() && keepRunning; i++) {\r
@@ -1951,7 +1968,7 @@ public class SyncRunner extends QObject implements Runnable {
                logger.log(logger.EXTREME, "Leaving SyncRunner.syncRemoteNotebooks");\r
        }\r
 \r
-       private void findNewLinkedTags(List<Note> newNotes, String token) {\r
+       private void findNewLinkedTags(Client noteStore, List<Note> newNotes, String token) {\r
                if (newNotes == null)\r
                        return;\r
                for (int i=0; i<newNotes.size(); i++) {\r
@@ -1964,16 +1981,12 @@ public class SyncRunner extends QObject implements Runnable {
                                                newTag = noteStore.getTag(token, tag);\r
                                                conn.getTagTable().addTag(newTag, false);\r
                                        } catch (EDAMUserException e) {\r
-                                               // TODO Auto-generated catch block\r
                                                e.printStackTrace();\r
                                        } catch (EDAMSystemException e) {\r
-                                               // TODO Auto-generated catch block\r
                                                e.printStackTrace();\r
                                        } catch (EDAMNotFoundException e) {\r
-                                               // TODO Auto-generated catch block\r
                                                e.printStackTrace();\r
                                        } catch (TException e) {\r
-                                               // TODO Auto-generated catch block\r
                                                e.printStackTrace();\r
                                        }\r
                                        \r
@@ -1983,11 +1996,11 @@ public class SyncRunner extends QObject implements Runnable {
        }\r
 \r
        // Synchronize changes locally done to linked notes\r
-       private void syncLocalLinkedNoteChanges(LinkedNotebook book) {\r
+       private void syncLocalLinkedNoteChanges(Client noteStore, LinkedNotebook book) {\r
                String notebookGuid = conn.getLinkedNotebookTable().getNotebookGuid(book.getGuid());\r
                List<Note> notes = conn.getNoteTable().getDirtyLinked(notebookGuid);\r
                for (int i=0; i<notes.size(); i++) {\r
-                       syncLocalNote(notes.get(i), linkedAuthResult.getAuthenticationToken());\r
+                       syncLocalNote(noteStore, notes.get(i), linkedAuthResult.getAuthenticationToken());\r
                }\r
        }\r
 \r
index ecd7166..81229f1 100644 (file)
@@ -217,7 +217,7 @@ public class NoteFormatter {
 //     if (!tfile.exists()) {\r
                Resource r = null;\r
                if (resGuid != null)\r
-                       r = conn.getNoteTable().noteResourceTable.getNoteResource(resGuid,true);\r
+                               r = conn.getNoteTable().noteResourceTable.getNoteResource(resGuid,true);\r
                        if (r==null || r.getData() == null || r.getData().getBody().length == 0) {\r
                                resourceError = true;\r
                                readOnly = true;\r