OSDN Git Service

Add initial logic for setting up shared/published notebooks. Added logic to download...
authorRandy Baumgarte <randy@fbn.cx>
Sat, 27 Nov 2010 17:22:10 +0000 (12:22 -0500)
committerRandy Baumgarte <randy@fbn.cx>
Wed, 15 Dec 2010 15:16:31 +0000 (10:16 -0500)
21 files changed:
lib/apache-mime4j-0.6.jar [new file with mode: 0644]
lib/commons-codec-1.3.jar [new file with mode: 0644]
lib/commons-logging-1.1.1.jar [new file with mode: 0644]
lib/httpclient-4.0.3.jar [new file with mode: 0644]
lib/httpcore-4.0.1.jar [new file with mode: 0644]
lib/httpmime-4.0.3.jar [new file with mode: 0644]
shortcuts_sample.txt
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/dialog/PublishNotebook.java [new file with mode: 0644]
src/cx/fbn/nevernote/dialog/ShareNotebook.java [new file with mode: 0644]
src/cx/fbn/nevernote/gui/MainMenuBar.java
src/cx/fbn/nevernote/gui/NotebookTreeWidget.java
src/cx/fbn/nevernote/sql/DatabaseConnection.java
src/cx/fbn/nevernote/sql/InkImagesTable.java [new file with mode: 0644]
src/cx/fbn/nevernote/sql/LinkedNotebookTable.java
src/cx/fbn/nevernote/sql/NoteResourceTable.java
src/cx/fbn/nevernote/sql/NotebookTable.java
src/cx/fbn/nevernote/sql/SharedNotebookTable.java
src/cx/fbn/nevernote/sql/WordsTable.java
src/cx/fbn/nevernote/threads/SyncRunner.java
src/cx/fbn/nevernote/xml/NoteFormatter.java

diff --git a/lib/apache-mime4j-0.6.jar b/lib/apache-mime4j-0.6.jar
new file mode 100644 (file)
index 0000000..1d2282c
Binary files /dev/null and b/lib/apache-mime4j-0.6.jar differ
diff --git a/lib/commons-codec-1.3.jar b/lib/commons-codec-1.3.jar
new file mode 100644 (file)
index 0000000..957b675
Binary files /dev/null and b/lib/commons-codec-1.3.jar differ
diff --git a/lib/commons-logging-1.1.1.jar b/lib/commons-logging-1.1.1.jar
new file mode 100644 (file)
index 0000000..1deef14
Binary files /dev/null and b/lib/commons-logging-1.1.1.jar differ
diff --git a/lib/httpclient-4.0.3.jar b/lib/httpclient-4.0.3.jar
new file mode 100644 (file)
index 0000000..fd0d377
Binary files /dev/null and b/lib/httpclient-4.0.3.jar differ
diff --git a/lib/httpcore-4.0.1.jar b/lib/httpcore-4.0.1.jar
new file mode 100644 (file)
index 0000000..4aef35e
Binary files /dev/null and b/lib/httpcore-4.0.1.jar differ
diff --git a/lib/httpmime-4.0.3.jar b/lib/httpmime-4.0.3.jar
new file mode 100644 (file)
index 0000000..0dfd331
Binary files /dev/null and b/lib/httpmime-4.0.3.jar differ
index 807bcd3..8cf01db 100644 (file)
@@ -11,6 +11,8 @@ File_Notebook_Delete                          // Delete the existing notebook
 File_Notebook_Close                            // Open/Close (i.e. archive) a notebook
 File_Notebook_Icon                             // Modify the selected notebook icon
 File_Notebook_Stack                            // Stack/Unstack notebooks
+File_Notebook_Publish                  // publish a notebook
+File_Notebook_Share                            // Share a notebook with others
 File_Tag_Add                   Ctrl+Shift+T    // Add a notebook
 File_Tag_Edit                                  // Edit an existing notebook
 File_Tag_Delete                                        // Delete the existing notebook
index 49505d1..0de1986 100644 (file)
@@ -55,6 +55,7 @@ import com.evernote.edam.type.Data;
 import com.evernote.edam.type.Note;
 import com.evernote.edam.type.NoteAttributes;
 import com.evernote.edam.type.Notebook;
+import com.evernote.edam.type.Publishing;
 import com.evernote.edam.type.QueryFormat;
 import com.evernote.edam.type.Resource;
 import com.evernote.edam.type.SavedSearch;
@@ -139,8 +140,10 @@ import cx.fbn.nevernote.dialog.LoginDialog;
 import cx.fbn.nevernote.dialog.NotebookArchive;
 import cx.fbn.nevernote.dialog.NotebookEdit;
 import cx.fbn.nevernote.dialog.OnlineNoteHistory;
+import cx.fbn.nevernote.dialog.PublishNotebook;
 import cx.fbn.nevernote.dialog.SavedSearchEdit;
 import cx.fbn.nevernote.dialog.SetIcon;
+import cx.fbn.nevernote.dialog.ShareNotebook;
 import cx.fbn.nevernote.dialog.StackNotebook;
 import cx.fbn.nevernote.dialog.TagEdit;
 import cx.fbn.nevernote.dialog.ThumbnailViewer;
