summaryrefslogtreecommitdiff
path: root/setup_native
diff options
context:
space:
mode:
authorSteven Butler <sebutler@gmail.com>2011-02-20 00:09:22 +1000
committerFridrich Štrba <fridrich.strba@bluewin.ch>2011-02-28 16:32:21 +0100
commitd5931ad3631ed74d73fea119573c1e3bbf176ee1 (patch)
treee9b46389cb1fb4de2796da2158c6928a8ed68767 /setup_native
parente1f33256f9f7edb143acc0fcc3e3d0f2d492df92 (diff)
Add MSI custom action capable of generating thesaurus index
Diffstat (limited to 'setup_native')
-rwxr-xr-xsetup_native/source/win32/customactions/thesaurus/exports.dxp1
-rwxr-xr-xsetup_native/source/win32/customactions/thesaurus/makefile.mk78
-rw-r--r--setup_native/source/win32/customactions/thesaurus/thesaurus.cxx214
3 files changed, 293 insertions, 0 deletions
diff --git a/setup_native/source/win32/customactions/thesaurus/exports.dxp b/setup_native/source/win32/customactions/thesaurus/exports.dxp
new file mode 100755
index 000000000000..830adddb3166
--- /dev/null
+++ b/setup_native/source/win32/customactions/thesaurus/exports.dxp
@@ -0,0 +1 @@
+CreateIndexes
diff --git a/setup_native/source/win32/customactions/thesaurus/makefile.mk b/setup_native/source/win32/customactions/thesaurus/makefile.mk
new file mode 100755
index 000000000000..c353341bf353
--- /dev/null
+++ b/setup_native/source/win32/customactions/thesaurus/makefile.mk
@@ -0,0 +1,78 @@
+#*************************************************************************
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# The Contents of this file are made available subject to
+# the terms of GNU Lesser General Public License Version 3.
+#
+#
+# GNU Lesser General Public License Version 3
+# =============================================
+# Copyright 2005 by Sun Microsystems, Inc.
+# 901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+#*************************************************************************
+
+PRJ=..$/..$/..$/..
+PRJNAME=setup_native
+TARGET=thidxmsi
+
+.IF "$(GUI)"=="WNT"
+
+# --- Settings -----------------------------------------------------
+
+ENABLE_EXCEPTIONS=TRUE
+NO_DEFAULT_STL=TRUE
+DYNAMIC_CRT=
+USE_DEFFILE=TRUE
+
+.INCLUDE : settings.mk
+
+CFLAGS+=-D_STLP_USE_STATIC_LIB
+
+# --- Files --------------------------------------------------------
+
+UWINAPILIB=
+
+SLOFILES = \
+ $(SLO)$/thesaurus.obj
+
+SHL1STDLIBS= kernel32.lib\
+ user32.lib\
+ advapi32.lib\
+ shell32.lib\
+ msi.lib
+
+SHL1LIBS = $(SLB)$/$(TARGET).lib
+
+SHL1TARGET = $(TARGET)
+SHL1IMPLIB = i$(TARGET)
+
+SHL1DEF = $(MISC)$/$(SHL1TARGET).def
+SHL1DEPN = $(SLB)$/$(TARGET).lib
+SHL1BASE = 0x1c000000
+DEF1NAME=$(SHL1TARGET)
+DEF1EXPORTFILE=exports.dxp
+
+# --- Targets --------------------------------------------------------------
+
+.INCLUDE : target.mk
+
+# -------------------------------------------------------------------------
+
+
+.ENDIF
diff --git a/setup_native/source/win32/customactions/thesaurus/thesaurus.cxx b/setup_native/source/win32/customactions/thesaurus/thesaurus.cxx
new file mode 100644
index 000000000000..07bd605cb964
--- /dev/null
+++ b/setup_native/source/win32/customactions/thesaurus/thesaurus.cxx
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU Lesser General Public License Version 3.
+ *
+ *
+ * GNU Lesser General Public License Version 3
+ * =============================================
+ * Copyright 2005 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ ************************************************************************/
+
+
+
+#define WIN32_LEAN_AND_MEAN
+#define _WIN32_WINNT 0x0500
+#undef WINVER
+#define WINVER 0x0500
+
+#include <windows.h>
+#include <msiquery.h>
+#include <malloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <systools/win32/uwinapi.h>
+#include <io.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <map>
+#include <vector>
+#include <stdlib.h>
+#include <string.h>
+using namespace std;
+namespace
+{
+
+ string GetMsiProperty(MSIHANDLE handle, const string& sProperty)
+ {
+ string result;
+ TCHAR szDummy[1] = TEXT("");
+ DWORD nChars = 0;
+
+ if (MsiGetProperty(handle, sProperty.c_str(), szDummy, &nChars) == ERROR_MORE_DATA)
+ {
+ DWORD nBytes = ++nChars * sizeof(TCHAR);
+ LPTSTR buffer = reinterpret_cast<LPTSTR>(_alloca(nBytes));
+ ZeroMemory( buffer, nBytes );
+ MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars);
+ result = buffer;
+ }
+ return result;
+ }
+
+ inline bool IsSetMsiProperty(MSIHANDLE handle, const string& sProperty)
+ {
+ return (GetMsiProperty(handle, sProperty).length() > 0);
+ }
+
+ inline void UnsetMsiProperty(MSIHANDLE handle, const string& sProperty)
+ {
+ MsiSetProperty(handle, sProperty.c_str(), NULL);
+ }
+
+ inline void SetMsiProperty(MSIHANDLE handle, const string& sProperty, const string&)
+ {
+ MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
+ }
+
+ static const int MAXLINE = 1024*64;
+
+
+ void generateIndex(const char *inputFile, const char *outputFile)
+ {
+
+ ifstream in(inputFile);
+ char inputBuffer[MAXLINE];
+ map<string, size_t> entries;
+ map<string,size_t>::iterator ret(entries.begin());
+
+ int line(1);
+ in.getline(inputBuffer, MAXLINE);
+ const string encoding(inputBuffer);
+ size_t currentOffset(encoding.size()+1);
+ while (true)
+ {
+ // Extract the next word, but not the entry count
+ in.getline(inputBuffer, MAXLINE, '|');
+
+ if (in.eof()) break;
+
+ string word(inputBuffer);
+ ret = entries.insert(ret, pair<string, size_t>(word, currentOffset));
+ currentOffset += word.size() + 1;
+ // Next is the entry count
+ in.getline(inputBuffer, MAXLINE);
+ if (!in.good())
+ {
+ return;
+
+ }
+ currentOffset += strlen(inputBuffer)+1;
+ int entryCount(strtol(inputBuffer, NULL, 10));
+ for (int i(0); i < entryCount; ++i)
+ {
+ in.getline(inputBuffer, MAXLINE);
+ currentOffset += strlen(inputBuffer)+1;
+ ++line;
+ }
+ }
+
+ // Use binary mode to prevent any translation of LF to CRLF on Windows
+ ofstream outputStream(outputFile, ios_base::binary| ios_base::trunc|ios_base::out);
+ if (!outputStream.is_open())
+ {
+ //cerr << "Unable to open output file " << outputFile << endl;
+ return;
+ }
+
+ cerr << "Doing it now" << outputFile << endl;
+ outputStream << encoding << '\n' << entries.size() << '\n';
+
+ for (map<string, size_t>::const_iterator ii(entries.begin());
+ ii != entries.end();
+ ++ii
+ )
+ {
+ outputStream << ii->first << '|' << ii->second << '\n';
+ }
+ outputStream.close();
+ }
+
+ void generateIndex(const string &datFile)
+ {
+ string idxFile(datFile.substr(0, datFile.size()-3)+"idx");
+ generateIndex(datFile.c_str(), idxFile.c_str());
+ }
+ void createIndexesForThesaurusFiles(const string & sOfficeInstallPath)
+ {
+ vector<string> thesaurusPaths;
+
+ string sExtensionsPath = sOfficeInstallPath + "\\share\\extensions\\";
+
+ string dictionariesWildcard = sExtensionsPath + "dict-*";
+
+ struct _finddatai64_t dictFind;
+ long h = _findfirsti64(dictionariesWildcard.c_str(),&dictFind);
+ if (h > 0)
+ {
+ do
+ {
+ if (dictFind.attrib & _A_SUBDIR)
+ {
+ struct _finddatai64_t datFind;
+ // Find any .dat files in the subdirectory
+ string dictPath = sExtensionsPath + dictFind.name + "\\";
+ string datWildCard = dictPath + "*.dat";
+ long h2 = _findfirsti64(datWildCard.c_str(), &datFind);
+ if (h2 > 0)
+ {
+ do
+ {
+ thesaurusPaths.push_back(dictPath + datFind.name);
+
+ } while (_findnexti64(h2,&datFind) == 0);
+ }
+ }
+
+ } while (_findnexti64(h,&dictFind) == 0);
+ }
+ for (vector<string>::const_iterator ii(thesaurusPaths.begin());
+ ii != thesaurusPaths.end();
+ ++ii
+ )
+ {
+ generateIndex(*ii);
+ }
+ }
+
+} // namespace
+
+
+// Creates the thesaurus .idx files for all installed .dat
+// thesaurus files
+extern "C" UINT __stdcall CreateIndexes( MSIHANDLE handle )
+{
+
+ string sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
+ createIndexesForThesaurusFiles(sOfficeInstallPath);
+ return ERROR_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */