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
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;
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;
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?
// Setup the browser window
noteCache = new HashMap<String,String>();
+ readOnlyCache = new HashMap<String, Boolean>();
browserWindow = new BrowserWindow(conn);
mainLeftRightSplitter.addWidget(leftSplitter1);
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"));
// if (!dateFormat.equals(Global.getDateFormat()) ||
// !timeFormat.equals(Global.getTimeFormat())) {
noteCache.clear();
+ readOnlyCache.clear();
noteIndexUpdated(true);
// }
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();
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() {
searchFieldCleared();
if (searchPerformed) {
noteCache.clear();
+ readOnlyCache.clear();
listManager.setEnSearch("");
///// listManager.clearNoteIndexSearch();
//noteIndexUpdated(true);
private void searchFieldChanged() {
logger.log(logger.HIGH, "Entering NeverNote.searchFieldChanged");
noteCache.clear();
+ readOnlyCache.clear();
saveNoteColumnPositions();
saveNoteIndexWidth();
String text = searchField.currentText();
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);
--- /dev/null
+/*\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
--- /dev/null
+/*\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
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
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
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
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
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
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
private InvalidXMLTable invalidXMLTable;
private LinkedNotebookTable linkedNotebookTable;
private SharedNotebookTable sharedNotebookTable;
+ private InkImagesTable inkImagesTable;
private SyncTable syncTable;
private SystemIconTable systemIconTable;
private final ApplicationLogger logger;
linkedNotebookTable = new LinkedNotebookTable(logger, this);
sharedNotebookTable = new SharedNotebookTable(logger, this);
systemIconTable = new SystemIconTable(logger, this);
+ inkImagesTable = new InkImagesTable(logger, this);
}
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);
}
}
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() {
public SystemIconTable getSystemIconTable() {
return systemIconTable;
}
+ public InkImagesTable getInkImagesTable() {
+ return inkImagesTable;
+ }
}
--- /dev/null
+/*\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
"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
\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
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
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
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
"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
\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
// 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
\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
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
\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
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
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
\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
"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
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
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
"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
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
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
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
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
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
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
\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
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
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
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
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
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
}\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
\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
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
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
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
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
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
\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
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
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
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
*/\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
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
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
// 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
}\r
if (refreshNeeded)\r
syncSignal.refreshLists.emit();\r
+ \r
if (!error) {\r
logger.log(logger.EXTREME, "Sync completed. Errors=" +error);\r
if (!disableUploads) \r
}\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
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
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
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
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