diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
commit | 940b4d1848e8c70ab7642901a68594e8016caffc (patch) | |
tree | eb72f344ee6c3d9b80a7ecc079ea79e9fba8676d /scripting/examples/java/Newsgroup | |
parent | Initial commit. (diff) | |
download | libreoffice-upstream.tar.xz libreoffice-upstream.zip |
Adding upstream version 1:7.0.4.upstream/1%7.0.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'scripting/examples/java/Newsgroup')
-rw-r--r-- | scripting/examples/java/Newsgroup/MimeConfiguration.java | 211 | ||||
-rw-r--r-- | scripting/examples/java/Newsgroup/NewsGroup.java | 39 | ||||
-rw-r--r-- | scripting/examples/java/Newsgroup/OfficeAttachment.java | 250 | ||||
-rw-r--r-- | scripting/examples/java/Newsgroup/PostNewsgroup.java | 633 | ||||
-rw-r--r-- | scripting/examples/java/Newsgroup/Sender.java | 141 | ||||
-rw-r--r-- | scripting/examples/java/Newsgroup/StatusWindow.java | 147 | ||||
-rw-r--r-- | scripting/examples/java/Newsgroup/SubscribedNewsgroups.java | 349 |
7 files changed, 1770 insertions, 0 deletions
diff --git a/scripting/examples/java/Newsgroup/MimeConfiguration.java b/scripting/examples/java/Newsgroup/MimeConfiguration.java new file mode 100644 index 000000000..03b964834 --- /dev/null +++ b/scripting/examples/java/Newsgroup/MimeConfiguration.java @@ -0,0 +1,211 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package org.libreoffice.example.java_scripts; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.uno.XComponentContext; +import com.sun.star.script.framework.runtime.XScriptContext; +import com.sun.star.util.XStringSubstitution; + +import javax.mail.*; +import javax.activation.*; + +import java.io.*; + + +public class MimeConfiguration { + + // Office Installation path + private static String instPath = ""; + + + public static boolean createFiles(XScriptContext xsc) { + try { + XComponentContext xcc = xsc.getComponentContext(); + XMultiComponentFactory xmf = xcc.getServiceManager(); + + Object pathSub = + xmf.createInstanceWithContext("com.sun.star.comp.framework.PathSubstitution", + xcc); + XStringSubstitution stringSub = (XStringSubstitution) UnoRuntime.queryInterface( + XStringSubstitution.class, pathSub); + instPath = stringSub.getSubstituteVariableValue("$(inst)"); + + } catch (com.sun.star.beans.UnknownPropertyException upe) { + System.out.println("com.sun.star.beans.UnknownPropertyException"); + upe.printStackTrace(); + } catch (com.sun.star.uno.Exception e) { + System.out.println("com.sun.star.uno.Exception"); + e.printStackTrace(); + } + + writeMailCap(); + writeMimeTypes(); + + // ToDo: include status feedback to StatusWindow + return true; + } + + + + + private static void writeMailCap() { + String mailcapPath = getConfigDir() + System.getProperty("file.separator") + + "mailcap"; + + try { + if (! new File(java.net.URLDecoder.decode(mailcapPath)).exists()) { + File mailcapFile = new File(mailcapPath); + FileWriter out = new FileWriter(mailcapFile); + String[] lines = getMailcapText(); + + for (int i = 0; i < lines.length; i++) { + out.write(lines[i], 0, lines[i].length()); + } + + out.close(); + } else { + } + + + + // use prog dir, if not there then java.io to create/write new file + MailcapCommandMap map = new MailcapCommandMap(mailcapPath); + CommandMap.setDefaultCommandMap(map); + } catch (IOException ioe) { + ioe.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + private static String[] getMailcapText() { + String[] mailcapText = { + "#\n", + "# Default mailcap file for the JavaMail System.\n", + "#\n", + "# JavaMail content-handlers:\n", + "#\n", + "text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain\n", + "text/html;; x-java-content-handler=com.sun.mail.handlers.text_html\n", + "text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml\n", + "image/gif;; x-java-content-handler=com.sun.mail.handlers.image_gif\n", + "image/jpeg;; x-java-content-handler=com.sun.mail.handlers.image_jpeg\n", + "multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed\n", + "message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822\n" + }; + + return mailcapText; + } + + + + private static void writeMimeTypes() { + String mimetypesPath = getConfigDir() + System.getProperty("file.separator") + + "mimetypes.default"; + + try { + if (! new File(java.net.URLDecoder.decode(mimetypesPath)).exists()) { + File mimetypesFile = new File(mimetypesPath); + FileWriter out = new FileWriter(mimetypesFile); + String[] lines = getMimeTypesText(); + + for (int i = 0; i < lines.length; i++) { + out.write(lines[i], 0, lines[i].length()); + } + + out.close(); + } else { + } + + MimetypesFileTypeMap mimeTypes = new MimetypesFileTypeMap(mimetypesPath); + FileTypeMap.setDefaultFileTypeMap(mimeTypes); + } catch (IOException ioe) { + ioe.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + private static String[] getMimeTypesText() { + String[] mimesText = { + "#\n", + "# A simple, old format, mime.types file\n", + "#\n", + "text/html html htm HTML HTM\n", + "text/plain txt text TXT TEXT\n", + "image/gif gif GIF\n", + "image/ief ief\n", + "image/jpeg jpeg jpg jpe JPG\n", + "image/tiff tiff tif\n", + "image/x-xwindowdump xwd\n", + "application/postscript ai eps ps\n", + "application/rtf rtf\n", + "application/x-tex tex\n", + "application/x-texinfo texinfo texi\n", + "application/x-troff t tr roff\n", + "audio/basic au\n", + "audio/midi midi mid\n", + "audio/x-aifc aifc\n", + "audio/x-aiff aif aiff\n", + "audio/x-mpeg mpeg mpg\n", + "audio/x-wav wav\n", + "video/mpeg mpeg mpg mpe\n", + "video/quicktime qt mov\n", + "video/x-msvideo avi\n" + }; + + return mimesText; + } + + + private static String getConfigDir() { + // mailcap file must be written to the Office user/config directory + + // instPath is a URL, needs to be converted to a system pathname + String config = instPath + "/user/config"; + String configNonURL = ""; + + if (System.getProperty("os.name").indexOf("Windows") != -1) { + // Windows + // removes "file:///" + int start = 8; + configNonURL = config.substring(start, config.length()); + + // Convert forward to back-slashes + while (configNonURL.indexOf("/") != -1) { + int fSlash = configNonURL.indexOf("/"); + String firstPart = configNonURL.substring(0, fSlash); + String secondPart = configNonURL.substring(fSlash + 1, configNonURL.length()); + configNonURL = firstPart + "\\" + secondPart; + } + } else { + // Unix/Linux + // removes "file://" + int start = 7; + configNonURL = config.substring(start, config.length()); + } + + return configNonURL; + } + +} diff --git a/scripting/examples/java/Newsgroup/NewsGroup.java b/scripting/examples/java/Newsgroup/NewsGroup.java new file mode 100644 index 000000000..4c1708a05 --- /dev/null +++ b/scripting/examples/java/Newsgroup/NewsGroup.java @@ -0,0 +1,39 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package org.libreoffice.example.java_scripts; + +public class NewsGroup { + + private String hostname = ""; + private String newsgroupName = ""; + + public NewsGroup(String host, String group) { + hostname = host; + newsgroupName = group; + } + + public String getHostName() { + return hostname; + } + + public String getNewsgroupName() { + return newsgroupName; + } + +} diff --git a/scripting/examples/java/Newsgroup/OfficeAttachment.java b/scripting/examples/java/Newsgroup/OfficeAttachment.java new file mode 100644 index 000000000..75c0f4d45 --- /dev/null +++ b/scripting/examples/java/Newsgroup/OfficeAttachment.java @@ -0,0 +1,250 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package org.libreoffice.example.java_scripts; + +//import com.sun.star.frame.XComponentLoader; +import java.io.*; +import com.sun.star.lang.XComponent; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.frame.XStorable; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.frame.XModel; +import com.sun.star.script.framework.runtime.XScriptContext; + +// for debug only +import javax.swing.JOptionPane; + +public class OfficeAttachment { + + private StatusWindow status = null; + private XStorable storedDoc = null; + private File htmlFile = null; + private File officeFile = null; + private boolean isHtmlDoc = false; + private boolean isOfficeDoc = false; + private String templocationURL = ""; + private String templocationSystem = ""; + private String attachmentName = ""; + private String statusLine = ""; + + public OfficeAttachment(XScriptContext xsc, StatusWindow sw, boolean html, + boolean office) { + status = sw; + isHtmlDoc = html; + isOfficeDoc = office; + + templocationSystem = templocationURL = System.getProperty("user.home"); + + if (System.getProperty("os.name").indexOf("Windows") != -1) { + while (templocationURL.indexOf("\\") != -1) { + int sepPos = templocationURL.indexOf("\\"); + String firstPart = templocationURL.substring(0, sepPos); + String lastPart = templocationURL.substring(sepPos + 1, + templocationURL.length()); + templocationURL = firstPart + "/" + lastPart; + } + } + + try { + statusLine = "Querying Office for current document"; + status.setStatus(1, statusLine); + XScriptContext scriptcontext = xsc; + XModel xmodel = scriptcontext.getDocument(); + storedDoc = (XStorable) UnoRuntime.queryInterface(XStorable.class, xmodel); + // find document name from storedDoc + attachmentName = storedDoc.getLocation(); + } catch (Exception e) { + //UNO error + status.setStatus(1, "Error: " + statusLine); + } + + if (attachmentName.equalsIgnoreCase("")) { + attachmentName = "Attachment"; + } else { + int lastSep = attachmentName.lastIndexOf("/"); + attachmentName = attachmentName.substring(lastSep + 1, attachmentName.length()); + int dot = attachmentName.indexOf("."); + attachmentName = attachmentName.substring(0, dot); + } + } + + + public boolean createTempDocs() { + String filenameURL = "file:///" + templocationURL + "/" + attachmentName; + + try { + if (isHtmlDoc) { + statusLine = "Saving doc in HTML format"; + status.setStatus(4, statusLine); + PropertyValue[] propertyvalue_html = new PropertyValue[2]; + propertyvalue_html[0] = new PropertyValue(); + propertyvalue_html[0].Name = "Overwrite"; + propertyvalue_html[0].Value = Boolean.TRUE; + propertyvalue_html[1] = new PropertyValue(); + propertyvalue_html[1].Name = ("FilterName"); + propertyvalue_html[1].Value = "swriter: HTML (StarWriter)"; + storedDoc.storeAsURL(filenameURL + ".html", propertyvalue_html); + + File homedir = new File(templocationSystem); + File homefiles[] = homedir.listFiles(); + String file = ""; + + for (int i = 0; i < homefiles.length; i++) { + if (homefiles[i].getName().equals(attachmentName + ".html")) { + file = homefiles[i].getAbsolutePath(); + } + } + + htmlFile = new File(file); + } + + if (isOfficeDoc) { + statusLine = "Saving doc in .sxw format"; + status.setStatus(4, statusLine); + PropertyValue[] propertyvalue_sxw = new PropertyValue[2]; + propertyvalue_sxw[0] = new PropertyValue(); + propertyvalue_sxw[0].Name = "Overwrite"; + propertyvalue_sxw[0].Value = Boolean.TRUE; + propertyvalue_sxw[1] = new PropertyValue(); + propertyvalue_sxw[1].Name = "Overwrite"; + propertyvalue_sxw[1].Value = Boolean.TRUE; + storedDoc.storeAsURL(filenameURL + ".sxw", propertyvalue_sxw); + + File homedir = new File(templocationSystem); + + File homefiles[] = homedir.listFiles(); + String file = ""; + + for (int i = 0; i < homefiles.length; i++) { + if (homefiles[i].getName().equals(attachmentName + ".sxw")) { + file = homefiles[i].getAbsolutePath(); + } + } + + officeFile = new File(file); + } + + } catch (SecurityException se) { + status.setStatus(4, "Error: " + statusLine); + System.out.println("Security error while saving temporary Document(s). Check file permissions in home directory."); + se.printStackTrace(); + htmlFile = null; + officeFile = null; + return false; + } catch (Exception e) { + status.setStatus(4, "Error: " + statusLine); + System.out.println("Error saving temporary Document(s)"); + e.printStackTrace(); + htmlFile = null; + officeFile = null; + return false; + } + + return true; + } + + + public boolean removeTempDocs() { + /* + if( !htmlFile.exists() && !officeFile.exists() ) + { + System.out.println("Error: Document(s) have not been saved." ); + } + */ + + statusLine = "Removing temp docs"; + status.setStatus(13, statusLine); + + try { + if (isOfficeDoc && isHtmlDoc) { + htmlFile.delete(); + officeFile.delete(); + } else { + if (isOfficeDoc) { + officeFile.delete(); + } else { + htmlFile.delete(); + } + } + } catch (SecurityException se) { + status.setStatus(13, "Error: " + statusLine); + System.out.println("Security Error while deleting temporary Document(s). Check file permissions in home directory."); + se.printStackTrace(); + return false; + } + + return true; + } + + + public void cleanUpOnError() { + try { + if (isOfficeDoc && isHtmlDoc) { + htmlFile.delete(); + officeFile.delete(); + } else { + if (isOfficeDoc) { + officeFile.delete(); + } else { + htmlFile.delete(); + } + } + } catch (SecurityException se) { + System.out.println("Security Error while deleting temporary Document(s). Check file permissions in home directory."); + se.printStackTrace(); + } + } + + + public File[] getAttachments() { + + statusLine = "Retrieving temp docs"; + status.setStatus(8, statusLine); + + File attachments[] = null; + + if (isOfficeDoc && isHtmlDoc) { + attachments = new File[2]; + attachments[0] = htmlFile; + attachments[1] = officeFile; + } else { + if (isOfficeDoc) { + attachments = new File[1]; + attachments[0] = officeFile; + } else { + attachments = new File[1]; + attachments[0] = htmlFile; + } + } + + return attachments; + } + + + public boolean isHtmlAttachment() { + return isHtmlDoc; + } + + + public boolean isOfficeAttachment() { + return isOfficeDoc; + } + +} diff --git a/scripting/examples/java/Newsgroup/PostNewsgroup.java b/scripting/examples/java/Newsgroup/PostNewsgroup.java new file mode 100644 index 000000000..6c6ecdf37 --- /dev/null +++ b/scripting/examples/java/Newsgroup/PostNewsgroup.java @@ -0,0 +1,633 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package org.libreoffice.example.java_scripts; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.border.*; +import java.util.Vector; +import com.sun.star.script.framework.runtime.XScriptContext; + + +public class PostNewsgroup extends JFrame { + + // Post to newsgroup objects + private NewsGroup[] subscribedNewsgroups = null; + private XScriptContext xscriptcontext = null; + + private final int FRAMEX = 300; + private final int FRAMEY = 300; + private final int TEXTBOXWIDTH = 300; + private final int TEXTBOXHEIGHT = 24; + private final int TEXTAREAHEIGHT = 70; + private final int BUTTONWIDTH = 80; + private final int BUTTONHEIGHT = 30; + + private PostNewsgroup window = null; + private JComboBox newsgroupComboBox = null; + private JTextField hostTextField = null; + private JTextField replyTextField = null; + private JTextField subjectTextField = null; + private JTextArea commentTextArea = null; + private JRadioButton officeHtmlButton = null; + private JRadioButton officeButton = null; + private JRadioButton htmlButton = null; + private JButton postButton = null; + private JButton cancelButton = null; + + // JFrame for launch progress dialog + private StatusWindow statusWindow = null; + private String statusLine = ""; + + // Tool tip text + private final String newsgroupText = "Newsgroup name"; + private final String hostText = "Newsgroup host/server name"; + private final String replyText = "Email address to reply to"; + private final String subjectText = "Subject title for the mail"; + private final String commentText = "Additional comment on mail"; + private final String officeHtmlText = + "Post as both Office and HTML attachments"; + private final String officeText = "Post as Office attachment only"; + private final String htmlText = "Post as HTML attachment only"; + private final String postText = "Post to newsgroup"; + private final String cancelText = "Cancel post to newsgroup"; + + + public void post(XScriptContext xsc) { + xscriptcontext = xsc; + window = this; + + // create mailcap and mimetypes files (fix for classloader problem) + MimeConfiguration.createFiles(xscriptcontext); + + this.setTitle("Post Document To Newsgroup"); + this.setLocation(FRAMEX, FRAMEY); + + this.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent event) { + System.out.println("Focus gained"); + window.update(window.getGraphics()); + } + + public void focusLost(FocusEvent event) { + System.out.println("Focus lost"); + } + }); + + Container container = getContentPane(); + container.setLayout(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.BOTH; + + JPanel labelPanel = constructLabelPanel(); + JPanel textPanel = constructTextPanel(); + JPanel optionPanel = constructOptionPanel(); + JPanel buttonPanel = constructButtonPanel(); + + constraints.gridx = 0; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.gridheight = 3; + constraints.insets = new Insets(15, 15, 5, 5); + container.add(labelPanel, constraints); + + constraints.gridx = 1; + constraints.gridy = 0; + constraints.gridwidth = 4; + constraints.gridheight = 3; + constraints.insets = new Insets(15, 5, 5, 15); + container.add(textPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 3; + constraints.gridwidth = 5; + constraints.gridheight = 1; + constraints.insets = new Insets(5, 15, 5, 15); + container.add(optionPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 4; + constraints.gridwidth = 5; + constraints.gridheight = 1; + constraints.insets = new Insets(5, 5, 5, 5); + container.add(buttonPanel, constraints); + + this.pack(); + this.setResizable(false); + this.setVisible(true); + } + + + private JPanel constructLabelPanel() { + JLabel newsgroupLabel = new JLabel("Newsgroup:"); + JLabel hostLabel = new JLabel("Host:"); + JLabel replyLabel = new JLabel("Reply:"); + JLabel subjectLabel = new JLabel("Subject:"); + JLabel commentLabel = new JLabel("Comment:"); + + newsgroupLabel.setToolTipText(newsgroupText); + hostLabel.setToolTipText(hostText); + replyLabel.setToolTipText(replyText); + subjectLabel.setToolTipText(subjectText); + commentLabel.setToolTipText(commentText); + + JPanel newsgroupPanel = new JPanel(); + newsgroupPanel.setLayout(new BorderLayout()); + newsgroupPanel.add(newsgroupLabel, "West"); + JPanel hostPanel = new JPanel(); + hostPanel.setLayout(new BorderLayout()); + hostPanel.add(hostLabel, "West"); + JPanel replyPanel = new JPanel(); + replyPanel.setLayout(new BorderLayout()); + replyPanel.add(replyLabel, "West"); + JPanel subjectPanel = new JPanel(); + subjectPanel.setLayout(new BorderLayout()); + subjectPanel.add(subjectLabel, "West"); + JPanel commentPanel = new JPanel(); + commentPanel.setLayout(new BorderLayout()); + commentPanel.add(commentLabel, "West"); + JPanel emptyPanel = new JPanel(); + + final int labelWidth = 80; + newsgroupPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT)); + hostPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT)); + replyPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT)); + subjectPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT)); + commentPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT)); + + JPanel panel = new JPanel(); + panel.setLayout(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + + constraints.gridx = 0; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.weightx = constraints.weighty = 0.0; + panel.add(newsgroupPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 1; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(hostPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 2; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(replyPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 3; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(subjectPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 4; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(commentPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 5; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.weightx = constraints.weighty = 1.0; + panel.add(emptyPanel, constraints); + + return panel; + } + + + private JPanel constructTextPanel() { + hostTextField = new JTextField(); + hostTextField.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT)); + hostTextField.setToolTipText(hostText); + hostTextField.setBorder(new EtchedBorder()); + + //optionPanel.setBorder( new TitledBorder( new EtchedBorder(), "Document Format" ) ); + newsgroupComboBox = getNewsgroupCombo(); + + replyTextField = new JTextField(); + replyTextField.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT)); + replyTextField.setToolTipText(replyText); + replyTextField.setBorder(new EtchedBorder()); + + subjectTextField = new JTextField(); + subjectTextField.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT)); + subjectTextField.setToolTipText(subjectText); + subjectTextField.setBorder(new EtchedBorder()); + + commentTextArea = new JTextArea(); + commentTextArea.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTAREAHEIGHT)); + commentTextArea.setToolTipText(commentText); + commentTextArea.setBorder(new EtchedBorder()); + + JPanel panel = new JPanel(); + panel.setLayout(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + + constraints.gridx = 0; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(newsgroupComboBox, constraints); + + constraints.gridx = 0; + constraints.gridy = 1; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(hostTextField, constraints); + + constraints.gridx = 0; + constraints.gridy = 2; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(replyTextField, constraints); + + constraints.gridx = 0; + constraints.gridy = 3; + constraints.gridwidth = 1; + constraints.gridheight = 1; + panel.add(subjectTextField, constraints); + + constraints.gridx = 0; + constraints.gridy = 4; + constraints.gridwidth = 1; + constraints.gridheight = 2; + panel.add(commentTextArea, constraints); + + return panel; + } + + + private JComboBox getNewsgroupCombo() { + newsgroupComboBox = new JComboBox(); + //newsgroupComboBox.setBorder( new EtchedBorder() ); + + newsgroupComboBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // when newsgroup is selected + if (subscribedNewsgroups != null) { + int position = newsgroupComboBox.getSelectedIndex(); + + if (position != -1) { + hostTextField.setText(subscribedNewsgroups[ position ].getHostName()); + newsgroupComboBox.setToolTipText("Newsgroup name: " + + subscribedNewsgroups[ position ].getNewsgroupName() + " (Host name: " + + subscribedNewsgroups[ position ].getHostName() + ")"); + } + } + } + }); + + NewsGroup groupToSend = null; + SubscribedNewsgroups newsgroups = new SubscribedNewsgroups(); + subscribedNewsgroups = newsgroups.getNewsGroups(); + + // Test for no .mozilla or no subscribed newsgroups + // subscribedNewsgroups = null; + + if (subscribedNewsgroups == null) { + JOptionPane.showMessageDialog(window, + "No subscribed newsgroups found in mozilla/netscape profile \nPlease enter newsgroup and host name", + "Newsgroups Information", JOptionPane.INFORMATION_MESSAGE); + } else { + // Copy all newsgroups into a vector for comparison + // Alter entries (to include host name) if duplication is found + ArrayList vector = new ArrayList(subscribedNewsgroups.length); + + for (int i = 0; i < subscribedNewsgroups.length; i++) { + vector.add(subscribedNewsgroups[i].getNewsgroupName()); + } + + // Compare and alter + for (int i = 0; i < subscribedNewsgroups.length; i++) { + // check if combo box already has a newsgroup with same name + // then add host name to differentiate + for (int j = 0; j < subscribedNewsgroups.length; j++) { + if (j != i + && subscribedNewsgroups[j].getNewsgroupName().equalsIgnoreCase( + subscribedNewsgroups[i].getNewsgroupName())) { + vector.set(j, subscribedNewsgroups[j].getNewsgroupName() + " (" + + subscribedNewsgroups[j].getHostName() + ")"); + vector.set(i, subscribedNewsgroups[i].getNewsgroupName() + " (" + + subscribedNewsgroups[i].getHostName() + ")"); + } + } + } + + // Copy converted newsgroups from vector to combo box + for (int i = 0; i < subscribedNewsgroups.length; i++) { + newsgroupComboBox.addItem(vector.elementAt(i)); + } + }// else + + newsgroupComboBox.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT)); + newsgroupComboBox.setEditable(true); + + return newsgroupComboBox; + } + + + + private JPanel constructOptionPanel() { + officeHtmlButton = new JRadioButton("Office and HTML", true); + officeHtmlButton.setToolTipText(officeHtmlText); + + officeButton = new JRadioButton("Office"); + officeButton.setToolTipText(officeText); + + htmlButton = new JRadioButton("HTML"); + htmlButton.setToolTipText(htmlText); + + JRadioButton[] rbuttons = { officeHtmlButton, officeButton, htmlButton }; + ButtonGroup radioButtonGroup = new ButtonGroup(); + + for (int i = 0; i < rbuttons.length; i++) { + radioButtonGroup.add(rbuttons[i]); + } + + JPanel optionPanel = new JPanel(); + optionPanel.setBorder(new TitledBorder(new EtchedBorder(), "Document Format")); + optionPanel.setLayout(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.BOTH; + + constraints.gridx = 0; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.insets = new Insets(5, 5, 5, 30); + optionPanel.add(officeHtmlButton, constraints); + + constraints.gridx = 1; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.insets = new Insets(5, 20, 5, 30); + optionPanel.add(officeButton, constraints); + + constraints.gridx = 2; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.insets = new Insets(5, 20, 5, 5); + optionPanel.add(htmlButton, constraints); + + return optionPanel; + } + + + + public boolean sendingActions() { + // posting actions + // Validate the data + if (isValidData()) { + // Create status window + StatusWindow statusWindow = new StatusWindow(window, "Posting to Newsgroup", + FRAMEX, FRAMEY); + + statusWindow.setVisible(true); + statusLine = "Ready to send..."; + statusWindow.setStatus(0, statusLine); + + // Get the boolean values for HTML/Office document + // params: ( XScriptContext, StatusWindow, html document, office document ) + + boolean html = false; + boolean office = false; + + if (officeHtmlButton.isSelected()) { + html = true; + office = true; + } + + if (officeButton.isSelected()) { + office = true; + html = false; + } + + if (htmlButton.isSelected()) { + html = true; + office = false; + } + + OfficeAttachment officeAttach = new OfficeAttachment(xscriptcontext, + statusWindow, html, office); + + statusLine = "Getting user input"; + statusWindow.setStatus(2, statusLine); + // Get replyto, subject, comment from textboxes + String replyto = replyTextField.getText(); + String subject = subjectTextField.getText(); + String comment = commentTextArea.getText(); + + // Get newsgroup from combo box (corresponding position) + String host = ""; + String group = ""; + int position = newsgroupComboBox.getSelectedIndex(); + + if (subscribedNewsgroups == null || position == -1) { + host = hostTextField.getText(); + group = newsgroupComboBox.getSelectedItem().toString(); + } else { + host = subscribedNewsgroups[ position ].getHostName(); + group = subscribedNewsgroups[ position ].getNewsgroupName(); + } + + statusLine = "Creating sender object"; + statusWindow.setStatus(3, statusLine); + Sender sender = new Sender(statusWindow, officeAttach, replyto, subject, + comment, host, group); + + if (!sender.sendMail()) { + statusWindow.enableCancelButton(true); + officeAttach.cleanUpOnError(); + return false; + } + + statusLine = "Send is complete"; + statusWindow.setStatus(14, statusLine); + } else { + return false; + } + + return true; + } + + + private JPanel constructButtonPanel() { + Action postAction = new AbstractAction() { + public void actionPerformed(ActionEvent event) { + // posting actions + sendingActions(); + }// actionPerformed + }; + + Action cancelAction = new AbstractAction() { + public void actionPerformed(ActionEvent event) { + // cancelling actions + window.dispose(); + } + }; + + postButton = new JButton(); + postButton.setAction(postAction); + postButton.setToolTipText(postText); + postButton.setText("Post"); + postButton.setPreferredSize(new Dimension(BUTTONWIDTH + 20, BUTTONHEIGHT)); + + cancelButton = new JButton(); + cancelButton.setAction(cancelAction); + cancelButton.setToolTipText(cancelText); + cancelButton.setText("Cancel"); + cancelButton.setPreferredSize(new Dimension(BUTTONWIDTH + 20, BUTTONHEIGHT)); + + JSeparator sep = new JSeparator(SwingConstants.HORIZONTAL); + + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.BOTH; + constraints.insets = new Insets(5, 5, 5, 5); + + JPanel emptyPanel1 = new JPanel(); + emptyPanel1.setPreferredSize(new Dimension(BUTTONWIDTH, BUTTONHEIGHT)); + + JPanel emptyPanel2 = new JPanel(); + emptyPanel2.setPreferredSize(new Dimension(BUTTONWIDTH, BUTTONHEIGHT)); + + constraints.gridx = 0; + constraints.gridy = 0; + constraints.gridwidth = 4; + constraints.gridheight = 1; + buttonPanel.add(sep, constraints); + + constraints.gridx = 0; + constraints.gridy = 1; + constraints.gridwidth = 1; + constraints.gridheight = 1; + buttonPanel.add(emptyPanel1, constraints); + + constraints.gridx = 1; + constraints.gridy = 1; + constraints.gridwidth = 1; + constraints.gridheight = 1; + buttonPanel.add(emptyPanel2, constraints); + + constraints.gridx = 2; + constraints.gridy = 1; + constraints.gridwidth = 1; + constraints.gridheight = 1; + buttonPanel.add(postButton, constraints); + + constraints.gridx = 3; + constraints.gridy = 1; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.insets = new Insets(5, 5, 5, 0); + buttonPanel.add(cancelButton, constraints); + + return buttonPanel; + } + + + public void enableButtons(boolean enable) { + if (enable) { + postButton.setEnabled(true); + cancelButton.setEnabled(true); + } else { + postButton.setEnabled(false); + cancelButton.setEnabled(false); + } + } + + + private boolean isValidData() { + // newsgroupComboBox must not be blank (format? dots and whitespace) + String newsgroupString = ""; + int position = newsgroupComboBox.getSelectedIndex(); + + if (subscribedNewsgroups == null || position == -1) { + newsgroupString = newsgroupComboBox.getSelectedItem().toString(); + } else { + newsgroupString = subscribedNewsgroups[ position ].getNewsgroupName(); + } + + if (newsgroupString.length() == 0) { + newsgroupComboBox.requestFocus(); + JOptionPane.showMessageDialog(window, "Please enter a newsgroup name", + "Input Error", JOptionPane.ERROR_MESSAGE); + return false; + } + + + // hostTextField must not be blank (format?) + String hostString = hostTextField.getText(); + + if (hostString.length() == 0) { + hostTextField.requestFocus(); + JOptionPane.showMessageDialog(window, "Please enter a hostname", "Input Error", + JOptionPane.ERROR_MESSAGE); + return false; + } + + + // replyTextField must have <string>@<string>.<string> + // (string at least 2 chars long) + // consider <s>.<s>@<s>.<s>.<s> format? (array of dot positions?) + String replyString = replyTextField.getText(); + int atPos = replyString.indexOf("@"); + int dotPos = replyString.lastIndexOf("."); + int length = replyString.length(); + + if (length == 0 || atPos == -1 || dotPos == -1 || atPos < 2 || dotPos < atPos + || dotPos + 2 == length || atPos + 2 == dotPos + || atPos != replyString.lastIndexOf("@") || replyString.indexOf(" ") != -1) { + replyTextField.requestFocus(); + JOptionPane.showMessageDialog(window, + "Please enter a valid reply to email address", "Input Error", + JOptionPane.ERROR_MESSAGE); + return false; + } + + + // subjectTextField must not be blank? + String subjectString = subjectTextField.getText(); + + if (subjectString.length() == 0) { + subjectTextField.requestFocus(); + JOptionPane.showMessageDialog(window, "Please enter subject title", + "Input Error", JOptionPane.ERROR_MESSAGE); + return false; + } + + // details are valid + return true; + } + +} diff --git a/scripting/examples/java/Newsgroup/Sender.java b/scripting/examples/java/Newsgroup/Sender.java new file mode 100644 index 000000000..00b3db87b --- /dev/null +++ b/scripting/examples/java/Newsgroup/Sender.java @@ -0,0 +1,141 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package org.libreoffice.example.java_scripts; + +import javax.mail.*; +import javax.mail.internet.*; +import com.msoft.mail.provider.nntp.NNTPTransport; +import java.util.Properties; +import java.io.*; +import javax.activation.*; + + +public class Sender { + // Constructor params: + private StatusWindow status = null; + private OfficeAttachment attachments = null; + private String replyto = ""; + private String subject = ""; + private String comment = ""; + private String hostname = ""; + private String newsgroup = ""; + private String statusLine = ""; + + + + public Sender(StatusWindow sw, OfficeAttachment attach, String reply, + String sub, String com, String host, String group) { + status = sw; + attachments = attach; + replyto = reply; + subject = sub; + comment = com; + hostname = host; + newsgroup = group; + } + + + + public boolean sendMail() { + int statusPos = 5; + + try { + attachments.createTempDocs(); + // Property for any information + Properties props = new Properties(); + + // Create unique session (null is unused authenticator info) + statusLine = "Creating unique session"; + status.setStatus(statusPos, statusLine); // 5 + Session session = Session.getInstance(props, null); + + // Create message + statusPos++; // 6 + statusLine = "Creating message"; + status.setStatus(statusPos, statusLine); + MimeMessage message = new MimeMessage(session); + message.setFrom(new InternetAddress(replyto)); + message.setSubject(subject); + message.setText(comment); + message.addHeader("Newsgroups", newsgroup); + + // Buildup bodypart with text and attachments + Multipart multipart = new MimeMultipart(); + + BodyPart messageBodyPart = new MimeBodyPart(); + messageBodyPart.setText(comment); + multipart.addBodyPart(messageBodyPart); + + statusPos++; // 7 + statusLine = "Adding attachment(s)"; + status.setStatus(statusPos, statusLine); + File attachs[] = attachments.getAttachments(); + + for (int i = 0; i < attachs.length; i++) { + messageBodyPart = new MimeBodyPart(); + DataSource filesource = new FileDataSource(attachs[i]); + messageBodyPart.setDataHandler(new DataHandler(filesource)); + messageBodyPart.setFileName(attachs[i].getName()); + multipart.addBodyPart(messageBodyPart); + } + + // Add multipart to mail + message.setContent(multipart); + + // Create and send NNTP transport + statusPos += 2; // 9 + statusLine = "Creating NNTP transport"; + status.setStatus(statusPos, statusLine); + Transport transport = new NNTPTransport(session, + new URLName("news:" + newsgroup)); + + // Null parameters are for user name and password + statusPos++; // 10 + statusLine = "Connecting to mail server"; + status.setStatus(statusPos, statusLine); + transport.connect(hostname, null, null); + + statusPos++; // 11 + statusLine = "Sending message"; + status.setStatus(statusPos, statusLine); + transport.sendMessage(message, message.getAllRecipients()); + + statusPos++; // 12 + statusLine = "Closing transport"; + status.setStatus(statusPos, statusLine); + transport.close(); + + // Clean up when finished + attachments.removeTempDocs(); + + return true; + } catch (MessagingException me) { + if (statusPos == 10) { + statusLine = "Error connecting (User authentication?)"; + } + + status.setStatus(statusPos, statusLine); + System.out.println("Error sending message: "); + me.printStackTrace(); + return false; + } + + } + +} diff --git a/scripting/examples/java/Newsgroup/StatusWindow.java b/scripting/examples/java/Newsgroup/StatusWindow.java new file mode 100644 index 000000000..7b37c8fa7 --- /dev/null +++ b/scripting/examples/java/Newsgroup/StatusWindow.java @@ -0,0 +1,147 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package org.libreoffice.example.java_scripts; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.border.*; + +public class StatusWindow extends JFrame { + + private JProgressBar progressBar = null; + private JTextField statusLabel = null; + private JButton cancelButton = null; + private JFrame statusWindow = null; + private PostNewsgroup mainWindow = null; + + private final int MAXPROGRESS = 13; + private final int MINPROGRESS = 0; + + + public StatusWindow(PostNewsgroup mw, String title, int parentX, int parentY) { + this.setTitle(title); + this.setLocation(parentX + 100, parentY + 100); + statusWindow = this; + mainWindow = mw; + + mainWindow.enableButtons(false); + + statusWindow.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent event) { + mainWindow.enableButtons(true); + } + }); + + progressBar = new JProgressBar(); + progressBar.setStringPainted(true); + progressBar.setMaximum(MAXPROGRESS); + progressBar.setMinimum(MINPROGRESS); + progressBar.setSize(30, 400); + + JLabel progLabel = new JLabel("Progress:"); + + JPanel progressPanel = new JPanel(); + progressPanel.setLayout(new BorderLayout(10, 0)); + progressPanel.add(progLabel, "West"); + progressPanel.add(progressBar, "East"); + + statusLabel = new JTextField(); + statusLabel.setColumns(25); + statusLabel.setEditable(false); + statusLabel.setBorder(null); + JPanel statusPanel = new JPanel(); + statusPanel.setLayout(new BorderLayout()); + statusPanel.add(statusLabel, "West"); + + cancelButton = new JButton("Cancel"); + cancelButton.setSize(30, 100); + cancelButton.setEnabled(false); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + // cancelling actions + mainWindow.enableButtons(true); + statusWindow.dispose(); + } + }); + + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new BorderLayout(0, 5)); + buttonPanel.add(cancelButton, "East"); + buttonPanel.add(new JSeparator(SwingConstants.HORIZONTAL), "North"); + + Container container = getContentPane(); + container.setLayout(new GridBagLayout()); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.BOTH; + + constraints.gridx = 0; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.insets = new Insets(15, 15, 10, 15); + container.add(progressPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 1; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.insets = new Insets(10, 15, 10, 15); + container.add(statusPanel, constraints); + + constraints.gridx = 0; + constraints.gridy = 2; + constraints.gridwidth = 1; + constraints.gridheight = 1; + constraints.insets = new Insets(10, 15, 5, 15); + container.add(buttonPanel, constraints); + + this.pack(); + this.setResizable(false); + + } + + + public void setStatus(int progress, String status) { + progressBar.setValue(progress); + statusLabel.setText(status); + statusLabel.setToolTipText(status); + + if (progress == MAXPROGRESS) { + cancelButton.setEnabled(true); + cancelButton.setText("Close"); + } + + update(getGraphics()); + mainWindow.update(mainWindow.getGraphics()); + } + + + public void enableCancelButton(boolean enable) { + if (enable) { + cancelButton.setEnabled(true); + cancelButton.setText("Finish"); + } else { + cancelButton.setEnabled(false); + cancelButton.setText("Cancel"); + } + + } + +} diff --git a/scripting/examples/java/Newsgroup/SubscribedNewsgroups.java b/scripting/examples/java/Newsgroup/SubscribedNewsgroups.java new file mode 100644 index 000000000..eb135a3e8 --- /dev/null +++ b/scripting/examples/java/Newsgroup/SubscribedNewsgroups.java @@ -0,0 +1,349 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package org.libreoffice.example.java_scripts; + +import java.io.*; +import java.util.Vector; + + +public class SubscribedNewsgroups { + + + private static NewsGroup[] allSubscribed = null; + private static boolean windows = false; + + public static void main(String[] args) { + // Test the class + SubscribedNewsgroups subscribed = new SubscribedNewsgroups(); + + NewsGroup allGroups[] = subscribed.getNewsGroups(); + + if (allGroups == null) { + System.out.println("Could not find subscribed newsgroups from mozilla/netscape mailrc files"); + } else { + for (int i = 0; i < allGroups.length; i++) { + System.out.println("Hostname is: " + allGroups[i].getHostName() + + " Newsgroup is: " + allGroups[i].getNewsgroupName()); + } + } + } + + + + // Only public method of the class + // Returns and array of unique NewsGroup objects + public NewsGroup[] getNewsGroups() { + windows = false; + + if (System.getProperty("os.name").indexOf("Windows") != -1) { + windows = true; + } + + String mozillaHome = ""; + + if (windows) { + mozillaHome = System.getProperty("user.home") + + System.getProperty("file.separator") + "Application Data" + + System.getProperty("file.separator") + "Mozilla" + + System.getProperty("file.separator") + "Profiles"; + } else { + mozillaHome = System.getProperty("user.home") + + System.getProperty("file.separator") + ".mozilla"; + } + + if (!new File(mozillaHome).isDirectory()) { + return null; + } + + // Get all the profiles belonging to the user + File profiles[] = findProfiles(new File(mozillaHome)); + + if (profiles.length < 1) { + return null; + } + + // Get the News directory for each profile + File allNewsDirs[] = new File[ profiles.length ]; + + for (int i = 0; i < profiles.length; i++) { + File newsDir = findNewsDir(profiles[i]); + allNewsDirs[i] = newsDir; + } + + // Check that at least one News directory exists and remove nulls + boolean newsFound = false; + + for (int i = 0; i < allNewsDirs.length; i++) { + if (allNewsDirs[i] != null) { + newsFound = true; + break; + } + } + + if (!newsFound) { + return null; + } + + // Get all the mailrc files for each News directory + File allMailrcs[] = findMailrcFiles(allNewsDirs); + + if (allMailrcs == null) { + return null; + } + + ArrayList<NewsGroup> subscribed = new ArrayList<NewsGroup>(); + + // Get the newsgroups in each mailrc file + for (int i = 0; i < allMailrcs.length; i++) { + File mailrc = (File) allMailrcs[i]; + NewsGroup newsgroup[] = findNewsgroups(mailrc); + + //if the Newsgroup has not already been added to the list + for (int j = 0; j < newsgroup.length; j++) { + // if newsgroup is unique then add to the list + if (!listed(newsgroup[j], subscribed)) { + subscribed.addElement(newsgroup[j]); + } + } + } + + // Copy all unique Newsgroups into the global array + allSubscribed = new NewsGroup[ subscribed.size() ]; + subscribed.toArray(allSubscribed); + + // Test that at least one subscribed newsgroup has been found + if (allSubscribed.length < 1) { + return null; + } + + return allSubscribed; + } + + + + + // Tests if the NewsGroup object has already been listed by another mailrc file + private static boolean listed(NewsGroup newsgroup, + ArrayList<NewsGroup> uniqueSubscription) { + for (int i = 0; i < uniqueSubscription.size(); i++) { + NewsGroup tempGroup = uniqueSubscription.elementAt(i); + + // Test for duplication + if (newsgroup.getHostName().equalsIgnoreCase(tempGroup.getHostName()) && + newsgroup.getNewsgroupName().equalsIgnoreCase(tempGroup.getNewsgroupName())) + return true; + } + + return false; + } + + + + + // Finds all the NewsGroups in an individual mailrc file + private static NewsGroup[] findNewsgroups(File mailrcfile) { + + String hostname = ""; + String newsgroup = ""; + NewsGroup mailrcNewsGroups[] = null; + + //Retrieve name of news host/server from file name + //Sequentially access each of the newsgroups + //If the newsgroup is not already contained in the global NewsGroup[] array then add it + + String filename = mailrcfile.getPath(); + + if (windows) { + // Windows format "staroffice-news.germany.sun.com.rc" + int hostNameStart = filename.lastIndexOf("\\") + 1; + int hostNameEnd = filename.indexOf(".rc"); + hostname = filename.substring(hostNameStart, hostNameEnd); + } else { + // Unix/Linux format "newsrc-staroffice-news.germany.sun.com" + int hostNameStart = filename.lastIndexOf("newsrc-") + 7; + hostname = filename.substring(hostNameStart, filename.length()); + } + + // Assumes the content format in Window is the same as Unix/Linux (unknown at the moment) + // i.e. a list of newsgroups each ending with a ":" + LineNumberReader in = null; + + try { + in = new LineNumberReader(new FileReader(mailrcfile)); + ArrayList groups = new ArrayList(); + String inString = ""; + int line = 0; + + while (inString != null) { + in.setLineNumber(line); + inString = in.readLine(); + line++; + + if (inString != null) { + int newsgroupEnd = inString.indexOf(":"); + newsgroup = inString.substring(0, newsgroupEnd); + NewsGroup group = new NewsGroup(hostname, newsgroup); + groups.addElement(group); + } + } + + mailrcNewsGroups = new NewsGroup[ groups.size() ]; + groups.copyInto(mailrcNewsGroups); + in.close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + + return mailrcNewsGroups; + } + + + // Finds all the mailrc files for all the given News directories + private static File[] findMailrcFiles(File[] newsDirs) { + ArrayList allFiles = new ArrayList(); + + for (int i = 0; i < newsDirs.length; i++) { + if (newsDirs[i] != null) { + File mailrcFiles[] = newsDirs[i].listFiles(new VersionFilter()); + + if (mailrcFiles != null) { + for (int j = 0; j < mailrcFiles.length; j++) { + allFiles.addElement(mailrcFiles[j]); + } + } + } + } + + File allMailrcFiles[] = new File[ allFiles.size() ]; + allFiles.copyInto(allMailrcFiles); + + if (allMailrcFiles.length == 0) { + return null; + } + + return allMailrcFiles; + } + + + // Finds all profiles belonging to one user (can be more than one) + private static File[] findProfiles(File start) { + // Get all files and directories in .mozilla + File allFiles[] = start.listFiles(); + File[] dirs = new File[allFiles.length]; + int dirCounter = 0; + + // Remove files leaving directories only + for (int i = 0; i < allFiles.length; i++) { + if (allFiles[i].isDirectory()) { + dirs[dirCounter] = allFiles[i]; + dirCounter++; + } + } + + // Add each directory to a user profile array + File[] profileDirs = new File[dirCounter]; + + for (int i = 0; i < dirCounter; i++) { + profileDirs[i] = dirs[i]; + } + + // return a File array containing the profile dirs + return profileDirs; + } + + + // Recursively searches for the News directory for a given profile directory + private static File findNewsDir(File start) { + File mailrcFile = null; + + // File array containing all matches for the version filter ("News") + File files[] = start.listFiles(new VersionFilter()); + + // If the array is empty then no matches were found + if (files.length == 0) { + // File array of all the directories in File start + File dirs[] = start.listFiles(new DirFilter()); + + // for each of the directories check for a match + for (int i = 0; i < dirs.length; i++) { + mailrcFile = findNewsDir(dirs[i]); + + if (mailrcFile != null) { + // break the for loop + break; + } + } + } else { + // end recursion + // Check for a News directory inside the News directory (fix for bug) + // Original solution had only "mailrcFile = files[0];" + + boolean noChildNews = true; + File checkChildNewsDirs[] = files[0].listFiles(new VersionFilter()); + + if (checkChildNewsDirs != null) { + for (int i = 0; i < checkChildNewsDirs.length; i++) { + if (checkChildNewsDirs[i].getName().equals("News")) { + noChildNews = false; + break; + } + } + } + + if (noChildNews) { + mailrcFile = files[0]; + } else { + String childNewsPathName = files[0].getAbsolutePath() + + System.getProperty("file.separator") + "News"; + mailrcFile = new File(childNewsPathName); + } + + } + + // return a File representing the News dir in a profile + return mailrcFile; + } +} + + + +class DirFilter implements FileFilter { + public boolean accept(File aFile) { + return aFile.isDirectory(); + } +} + + +class VersionFilter implements FileFilter { + public boolean accept(File aFile) { + if (System.getProperty("os.name").indexOf("Windows") != -1) { + if (aFile.getName().compareToIgnoreCase("News") == 0 || + aFile.getName().indexOf(".rc") != -1) { + return true; + } + } else { + if (aFile.getName().compareToIgnoreCase("News") == 0 || + aFile.getName().indexOf("newsrc") != -1) { + return true; + } + } + + return false; + } +} |