@@ -287,6 +290,7 @@ public class NeverNote extends QMainWindow{
     int                                saveThreadDeadCount=0;          // number of consecutive dead times for the save thread
     
     HashMap<String, String>            noteCache;                      // Cash of note content 
+    HashMap<String, Boolean>   readOnlyCache;          // List of cash notes that are read-only
     List<String>               historyGuids;                           // GUIDs of previously viewed items
     int                                        historyPosition;                        // Position within the viewed items
     boolean                            fromHistory;                            // Is this from the history queue?
@@ -460,6 +464,7 @@ public class NeverNote extends QMainWindow{
         
         // Setup the browser window
         noteCache = new HashMap<String,String>();
+        readOnlyCache = new HashMap<String, Boolean>();
         browserWindow = new BrowserWindow(conn);
 
         mainLeftRightSplitter.addWidget(leftSplitter1);
@@ -519,6 +524,8 @@ public class NeverNote extends QMainWindow{
                notebookTree.setAddAction(menuBar.notebookAddAction);
                notebookTree.setIconAction(menuBar.notebookIconAction);
                notebookTree.setStackAction(menuBar.notebookStackAction);
+               notebookTree.setPublishAction(menuBar.notebookPublishAction);
+               notebookTree.setShareAction(menuBar.notebookShareAction);
                notebookTree.setVisible(Global.isWindowVisible("notebookTree"));
                notebookTree.noteSignal.notebookChanged.connect(this, "updateNoteNotebook(String, String)");
                menuBar.hideNotebooks.setChecked(Global.isWindowVisible("notebookTree"));
@@ -1049,6 +1056,7 @@ public class NeverNote extends QMainWindow{
 //        if (!dateFormat.equals(Global.getDateFormat()) ||
 //                     !timeFormat.equals(Global.getTimeFormat())) {
                noteCache.clear();
+               readOnlyCache.clear();
                noteIndexUpdated(true);
 //        }
         
@@ -1168,6 +1176,8 @@ public class NeverNote extends QMainWindow{
                menuBar.noteRestoreAction.setVisible(false);            
        menuBar.notebookEditAction.setEnabled(true);
        menuBar.notebookDeleteAction.setEnabled(true);
+       menuBar.notebookPublishAction.setEnabled(true);
+       menuBar.notebookShareAction.setEnabled(true);
        menuBar.notebookIconAction.setEnabled(true);
        menuBar.notebookStackAction.setEnabled(true);
        List<QTreeWidgetItem> selections = notebookTree.selectedItems();
@@ -1441,6 +1451,70 @@ public class NeverNote extends QMainWindow{
                browserWindow.setNotebookList(nbooks);
                logger.log(logger.HIGH, "Leaving NeverNote.editNotebook");
        }
+       // Publish a notebook
+       @SuppressWarnings("unused")
+       private void publishNotebook() {
+               List<QTreeWidgetItem> selections = notebookTree.selectedItems();
+               QTreeWidgetItem currentSelection;
+               currentSelection = selections.get(0);
+               String guid = currentSelection.text(2);
+
+               if (guid.equalsIgnoreCase("STACK") || guid.equalsIgnoreCase(""))
+                       return;
+               
+               Notebook n = null;
+               int position = 0;
+               for (int i=0; i<listManager.getNotebookIndex().size(); i++) {
+                       if (guid.equals(listManager.getNotebookIndex().get(i).getGuid())) {
+                               n = listManager.getNotebookIndex().get(i);
+                               position = i;
+                               i = listManager.getNotebookIndex().size();
+                       }
+               }
+               if (n == null)
+                       return;
+               
+               PublishNotebook publish = new PublishNotebook(Global.username, Global.getServer(), n);
+               publish.exec();
+               
+               if (!publish.okClicked()) 
+                       return;
+               
+               Publishing p = publish.getPublishing();
+               boolean isPublished = !publish.isStopPressed();
+               conn.getNotebookTable().setPublishing(n.getGuid(), isPublished, p);
+               n.setPublished(isPublished);
+               n.setPublishing(p);
+               listManager.getNotebookIndex().set(position, n);
+               notebookIndexUpdated();
+       }
+       // Publish a notebook
+       @SuppressWarnings("unused")
+       private void shareNotebook() {
+               List<QTreeWidgetItem> selections = notebookTree.selectedItems();
+               QTreeWidgetItem currentSelection;
+               currentSelection = selections.get(0);
+               String guid = currentSelection.text(2);
+
+               if (guid.equalsIgnoreCase("STACK") || guid.equalsIgnoreCase(""))
+                       return;
+               
+               Notebook n = null;;
+               for (int i=0; i<listManager.getNotebookIndex().size(); i++) {
+                       if (guid.equals(listManager.getNotebookIndex().get(i).getGuid())) {
+                               n = listManager.getNotebookIndex().get(i);
+                               i = listManager.getNotebookIndex().size();
+                       }
+               }
+                               
+               String authToken = null;
+               if (syncRunner.isConnected)
+                       authToken = syncRunner.authToken;
+               ShareNotebook share = new ShareNotebook(n.getName(), conn, n, syncRunner);
+               share.exec();
+               
+       }
+
        // Delete an existing notebook
        @SuppressWarnings("unused")
        private void deleteNotebook() {
@@ -2416,6 +2490,7 @@ public class NeverNote extends QMainWindow{
                        searchFieldCleared();
                        if (searchPerformed) {
                                noteCache.clear();
+                               readOnlyCache.clear();
                                listManager.setEnSearch("");
 /////                          listManager.clearNoteIndexSearch();
                                //noteIndexUpdated(true);
@@ -2430,6 +2505,7 @@ public class NeverNote extends QMainWindow{
     private void searchFieldChanged() {
        logger.log(logger.HIGH, "Entering NeverNote.searchFieldChanged");
        noteCache.clear();
+       readOnlyCache.clear();
        saveNoteColumnPositions();
        saveNoteIndexWidth();
        String text = searchField.currentText();
@@ -3846,19 +3922,24 @@ public class NeverNote extends QMainWindow{
                        js.replace("<?xml version='1.0' encoding='UTF-8'?>", "");
                        browser.getBrowser().setContent(js);
                        noteCache.put(currentNoteGuid, js.toString());
+
+                       if (formatter.resourceError)
+                               resourceErrorMessage();
+                       inkNote = formatter.readOnly;
+                       if (inkNote)
+                               readOnlyCache.put(currentNoteGuid, true);
                } else {
                        logger.log(logger.HIGH, "Note content is being pulled from the cache");
                        String cachedContent = formatter.modifyCachedTodoTags(noteCache.get(currentNoteGuid));
                        js = new QByteArray(cachedContent);
                        browser.getBrowser().setContent(js);
+                       if (readOnlyCache.containsKey(currentNoteGuid))
+                                       inkNote = true;
                }
                if (conn.getNoteTable().isThumbnailNeeded(currentNoteGuid)) {
                        thumbnailHTMLReady(currentNoteGuid, js, Global.calculateThumbnailZoom(js.toString()));
                }
 
-               if (formatter.resourceError)
-                       resourceErrorMessage();
-               inkNote = formatter.readOnly;
                
                browser.getBrowser().page().setContentEditable(!inkNote);  // We don't allow editing of ink notes
                browser.setNote(currentNote);
diff --git a/src/cx/fbn/nevernote/dialog/PublishNotebook.java b/src/cx/fbn/nevernote/dialog/PublishNotebook.java
new file mode 100644 (file)
index 0000000..591cfa0
--- /dev/null
@@ -0,0 +1,184 @@
+/*\r
+ * This file is part of NeverNote \r
+ * Copyright 2009 Randy Baumgarte\r
+ * \r
+ * This file may be licensed under the terms of of the\r
+ * GNU General Public License Version 2 (the ``GPL'').\r
+ *\r
+ * Software distributed under the License is distributed\r
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
+ * express or implied. See the GPL for the specific language\r
+ * governing rights and limitations.\r
+ *\r
+ * You should have received a copy of the GPL along with this\r
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
+ * or write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
+ *\r
+*/\r
+\r
+package cx.fbn.nevernote.dialog;\r
+\r
+import com.evernote.edam.type.NoteSortOrder;\r
+import com.evernote.edam.type.Notebook;\r
+import com.evernote.edam.type.Publishing;\r
+import com.trolltech.qt.core.Qt;\r
+import com.trolltech.qt.gui.QComboBox;\r
+import com.trolltech.qt.gui.QDialog;\r
+import com.trolltech.qt.gui.QHBoxLayout;\r
+import com.trolltech.qt.gui.QIcon;\r
+import com.trolltech.qt.gui.QLabel;\r
+import com.trolltech.qt.gui.QLineEdit;\r
+import com.trolltech.qt.gui.QPushButton;\r
+import com.trolltech.qt.gui.QTextEdit;\r
+import com.trolltech.qt.gui.QVBoxLayout;\r
+\r
+public class PublishNotebook extends QDialog {\r
+       private final QPushButton               okButton;\r
+       private final QPushButton               cancelButton;\r
+       private boolean                                 okClicked;\r
+       private final QLabel                    urlLabel;\r
+       private final QLineEdit                 url;            \r
+       private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
+       private final QTextEdit                 description;\r
+       private final QComboBox                 sortedBy;\r
+       private final QComboBox                 sortOrder;\r
+       private boolean stopButtonPressed = false;\r
+       private final QPushButton stopButton;\r
+       \r
+       public PublishNotebook(String userid, String url, Notebook n) {\r
+               setWindowIcon(new QIcon(iconPath+"globe.png"));\r
+               okClicked = false;\r
+\r
+               \r
+               okButton = new QPushButton();\r
+               okButton.setText(tr("OK"));\r
+               okButton.pressed.connect(this, "onClicked()");\r
+               \r
+               userid = "sysrabt";\r
+               \r
+               urlLabel = new QLabel("http://"+url +tr("/pub/") +userid + tr("/"));\r
+               QHBoxLayout urlLayout = new QHBoxLayout();\r
+               urlLayout.addWidget(urlLabel);\r
+               this.url = new QLineEdit();\r
+               this.url.textChanged.connect(this, "urlEdited()");\r
+               urlLayout.addWidget(this.url);\r
+               \r
+               QVBoxLayout textEditLayout = new QVBoxLayout();\r
+               textEditLayout.addWidget(new QLabel(tr("Notebook: ") +n.getName()));\r
+               textEditLayout.addWidget(new QLabel("Public URL"));\r
+               textEditLayout.addLayout(urlLayout);\r
+               textEditLayout.addWidget(new QLabel(tr("Description")));\r
+               description = new QTextEdit();\r
+               textEditLayout.addWidget(description);\r
+               \r
+               sortedBy = new QComboBox(this);\r
+               sortOrder = new QComboBox(this);\r
+               QHBoxLayout orderLayout = new QHBoxLayout();\r
+               orderLayout.addWidget(new QLabel("Sort By"));\r
+               Qt.Alignment right = new Qt.Alignment();\r
+               right.set(Qt.AlignmentFlag.AlignRight);\r
+               orderLayout.setAlignment(right);\r
+               orderLayout.addWidget(sortedBy);\r
+               orderLayout.addSpacing(50);\r
+               orderLayout.addWidget(new QLabel("Sort Order"));\r
+               orderLayout.addWidget(sortOrder);\r
+               \r
+               sortedBy.addItem(tr("Date Created"), NoteSortOrder.CREATED);\r
+               sortedBy.addItem(tr("Date Updated"), NoteSortOrder.UPDATED);\r
+               \r
+               sortOrder.addItem(tr("Newest to oldest"), false);\r
+               sortOrder.addItem(tr("Oldest to newest"), true);\r
+               \r
+               textEditLayout.addLayout(orderLayout);\r
+               \r
+               cancelButton = new QPushButton();\r
+               cancelButton.setText(tr("Cancel"));\r
+               cancelButton.pressed.connect(this, "onCancel()");\r
+               \r
+               stopButton = new QPushButton(tr("Stop Sharing"));\r
+               stopButton.setVisible(false);\r
+               stopButton.clicked.connect(this, "stopPublishing()");\r
+               \r
+               QHBoxLayout buttonLayout = new QHBoxLayout();\r
+               buttonLayout.addStretch(1);\r
+               buttonLayout.addWidget(stopButton);\r
+               buttonLayout.addWidget(okButton);\r
+               buttonLayout.addWidget(cancelButton);\r
+               setWindowTitle(tr("Share A Notebook With The World"));  \r
+               \r
+               QVBoxLayout mainLayout = new QVBoxLayout();\r
+               mainLayout.addLayout(textEditLayout);\r
+               mainLayout.addSpacing(1);\r
+               mainLayout.addLayout(buttonLayout);\r
+               setLayout(mainLayout);\r
+\r
+               if (n.isPublished()) {\r
+                       Publishing p = n.getPublishing();\r
+                       this.url.setText(p.getUri());\r
+                       description.setText(p.getPublicDescription());\r
+                       int position = sortOrder.findData(p.isAscending());\r
+                       sortOrder.setCurrentIndex(position);\r
+                       position = sortedBy.findData(p.getOrder());\r
+                       sortedBy.setCurrentIndex(position);\r
+                       okButton.setText(tr("Save Changes"));\r
+                       stopButton.setVisible(true);\r
+               } else {\r
+                       okButton.setEnabled(false);\r
+               }\r
+               \r
+               resize(500, 200);\r
+               \r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void onClicked() {\r
+               okClicked = true;\r
+               stopButtonPressed = false;\r
+               close();\r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void onCancel() {\r
+               okClicked = false;\r
+               close();\r
+       }\r
+       \r
+       public boolean okClicked() {\r
+               return okClicked;\r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void itemSelected() {\r
+               okButton.setEnabled(true);\r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void urlEdited() {\r
+               if (url.text().trim().equals(""))\r
+                       okButton.setEnabled(false);\r
+               else\r
+                       okButton.setEnabled(true);\r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void stopPublishing() {\r
+               stopButtonPressed = true;\r
+               okClicked = true;\r
+               close();\r
+       }\r
+       \r
+       public boolean isStopPressed() {\r
+               return stopButtonPressed;\r
+       }\r
+       \r
+       public Publishing getPublishing() {\r
+               Publishing p = new Publishing();\r
+               p.setPublicDescription(description.toPlainText());\r
+               int i = sortedBy.currentIndex();\r
+               p.setOrder((NoteSortOrder) sortedBy.itemData(i));\r
+               p.setAscending((Boolean)sortOrder.itemData(i));\r
+               p.setUri(url.text());\r
+               return p;\r
+       }\r
+}\r
diff --git a/src/cx/fbn/nevernote/dialog/ShareNotebook.java b/src/cx/fbn/nevernote/dialog/ShareNotebook.java
new file mode 100644 (file)
index 0000000..8f3eace
--- /dev/null
@@ -0,0 +1,242 @@
+/*\r
+ * This file is part of NeverNote \r
+ * Copyright 2009 Randy Baumgarte\r
+ * \r
+ * This file may be licensed under the terms of of the\r
+ * GNU General Public License Version 2 (the ``GPL'').\r
+ *\r
+ * Software distributed under the License is distributed\r
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
+ * express or implied. See the GPL for the specific language\r
+ * governing rights and limitations.\r
+ *\r
+ * You should have received a copy of the GPL along with this\r
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
+ * or write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
+ *\r
+*/\r
+\r
+package cx.fbn.nevernote.dialog;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.thrift.TException;\r
+\r
+import com.evernote.edam.error.EDAMNotFoundException;\r
+import com.evernote.edam.error.EDAMSystemException;\r
+import com.evernote.edam.error.EDAMUserException;\r
+import com.evernote.edam.type.Notebook;\r
+import com.evernote.edam.type.SharedNotebook;\r
+import com.trolltech.qt.core.QModelIndex;\r
+import com.trolltech.qt.core.Qt.ItemFlag;\r
+import com.trolltech.qt.core.Qt.ItemFlags;\r
+import com.trolltech.qt.gui.QAbstractItemView.SelectionBehavior;\r
+import com.trolltech.qt.gui.QAbstractItemView.SelectionMode;\r
+import com.trolltech.qt.gui.QApplication;\r
+import com.trolltech.qt.gui.QDialog;\r
+import com.trolltech.qt.gui.QFontMetrics;\r
+import com.trolltech.qt.gui.QHBoxLayout;\r
+import com.trolltech.qt.gui.QIcon;\r
+import com.trolltech.qt.gui.QLabel;\r
+import com.trolltech.qt.gui.QPushButton;\r
+import com.trolltech.qt.gui.QTableWidget;\r
+import com.trolltech.qt.gui.QTableWidgetItem;\r
+import com.trolltech.qt.gui.QVBoxLayout;\r
+\r
+import cx.fbn.nevernote.sql.DatabaseConnection;\r
+import cx.fbn.nevernote.threads.SyncRunner;\r
+\r
+public class ShareNotebook extends QDialog {\r
+       private final QPushButton                               okButton;\r
+       private final QPushButton                               addButton;\r
+       private final QPushButton                               deleteButton;\r
+       private boolean                                                 okClicked;\r
+       public final QTableWidget                               table;\r
+       private final List<SharedNotebook>              notebooks;\r
+       private final DatabaseConnection                conn;\r
+       private final Notebook                                  notebook;\r
+       private final SyncRunner                                syncRunner;\r
+       private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");\r
+       \r
+       public ShareNotebook(String guid, DatabaseConnection c, Notebook n,\r
+                                               SyncRunner s) {\r
+               setWindowIcon(new QIcon(iconPath+"globe.png"));\r
+               okClicked = false;\r
+               conn = c;\r
+               syncRunner = s;;\r
+               notebook = n;\r
+               \r
+               notebooks = conn.getSharedNotebookTable().getForNotebook(n.getGuid());\r
+               okButton = new QPushButton();\r
+               okButton.setText(tr("OK"));\r
+               okButton.pressed.connect(this, "onClicked()");\r
+               \r
+               QHBoxLayout horizontalLayout = new QHBoxLayout();\r
+               QHBoxLayout buttonLayout = new QHBoxLayout();\r
+               buttonLayout.addStretch(1);\r
+               buttonLayout.addWidget(okButton);\r
+               setWindowTitle(tr("Share Notebook \"") +notebook.getName() + tr("\" With Others"));     \r
+               \r
+               table = new QTableWidget(notebooks.size(),3);\r
+               List<String> headers = new ArrayList<String>();\r
+               headers.add(tr("Email"));\r
+               headers.add(tr("Access"));\r
+               headers.add(tr("Login Required"));\r
+               table.setHorizontalHeaderLabels(headers);\r
+               table.verticalHeader().setVisible(false);\r
+               table.setAlternatingRowColors(true);\r
+               table.setSelectionBehavior(SelectionBehavior.SelectRows);\r
+               table.setSelectionMode(SelectionMode.SingleSelection);\r
+               table.itemSelectionChanged.connect(this, "tableSelection()");\r
+               horizontalLayout.addWidget(table);\r
+               \r
+               \r
+               addButton = new QPushButton();\r
+               addButton.setText(tr("Add"));\r
+               addButton.clicked.connect(this, "addPressed()");\r
+               \r
+               deleteButton = new QPushButton();\r
+               deleteButton.setText(tr("Delete"));\r
+               deleteButton.setEnabled(false);\r
+               deleteButton.clicked.connect(this, "deletePressed()");\r
+               \r
+               QVBoxLayout editLayout = new QVBoxLayout();\r
+               editLayout.addWidget(addButton);\r
+               editLayout.addWidget(deleteButton);\r
+               \r
+               QHBoxLayout listLayout = new QHBoxLayout();\r
+               listLayout.addLayout(horizontalLayout);\r
+               listLayout.addLayout(editLayout);\r
+               \r
+               QVBoxLayout mainLayout = new QVBoxLayout();\r
+               if (syncRunner.authToken == null) {\r
+                       QLabel msg = new QLabel(tr("You must be connected to make changes."));\r
+                       mainLayout.addWidget(msg);\r
+               }\r
+               mainLayout.addLayout(listLayout);\r
+               mainLayout.addSpacing(1);\r
+               mainLayout.addLayout(buttonLayout);\r
+               setLayout(mainLayout);\r
+               \r
+               table.setColumnWidth(0, 160);\r
+               resize(500, 200);\r
+               load();\r
+               \r
+               if (syncRunner.authToken == null) {\r
+                       addButton.setEnabled(false);\r
+                       deleteButton.setEnabled(false);\r
+               }\r
+               \r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void onClicked() {\r
+               okClicked = true;\r
+               close();\r
+       }\r
+       \r
+\r
+       public boolean okClicked() {\r
+               return okClicked;\r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void itemSelected() {\r
+               okButton.setEnabled(true);\r
+       }\r
+       \r
+       private void load() {\r
+               for (int i=0; i<notebooks.size(); i++) {\r
+                       addRow(i, notebooks.get(i).getEmail(), \r
+                                        notebooks.get(i).isNotebookModifiable(),\r
+                                        notebooks.get(i).isRequireLogin());\r
+               }\r
+       }\r
+\r
+       private void addRow(int row, String email, boolean mod, boolean login) {\r
+               QFontMetrics f = QApplication.fontMetrics();\r
+               int fontHeight = f.height();\r
+\r
+               QTableWidgetItem emailWidget = new QTableWidgetItem();\r
+               emailWidget.setText(email);\r
+               table.setItem(row, 0, emailWidget);\r
+               table.setRowHeight(row, fontHeight);\r
+               emailWidget.setToolTip(email);\r
+               ItemFlags flags = emailWidget.flags();\r
+               flags.clear(ItemFlag.ItemIsEditable);\r
+               emailWidget.setFlags(flags);\r
+\r
+               QTableWidgetItem accessWidget = new QTableWidgetItem();\r
+               if (mod)\r
+                       accessWidget.setText(tr("Modify"));\r
+               else\r
+                       accessWidget.setText(tr("Read Only"));\r
+               table.setItem(row, 1,accessWidget);\r
+               accessWidget.setFlags(flags);\r
+\r
+               QTableWidgetItem loginWidget = new QTableWidgetItem();\r
+               if (login)\r
+                       loginWidget.setText(tr("True"));\r
+               else\r
+                       loginWidget.setText(tr("False"));\r
+               table.setItem(row, 2, loginWidget);\r
+               loginWidget.setFlags(flags);\r
+               \r
+\r
+       }\r
+       \r
+       @SuppressWarnings("unused")\r
+       private void tableSelection() {\r
+               if (syncRunner.authToken != null)\r
+                       deleteButton.setEnabled(true);\r
+       }\r
+       \r
+       \r
+       @SuppressWarnings("unused")\r
+       private void addPressed() {\r
+\r
+               \r
+       }\r
+       \r
+       \r
+       @SuppressWarnings("unused")\r
+       private void deletePressed() {\r
+               QModelIndex index = table.currentIndex();\r
+               int row = index.row();\r
+               \r
+               QTableWidgetItem dirWidget = table.item(row, 0);\r
+               String value = dirWidget.text();\r
+               List<SharedNotebook> notebooks = conn.getSharedNotebookTable().getForNotebook(notebook.getGuid());\r
+               \r
+               List<Long> ids = new ArrayList<Long>();\r
+               for (int i=0; i<notebooks.size(); i++) {\r
+                       if (notebooks.get(i).getEmail().equalsIgnoreCase(value)) {\r
+                               ids.add(notebooks.get(i).getId());\r
+                       }\r
+               }\r
+               \r
+               if (ids.size() > 0) {\r
+                       try {\r
+                               syncRunner.noteStore.expungeSharedNotebooks(syncRunner.authToken, ids);\r
+                       } catch (EDAMUserException e) {\r
+                               e.printStackTrace();\r
+                       } catch (EDAMNotFoundException e) {\r
+                               e.printStackTrace();\r
+                       } catch (EDAMSystemException e) {\r
+                               e.printStackTrace();\r
+                       } catch (TException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+                       for (int i=0; i<ids.size(); i++)\r
+                               conn.getSharedNotebookTable().expungeNotebook(ids.get(i), false);\r
+               }\r
+               \r
+               table.clear();\r
+               load();\r
+               if (table.rowCount() == 0) {\r
+                       deleteButton.setEnabled(false);\r
+               }               \r
+       }\r
+}\r
index f17c303..2e73965 100644 (file)
@@ -101,6 +101,8 @@ public class MainMenuBar extends QMenuBar {
        public QAction                  notebookEditAction;                     // Edit the selected notebook\r
        public QAction                  notebookAddAction;                      // Add a new notebook\r
        public QAction                  notebookDeleteAction;           // Delete a notebook\r
+       public QAction                  notebookPublishAction;          // Publish a notebook\r
+       public QAction                  notebookShareAction;            // Share a notebook with others\r
        public QAction                  notebookCloseAction;            // Close notebooks\r
        public QAction                  notebookIconAction;                     // Change the icon\r
        public QAction                  notebookStackAction;            // Stack/Unstack the icon.\r
@@ -450,6 +452,17 @@ public class MainMenuBar extends QMenuBar {
                notebookDeleteAction.triggered.connect(parent, "deleteNotebook()");\r
                setupShortcut(notebookDeleteAction, "File_Notebook_Delete");\r
                \r
+               notebookPublishAction = new QAction(tr("Share With The World"), this);\r
+               notebookPublishAction.setEnabled(false);\r
+               notebookPublishAction.triggered.connect(parent, "publishNotebook()");\r
+               setupShortcut(notebookPublishAction, "File_Notebook_Publish");\r
+\r
+               notebookShareAction = new QAction(tr("Share With Individuals"), this);\r
+               notebookShareAction.setEnabled(false);\r
+               notebookShareAction.triggered.connect(parent, "shareNotebook()");\r
+               setupShortcut(notebookShareAction, "File_Notebook_Share");\r
+               \r
+               \r
                notebookCloseAction = new QAction(tr("Open/Close Notebooks"), this);\r
                notebookCloseAction.setEnabled(true);\r
                notebookCloseAction.triggered.connect(parent, "closeNotebooks()");\r
@@ -674,6 +687,9 @@ public class MainMenuBar extends QMenuBar {
                notebookMenu.addAction(notebookEditAction);\r
                notebookMenu.addAction(notebookDeleteAction);\r
                notebookMenu.addSeparator();\r
+               notebookMenu.addAction(notebookPublishAction);\r
+               notebookMenu.addAction(notebookShareAction);\r
+               notebookMenu.addSeparator();\r
                notebookMenu.addAction(notebookStackAction);\r
                notebookMenu.addAction(notebookCloseAction);\r
                notebookMenu.addSeparator();\r
index e0d9763..cd69f97 100644 (file)
@@ -53,6 +53,8 @@ public class NotebookTreeWidget extends QTreeWidget {
        private QAction                                 editAction;\r
        private QAction                                 iconAction;\r
        private QAction                                 stackAction;\r
+       private QAction                                 publishAction;\r
+       private QAction                                 shareAction;\r
        public NoteSignal                               noteSignal;\r
        private HashMap<String, QIcon>  icons;\r
        private final DatabaseConnection                db;\r
@@ -64,6 +66,14 @@ public class NotebookTreeWidget extends QTreeWidget {
                addAction = a;\r
        }\r
        \r
+       public void setPublishAction(QAction p) {\r
+               publishAction = p;\r
+       }\r
+       \r
+       public void setShareAction(QAction s) {\r
+               shareAction = s;\r
+       }\r
+       \r
        public void setDeleteAction(QAction d) {\r
                deleteAction = d;\r
        }\r
@@ -306,6 +316,9 @@ public class NotebookTreeWidget extends QTreeWidget {
                menu.addAction(deleteAction);\r
                menu.addAction(stackAction);\r
                menu.addSeparator();\r
+               menu.addAction(publishAction);\r
+               menu.addAction(shareAction);\r
+               menu.addSeparator();\r
                menu.addAction(iconAction);\r
                menu.exec(event.globalPos());\r
        }\r
index 6d9eab6..50bd215 100644 (file)
@@ -42,6 +42,7 @@ public class DatabaseConnection {
        private InvalidXMLTable                         invalidXMLTable;
        private LinkedNotebookTable                     linkedNotebookTable;
        private SharedNotebookTable                     sharedNotebookTable;
+       private InkImagesTable                          inkImagesTable;
        private SyncTable                                       syncTable;
        private SystemIconTable                         systemIconTable;
        private final ApplicationLogger         logger;
@@ -67,6 +68,7 @@ public class DatabaseConnection {
                linkedNotebookTable = new LinkedNotebookTable(logger, this);
                sharedNotebookTable = new SharedNotebookTable(logger, this);
                systemIconTable = new SystemIconTable(logger, this);
+               inkImagesTable = new InkImagesTable(logger, this);
        }
        
        
@@ -165,11 +167,15 @@ public class DatabaseConnection {
                        sharedNotebookTable.createTable();
                        linkedNotebookTable.createTable();
                        systemIconTable.createTable();
+                       inkImagesTable.createTable();
                        
                        version = "0.95";
                        executeSql("Insert into Sync (key, value) values ('FullNotebookSync', 'true')");
                        executeSql("Insert into Sync (key, value) values ('FullLinkedNotebookSync', 'true')");
                        executeSql("Insert into Sync (key, value) values ('FullSharedNotebookSync', 'true')");
+                       executeSql("Insert into Sync (key, value) values ('FullInkNoteImageSync', 'true')");
+                       executeSql("Update note set indexneeded='true'");
+                       executeSql("Update noteresources set indexneeded='true'");
                        Global.setDatabaseVersion(version);
                } 
        }
@@ -201,14 +207,15 @@ public class DatabaseConnection {
                Global.saveUploadAmount(0);
                
                getTagTable().createTable();
-               notebookTable.createTable();
+               notebookTable.createTable(true);
                noteTable.createTable();
                deletedTable.createTable();             
                searchTable.createTable();
                watchFolderTable.createTable();
                invalidXMLTable.createTable();
                wordsTable.createTable();
-               syncTable.createTable();                
+               syncTable.createTable();
+               inkImagesTable.createTable();
        }
        
        public Connection getConnection() {
@@ -254,4 +261,7 @@ public class DatabaseConnection {
        public SystemIconTable getSystemIconTable() {
                return systemIconTable;
        }
+       public InkImagesTable getInkImagesTable() {
+               return inkImagesTable;
+       }
 }
diff --git a/src/cx/fbn/nevernote/sql/InkImagesTable.java b/src/cx/fbn/nevernote/sql/InkImagesTable.java
new file mode 100644 (file)
index 0000000..1dc2a03
--- /dev/null
@@ -0,0 +1,114 @@
+/*\r
+ * This file is part of NeverNote \r
+ * Copyright 2009 Randy Baumgarte\r
+ * \r
+ * This file may be licensed under the terms of of the\r
+ * GNU General Public License Version 2 (the ``GPL'').\r
+ *\r
+ * Software distributed under the License is distributed\r
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
+ * express or implied. See the GPL for the specific language\r
+ * governing rights and limitations.\r
+ *\r
+ * You should have received a copy of the GPL along with this\r
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
+ * or write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
+ *\r
+*/\r
+\r
+\r
+package cx.fbn.nevernote.sql;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.trolltech.qt.core.QByteArray;\r
+\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
+\r
+public class InkImagesTable {\r
+       private final ApplicationLogger                 logger;\r
+       DatabaseConnection                                              db;\r
+\r
+       // Constructor\r
+       public InkImagesTable(ApplicationLogger l,DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
+       }\r
+       // Create the table\r
+       public void createTable() {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        // Create the NoteTag table\r
+        logger.log(logger.HIGH, "Creating table InkImage...");\r
+        if (!query.exec("Create table InkImages (guid varchar, " +\r
+                       "slice integer, primary key(guid, slice), image blob)"))\r
+               logger.log(logger.HIGH, "Table InkImage creation FAILED!!!"); \r
+       }\r
+       // Drop the table\r
+       public void dropTable() {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("drop table InkImages");\r
+       }\r
+       // Delete an image\r
+       public void expungeImage(String guid) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.prepare("Delete from InkImages where guid=:guid ")) {\r
+                       logger.log(logger.EXTREME, "InkImage SQL prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return;\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.EXTREME, "InkImage SQL delete has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return;\r
+               }\r
+               return;         \r
+       }\r
+       // Get a note tags by the note's Guid\r
+       public List<QByteArray> getImage(String guid) {\r
+               List<QByteArray> data = new ArrayList<QByteArray>();\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.prepare("Select image from InkImages where guid = :guid order by slice")) {\r
+                       logger.log(logger.EXTREME, "InkImage SQL prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.EXTREME, "InkImage SQL exec has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               while (query.next()) {\r
+                       data.add(new QByteArray(query.getBlob(0)));     \r
+               }       \r
+               return data;\r
+       }\r
+       // Save an ink note image\r
+       public void saveImage(String guid, int slice, QByteArray data) {\r
+               logger.log(logger.HIGH, "Entering inkImageTable.saveImage");\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Insert Into InkImages ("\r
+                               +"guid, slice, image) Values("\r
+                               +":guid, :slice, :data)");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "InkImages SQL insert prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return;\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":slice", slice);\r
+               query.bindBlob(":data", data.toByteArray());                                            \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "*** InkImages Table insert failed.");                \r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }                       \r
+               logger.log(logger.HIGH, "Leaving InkImages.saveImage");\r
+       }\r
+\r
+}\r
index 71a1633..b5a32bb 100644 (file)
@@ -49,6 +49,8 @@ public class LinkedNotebookTable {
                        "shareKey VarChar, " +\r
                        "uri VarChar, " +\r
                        "updateSequenceNumber Long," +\r
+                       "lastSequenceNumber Long," +\r
+                       "lastSequenceDate timestamp," +\r
                        "icon blob, " +\r
                        "isDirty boolean)"))                            \r
                logger.log(logger.HIGH, "Table LinkedNotebook creation FAILED!!!");   \r
@@ -64,10 +66,11 @@ public class LinkedNotebookTable {
                \r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                check = query.prepare("Insert Into LinkedNotebook (guid, shareName, username,  "\r
-                               +"shardId, shareKey, uri, updateSequenceNumber, isDirty) "   \r
+                               +"shardId, shareKey, uri, updateSequenceNumber, isDirty, lastSequenceNumber, "\r
+                               + "lastSequenceDate) "   \r
                                + " Values("\r
                                +":guid, :shareName, :username, "\r
-                               +":shardId, :shareKey, :uri,:usn, :isDirty)");\r
+                               +":shardId, :shareKey, :uri,:usn, :isDirty, 0, '1969-12-31 19.00.00')");\r
                query.bindValue(":guid", tempNotebook.getGuid());\r
                query.bindValue(":shareName", tempNotebook.getShareName());\r
                query.bindValue(":username", tempNotebook.getUsername());\r
index 25bd0d5..c418243 100644 (file)
@@ -109,7 +109,19 @@ public class NoteResourceTable  {
                return guids;   \r
        }\r
 \r
-\r
+       public List<String> findInkNotes() {\r
+               List<String> guids = new ArrayList<String>();\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Select guid from noteresources where mime='application/vnd.evernote.ink'");\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error searching for ink notes. " +query.lastError());\r
+               \r
+               while (query.next()) {\r
+                       guids.add(query.valueString(0));\r
+               }\r
+               return guids;\r
+       }\r
        \r
        public void saveNoteResource(Resource r, boolean isDirty) {\r
                logger.log(logger.HIGH, "Entering DBRunner.saveNoteResources");\r
@@ -195,6 +207,11 @@ 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
+\r
        }\r
 \r
        \r
index 647967e..b60b02d 100644 (file)
@@ -44,18 +44,20 @@ import cx.fbn.nevernote.utilities.Pair;
 public class NotebookTable {\r
        \r
        private final ApplicationLogger                 logger;\r
-       DatabaseConnection                                                      db;\r
+       DatabaseConnection                                              db;\r
+       private final String                                    dbName;\r
        \r
        // Constructor\r
        public NotebookTable(ApplicationLogger l, DatabaseConnection d) {\r
                logger = l;\r
                db = d;\r
+               dbName = "Notebook";\r
        }\r
        // Create the table\r
-       public void createTable() {\r
+       public void createTable(boolean addDefault) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        logger.log(logger.HIGH, "Creating table Notebook...");\r
-        if (!query.exec("Create table Notebook (guid varchar primary key, " +\r
+        logger.log(logger.HIGH, "Creating table "+dbName+"...");\r
+        if (!query.exec("Create table "+dbName+" (guid varchar primary key, " +\r
                        "sequence integer, " +\r
                        "name varchar, "+\r
                        "defaultNotebook varchar, "+\r
@@ -66,17 +68,20 @@ public class NotebookTable {
                        "autoEncrypt boolean, "+\r
                        "local boolean, "+\r
                        "archived boolean)"))                           \r
-               logger.log(logger.HIGH, "Table Notebook creation FAILED!!!");   \r
+               logger.log(logger.HIGH, "Table "+dbName+" creation FAILED!!!");   \r
         Notebook newnote = new Notebook();\r
         newnote.setDefaultNotebook(true);\r
         newnote.setName("My Notebook");\r
         newnote.setPublished(false);\r
         newnote.setGuid("1");\r
         \r
+        if (!addDefault)\r
+               return;\r
+               \r
         // Setup an initial notebook\r
                SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
         query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
+               query.prepare("Insert Into "+dbName+" (guid, sequence, name, defaultNotebook, "\r
                                +"serviceCreated, serviceUpdated, published, "   \r
                                + "isDirty, autoEncrypt, " \r
                                + "local, archived) Values("\r
@@ -103,7 +108,7 @@ public class NotebookTable {
 \r
                boolean check = query.exec();\r
                if (!check) {\r
-                       logger.log(logger.MEDIUM, "Initial Notebook Table insert failed.");\r
+                       logger.log(logger.MEDIUM, "Initial "+dbName+" Table insert failed.");\r
                        logger.log(logger.MEDIUM, query.lastError().toString());\r
                }\r
 \r
@@ -112,7 +117,7 @@ public class NotebookTable {
        // Drop the table\r
        public void dropTable() {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table Notebook");\r
+               query.exec("Drop table "+dbName);\r
        }\r
        // Save an individual notebook\r
        public void addNotebook(Notebook tempNotebook, boolean isDirty, boolean local) {\r
@@ -120,12 +125,14 @@ public class NotebookTable {
                \r
                SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
+               check = query.prepare("Insert Into "+dbName+" (guid, sequence, name, defaultNotebook, "\r
                                +"serviceCreated, serviceUpdated, published, "   \r
+                               + "publishingUri, publishingOrder, publishingAscending, publishingPublicDescription, "\r
                                + "isDirty, autoEncrypt, stack, " \r
                                + "local, archived, readOnly) Values("\r
                                +":guid, :sequence, :name, :defaultNotebook,  "\r
                                +":serviceCreated, :serviceUpdated, :published, "\r
+                               +":publishingUri, :publishingOrder, :publishingAscending, :publishingPublicDescription, "\r
                                +":isDirty, :autoEncrypt, "\r
                                +":stack, :local, false, false)");\r
                query.bindValue(":guid", tempNotebook.getGuid());\r
@@ -141,6 +148,19 @@ public class NotebookTable {
                query.bindValue(":serviceUpdated", serviceCreated.toString());\r
                query.bindValue(":published",tempNotebook.isPublished());\r
                \r
+               if (tempNotebook.isPublished() && tempNotebook.getPublishing() != null) {\r
+                       Publishing p = tempNotebook.getPublishing();\r
+                       query.bindValue(":publishingUri", p.getUri());\r
+                       query.bindValue(":publishingOrder", p.getOrder().getValue());\r
+                       query.bindValue(":publishingAscending", p.isAscending());\r
+                       query.bindValue(":publishingPublicDescription", p.getPublicDescription());\r
+               } else {\r
+                       query.bindValue(":publishingUri", "");\r
+                       query.bindValue(":publishingOrder", 1);\r
+                       query.bindValue(":publishingAscending", 1);\r
+                       query.bindValue(":publishingPublicDescription", "");\r
+               }\r
+               \r
                if (isDirty)\r
                        query.bindValue(":isDirty", true);\r
                else\r
@@ -151,7 +171,7 @@ public class NotebookTable {
 \r
                check = query.exec();\r
                if (!check) {\r
-                       logger.log(logger.MEDIUM, "Notebook Table insert failed.");\r
+                       logger.log(logger.MEDIUM, ""+dbName+" Table insert failed.");\r
                        logger.log(logger.MEDIUM, query.lastError().toString());\r
                }\r
        }\r
@@ -160,21 +180,20 @@ public class NotebookTable {
                boolean check;\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
 \r
-               check = query.prepare("delete from Notebook "\r
-                               +"where guid=:guid");\r
+               check = query.prepare("delete from "+dbName+" where guid=:guid");\r
                if (!check) {\r
-                       logger.log(logger.EXTREME, "Notebook SQL delete prepare has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL delete prepare has failed.");\r
                        logger.log(logger.EXTREME, query.lastError().toString());\r
                }\r
                query.bindValue(":guid", guid);\r
                check = query.exec();\r
                if (!check) \r
-                       logger.log(logger.MEDIUM, "Notebook delete failed.");\r
+                       logger.log(logger.MEDIUM, dbName+" delete failed.");\r
                \r
                // Signal the parent that work needs to be done\r
                if  (needsSync) {\r
                        DeletedTable deletedTable = new DeletedTable(logger, db);\r
-                       deletedTable.addDeletedItem(guid, "Notebook");\r
+                       deletedTable.addDeletedItem(guid, dbName);\r
                }\r
        }\r
        // Update a notebook\r
@@ -184,7 +203,7 @@ public class NotebookTable {
                SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
                \r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Notebook set sequence=:sequence, name=:name, defaultNotebook=:defaultNotebook, " +\r
+               check = query.prepare("Update "+dbName+" set sequence=:sequence, name=:name, defaultNotebook=:defaultNotebook, " +\r
                                "serviceCreated=:serviceCreated, serviceUpdated=:serviceUpdated, "+\r
                                "published=:published, isDirty=:isDirty, publishinguri=:uri, "+\r
                                "publishingOrder=:order, " + \r
@@ -220,7 +239,7 @@ public class NotebookTable {
                \r
                check = query.exec();\r
                if (!check) {\r
-                       logger.log(logger.MEDIUM, "Notebook Table update failed.");\r
+                       logger.log(logger.MEDIUM, dbName+" Table update failed.");\r
                        logger.log(logger.MEDIUM, query.lastError().toString());\r
                }\r
        }\r
@@ -236,9 +255,9 @@ public class NotebookTable {
                                "serviceCreated, "+\r
                                "serviceUpdated, "+\r
                                "published, stack, publishinguri, publishingascending, publishingPublicDescription, "+\r
-                               "publishingOrder from Notebook order by name");\r
+                               "publishingOrder from "+dbName+" order by name");\r
                if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL retrieve has failed.");\r
                while (query.next()) {\r
                        tempNotebook = new Notebook();\r
                        tempNotebook.setGuid(query.valueString(0));\r
@@ -279,9 +298,9 @@ public class NotebookTable {
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                                        \r
                check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
-                               "serviceCreated, serviceUpdated, published, stack from Notebook where local=true order by name");\r
+                               "serviceCreated, serviceUpdated, published, stack from "+dbName+" where local=true order by name");\r
                if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL retrieve has failed.");\r
                while (query.next()) {\r
                        tempNotebook = new Notebook();\r
                        tempNotebook.setGuid(query.valueString(0));\r
@@ -306,9 +325,9 @@ public class NotebookTable {
        public void setArchived(String guid, boolean val) {\r
                boolean check;                  \r
         NSqlQuery query = new NSqlQuery(db.getConnection());                                   \r
-               check = query.prepare("Update notebook set archived=:archived where guid=:guid");\r
+               check = query.prepare("Update "+dbName+" set archived=:archived where guid=:guid");\r
                if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL archive update has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL archive update has failed.");\r
                query.bindValue(":guid", guid);\r
                query.bindValue(":archived", val);\r
                query.exec();\r
@@ -325,9 +344,9 @@ public class NotebookTable {
                                "serviceCreated, serviceUpdated, published, stack "+\r
                                "publishinguri, publishingascending, publishingPublicDescription, "+\r
                                "publishingOrder " +\r
-                               "from Notebook where archived=true order by name");\r
+                               "from "+dbName+" where archived=true order by name");\r
                if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL retrieve has failed.");\r
                while (query.next()) {\r
                        tempNotebook = new Notebook();\r
                        tempNotebook.setGuid(query.valueString(0));\r
@@ -363,7 +382,7 @@ public class NotebookTable {
        public boolean isNotebookLocal(String guid) {\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Select local from Notebook where guid=:guid");\r
+               query.prepare("Select local from "+dbName+" where guid=:guid");\r
                query.bindValue(":guid", guid);\r
                query.exec();\r
                if (!query.next()) {\r
@@ -375,7 +394,7 @@ public class NotebookTable {
        public boolean isReadOnly(String guid) {\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Select readOnly from Notebook where guid=:guid");\r
+               query.prepare("Select readOnly from "+dbName+" where guid=:guid and readOnly='true'");\r
                query.bindValue(":guid", guid);\r
                query.exec();\r
                if (!query.next()) {\r
@@ -388,23 +407,23 @@ public class NotebookTable {
        public void updateNotebookSequence(String guid, int sequence) {\r
                boolean check;\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Notebook set sequence=:sequence where guid=:guid");\r
+               check = query.prepare("Update "+dbName+" set sequence=:sequence where guid=:guid");\r
                query.bindValue(":guid", guid);\r
                query.bindValue(":sequence", sequence);\r
                query.exec();\r
                if (!check) {\r
-                       logger.log(logger.MEDIUM, "Notebook sequence update failed.");\r
+                       logger.log(logger.MEDIUM, dbName+" sequence update failed.");\r
                        logger.log(logger.MEDIUM, query.lastError());\r
                } \r
        }\r
        // Update a notebook GUID number\r
        public void updateNotebookGuid(String oldGuid, String newGuid) {\r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Update Notebook set guid=:newGuid where guid=:oldGuid");\r
+               query.prepare("Update "+dbName+" set guid=:newGuid where guid=:oldGuid");\r
                query.bindValue(":oldGuid", oldGuid);\r
                query.bindValue(":newGuid", newGuid);\r
                if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Notebook guid update failed.");\r
+                       logger.log(logger.MEDIUM, dbName+" guid update failed.");\r
                        logger.log(logger.MEDIUM, query.lastError());\r
                } \r
                \r
@@ -413,7 +432,7 @@ public class NotebookTable {
                query.bindValue(":oldGuid", oldGuid);\r
                query.bindValue(":newGuid", newGuid);\r
                if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Notebook guid update for note failed.");\r
+                       logger.log(logger.MEDIUM, dbName+" guid update for note failed.");\r
                        logger.log(logger.MEDIUM, query.lastError());\r
                } \r
                \r
@@ -437,12 +456,12 @@ public class NotebookTable {
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                                        \r
                check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
-                               "serviceCreated, serviceUpdated, published, stack "+\r
+                               "serviceCreated, serviceUpdated, published, stack, "+\r
                                "publishinguri, publishingascending, publishingPublicDescription, "+\r
                                "publishingOrder " +\r
-                               "from Notebook where isDirty = true and local=false");\r
+                               "from "+dbName+" where isDirty = true and local=false");\r
                if (!check) \r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL retrieve has failed.");\r
                while (query.next()) {\r
                        tempNotebook = new Notebook();\r
                        tempNotebook.setGuid(query.valueString(0));\r
@@ -467,6 +486,8 @@ public class NotebookTable {
                                p.setAscending(query.valueBoolean(9, false));\r
                                p.setPublicDescription(query.valueString(10));\r
                                p.setOrder(NoteSortOrder.findByValue(query.valueInteger(11)));\r
+                               if (p.getPublicDescription().trim().equalsIgnoreCase(""))\r
+                                       p.setPublicDescription(null);\r
                                tempNotebook.setPublishing(p);\r
                        }\r
                        \r
@@ -487,10 +508,10 @@ public class NotebookTable {
                \r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Select guid from notebook where guid=:guid");\r
+               query.prepare("Select guid from "+dbName+" where guid=:guid");\r
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL retrieve has failed.");\r
                boolean retval = query.next();\r
                return retval;\r
        }\r
@@ -498,22 +519,22 @@ public class NotebookTable {
        public void  resetDirtyFlag(String guid) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Update notebook set isdirty='false' where guid=:guid");\r
+               query.prepare("Update "+dbName+" set isdirty='false' where guid=:guid");\r
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error resetting notebook dirty field.");\r
+                       logger.log(logger.EXTREME, "Error resetting "+dbName+" dirty field.");\r
        }\r
        // Set the default notebook\r
        public void setDefaultNotebook(String guid) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Update notebook set defaultNotebook=false");\r
+               query.prepare("Update "+dbName+" set defaultNotebook=false");\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error removing default notebook.");\r
-               query.prepare("Update notebook set defaultNotebook=true where guid = :guid");\r
+                       logger.log(logger.EXTREME, "Error removing default "+dbName+".");\r
+               query.prepare("Update "+dbName+" set defaultNotebook=true where guid = :guid");\r
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error setting default notebook.");\r
+                       logger.log(logger.EXTREME, "Error setting default "+dbName+".");\r
        }\r
        \r
        // Get a list of all icons\r
@@ -521,8 +542,8 @@ public class NotebookTable {
                HashMap<String, QIcon> values = new HashMap<String, QIcon>();\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
        \r
-               if (!query.exec("SELECT guid, icon from notebook where ARCHIVED  != true"))\r
-                       logger.log(logger.EXTREME, "Error executing notebook getAllIcons select.");\r
+               if (!query.exec("SELECT guid, icon from "+dbName+" where ARCHIVED  != true"))\r
+                       logger.log(logger.EXTREME, "Error executing "+dbName+" getAllIcons select.");\r
                while (query.next()) {\r
                        if (query.getBlob(1) != null) {\r
                                String guid = query.valueString(0);\r
@@ -538,11 +559,11 @@ public class NotebookTable {
        public QIcon getIcon(String guid) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               if (!query.prepare("Select icon from notebook where guid=:guid"))\r
-                       logger.log(logger.EXTREME, "Error preparing notebook icon select.");\r
+               if (!query.prepare("Select icon from "+dbName+" where guid=:guid"))\r
+                       logger.log(logger.EXTREME, "Error preparing "+dbName+" icon select.");\r
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error finding notebook icon.");\r
+                       logger.log(logger.EXTREME, "Error finding "+dbName+" icon.");\r
                if (!query.next() || query.getBlob(0) == null)\r
                        return null;\r
                \r
@@ -554,11 +575,11 @@ public class NotebookTable {
        public QByteArray getIconAsByteArray(String guid) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               if (!query.prepare("Select icon from notebook where guid=:guid"))\r
-                       logger.log(logger.EXTREME, "Error preparing notebook icon select.");\r
+               if (!query.prepare("Select icon from "+dbName+" where guid=:guid"))\r
+                       logger.log(logger.EXTREME, "Error preparing "+dbName+" icon select.");\r
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error finding notebook icon.");\r
+                       logger.log(logger.EXTREME, "Error finding "+dbName+" icon.");\r
                if (!query.next() || query.getBlob(0) == null)\r
                        return null;\r
                \r
@@ -569,11 +590,11 @@ public class NotebookTable {
        public void setIcon(String guid, QIcon icon, String type) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                if (icon == null) {\r
-                       if (!query.prepare("update notebook set icon=null where guid=:guid"))\r
-                               logger.log(logger.EXTREME, "Error preparing notebook icon select.");\r
+                       if (!query.prepare("update "+dbName+" set icon=null where guid=:guid"))\r
+                               logger.log(logger.EXTREME, "Error preparing "+dbName+" icon select.");\r
                } else {\r
-                       if (!query.prepare("update notebook set icon=:icon where guid=:guid"))\r
-                               logger.log(logger.EXTREME, "Error preparing notebook icon select.");\r
+                       if (!query.prepare("update "+dbName+" set icon=:icon where guid=:guid"))\r
+                               logger.log(logger.EXTREME, "Error preparing "+dbName+" icon select.");\r
                        QBuffer buffer = new QBuffer();\r
                if (!buffer.open(QIODevice.OpenModeFlag.ReadWrite)) {\r
                        logger.log(logger.EXTREME, "Failure to open buffer.  Aborting.");\r
@@ -591,17 +612,17 @@ public class NotebookTable {
                }\r
                query.bindValue(":guid", guid);\r
                if (!query.exec()) \r
-                       logger.log(logger.LOW, "Error setting notebook icon. " +query.lastError());\r
+                       logger.log(logger.LOW, "Error setting "+dbName+" icon. " +query.lastError());\r
        }\r
        // Set the notebooks custom icon\r
        public void setReadOnly(String guid, boolean readOnly) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.prepare("update notebook set readOnly=:readOnly where guid=:guid"))\r
-                       logger.log(logger.EXTREME, "Error preparing notebook read only.");\r
+               if (!query.prepare("update "+dbName+" set readOnly=:readOnly where guid=:guid"))\r
+                       logger.log(logger.EXTREME, "Error preparing "+dbName+" read only.");\r
                query.bindValue(":guid", guid);\r
                query.bindValue(":readOnly", readOnly);\r
                if (!query.exec()) \r
-                       logger.log(logger.LOW, "Error setting notebook read only. " +query.lastError());\r
+                       logger.log(logger.LOW, "Error setting "+dbName+" read only. " +query.lastError());\r
        }\r
 \r
        // does a record exist?\r
@@ -609,10 +630,10 @@ public class NotebookTable {
                \r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Select guid from notebook where name=:newname");\r
+               query.prepare("Select guid from "+dbName+" where name=:newname");\r
                query.bindValue(":newname", newname);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
+                       logger.log(logger.EXTREME, dbName+" SQL retrieve has failed.");\r
                String val = null;\r
                if (query.next())\r
                        val = query.valueString(0);\r
@@ -622,7 +643,7 @@ public class NotebookTable {
        public List<Pair<String,Integer>> getNotebookCounts() {\r
                List<Pair<String,Integer>> counts = new ArrayList<Pair<String,Integer>>();              \r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("select notebookGuid, count(guid) from note where active=1 group by notebookguid;")) {\r
+               if (!query.exec("select notebookGuid, count(guid) from "+dbName+" where active=1 group by notebookguid;")) {\r
                        logger.log(logger.EXTREME, "NoteTags SQL getTagCounts has failed.");\r
                        logger.log(logger.MEDIUM, query.lastError());\r
                        return null;\r
@@ -640,16 +661,16 @@ public class NotebookTable {
        public void clearStack(String guid) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Update notebook set stack='' where guid=:guid");\r
+               query.prepare("Update "+dbName+" set stack='' where guid=:guid");\r
                query.bindValue(":guid", guid);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error clearing notebook stack.");\r
+                       logger.log(logger.EXTREME, "Error clearing "+dbName+" stack.");\r
        }\r
        // Get/Set stacks\r
        public void setStack(String guid, String stack) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Update notebook set stack=:stack, isDirty=true where guid=:guid");\r
+               query.prepare("Update "+dbName+" set stack=:stack, isDirty=true where guid=:guid");\r
                query.bindValue(":guid", guid);\r
                query.bindValue(":stack", stack);\r
                if (!query.exec())\r
@@ -660,7 +681,7 @@ public class NotebookTable {
                List<String> stacks = new ArrayList<String>();\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               if (!query.exec("Select distinct stack from notebook")) {\r
+               if (!query.exec("Select distinct stack from "+dbName)) {\r
                        logger.log(logger.EXTREME, "Error getting all stack names.");\r
                        return null;\r
                }\r
@@ -675,7 +696,7 @@ public class NotebookTable {
        public void renameStacks(String oldName, String newName) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               if (!query.prepare("update notebook set stack=:newName where stack=:oldName")) {\r
+               if (!query.prepare("update "+dbName+" set stack=:newName where stack=:oldName")) {\r
                        logger.log(logger.EXTREME, "Error preparing in renameStacks.");\r
                        return;\r
                }\r
@@ -702,14 +723,33 @@ public class NotebookTable {
        public boolean stackExists(String stack) {\r
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
-               query.prepare("Select guid from notebook where stack=:stack limit 1");\r
+               query.prepare("Select guid from "+dbName+" where stack=:stack limit 1");\r
                query.bindValue(":stack", stack);\r
                if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error setting notebook stack.");\r
+                       logger.log(logger.EXTREME, "Error setting "+dbName+" stack.");\r
                if (query.next())\r
                        return true;\r
                else\r
                        return false;\r
        }\r
+       // Set Publishing\r
+       public void setPublishing(String guid, boolean published, Publishing p) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               \r
+               query.prepare("Update "+dbName+" set publishingPublicDescription=:publishingPublicDescription, " +\r
+                               "publishingUri=:publishingUri, publishingOrder=:publishingOrder, published=:published, "+\r
+                               "publishingAscending=:publishingAscending, isdirty=true where "+\r
+                               "guid=:guid");\r
+               query.bindValue(":publishingPublicDescription", p.getPublicDescription());\r
+               query.bindValue(":publishingUri", p.getUri());\r
+                               query.bindValue(":publishingOrder", p.getOrder().getValue());\r
+               query.bindValue(":publishingAscending", p.isAscending());\r
+               query.bindValue(":publishingPublicDescription", p.getPublicDescription());\r
+               query.bindValue(":published", published);\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error setting "+dbName+" stack.");\r
+       }\r
 }\r
 \r
index aed7f46..4a5857e 100644 (file)
@@ -147,9 +147,10 @@ public class SharedNotebookTable {
                \r
                SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
                \r
+               StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                                              \r
         NSqlQuery query = new NSqlQuery(db.getConnection());\r
                check = query.prepare("Update SharedNotebook set id=:id, userid=:userid, notebookGuid=:notebook, "\r
-                               + "email=:email, notebookModifiable=:mod, requireLogin=:rlogin, serviceCreated=:created, "\r
+                               + "email=:email, notebookModifiable=:mod, requireLogin=:rlogin, serviceCreated=:serviceCreated, "\r
                                + "shareKey=:shareKey, username=:username, isDirty=:isdirty");\r
                query.bindValue(":id", tempNotebook.getId());\r
                query.bindValue(":userid", tempNotebook.getUserId());\r
@@ -157,11 +158,9 @@ public class SharedNotebookTable {
                query.bindValue(":email", tempNotebook.getEmail());\r
                query.bindValue(":mod", tempNotebook.isNotebookModifiable());\r
                query.bindValue(":rlogin", tempNotebook.isRequireLogin());\r
+               query.bindValue(":serviceCreated", serviceCreated.toString());\r
                query.bindValue(":shareKey", tempNotebook.getShareKey());\r
                query.bindValue(":username", tempNotebook.getUsername());\r
-\r
-               StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                                              \r
-               query.bindValue(":serviceCreated", serviceCreated.toString());\r
                \r
                query.bindValue(":isDirty", isDirty);\r
                \r
@@ -209,6 +208,49 @@ public class SharedNotebookTable {
                return index;\r
        }                       \r
 \r
+       // Load notebooks from the database\r
+       public List<SharedNotebook> getForNotebook(String guid) {\r
+               SharedNotebook tempNotebook;\r
+               List<SharedNotebook> index = new ArrayList<SharedNotebook>();\r
+               boolean check;\r
+                                       \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("Select id, userid, notebookGuid, email, notebookModifiable, requireLogin, " +\r
+                               "serviceCreated, "+\r
+                               "shareKey, username from SharedNotebook where notebookGuid=:notebookGuid ");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "SharedNotebook getForNotebook SQL prepare has failed.");\r
+               query.bindValue(":notebookGuid", guid);\r
+               check = query.exec();\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "SharedNotebook getForNotebook SQL exec has failed.");\r
+               \r
+               while (query.next()) {\r
+                       tempNotebook = new SharedNotebook();\r
+                       tempNotebook.setId(query.valueLong(0));\r
+                       tempNotebook.setUserId(query.valueInteger(1));\r
+                       tempNotebook.setNotebookGuid(query.valueString(2));\r
+                       tempNotebook.setEmail(query.valueString(3));\r
+                       tempNotebook.setNotebookModifiable(query.valueBoolean(4,false));\r
+                       tempNotebook.setRequireLogin(query.valueBoolean(5,true));\r
+                       DateFormat indfm = null;\r
+                       try {\r
+                               indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
+                       } catch (Exception e) { }\r
+                       try {\r
+                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(6)).getTime());\r
+                       } catch (ParseException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+                       tempNotebook.setShareKey(query.valueString(7));\r
+                       tempNotebook.setUsername(query.valueString(8));\r
+\r
+                       index.add(tempNotebook); \r
+               }       \r
+               return index;\r
+       }                       \r
+\r
        \r
        // Get a list of shared notebooks that need to be updated\r
        public List <Long> getDirtyIds() {\r
index 28f7b7b..786d267 100644 (file)
@@ -130,7 +130,9 @@ public class WordsTable {
                insertWords.bindValue(":guid", guid);\r
                insertWords.bindValue(":weight", weight);\r
                insertWords.bindValue(":type", type);\r
-               insertWords.exec();\r
+               if (!insertWords.exec()) {\r
+                       String err = insertWords.lastError();\r
+               }\r
        }\r
 \r
 \r
index 1db1fda..29a2afb 100644 (file)
 */\r
 package cx.fbn.nevernote.threads;\r
 \r
+import java.io.BufferedOutputStream;\r
+import java.io.File;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.UnsupportedEncodingException;\r
 import java.net.UnknownHostException;\r
 import java.util.ArrayList;\r
 import java.util.Calendar;\r
@@ -27,6 +33,16 @@ import java.util.List;
 import java.util.Vector;\r
 import java.util.concurrent.LinkedBlockingQueue;\r
 \r
+import org.apache.http.HttpEntity;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.NameValuePair;\r
+import org.apache.http.client.ClientProtocolException;\r
+import org.apache.http.client.HttpClient;\r
+import org.apache.http.client.entity.UrlEncodedFormEntity;\r
+import org.apache.http.client.methods.HttpPost;\r
+import org.apache.http.impl.client.DefaultHttpClient;\r
+import org.apache.http.message.BasicNameValuePair;\r
+import org.apache.http.protocol.HTTP;\r
 import org.apache.thrift.TException;\r
 import org.apache.thrift.protocol.TBinaryProtocol;\r
 import org.apache.thrift.transport.THttpClient;\r
@@ -49,6 +65,9 @@ import com.evernote.edam.type.Tag;
 import com.evernote.edam.type.User;\r
 import com.evernote.edam.userstore.AuthenticationResult;\r
 import com.evernote.edam.userstore.UserStore;\r
+import com.trolltech.qt.core.QByteArray;\r
+import com.trolltech.qt.core.QFile;\r
+import com.trolltech.qt.core.QIODevice.OpenModeFlag;\r
 import com.trolltech.qt.core.QObject;\r
 import com.trolltech.qt.gui.QMessageBox;\r
 \r
@@ -312,12 +331,25 @@ public class SyncRunner extends QObject implements Runnable {
                        // Check for "special" sync instructions\r
                        String syncLinked = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
                        String syncShared = conn.getSyncTable().getRecord("FullLinkedNotebookSync");\r
+                       String syncNotebooks = conn.getSyncTable().getRecord("FullNotebookSync");\r
+                       String syncInkNoteImages = conn.getSyncTable().getRecord("FullInkNoteImageSync");\r
                        if (syncLinked != null) {\r
                                downloadAllLinkedNotebooks();\r
                        }\r
                        if (syncShared != null) {\r
                                downloadAllSharedNotebooks();\r
                        }\r
+                       if (syncNotebooks != null) {\r
+                               downloadAllNotebooks();\r
+                       }\r
+                       \r
+                       if (syncInkNoteImages != null) {\r
+                               List<String> guids = conn.getNoteTable().noteResourceTable.findInkNotes();\r
+                               for (int i=0; i<guids.size(); i++) {\r
+                                       downloadInkNoteImage(guids.get(i));\r
+                               }\r
+                               conn.getSyncTable().deleteRecord("FullInkNoteImageSync");\r
+                       }\r
                        \r
                        // If there are remote changes\r
                        logger.log(logger.LOW, "Update Count: " +syncState.getUpdateCount());\r
@@ -348,6 +380,7 @@ public class SyncRunner extends QObject implements Runnable {
                        }\r
                        if (refreshNeeded)\r
                                syncSignal.refreshLists.emit();\r
+                       \r
                        if (!error) {\r
                                logger.log(logger.EXTREME, "Sync completed.  Errors=" +error);\r
                                if (!disableUploads) \r
@@ -366,6 +399,7 @@ public class SyncRunner extends QObject implements Runnable {
                }\r
                logger.log(logger.HIGH, "Leaving SyncRunner.evernoteSync");\r
        }\r
+       \r
        // Sync deleted items with Evernote\r
        private void syncExpunged() {\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncExpunged");\r
@@ -1485,6 +1519,31 @@ public class SyncRunner extends QObject implements Runnable {
                        logger.log(logger.LOW, e1.getMessage());\r
                }\r
     }\r
+    private void downloadAllNotebooks() {\r
+       try {\r
+                       List<Notebook> books = noteStore.listNotebooks(authToken);\r
+                       logger.log(logger.LOW, "Shared notebooks found = " +books.size());\r
+                       for (int i=0; i<books.size(); i++) {\r
+                               conn.getNotebookTable().updateNotebook(books.get(i), false);\r
+                       }\r
+                       conn.getSyncTable().deleteRecord("FullNotebookSync");\r
+               } catch (EDAMUserException e1) {\r
+                       e1.printStackTrace();\r
+                       status.message.emit(tr("User exception Listing 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 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 notebooks."));\r
+                       logger.log(logger.LOW, e1.getMessage());\r
+                       return;\r
+               }\r
+    }\r
     private void downloadAllLinkedNotebooks() {\r
        try {\r
                        List<LinkedNotebook> books = noteStore.listLinkedNotebooks(authToken);\r
@@ -1514,4 +1573,72 @@ public class SyncRunner extends QObject implements Runnable {
                        logger.log(logger.LOW, e1.getMessage());\r
                }\r
     }\r
+\r
+    \r
+    private void downloadInkNoteImage(String guid) {\r
+               String urlBase = noteStoreUrl.replace("/edam/note/", "/shard/") + "/res/"+guid+".ink?slice=";\r
+//             urlBase = "https://www.evernote.com/shard/s1/res/52b567a9-54ae-4a08-afc5-d5bae275b2a8.ink?slice=";\r
+               Integer slice = 1;\r
+               Resource r = conn.getNoteTable().noteResourceTable.getNoteResource(guid, false);\r
+               conn.getInkImagesTable().expungeImage(r.getGuid());\r
+               int sliceCount = 1+((r.getHeight()-1)/480);\r
+               HttpClient http = new DefaultHttpClient();\r
+       for (int i=0; i<sliceCount; i++) {\r
+               String url = urlBase + slice.toString();\r
+               HttpPost post = new HttpPost(url);\r
+               post.getParams().setParameter("auth", authToken);\r
+               List <NameValuePair> nvps = new ArrayList <NameValuePair>();\r
+            nvps.add(new BasicNameValuePair("auth", authToken));\r
+\r
+            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
+                       HttpResponse response = http.execute(post);\r
+                       HttpEntity resEntity = response.getEntity();\r
+                       InputStream is = resEntity.getContent();\r
+                       QByteArray data = writeToFile(is);\r
+                       conn.getInkImagesTable().saveImage(guid, slice, data);\r
+                       } catch (ClientProtocolException e) {\r
+                               e.printStackTrace();\r
+                       } catch (IOException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+\r
+                       slice++;\r
+       }\r
+       http.getConnectionManager().shutdown(); \r
+               noteSignal.noteChanged.emit(r.getNoteGuid(), null);   // Signal to ivalidate note cache\r
+    }\r
+    \r
+    \r
+    public QByteArray writeToFile(InputStream iStream) throws IOException {\r
+\r
+           File temp = File.createTempFile("nn-inknote-temp", ".png");\r
+\r
+           // Save InputStream to the file.\r
+           BufferedOutputStream fOut = null;\r
+           try {\r
+             fOut = new BufferedOutputStream(new FileOutputStream(temp));\r
+             byte[] buffer = new byte[32 * 1024];\r
+             int bytesRead = 0;\r
+             while ((bytesRead = iStream.read(buffer)) != -1) {\r
+               fOut.write(buffer, 0, bytesRead);\r
+             }\r
+           }\r
+           finally {\r
+               iStream.close();\r
+               fOut.close();\r
+           }\r
+           QFile tempFile = new QFile(temp.getAbsoluteFile().toString());\r
+           tempFile.open(OpenModeFlag.ReadOnly);\r
+           QByteArray data = tempFile.readAll();\r
+           tempFile.close();\r
+           tempFile.remove();\r
+           return data;\r
+    }\r
+    \r
 }\r
index 0ec67ef..9347616 100644 (file)
@@ -10,6 +10,7 @@ import com.trolltech.qt.core.QByteArray;
 import com.trolltech.qt.core.QDataStream;\r
 import com.trolltech.qt.core.QFile;\r
 import com.trolltech.qt.core.QIODevice;\r
+import com.trolltech.qt.core.QIODevice.OpenModeFlag;\r
 import com.trolltech.qt.core.QTemporaryFile;\r
 import com.trolltech.qt.core.QUrl;\r
 import com.trolltech.qt.xml.QDomAttr;\r
@@ -237,12 +238,54 @@ public class NoteFormatter {
                return doc;\r
        }\r
        \r
+\r
+       // Get an ink note image.  If an image doesn't exist then we fall back \r
+       // to the old ugly icon\r
+    private boolean buildInkNote(QDomDocument doc, QDomElement docElem, QDomElement enmedia, QDomAttr hash, String appl) {\r
+       String resGuid = conn.getNoteTable().noteResourceTable.getNoteResourceGuidByHashHex(currentNote.getGuid(), hash.value());\r
+       Resource r = conn.getNoteTable().noteResourceTable.getNoteResource(resGuid, false);\r
\r
+       // If we can't find the resource, then fall back to the old method.  We'll return & show\r
+       // an error later\r
+       if (r == null || r.getData() == null) \r
+               return false;\r
+       \r
+       // If there isn't some type of error, continue on.\r
+               if (!resourceError) {\r
+                       \r
+                       // Get a list of images in the database.  We'll use these to bulid the page.\r
+                       List<QByteArray> data = conn.getInkImagesTable().getImage(r.getGuid());\r
+                       \r
+                       // If no pictures are found, go back to & just show the icon\r
+                       if (data.size() == 0)\r
+                               return false;\r
+                       \r
+                       // We have pictures, so append them to the page.  This really isn't proper since\r
+                       // we leave the en-media tag in place, but since we can't edit the page it doesn't\r
+                       // hurt anything.\r
+                       for (int i=0; i<data.size(); i++) {\r
+                       QFile f = new QFile(Global.getFileManager().getResDirPath(resGuid + new Integer(i).toString()+".png"));\r
+                               f.open(OpenModeFlag.WriteOnly);\r
+                               f.write(data.get(i));\r
+                               f.close();\r
+                               QDomElement newImage = doc.createElement("img");\r
+                               newImage.setAttribute("src", QUrl.fromLocalFile(f.fileName()).toString());\r
+                               enmedia.appendChild(newImage);\r
+                       }\r
+                       return true;\r
+               }\r
+       return false;\r
+    }\r
+       \r
        \r
     // Modify the en-media tag into an attachment\r
     private void modifyApplicationTags(QDomDocument doc, QDomElement docElem, QDomElement enmedia, QDomAttr hash, String appl) {\r
        logger.log(logger.HIGH, "Entering NeverNote.modifyApplicationTags");\r
-       if (appl.equalsIgnoreCase("vnd.evernote.ink"))\r
+       if (appl.equalsIgnoreCase("vnd.evernote.ink")) {\r
                readOnly = true;\r
+           if (buildInkNote(doc, docElem, enmedia, hash, appl))\r
+               return;\r
+       }\r
        String resGuid = conn.getNoteTable().noteResourceTable.getNoteResourceGuidByHashHex(currentNote.getGuid(), hash.value());\r
        Resource r = conn.getNoteTable().noteResourceTable.getNoteResource(resGuid, false);\r
        if (r == null || r.getData() == null) \r