1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 package util; 28 29 import com.sun.star.beans.PropertyValue; 30 import com.sun.star.beans.XPropertySet; 31 import com.sun.star.container.XNameAccess; 32 import com.sun.star.frame.XController; 33 import com.sun.star.frame.XDispatch; 34 import com.sun.star.frame.XDispatchProvider; 35 import com.sun.star.frame.XFrame; 36 import com.sun.star.frame.XModel; 37 import com.sun.star.lang.XComponent; 38 import com.sun.star.lang.XMultiServiceFactory; 39 import com.sun.star.script.XLibraryContainer; 40 import com.sun.star.uno.UnoRuntime; 41 import com.sun.star.util.*; 42 import com.sun.star.util.URL; 43 import com.sun.star.util.XURLTransformer; 44 45 46 47 public class BasicMacroTools { 48 private final XDispatchProvider mDispProv; 49 private final XMultiServiceFactory mMSF; 50 private final XURLTransformer mParser; 51 private final XNameAccess mLCxNA; //LibraryContainer::XNameAccess 52 private final XLibraryContainer mLCxLC; //LibraryContainer::XLibraryContainer 53 54 /* 55 *While initializing the Basic Libraries will be appendend to the Document 56 */ 57 public BasicMacroTools(XMultiServiceFactory msf, XModel xModel, 58 XComponent xDoc) throws java.lang.Exception { 59 try { 60 mMSF = msf; 61 mDispProv = makeDispatchProvider(mMSF, xModel); 62 mParser = makeParser(mMSF); 63 64 Object DocLibCont = null; 65 66 try { 67 XPropertySet xDocProps = (XPropertySet) UnoRuntime.queryInterface( 68 XPropertySet.class, xDoc); 69 DocLibCont = xDocProps.getPropertyValue("BasicLibraries"); 70 } catch (com.sun.star.uno.Exception e) { 71 throw new Exception( 72 "Couldn't get BasicLibraries-Container from document: " + e.toString()); 73 } 74 75 mLCxNA = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, 76 DocLibCont); 77 78 mLCxLC = (XLibraryContainer) UnoRuntime.queryInterface( 79 XLibraryContainer.class, DocLibCont); 80 81 } catch (Exception e) { 82 throw new Exception("could not initialize BasicMacros " + 83 e.toString()); 84 } 85 } 86 87 /* 88 * While initializing the Basic Libraries will be appendend to the Office 89 */ 90 public BasicMacroTools(XMultiServiceFactory msf, XModel xModel) 91 throws java.lang.Exception { 92 try { 93 mMSF = msf; 94 mDispProv = makeDispatchProvider(mMSF, xModel); 95 mParser = makeParser(mMSF); 96 97 Object ASLC = null; 98 99 try { 100 ASLC = mMSF.createInstance( 101 "com.sun.star.script.ApplicationScriptLibraryContainer"); 102 } catch (com.sun.star.uno.Exception e) { 103 throw new Exception( 104 "Couldn't create ApplicationScriptLibraryContainer" + e.toString()); 105 } 106 107 mLCxNA = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, 108 ASLC); 109 110 mLCxLC = (XLibraryContainer) UnoRuntime.queryInterface( 111 XLibraryContainer.class, ASLC); 112 113 } catch (Exception e) { 114 throw new Exception("could not initialize BasicMacros " + 115 e.toString()); 116 } 117 } 118 119 private static XDispatchProvider makeDispatchProvider(XMultiServiceFactory mMSF, 120 XModel aModel) 121 throws java.lang.Exception { 122 XController xController = aModel.getCurrentController(); 123 XFrame xFrame = xController.getFrame(); 124 125 if (xFrame == null) { 126 throw new Exception("Could not create DispatchProvider"); 127 } 128 129 return (XDispatchProvider) UnoRuntime.queryInterface( 130 XDispatchProvider.class, xFrame); 131 } 132 133 private static XURLTransformer makeParser(XMultiServiceFactory mMSF) 134 throws java.lang.Exception { 135 try { 136 return (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface( 137 XURLTransformer.class, mMSF.createInstance( 138 "com.sun.star.util.URLTransformer")); 139 } catch (Exception e) { 140 throw new Exception("could not create UTL-Transformer " + 141 e.toString()); 142 } 143 } 144 145 public void loadLibrary(String LibraryName, String LibraryURL) 146 throws java.lang.Exception { 147 try { 148 appendLibrary(LibraryName, LibraryURL); 149 } catch (java.lang.Exception e) { 150 e.printStackTrace(); 151 throw new Exception("ERROR: Could not append Library " + 152 LibraryName + e.toString()); 153 } 154 155 try { 156 mLCxLC.loadLibrary(LibraryName); 157 } catch (com.sun.star.container.NoSuchElementException e) { 158 e.printStackTrace(); 159 throw new Exception("ERROR: Could not load Library " + 160 LibraryName + e.toString()); 161 } catch (com.sun.star.lang.WrappedTargetException e) { 162 e.printStackTrace(); 163 throw new Exception("ERROR: Could not load Library " + 164 LibraryName + e.toString()); 165 } 166 } 167 168 private void appendLibrary(String LibraryName, String LibraryURL) 169 throws java.lang.Exception { 170 try { 171 removeLibrary(LibraryName); 172 } catch (java.lang.Exception e) { 173 } 174 175 try { 176 mLCxLC.createLibraryLink(LibraryName, LibraryURL, false); 177 } catch (com.sun.star.container.ElementExistException e) { 178 e.printStackTrace(); 179 throw new Exception("ERROR: Library " + LibraryName + 180 "already exist." + e.toString()); 181 } catch (com.sun.star.uno.Exception e) { 182 e.printStackTrace(); 183 throw new Exception("Could not link Basic library:" + 184 LibraryName + e.toString()); 185 } 186 } 187 188 public void removeLibrary(String LibraryName) throws java.lang.Exception { 189 if (mLCxNA.hasByName(LibraryName)) { 190 try { 191 mLCxLC.removeLibrary(LibraryName); 192 } catch (com.sun.star.container.NoSuchElementException e) { 193 e.printStackTrace(); 194 throw new Exception("Could not remove Basic library:" + 195 LibraryName + ": Library does not exist" + e.toString()); 196 } catch (com.sun.star.lang.WrappedTargetException e) { 197 e.printStackTrace(); 198 throw new Exception("Could not remove Basic library:" + 199 LibraryName + e.toString()); 200 } 201 } 202 } 203 204 public void runMarco(String MacroName) throws java.lang.Exception { 205 URL[] aParseURL = new URL[1]; 206 aParseURL[0] = new URL(); 207 aParseURL[0].Complete = "macro://./" + MacroName; //Standard.Stock.GetSymbol('micro','')"; 208 mParser.parseStrict(aParseURL); 209 210 URL aURL = aParseURL[0]; 211 XDispatch xDispatcher = mDispProv.queryDispatch(aURL, "", 0); 212 213 if (xDispatcher != null) { 214 xDispatcher.dispatch(aURL, null); 215 } else { 216 throw new Exception("Could not run Macro " + MacroName); 217 } 218 } 219 220 /** 221 * Set the given <CODE>secureURL</CODE> as secure URL for marco execution. 222 * The macros of documents located in <CODE>secureURL</CODE> will be executed 223 * automatically. 224 * @param xMSF the XMultiServiceFactory 225 * @param secureURL the URL the documet is located 226 * @throws java.lang.Exception throws this exception on any error 227 */ 228 public static void addSecureBasicMarcosURL(XMultiServiceFactory xMSF, String secureURL) 229 throws Exception { 230 231 secureURL = utils.getFullURL(secureURL); 232 233 // configure Office to allow to execute macos 234 PropertyValue[] ProvArgs = new PropertyValue [1]; 235 PropertyValue Arg = new PropertyValue(); 236 Arg.Name = "nodepath"; 237 Arg.Value = "/org.openoffice.Office.Common/Security"; 238 ProvArgs[0] = Arg; 239 240 Object oProvider = xMSF.createInstance("com.sun.star.configuration.ConfigurationProvider"); 241 242 243 XMultiServiceFactory oProviderMSF = (XMultiServiceFactory) 244 UnoRuntime.queryInterface(XMultiServiceFactory.class, oProvider); 245 246 Object oSecure = oProviderMSF.createInstanceWithArguments( 247 "com.sun.star.configuration.ConfigurationUpdateAccess", 248 ProvArgs); 249 250 XPropertySet oSecureProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, oSecure); 251 252 Object oScripting = oSecureProps.getPropertyValue("Scripting"); 253 XPropertySet oScriptingSettings = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, oScripting); 254 255 oScriptingSettings.setPropertyValue("SecureURL", new String[]{secureURL}); 256 oScriptingSettings.setPropertyValue("OfficeBasic", new Integer(2)); 257 258 XChangesBatch oSecureChange = (XChangesBatch) UnoRuntime.queryInterface(XChangesBatch.class, oSecure); 259 oSecureChange.commitChanges(); 260 } 261 } 262