tdf#140107 Remove all collect usage data code.

Remove all collect usage data code because we
don't really use them.

Change-Id: I8d83d57220bed8f8c15bd012584943cd0913500d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119166
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx
index 3870a3d..83fd85d8 100644
--- a/cui/source/options/optgdlg.cxx
+++ b/cui/source/options/optgdlg.cxx
@@ -161,9 +161,9 @@ OfaMiscTabPage::OfaMiscTabPage(weld::Container* pPage, weld::DialogController* p
    , m_xYearFrame(m_xBuilder->weld_widget("yearframe"))
    , m_xYearValueField(m_xBuilder->weld_spin_button("year"))
    , m_xToYearFT(m_xBuilder->weld_label("toyear"))
    , m_xCollectUsageInfo(m_xBuilder->weld_check_button("collectusageinfo"))
    , m_xCrashReport(m_xBuilder->weld_check_button("crashreport"))
    , m_xQuickStarterFrame(m_xBuilder->weld_widget("quickstarter"))
    , m_xHelpImproveLabel(m_xBuilder->weld_label("label7")) //"Help Improve"
#if defined(UNX)
    , m_xQuickLaunchCB(m_xBuilder->weld_check_button("systray"))
#else
@@ -188,6 +188,8 @@ OfaMiscTabPage::OfaMiscTabPage(weld::Container* pPage, weld::DialogController* p
    //Only available in Win or if building the gtk systray
#if !defined(_WIN32)
    m_xQuickStarterFrame->hide();
    //Hide frame label in case of no content
    m_xHelpImproveLabel->hide();
#endif

#if defined(_WIN32)
@@ -251,12 +253,6 @@ bool OfaMiscTabPage::FillItemSet( SfxItemSet* rSet )
        rSet->Put( SfxUInt16Item( SID_ATTR_YEAR2000, nNum ) );
    }

    if (m_xCollectUsageInfo->get_state_changed_from_saved())
    {
        officecfg::Office::Common::Misc::CollectUsageInformation::set(m_xCollectUsageInfo->get_active(), batch);
        bModified = true;
    }

#if HAVE_FEATURE_BREAKPAD
    if (m_xCrashReport->get_state_changed_from_saved())
    {
@@ -309,10 +305,6 @@ void OfaMiscTabPage::Reset( const SfxItemSet* rSet )
    else
        m_xYearFrame->set_sensitive(false);

    m_xCollectUsageInfo->set_active(officecfg::Office::Common::Misc::CollectUsageInformation::get());
    m_xCollectUsageInfo->set_sensitive(!officecfg::Office::Common::Misc::CollectUsageInformation::isReadOnly());
    m_xCollectUsageInfo->save_state();

#if HAVE_FEATURE_BREAKPAD
    m_xCrashReport->set_active(officecfg::Office::Common::Misc::CrashReport::get() && CrashReporter::IsDumpEnable());
    m_xCrashReport->set_sensitive(!officecfg::Office::Common::Misc::CrashReport::isReadOnly() && CrashReporter::IsDumpEnable());
diff --git a/cui/source/options/optgdlg.hxx b/cui/source/options/optgdlg.hxx
index 38731ce..3d4c342 100644
--- a/cui/source/options/optgdlg.hxx
+++ b/cui/source/options/optgdlg.hxx
@@ -44,9 +44,9 @@ private:
    std::unique_ptr<weld::Widget> m_xYearFrame;
    std::unique_ptr<weld::SpinButton> m_xYearValueField;
    std::unique_ptr<weld::Label> m_xToYearFT;
    std::unique_ptr<weld::CheckButton> m_xCollectUsageInfo;
    std::unique_ptr<weld::CheckButton> m_xCrashReport;
    std::unique_ptr<weld::Widget> m_xQuickStarterFrame;
    std::unique_ptr<weld::Label> m_xHelpImproveLabel;
    std::unique_ptr<weld::CheckButton> m_xQuickLaunchCB;
#if defined(_WIN32)
    std::unique_ptr<weld::Widget> m_xFileAssocFrame;
diff --git a/cui/uiconfig/ui/optgeneralpage.ui b/cui/uiconfig/ui/optgeneralpage.ui
index 6d9512d..363ed46 100644
--- a/cui/uiconfig/ui/optgeneralpage.ui
+++ b/cui/uiconfig/ui/optgeneralpage.ui
@@ -280,26 +280,6 @@
            <property name="margin-start">12</property>
            <property name="margin-top">6</property>
            <child>
              <object class="GtkCheckButton" id="collectusageinfo">
                <property name="label" translatable="yes" context="optgeneralpage|collectusageinfo">Collect usage data and send it to The Document Foundation</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="margin_top">1</property>
                <property name="use_underline">True</property>
                <property name="draw_indicator">True</property>
                <child internal-child="accessible">
                  <object class="AtkObject" id="collectusageinfo-atkobject">
                    <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip | collectusageinfo">Send usage data to help The Document Foundation improve the software usability.</property>
                  </object>
                </child>
              </object>
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkCheckButton" id="crashreport">
                <property name="label" translatable="yes" context="optgeneralpage|crashreport">Sen_d crash reports to The Document Foundation</property>
                <property name="visible">True</property>
diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
index d74a941..c994000 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
@@ -5663,14 +5663,6 @@
        </info>
        <value>false</value>
      </prop>
      <prop oor:name="CollectUsageInformation" oor:type="xs:boolean" oor:nillable="false">
        <info>
          <desc>Determines whether the usage information (like what actions
          the user has performed) can be collected, and potentially sent for
          examination.</desc>
        </info>
        <value>false</value>
      </prop>
      <prop oor:name="CrashReport" oor:type="xs:boolean" oor:nillable="false">
        <!-- UIHints: Tools - Options - General -->
        <info>
diff --git a/sfx2/source/control/unoctitm.cxx b/sfx2/source/control/unoctitm.cxx
index cf6985e..1eb2726 100644
--- a/sfx2/source/control/unoctitm.cxx
+++ b/sfx2/source/control/unoctitm.cxx
@@ -504,147 +504,6 @@ OUString SfxDispatchController_Impl::getSlaveCommand( const css::util::URL& rURL

namespace {

/// Class that collects the usage information - how many times what .uno: command was used.
class UsageInfo {

    typedef std::map<OUString, int> UsageMap;

    /// Are we collecting the info?  We cache the value because the call to save can happen very late.
    bool mbIsCollecting;

    /// Command vs. how many times it was used
    UsageMap maUsage;

    /// config path, get it long before atexit time
    OUString msConfigPath;

public:
    UsageInfo() : mbIsCollecting(false)
    {
    }

    ~UsageInfo()
    {
        save();
    }

    /// Increment command's use.
    void increment(const OUString &rCommand);

    /// Save the usage data for the next session.
    void save();

    /// Modify the flag whether we are collecting.
    void setCollecting(bool bIsCollecting)
    {
        mbIsCollecting = bIsCollecting;
        if (mbIsCollecting)
        {
            msConfigPath = SvtPathOptions().GetConfigPath();
            msConfigPath += "usage/";
        }
    }
};

void UsageInfo::increment(const OUString &rCommand)
{
    UsageMap::iterator it = maUsage.find(rCommand);

    if (it != maUsage.end())
        ++(it->second);
    else
        maUsage[rCommand] = 1;
}

void UsageInfo::save()
{
    if (!mbIsCollecting)
        return;

    osl::Directory::createPath(msConfigPath);

    //get system time information.
    TimeValue systemTime;
    TimeValue localTime;
    oslDateTime localDateTime;
    osl_getSystemTime( &systemTime );
    osl_getLocalTimeFromSystemTime( &systemTime, &localTime );
    osl_getDateTimeFromTimeValue( &localTime, &localDateTime );

    char time[1024];
    sprintf(time,"%4i-%02i-%02iT%02i_%02i_%02i", localDateTime.Year, localDateTime.Month, localDateTime.Day, localDateTime.Hours, localDateTime.Minutes, localDateTime.Seconds);

    //filename type: usage-YYYY-MM-DDTHH_MM_SS.csv
    OUString filename = "usage-" + OUString::createFromAscii(time) + ".csv";
    OUString path = msConfigPath + filename;

    osl::File file(path);

    if( file.open(osl_File_OpenFlag_Read | osl_File_OpenFlag_Write | osl_File_OpenFlag_Create) == osl::File::E_None )
    {
        OStringBuffer aUsageInfoMsg("Document Type;Command;Count");

        for (auto const& elem : maUsage)
            aUsageInfoMsg.append("\n" + elem.first.toUtf8() + ";" + OString::number(elem.second));

        sal_uInt64 written = 0;
        auto s = aUsageInfoMsg.makeStringAndClear();
        file.write(s.getStr(), s.getLength(), written);
        file.close();
    }
}

class theUsageInfo : public rtl::Static<UsageInfo, theUsageInfo> {};

/// Extracts information about the command + args, and stores that.
void collectUsageInformation(const util::URL& rURL, const uno::Sequence<beans::PropertyValue>& rArgs)
{
    bool bCollecting = getenv("LO_COLLECT_USAGE") || officecfg::Office::Common::Misc::CollectUsageInformation::get();
    theUsageInfo::get().setCollecting(bCollecting);
    if (!bCollecting)
        return;

    OUStringBuffer aBuffer;

    // app identification [uh, several UNO calls :-(]
    uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
    uno::Reference<frame::XModuleManager2> xModuleManager(frame::ModuleManager::create(xContext));
    uno::Reference<frame::XDesktop2> xDesktop = frame::Desktop::create(xContext);
    uno::Reference<frame::XFrame> xFrame = xDesktop->getCurrentFrame();

    OUString aModule(xModuleManager->identify(xFrame));
    sal_Int32 nLastDot = aModule.lastIndexOf('.');
    if (nLastDot >= 0)
        aModule = aModule.copy(nLastDot + 1);

    aBuffer.append(aModule);
    aBuffer.append(';');

    // command
    aBuffer.append(rURL.Protocol);
    aBuffer.append(rURL.Path);
    sal_Int32 nCount = rArgs.getLength();

    // parameters - only their names, not the values (could be sensitive!)
    if (nCount > 0)
    {
        aBuffer.append('(');
        for (sal_Int32 n = 0; n < nCount; n++)
        {
            const css::beans::PropertyValue& rProp = rArgs[n];
            if (n > 0)
                aBuffer.append(',');
            aBuffer.append(rProp.Name);
        }
        aBuffer.append(')');
    }

    OUString aCommand(aBuffer.makeStringAndClear());

    // store
    theUsageInfo::get().increment(aCommand);
}

void collectUIInformation(const util::URL& rURL, const css::uno::Sequence< css::beans::PropertyValue >& rArgs)
{
    static const char* pFile = std::getenv("LO_COLLECT_UIINFO");
@@ -664,7 +523,6 @@ void SfxDispatchController_Impl::dispatch( const css::util::URL& aURL,
    {
        CrashReporter::logUnoCommand(aURL.Path);
    }
    collectUsageInformation(aURL, aArgs);
    collectUIInformation(aURL, aArgs);

    SolarMutexGuard aGuard;