xref: /AOO41X/main/comphelper/source/misc/uieventslogger.cxx (revision dde7d3faf6dcd9cbeb7b48ba6d0cea5ffcc883d0)
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