1*dde7d3faSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*dde7d3faSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*dde7d3faSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*dde7d3faSAndrew Rist * distributed with this work for additional information 6*dde7d3faSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*dde7d3faSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*dde7d3faSAndrew Rist * "License"); you may not use this file except in compliance 9*dde7d3faSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*dde7d3faSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*dde7d3faSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*dde7d3faSAndrew Rist * software distributed under the License is distributed on an 15*dde7d3faSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*dde7d3faSAndrew Rist * KIND, either express or implied. See the License for the 17*dde7d3faSAndrew Rist * specific language governing permissions and limitations 18*dde7d3faSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*dde7d3faSAndrew Rist *************************************************************/ 21*dde7d3faSAndrew Rist 22*dde7d3faSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_comphelper.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <comphelper/uieventslogger.hxx> 28cdf0e10cSrcweir #include <boost/shared_ptr.hpp> 29cdf0e10cSrcweir #include <com/sun/star/frame/XDesktop.hpp> 30cdf0e10cSrcweir #include <com/sun/star/frame/XTerminateListener.hpp> 31cdf0e10cSrcweir #include <com/sun/star/lang/XEventListener.hpp> 32cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp> 33cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 34cdf0e10cSrcweir #include <com/sun/star/logging/LogLevel.hpp> 35cdf0e10cSrcweir #include <com/sun/star/logging/XCsvLogFormatter.hpp> 36cdf0e10cSrcweir #include <com/sun/star/logging/XLogHandler.hpp> 37cdf0e10cSrcweir #include <com/sun/star/logging/XLogger.hpp> 38cdf0e10cSrcweir #include <com/sun/star/logging/XLoggerPool.hpp> 39cdf0e10cSrcweir #include <com/sun/star/oooimprovement/XCoreController.hpp> 40cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 41cdf0e10cSrcweir #include <com/sun/star/util/XStringSubstitution.hpp> 42cdf0e10cSrcweir #include <comphelper/configurationhelper.hxx> 43cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 44cdf0e10cSrcweir #include <map> 45cdf0e10cSrcweir #include <osl/file.hxx> 46cdf0e10cSrcweir #include <osl/mutex.hxx> 47cdf0e10cSrcweir #include <osl/time.h> 48cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 49cdf0e10cSrcweir 50cdf0e10cSrcweir 51cdf0e10cSrcweir using namespace com::sun::star::beans; 52cdf0e10cSrcweir using namespace com::sun::star::frame; 53cdf0e10cSrcweir using namespace com::sun::star::lang; 54cdf0e10cSrcweir using namespace com::sun::star::logging; 55cdf0e10cSrcweir using namespace com::sun::star::oooimprovement; 56cdf0e10cSrcweir using namespace com::sun::star::uno; 57cdf0e10cSrcweir using namespace com::sun::star::util; 58cdf0e10cSrcweir using namespace cppu; 59cdf0e10cSrcweir using namespace osl; 60cdf0e10cSrcweir using namespace rtl; 61cdf0e10cSrcweir using namespace std; 62cdf0e10cSrcweir 63cdf0e10cSrcweir 64cdf0e10cSrcweir namespace 65cdf0e10cSrcweir { lcl_SetupOriginAppAbbr(map<OUString,OUString> & abbrs)66cdf0e10cSrcweir static void lcl_SetupOriginAppAbbr(map<OUString, OUString>& abbrs) 67cdf0e10cSrcweir { 68cdf0e10cSrcweir abbrs[OUString::createFromAscii("com.sun.star.text.TextDocument")] = OUString::createFromAscii("W"); // Writer 69cdf0e10cSrcweir abbrs[OUString::createFromAscii("com.sun.star.sheet.SpreadsheetDocument")] = OUString::createFromAscii("C"); // Calc 70cdf0e10cSrcweir abbrs[OUString::createFromAscii("com.sun.star.presentation.PresentationDocument")] = OUString::createFromAscii("I"); // Impress 71cdf0e10cSrcweir abbrs[OUString::createFromAscii("com.sun.star.drawing.DrawingDocument")] = OUString::createFromAscii("D"); // Draw 72cdf0e10cSrcweir }; 73cdf0e10cSrcweir lcl_SetupOriginWidgetAbbr(map<OUString,OUString> & abbrs)74cdf0e10cSrcweir static void lcl_SetupOriginWidgetAbbr(map<OUString,OUString>& abbrs) 75cdf0e10cSrcweir { 76cdf0e10cSrcweir abbrs[OUString::createFromAscii("ButtonToolbarController")] = OUString::createFromAscii("0"); 77cdf0e10cSrcweir abbrs[OUString::createFromAscii("ComplexToolbarController")] = OUString::createFromAscii("1"); 78cdf0e10cSrcweir abbrs[OUString::createFromAscii("ControlMenuController")] = OUString::createFromAscii("2"); 79cdf0e10cSrcweir abbrs[OUString::createFromAscii("FontMenuController")] = OUString::createFromAscii("3"); 80cdf0e10cSrcweir abbrs[OUString::createFromAscii("FontSizeMenuController")] = OUString::createFromAscii("4"); 81cdf0e10cSrcweir abbrs[OUString::createFromAscii("FooterMenuController")] = OUString::createFromAscii("5"); 82cdf0e10cSrcweir abbrs[OUString::createFromAscii("GenericToolbarController")] = OUString::createFromAscii("6"); 83cdf0e10cSrcweir abbrs[OUString::createFromAscii("HeaderMenuController")] = OUString::createFromAscii("7"); 84cdf0e10cSrcweir abbrs[OUString::createFromAscii("LanguageSelectionMenuController")] = OUString::createFromAscii("8"); 85cdf0e10cSrcweir abbrs[OUString::createFromAscii("LangSelectionStatusbarController")] = OUString::createFromAscii("9"); 86cdf0e10cSrcweir abbrs[OUString::createFromAscii("MacrosMenuController")] = OUString::createFromAscii("10"); 87cdf0e10cSrcweir abbrs[OUString::createFromAscii("MenuBarManager")] = OUString::createFromAscii("11"); 88cdf0e10cSrcweir abbrs[OUString::createFromAscii("NewMenuController")] = OUString::createFromAscii("12"); 89cdf0e10cSrcweir abbrs[OUString::createFromAscii("ObjectMenuController")] = OUString::createFromAscii("13"); 90cdf0e10cSrcweir abbrs[OUString::createFromAscii("RecentFilesMenuController")] = OUString::createFromAscii("14"); 91cdf0e10cSrcweir abbrs[OUString::createFromAscii("ToolbarsMenuController")] = OUString::createFromAscii("15"); 92cdf0e10cSrcweir abbrs[OUString::createFromAscii("SfxToolBoxControl")] = OUString::createFromAscii("16"); 93cdf0e10cSrcweir abbrs[OUString::createFromAscii("SfxAsyncExec")] = OUString::createFromAscii("17"); 94cdf0e10cSrcweir abbrs[OUString::createFromAscii("AcceleratorExecute")] = OUString::createFromAscii("18"); 95cdf0e10cSrcweir }; 96cdf0e10cSrcweir } 97cdf0e10cSrcweir 98cdf0e10cSrcweir namespace comphelper 99cdf0e10cSrcweir { 100cdf0e10cSrcweir // declaration of implementation 101cdf0e10cSrcweir class UiEventsLogger_Impl; 102cdf0e10cSrcweir class UiEventsLogger_Impl : public UiEventsLogger 103cdf0e10cSrcweir { 104cdf0e10cSrcweir private: 105cdf0e10cSrcweir //typedefs and friends 106cdf0e10cSrcweir friend class UiEventsLogger; 107cdf0e10cSrcweir typedef UiEventsLogger_Impl* ptr; 108cdf0e10cSrcweir 109cdf0e10cSrcweir // instance methods and data 110cdf0e10cSrcweir UiEventsLogger_Impl(); 111cdf0e10cSrcweir void initializeLogger(); 112cdf0e10cSrcweir void logDispatch(const ::com::sun::star::util::URL& url, 113cdf0e10cSrcweir const Sequence<PropertyValue>& args); 114cdf0e10cSrcweir void logRotated(); 115cdf0e10cSrcweir void logVcl(const ::rtl::OUString& parent_id, 116cdf0e10cSrcweir sal_Int32 window_type, 117cdf0e10cSrcweir const ::rtl::OUString& id, 118cdf0e10cSrcweir const ::rtl::OUString& method, 119cdf0e10cSrcweir const ::rtl::OUString& param); 120cdf0e10cSrcweir void rotate(); 121cdf0e10cSrcweir void hotRotate(); 122cdf0e10cSrcweir void prepareLogHandler(); 123cdf0e10cSrcweir void checkIdleTimeout(); 124cdf0e10cSrcweir OUString getCurrentPath(); 125cdf0e10cSrcweir OUString getRotatedPath(); 126cdf0e10cSrcweir void disposing(); 127cdf0e10cSrcweir 128cdf0e10cSrcweir bool m_Active; 129cdf0e10cSrcweir TimeValue m_LastLogEventTime; 130cdf0e10cSrcweir const OUString m_LogPath; 131cdf0e10cSrcweir const TimeValue m_IdleTimeout; 132cdf0e10cSrcweir sal_Int32 m_SessionLogEventCount; 133cdf0e10cSrcweir Reference<XLogger> m_Logger; 134cdf0e10cSrcweir Reference<XLogHandler> m_LogHandler; 135cdf0e10cSrcweir Reference<XCsvLogFormatter> m_Formatter; 136cdf0e10cSrcweir map<OUString, OUString> m_OriginAppAbbr; 137cdf0e10cSrcweir map<OUString, OUString> m_OriginWidgetAbbr; 138cdf0e10cSrcweir 139cdf0e10cSrcweir 140cdf0e10cSrcweir // static methods and data 141cdf0e10cSrcweir static ptr getInstance(); 142cdf0e10cSrcweir static void prepareMutex(); 143cdf0e10cSrcweir static bool shouldActivate(); 144cdf0e10cSrcweir static bool getEnabledFromCoreController(); 145cdf0e10cSrcweir static bool getEnabledFromCfg(); 146cdf0e10cSrcweir static TimeValue getIdleTimeoutFromCfg(); 147cdf0e10cSrcweir static OUString getLogPathFromCfg(); 148cdf0e10cSrcweir static sal_Int32 findIdx(const Sequence<PropertyValue>& args, const OUString& key); 149cdf0e10cSrcweir 150cdf0e10cSrcweir static ptr instance; 151cdf0e10cSrcweir static Mutex * singleton_mutex; 152cdf0e10cSrcweir static const sal_Int32 COLUMNS; 153cdf0e10cSrcweir static const OUString CFG_ENABLED; 154cdf0e10cSrcweir static const OUString CFG_IDLETIMEOUT; 155cdf0e10cSrcweir static const OUString CFG_LOGGING; 156cdf0e10cSrcweir static const OUString CFG_LOGPATH; 157cdf0e10cSrcweir static const OUString CFG_OOOIMPROVEMENT; 158cdf0e10cSrcweir static const OUString ETYPE_DISPATCH; 159cdf0e10cSrcweir static const OUString ETYPE_ROTATED; 160cdf0e10cSrcweir static const OUString ETYPE_VCL; 161cdf0e10cSrcweir static const OUString CSSL_CSVFORMATTER; 162cdf0e10cSrcweir static const OUString CSSL_FILEHANDLER; 163cdf0e10cSrcweir static const OUString CSSL_LOGGERPOOL; 164cdf0e10cSrcweir static const OUString CSSO_CORECONTROLLER; 165cdf0e10cSrcweir static const OUString CSST_JOBEXECUTOR; 166cdf0e10cSrcweir static const OUString CSSU_PATHSUB; 167cdf0e10cSrcweir static const OUString LOGGERNAME; 168cdf0e10cSrcweir static const OUString LOGORIGINAPP; 169cdf0e10cSrcweir static const OUString LOGORIGINWIDGET; 170cdf0e10cSrcweir static const OUString UNKNOWN_ORIGIN; 171cdf0e10cSrcweir static const OUString FN_CURRENTLOG; 172cdf0e10cSrcweir static const OUString FN_ROTATEDLOG; 173cdf0e10cSrcweir static const OUString LOGROTATE_EVENTNAME; 174cdf0e10cSrcweir static const OUString URL_UNO; 175cdf0e10cSrcweir static const OUString URL_SPECIAL; 176cdf0e10cSrcweir static const OUString URL_FILE; 177cdf0e10cSrcweir }; 178cdf0e10cSrcweir } 179cdf0e10cSrcweir 180cdf0e10cSrcweir namespace comphelper 181cdf0e10cSrcweir { 182cdf0e10cSrcweir // consts 183cdf0e10cSrcweir const sal_Int32 UiEventsLogger_Impl::COLUMNS = 9; 184cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CFG_ENABLED = OUString::createFromAscii("EnablingAllowed"); 185cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CFG_IDLETIMEOUT = OUString::createFromAscii("IdleTimeout"); 186cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CFG_LOGGING = OUString::createFromAscii("/org.openoffice.Office.Logging"); 187cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CFG_LOGPATH = OUString::createFromAscii("LogPath"); 188cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CFG_OOOIMPROVEMENT = OUString::createFromAscii("OOoImprovement"); 189cdf0e10cSrcweir 190cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CSSL_CSVFORMATTER = OUString::createFromAscii("com.sun.star.logging.CsvFormatter"); 191cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CSSL_FILEHANDLER = OUString::createFromAscii("com.sun.star.logging.FileHandler"); 192cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CSSL_LOGGERPOOL = OUString::createFromAscii("com.sun.star.logging.LoggerPool"); 193cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CSSO_CORECONTROLLER = OUString::createFromAscii("com.sun.star.oooimprovement.CoreController"); 194cdf0e10cSrcweir const OUString UiEventsLogger_Impl::CSSU_PATHSUB = OUString::createFromAscii("com.sun.star.util.PathSubstitution"); 195cdf0e10cSrcweir 196cdf0e10cSrcweir const OUString UiEventsLogger_Impl::ETYPE_DISPATCH = OUString::createFromAscii("dispatch"); 197cdf0e10cSrcweir const OUString UiEventsLogger_Impl::ETYPE_ROTATED = OUString::createFromAscii("rotated"); 198cdf0e10cSrcweir const OUString UiEventsLogger_Impl::ETYPE_VCL = OUString::createFromAscii("vcl"); 199cdf0e10cSrcweir 200cdf0e10cSrcweir const OUString UiEventsLogger_Impl::LOGGERNAME = OUString::createFromAscii("org.openoffice.oooimprovement.Core.UiEventsLogger"); 201cdf0e10cSrcweir const OUString UiEventsLogger_Impl::LOGORIGINWIDGET = OUString::createFromAscii("comphelper.UiEventsLogger.LogOriginWidget"); 202cdf0e10cSrcweir const OUString UiEventsLogger_Impl::LOGORIGINAPP = OUString::createFromAscii("comphelper.UiEventsLogger.LogOriginApp"); 203cdf0e10cSrcweir 204cdf0e10cSrcweir const OUString UiEventsLogger_Impl::UNKNOWN_ORIGIN = OUString::createFromAscii("unknown origin"); 205cdf0e10cSrcweir const OUString UiEventsLogger_Impl::FN_CURRENTLOG = OUString::createFromAscii("Current"); 206cdf0e10cSrcweir const OUString UiEventsLogger_Impl::FN_ROTATEDLOG = OUString::createFromAscii("OOoImprove"); 207cdf0e10cSrcweir const OUString UiEventsLogger_Impl::LOGROTATE_EVENTNAME = OUString::createFromAscii("onOOoImprovementLogRotated"); 208cdf0e10cSrcweir 209cdf0e10cSrcweir const OUString UiEventsLogger_Impl::URL_UNO = OUString::createFromAscii(".uno:"); 210cdf0e10cSrcweir const OUString UiEventsLogger_Impl::URL_SPECIAL = OUString::createFromAscii(".special:"); 211cdf0e10cSrcweir const OUString UiEventsLogger_Impl::URL_FILE = OUString::createFromAscii("file:"); 212cdf0e10cSrcweir 213cdf0e10cSrcweir 214cdf0e10cSrcweir // public UiEventsLogger interface isEnabled()215cdf0e10cSrcweir sal_Bool UiEventsLogger::isEnabled() 216cdf0e10cSrcweir { 217cdf0e10cSrcweir if ( UiEventsLogger_Impl::getEnabledFromCfg() ) 218cdf0e10cSrcweir { 219cdf0e10cSrcweir try { 220cdf0e10cSrcweir UiEventsLogger_Impl::prepareMutex(); 221cdf0e10cSrcweir Guard<Mutex> singleton_guard(UiEventsLogger_Impl::singleton_mutex); 222cdf0e10cSrcweir return UiEventsLogger_Impl::getInstance()->m_Active; 223cdf0e10cSrcweir } catch(...) { return false; } // never throws 224cdf0e10cSrcweir } // if ( ) 225cdf0e10cSrcweir return sal_False; 226cdf0e10cSrcweir } 227cdf0e10cSrcweir getSessionLogEventCount()228cdf0e10cSrcweir sal_Int32 UiEventsLogger::getSessionLogEventCount() 229cdf0e10cSrcweir { 230cdf0e10cSrcweir try { 231cdf0e10cSrcweir UiEventsLogger_Impl::prepareMutex(); 232cdf0e10cSrcweir Guard<Mutex> singleton_guard(UiEventsLogger_Impl::singleton_mutex); 233cdf0e10cSrcweir return UiEventsLogger_Impl::getInstance()->m_SessionLogEventCount; 234cdf0e10cSrcweir } catch(...) { return 0; } // never throws 235cdf0e10cSrcweir } 236cdf0e10cSrcweir appendDispatchOrigin(Sequence<PropertyValue> & args,const OUString & originapp,const OUString & originwidget)237cdf0e10cSrcweir void UiEventsLogger::appendDispatchOrigin( 238cdf0e10cSrcweir Sequence<PropertyValue>& args, 239cdf0e10cSrcweir const OUString& originapp, 240cdf0e10cSrcweir const OUString& originwidget) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir sal_Int32 old_length = args.getLength(); 243cdf0e10cSrcweir args.realloc(old_length+2); 244cdf0e10cSrcweir args[old_length].Name = UiEventsLogger_Impl::LOGORIGINAPP; 245cdf0e10cSrcweir args[old_length].Value = static_cast<Any>(originapp); 246cdf0e10cSrcweir args[old_length+1].Name = UiEventsLogger_Impl::LOGORIGINWIDGET; 247cdf0e10cSrcweir args[old_length+1].Value = static_cast<Any>(originwidget); 248cdf0e10cSrcweir } 249cdf0e10cSrcweir purgeDispatchOrigin(const Sequence<PropertyValue> & args)250cdf0e10cSrcweir Sequence<PropertyValue> UiEventsLogger::purgeDispatchOrigin( 251cdf0e10cSrcweir const Sequence<PropertyValue>& args) 252cdf0e10cSrcweir { 253cdf0e10cSrcweir Sequence<PropertyValue> result(args.getLength()); 254cdf0e10cSrcweir sal_Int32 target_idx=0; 255cdf0e10cSrcweir for(sal_Int32 source_idx=0; source_idx<args.getLength(); source_idx++) 256cdf0e10cSrcweir if(args[source_idx].Name != UiEventsLogger_Impl::LOGORIGINAPP 257cdf0e10cSrcweir && args[source_idx].Name != UiEventsLogger_Impl::LOGORIGINWIDGET) 258cdf0e10cSrcweir result[target_idx++] = args[source_idx]; 259cdf0e10cSrcweir result.realloc(target_idx); 260cdf0e10cSrcweir return result; 261cdf0e10cSrcweir } 262cdf0e10cSrcweir logDispatch(const URL & url,const Sequence<PropertyValue> & args)263cdf0e10cSrcweir void UiEventsLogger::logDispatch( 264cdf0e10cSrcweir const URL& url, 265cdf0e10cSrcweir const Sequence<PropertyValue>& args) 266cdf0e10cSrcweir { 267cdf0e10cSrcweir try { 268cdf0e10cSrcweir UiEventsLogger_Impl::prepareMutex(); 269cdf0e10cSrcweir Guard<Mutex> singleton_guard(UiEventsLogger_Impl::singleton_mutex); 270cdf0e10cSrcweir UiEventsLogger_Impl::getInstance()->logDispatch(url, args); 271cdf0e10cSrcweir } catch(...) { } // never throws 272cdf0e10cSrcweir } 273cdf0e10cSrcweir logVcl(const OUString & parent_id,sal_Int32 window_type,const OUString & id,const OUString & method,const OUString & param)274cdf0e10cSrcweir void UiEventsLogger::logVcl( 275cdf0e10cSrcweir const OUString& parent_id, 276cdf0e10cSrcweir sal_Int32 window_type, 277cdf0e10cSrcweir const OUString& id, 278cdf0e10cSrcweir const OUString& method, 279cdf0e10cSrcweir const OUString& param) 280cdf0e10cSrcweir { 281cdf0e10cSrcweir try { 282cdf0e10cSrcweir UiEventsLogger_Impl::prepareMutex(); 283cdf0e10cSrcweir Guard<Mutex> singleton_guard(UiEventsLogger_Impl::singleton_mutex); 284cdf0e10cSrcweir UiEventsLogger_Impl::getInstance()->logVcl(parent_id, window_type, id, method, param); 285cdf0e10cSrcweir } catch(...) { } // never throws 286cdf0e10cSrcweir } 287cdf0e10cSrcweir logVcl(const OUString & parent_id,sal_Int32 window_type,const OUString & id,const OUString & method,sal_Int32 param)288cdf0e10cSrcweir void UiEventsLogger::logVcl( 289cdf0e10cSrcweir const OUString& parent_id, 290cdf0e10cSrcweir sal_Int32 window_type, 291cdf0e10cSrcweir const OUString& id, 292cdf0e10cSrcweir const OUString& method, 293cdf0e10cSrcweir sal_Int32 param) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir OUStringBuffer buf; 296cdf0e10cSrcweir UiEventsLogger::logVcl(parent_id, window_type, id, method, buf.append(param).makeStringAndClear()); 297cdf0e10cSrcweir } 298cdf0e10cSrcweir logVcl(const OUString & parent_id,sal_Int32 window_type,const OUString & id,const OUString & method)299cdf0e10cSrcweir void UiEventsLogger::logVcl( 300cdf0e10cSrcweir const OUString& parent_id, 301cdf0e10cSrcweir sal_Int32 window_type, 302cdf0e10cSrcweir const OUString& id, 303cdf0e10cSrcweir const OUString& method) 304cdf0e10cSrcweir { 305cdf0e10cSrcweir OUString empty; 306cdf0e10cSrcweir UiEventsLogger::logVcl(parent_id, window_type, id, method, empty); 307cdf0e10cSrcweir } 308cdf0e10cSrcweir disposing()309cdf0e10cSrcweir void UiEventsLogger::disposing() 310cdf0e10cSrcweir { 311cdf0e10cSrcweir // we dont want to create an instance just to dispose it 312cdf0e10cSrcweir UiEventsLogger_Impl::prepareMutex(); 313cdf0e10cSrcweir Guard<Mutex> singleton_guard(UiEventsLogger_Impl::singleton_mutex); 314cdf0e10cSrcweir if(UiEventsLogger_Impl::instance!=UiEventsLogger_Impl::ptr()) 315cdf0e10cSrcweir UiEventsLogger_Impl::getInstance()->disposing(); 316cdf0e10cSrcweir } 317cdf0e10cSrcweir reinit()318cdf0e10cSrcweir void UiEventsLogger::reinit() 319cdf0e10cSrcweir { 320cdf0e10cSrcweir UiEventsLogger_Impl::prepareMutex(); 321cdf0e10cSrcweir Guard<Mutex> singleton_guard(UiEventsLogger_Impl::singleton_mutex); 322cdf0e10cSrcweir if(UiEventsLogger_Impl::instance) 323cdf0e10cSrcweir { 324cdf0e10cSrcweir UiEventsLogger_Impl::instance->disposing(); 325cdf0e10cSrcweir delete UiEventsLogger_Impl::instance; 326cdf0e10cSrcweir UiEventsLogger_Impl::instance = NULL; 327cdf0e10cSrcweir } 328cdf0e10cSrcweir } 329cdf0e10cSrcweir 330cdf0e10cSrcweir // private UiEventsLogger_Impl methods UiEventsLogger_Impl()331cdf0e10cSrcweir UiEventsLogger_Impl::UiEventsLogger_Impl() 332cdf0e10cSrcweir : m_Active(UiEventsLogger_Impl::shouldActivate()) 333cdf0e10cSrcweir , m_LogPath(UiEventsLogger_Impl::getLogPathFromCfg()) 334cdf0e10cSrcweir , m_IdleTimeout(UiEventsLogger_Impl::getIdleTimeoutFromCfg()) 335cdf0e10cSrcweir , m_SessionLogEventCount(0) 336cdf0e10cSrcweir { 337cdf0e10cSrcweir lcl_SetupOriginAppAbbr(m_OriginAppAbbr); 338cdf0e10cSrcweir lcl_SetupOriginWidgetAbbr(m_OriginWidgetAbbr); 339cdf0e10cSrcweir m_LastLogEventTime.Seconds = m_LastLogEventTime.Nanosec = 0; 340cdf0e10cSrcweir if(m_Active) rotate(); 341cdf0e10cSrcweir if(m_Active) initializeLogger(); 342cdf0e10cSrcweir } 343cdf0e10cSrcweir logDispatch(const URL & url,const Sequence<PropertyValue> & args)344cdf0e10cSrcweir void UiEventsLogger_Impl::logDispatch( 345cdf0e10cSrcweir const URL& url, 346cdf0e10cSrcweir const Sequence<PropertyValue>& args) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir if(!m_Active) return; 349cdf0e10cSrcweir if(!url.Complete.match(URL_UNO) 350cdf0e10cSrcweir && !url.Complete.match(URL_FILE) 351cdf0e10cSrcweir && !url.Complete.match(URL_SPECIAL)) 352cdf0e10cSrcweir { 353cdf0e10cSrcweir return; 354cdf0e10cSrcweir } 355cdf0e10cSrcweir checkIdleTimeout(); 356cdf0e10cSrcweir 357cdf0e10cSrcweir Sequence<OUString> logdata = Sequence<OUString>(COLUMNS); 358cdf0e10cSrcweir logdata[0] = ETYPE_DISPATCH; 359cdf0e10cSrcweir sal_Int32 originapp_idx = findIdx(args, LOGORIGINAPP); 360cdf0e10cSrcweir if(originapp_idx!=-1) 361cdf0e10cSrcweir { 362cdf0e10cSrcweir OUString app; 363cdf0e10cSrcweir args[originapp_idx].Value >>= app; 364cdf0e10cSrcweir map<OUString, OUString>::iterator abbr_it = m_OriginAppAbbr.find(app); 365cdf0e10cSrcweir if(abbr_it != m_OriginAppAbbr.end()) 366cdf0e10cSrcweir app = abbr_it->second; 367cdf0e10cSrcweir logdata[1] = app; 368cdf0e10cSrcweir } 369cdf0e10cSrcweir else 370cdf0e10cSrcweir logdata[1] = UNKNOWN_ORIGIN; 371cdf0e10cSrcweir sal_Int32 originwidget_idx = findIdx(args, LOGORIGINWIDGET); 372cdf0e10cSrcweir if(originwidget_idx!=-1) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir OUString widget; 375cdf0e10cSrcweir args[originwidget_idx].Value >>= widget; 376cdf0e10cSrcweir map<OUString, OUString>::iterator widget_it = m_OriginWidgetAbbr.find(widget); 377cdf0e10cSrcweir if(widget_it != m_OriginWidgetAbbr.end()) 378cdf0e10cSrcweir widget = widget_it->second; 379cdf0e10cSrcweir logdata[2] = widget; 380cdf0e10cSrcweir } 381cdf0e10cSrcweir else 382cdf0e10cSrcweir logdata[2] = UNKNOWN_ORIGIN; 383cdf0e10cSrcweir if(url.Complete.match(URL_FILE)) 384cdf0e10cSrcweir logdata[3] = URL_FILE; 385cdf0e10cSrcweir else 386cdf0e10cSrcweir logdata[3] = url.Main; 387cdf0e10cSrcweir OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s", 388cdf0e10cSrcweir OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(), 389cdf0e10cSrcweir OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(), 390cdf0e10cSrcweir OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(), 391cdf0e10cSrcweir OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(), 392cdf0e10cSrcweir OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(), 393cdf0e10cSrcweir OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(), 394cdf0e10cSrcweir OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(), 395cdf0e10cSrcweir OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(), 396cdf0e10cSrcweir OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr()); 397cdf0e10cSrcweir m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata)); 398cdf0e10cSrcweir m_SessionLogEventCount++; 399cdf0e10cSrcweir } 400cdf0e10cSrcweir logRotated()401cdf0e10cSrcweir void UiEventsLogger_Impl::logRotated() 402cdf0e10cSrcweir { 403cdf0e10cSrcweir Sequence<OUString> logdata = Sequence<OUString>(COLUMNS); 404cdf0e10cSrcweir logdata[0] = ETYPE_ROTATED; 405cdf0e10cSrcweir OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s", 406cdf0e10cSrcweir OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(), 407cdf0e10cSrcweir OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(), 408cdf0e10cSrcweir OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(), 409cdf0e10cSrcweir OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(), 410cdf0e10cSrcweir OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(), 411cdf0e10cSrcweir OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(), 412cdf0e10cSrcweir OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(), 413cdf0e10cSrcweir OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(), 414cdf0e10cSrcweir OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr()); 415cdf0e10cSrcweir m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata)); 416cdf0e10cSrcweir } 417cdf0e10cSrcweir logVcl(const OUString & parent_id,sal_Int32 window_type,const OUString & id,const OUString & method,const OUString & param)418cdf0e10cSrcweir void UiEventsLogger_Impl::logVcl( 419cdf0e10cSrcweir const OUString& parent_id, 420cdf0e10cSrcweir sal_Int32 window_type, 421cdf0e10cSrcweir const OUString& id, 422cdf0e10cSrcweir const OUString& method, 423cdf0e10cSrcweir const OUString& param) 424cdf0e10cSrcweir { 425cdf0e10cSrcweir if(!m_Active) return; 426cdf0e10cSrcweir checkIdleTimeout(); 427cdf0e10cSrcweir 428cdf0e10cSrcweir OUStringBuffer buf; 429cdf0e10cSrcweir Sequence<OUString> logdata = Sequence<OUString>(COLUMNS); 430cdf0e10cSrcweir logdata[0] = ETYPE_VCL; 431cdf0e10cSrcweir logdata[4] = parent_id; 432cdf0e10cSrcweir logdata[5] = buf.append(window_type).makeStringAndClear(); 433cdf0e10cSrcweir logdata[6] = id; 434cdf0e10cSrcweir logdata[7] = method; 435cdf0e10cSrcweir logdata[8] = param; 436cdf0e10cSrcweir OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s", 437cdf0e10cSrcweir OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(), 438cdf0e10cSrcweir OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(), 439cdf0e10cSrcweir OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(), 440cdf0e10cSrcweir OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(), 441cdf0e10cSrcweir OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(), 442cdf0e10cSrcweir OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(), 443cdf0e10cSrcweir OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(), 444cdf0e10cSrcweir OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(), 445cdf0e10cSrcweir OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr()); 446cdf0e10cSrcweir m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata)); 447cdf0e10cSrcweir m_SessionLogEventCount++; 448cdf0e10cSrcweir } 449cdf0e10cSrcweir rotate()450cdf0e10cSrcweir void UiEventsLogger_Impl::rotate() 451cdf0e10cSrcweir { 452cdf0e10cSrcweir FileBase::RC result = File::move(getCurrentPath(), getRotatedPath()); 453cdf0e10cSrcweir if(result!=FileBase::E_None && result!=FileBase::E_NOENT) 454cdf0e10cSrcweir m_Active = false; 455cdf0e10cSrcweir } 456cdf0e10cSrcweir hotRotate()457cdf0e10cSrcweir void UiEventsLogger_Impl::hotRotate() 458cdf0e10cSrcweir { 459cdf0e10cSrcweir logRotated(); 460cdf0e10cSrcweir m_Logger->removeLogHandler(m_LogHandler); 461cdf0e10cSrcweir m_LogHandler = NULL; 462cdf0e10cSrcweir rotate(); 463cdf0e10cSrcweir prepareLogHandler(); 464cdf0e10cSrcweir if(m_Formatter.is() && m_LogHandler.is() && m_Logger.is()) 465cdf0e10cSrcweir { 466cdf0e10cSrcweir m_LogHandler->setFormatter(Reference<XLogFormatter>(m_Formatter, UNO_QUERY)); 467cdf0e10cSrcweir m_LogHandler->setLevel(LogLevel::ALL); 468cdf0e10cSrcweir m_Logger->addLogHandler(m_LogHandler); 469cdf0e10cSrcweir } 470cdf0e10cSrcweir else 471cdf0e10cSrcweir m_Active = false; 472cdf0e10cSrcweir } 473cdf0e10cSrcweir prepareLogHandler()474cdf0e10cSrcweir void UiEventsLogger_Impl::prepareLogHandler() 475cdf0e10cSrcweir { 476cdf0e10cSrcweir Reference<XMultiServiceFactory> sm = getProcessServiceFactory(); 477cdf0e10cSrcweir 478cdf0e10cSrcweir Sequence<Any> init_args = Sequence<Any>(1); 479cdf0e10cSrcweir init_args[0] = static_cast<Any>(getCurrentPath()); 480cdf0e10cSrcweir Reference< XInterface > temp = 481cdf0e10cSrcweir sm->createInstanceWithArguments(CSSL_FILEHANDLER, init_args); 482cdf0e10cSrcweir m_LogHandler = Reference<XLogHandler>(temp, UNO_QUERY); 483cdf0e10cSrcweir } 484cdf0e10cSrcweir checkIdleTimeout()485cdf0e10cSrcweir void UiEventsLogger_Impl::checkIdleTimeout() 486cdf0e10cSrcweir { 487cdf0e10cSrcweir TimeValue now; 488cdf0e10cSrcweir osl_getSystemTime(&now); 489cdf0e10cSrcweir if(now.Seconds - m_LastLogEventTime.Seconds > m_IdleTimeout.Seconds && m_SessionLogEventCount>0) 490cdf0e10cSrcweir hotRotate(); 491cdf0e10cSrcweir m_LastLogEventTime = now; 492cdf0e10cSrcweir } 493cdf0e10cSrcweir getCurrentPath()494cdf0e10cSrcweir OUString UiEventsLogger_Impl::getCurrentPath() 495cdf0e10cSrcweir { 496cdf0e10cSrcweir OUStringBuffer current_path(m_LogPath); 497cdf0e10cSrcweir current_path.appendAscii("/"); 498cdf0e10cSrcweir current_path.append(FN_CURRENTLOG); 499cdf0e10cSrcweir current_path.appendAscii(".csv"); 500cdf0e10cSrcweir return current_path.makeStringAndClear(); 501cdf0e10cSrcweir } 502cdf0e10cSrcweir getRotatedPath()503cdf0e10cSrcweir OUString UiEventsLogger_Impl::getRotatedPath() 504cdf0e10cSrcweir { 505cdf0e10cSrcweir OUStringBuffer rotated_path(m_LogPath); 506cdf0e10cSrcweir rotated_path.appendAscii("/"); 507cdf0e10cSrcweir rotated_path.append(FN_ROTATEDLOG); 508cdf0e10cSrcweir rotated_path.appendAscii("-"); 509cdf0e10cSrcweir { 510cdf0e10cSrcweir // ISO 8601 511cdf0e10cSrcweir char tsrotated_pathfer[20]; 512cdf0e10cSrcweir oslDateTime now; 513cdf0e10cSrcweir TimeValue now_tv; 514cdf0e10cSrcweir osl_getSystemTime(&now_tv); 515cdf0e10cSrcweir osl_getDateTimeFromTimeValue(&now_tv, &now); 516cdf0e10cSrcweir const size_t rotated_pathfer_size = sizeof(tsrotated_pathfer); 517cdf0e10cSrcweir snprintf(tsrotated_pathfer, rotated_pathfer_size, "%04i-%02i-%02iT%02i_%02i_%02i", 518cdf0e10cSrcweir now.Year, 519cdf0e10cSrcweir now.Month, 520cdf0e10cSrcweir now.Day, 521cdf0e10cSrcweir now.Hours, 522cdf0e10cSrcweir now.Minutes, 523cdf0e10cSrcweir now.Seconds); 524cdf0e10cSrcweir rotated_path.appendAscii(tsrotated_pathfer); 525cdf0e10cSrcweir rotated_path.appendAscii(".csv"); 526cdf0e10cSrcweir } 527cdf0e10cSrcweir return rotated_path.makeStringAndClear(); 528cdf0e10cSrcweir } 529cdf0e10cSrcweir initializeLogger()530cdf0e10cSrcweir void UiEventsLogger_Impl::initializeLogger() 531cdf0e10cSrcweir { 532cdf0e10cSrcweir Reference<XMultiServiceFactory> sm = getProcessServiceFactory(); 533cdf0e10cSrcweir 534cdf0e10cSrcweir // getting the Core Uno proxy object 535cdf0e10cSrcweir // It will call disposing and make sure we clear all our references 536cdf0e10cSrcweir { 537cdf0e10cSrcweir Reference<XTerminateListener> xCore( 538cdf0e10cSrcweir sm->createInstance(OUString::createFromAscii("com.sun.star.oooimprovement.Core")), 539cdf0e10cSrcweir UNO_QUERY); 540cdf0e10cSrcweir Reference<XDesktop> xDesktop( 541cdf0e10cSrcweir sm->createInstance(OUString::createFromAscii("com.sun.star.frame.Desktop")), 542cdf0e10cSrcweir UNO_QUERY); 543cdf0e10cSrcweir if(!(xCore.is() && xDesktop.is())) 544cdf0e10cSrcweir { 545cdf0e10cSrcweir m_Active = false; 546cdf0e10cSrcweir return; 547cdf0e10cSrcweir } 548cdf0e10cSrcweir xDesktop->addTerminateListener(xCore); 549cdf0e10cSrcweir } 550cdf0e10cSrcweir // getting the LoggerPool 551cdf0e10cSrcweir Reference<XLoggerPool> pool; 552cdf0e10cSrcweir { 553cdf0e10cSrcweir Reference<XInterface> temp = 554cdf0e10cSrcweir sm->createInstance(CSSL_LOGGERPOOL); 555cdf0e10cSrcweir pool = Reference<XLoggerPool>(temp, UNO_QUERY); 556cdf0e10cSrcweir } 557cdf0e10cSrcweir 558cdf0e10cSrcweir // getting the Logger 559cdf0e10cSrcweir m_Logger = pool->getNamedLogger(LOGGERNAME); 560cdf0e10cSrcweir 561cdf0e10cSrcweir // getting the FileHandler 562cdf0e10cSrcweir prepareLogHandler(); 563cdf0e10cSrcweir 564cdf0e10cSrcweir // getting the Formatter 565cdf0e10cSrcweir { 566cdf0e10cSrcweir Reference<XInterface> temp = 567cdf0e10cSrcweir sm->createInstance(CSSL_CSVFORMATTER); 568cdf0e10cSrcweir m_Formatter = Reference<XCsvLogFormatter>(temp, UNO_QUERY); 569cdf0e10cSrcweir } 570cdf0e10cSrcweir 571cdf0e10cSrcweir if(m_Formatter.is() && m_LogHandler.is() && m_Logger.is()) 572cdf0e10cSrcweir { 573cdf0e10cSrcweir Sequence<OUString> columns = Sequence<OUString>(COLUMNS); 574cdf0e10cSrcweir columns[0] = OUString::createFromAscii("eventtype"); 575cdf0e10cSrcweir columns[1] = OUString::createFromAscii("originapp"); 576cdf0e10cSrcweir columns[2] = OUString::createFromAscii("originwidget"); 577cdf0e10cSrcweir columns[3] = OUString::createFromAscii("uno url"); 578cdf0e10cSrcweir columns[4] = OUString::createFromAscii("parent id"); 579cdf0e10cSrcweir columns[5] = OUString::createFromAscii("window type"); 580cdf0e10cSrcweir columns[6] = OUString::createFromAscii("id"); 581cdf0e10cSrcweir columns[7] = OUString::createFromAscii("method"); 582cdf0e10cSrcweir columns[8] = OUString::createFromAscii("parameter"); 583cdf0e10cSrcweir m_Formatter->setColumnnames(columns); 584cdf0e10cSrcweir m_LogHandler->setFormatter(Reference<XLogFormatter>(m_Formatter, UNO_QUERY)); 585cdf0e10cSrcweir m_Logger->setLevel(LogLevel::ALL); 586cdf0e10cSrcweir m_LogHandler->setLevel(LogLevel::ALL); 587cdf0e10cSrcweir m_Logger->addLogHandler(m_LogHandler); 588cdf0e10cSrcweir } 589cdf0e10cSrcweir else 590cdf0e10cSrcweir m_Active = false; 591cdf0e10cSrcweir } 592cdf0e10cSrcweir 593cdf0e10cSrcweir // private static UiEventsLogger_Impl shouldActivate()594cdf0e10cSrcweir bool UiEventsLogger_Impl::shouldActivate() 595cdf0e10cSrcweir { 596cdf0e10cSrcweir return getEnabledFromCfg() && getEnabledFromCoreController(); 597cdf0e10cSrcweir } 598cdf0e10cSrcweir getLogPathFromCfg()599cdf0e10cSrcweir OUString UiEventsLogger_Impl::getLogPathFromCfg() 600cdf0e10cSrcweir { 601cdf0e10cSrcweir OUString result; 602cdf0e10cSrcweir Reference<XMultiServiceFactory> sm = getProcessServiceFactory(); 603cdf0e10cSrcweir 604cdf0e10cSrcweir ConfigurationHelper::readDirectKey( 605cdf0e10cSrcweir sm, 606cdf0e10cSrcweir CFG_LOGGING, CFG_OOOIMPROVEMENT, CFG_LOGPATH, 607cdf0e10cSrcweir ConfigurationHelper::E_READONLY 608cdf0e10cSrcweir ) >>= result; 609cdf0e10cSrcweir 610cdf0e10cSrcweir Reference<XStringSubstitution> path_sub( 611cdf0e10cSrcweir sm->createInstance(CSSU_PATHSUB), 612cdf0e10cSrcweir UNO_QUERY); 613cdf0e10cSrcweir if(path_sub.is()) 614cdf0e10cSrcweir result = path_sub->substituteVariables(result, sal_False); 615cdf0e10cSrcweir return result; 616cdf0e10cSrcweir } 617cdf0e10cSrcweir getIdleTimeoutFromCfg()618cdf0e10cSrcweir TimeValue UiEventsLogger_Impl::getIdleTimeoutFromCfg() 619cdf0e10cSrcweir { 620cdf0e10cSrcweir sal_Int32 timeoutminutes = 360; 621cdf0e10cSrcweir Reference<XMultiServiceFactory> sm = getProcessServiceFactory(); 622cdf0e10cSrcweir 623cdf0e10cSrcweir ConfigurationHelper::readDirectKey( 624cdf0e10cSrcweir sm, 625cdf0e10cSrcweir CFG_LOGGING, CFG_OOOIMPROVEMENT, CFG_IDLETIMEOUT, 626cdf0e10cSrcweir ConfigurationHelper::E_READONLY 627cdf0e10cSrcweir ) >>= timeoutminutes; 628cdf0e10cSrcweir TimeValue result; 629cdf0e10cSrcweir result.Seconds = static_cast<sal_uInt32>(timeoutminutes)*60; 630cdf0e10cSrcweir result.Nanosec = 0; 631cdf0e10cSrcweir return result; 632cdf0e10cSrcweir } 633cdf0e10cSrcweir getEnabledFromCfg()634cdf0e10cSrcweir bool UiEventsLogger_Impl::getEnabledFromCfg() 635cdf0e10cSrcweir { 636cdf0e10cSrcweir sal_Bool result = false; 637cdf0e10cSrcweir Reference<XMultiServiceFactory> sm = getProcessServiceFactory(); 638cdf0e10cSrcweir ConfigurationHelper::readDirectKey( 639cdf0e10cSrcweir sm, 640cdf0e10cSrcweir CFG_LOGGING, CFG_OOOIMPROVEMENT, CFG_ENABLED, 641cdf0e10cSrcweir ::comphelper::ConfigurationHelper::E_READONLY 642cdf0e10cSrcweir ) >>= result; 643cdf0e10cSrcweir return result; 644cdf0e10cSrcweir } 645cdf0e10cSrcweir getEnabledFromCoreController()646cdf0e10cSrcweir bool UiEventsLogger_Impl::getEnabledFromCoreController() 647cdf0e10cSrcweir { 648cdf0e10cSrcweir Reference<XMultiServiceFactory> sm = getProcessServiceFactory(); 649cdf0e10cSrcweir Reference<XCoreController> core_c( 650cdf0e10cSrcweir sm->createInstance(OUString::createFromAscii("com.sun.star.oooimprovement.CoreController")), 651cdf0e10cSrcweir UNO_QUERY); 652cdf0e10cSrcweir if(!core_c.is()) return false; 653cdf0e10cSrcweir return core_c->enablingUiEventsLoggerAllowed(1); 654cdf0e10cSrcweir } 655cdf0e10cSrcweir 656cdf0e10cSrcweir UiEventsLogger_Impl::ptr UiEventsLogger_Impl::instance = UiEventsLogger_Impl::ptr(); getInstance()657cdf0e10cSrcweir UiEventsLogger_Impl::ptr UiEventsLogger_Impl::getInstance() 658cdf0e10cSrcweir { 659cdf0e10cSrcweir if(instance == NULL) 660cdf0e10cSrcweir instance = UiEventsLogger_Impl::ptr(new UiEventsLogger_Impl()); 661cdf0e10cSrcweir return instance; 662cdf0e10cSrcweir } 663cdf0e10cSrcweir 664cdf0e10cSrcweir Mutex * UiEventsLogger_Impl::singleton_mutex = NULL; prepareMutex()665cdf0e10cSrcweir void UiEventsLogger_Impl::prepareMutex() 666cdf0e10cSrcweir { 667cdf0e10cSrcweir if(singleton_mutex == NULL) 668cdf0e10cSrcweir { 669cdf0e10cSrcweir Guard<Mutex> global_guard(Mutex::getGlobalMutex()); 670cdf0e10cSrcweir if(singleton_mutex == NULL) 671cdf0e10cSrcweir singleton_mutex = new Mutex(); 672cdf0e10cSrcweir } 673cdf0e10cSrcweir } 674cdf0e10cSrcweir findIdx(const Sequence<PropertyValue> & args,const OUString & key)675cdf0e10cSrcweir sal_Int32 UiEventsLogger_Impl::findIdx(const Sequence<PropertyValue>& args, const OUString& key) 676cdf0e10cSrcweir { 677cdf0e10cSrcweir for(sal_Int32 i=0; i<args.getLength(); i++) 678cdf0e10cSrcweir if(args[i].Name == key) 679cdf0e10cSrcweir return i; 680cdf0e10cSrcweir return -1; 681cdf0e10cSrcweir } 682cdf0e10cSrcweir disposing()683cdf0e10cSrcweir void UiEventsLogger_Impl::disposing() 684cdf0e10cSrcweir { 685cdf0e10cSrcweir m_Active = false; 686cdf0e10cSrcweir m_Logger.clear() ; 687cdf0e10cSrcweir m_LogHandler.clear(); 688cdf0e10cSrcweir m_Formatter.clear(); 689cdf0e10cSrcweir } 690cdf0e10cSrcweir } 691