1*2722ceddSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*2722ceddSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*2722ceddSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*2722ceddSAndrew Rist * distributed with this work for additional information
6*2722ceddSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*2722ceddSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*2722ceddSAndrew Rist * "License"); you may not use this file except in compliance
9*2722ceddSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*2722ceddSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*2722ceddSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*2722ceddSAndrew Rist * software distributed under the License is distributed on an
15*2722ceddSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2722ceddSAndrew Rist * KIND, either express or implied. See the License for the
17*2722ceddSAndrew Rist * specific language governing permissions and limitations
18*2722ceddSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*2722ceddSAndrew Rist *************************************************************/
21*2722ceddSAndrew Rist
22*2722ceddSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "precompiled_desktop.hxx"
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include "sal/config.h"
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include <cstddef>
29cdf0e10cSrcweir #include <utility>
30cdf0e10cSrcweir #include <vector>
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include "osl/diagnose.h"
33cdf0e10cSrcweir #include "rtl/strbuf.hxx"
34cdf0e10cSrcweir #include "rtl/string.hxx"
35cdf0e10cSrcweir #include "rtl/textenc.h"
36cdf0e10cSrcweir #include "rtl/uri.h"
37cdf0e10cSrcweir #include "rtl/uri.hxx"
38cdf0e10cSrcweir #include "rtl/ustring.hxx"
39cdf0e10cSrcweir #include <hash_map>
40cdf0e10cSrcweir
41cdf0e10cSrcweir #include "dp_identifier.hxx"
42cdf0e10cSrcweir #include "dp_persmap.h"
43cdf0e10cSrcweir
44cdf0e10cSrcweir #include "dp_activepackages.hxx"
45cdf0e10cSrcweir
46cdf0e10cSrcweir // Old format of database entry:
47cdf0e10cSrcweir // key: UTF8(filename)
48cdf0e10cSrcweir // value: UTF8(tempname ";" mediatype)
49cdf0e10cSrcweir // New format of database entry:
50cdf0e10cSrcweir // key: 0xFF UTF8(identifier)
51cdf0e10cSrcweir // value: UTF8(tempname) 0xFF UTF8(filename) 0xFF UTF8(mediatype)
52cdf0e10cSrcweir
53cdf0e10cSrcweir namespace {
54cdf0e10cSrcweir
55cdf0e10cSrcweir static char const separator = static_cast< char >(
56cdf0e10cSrcweir static_cast< unsigned char >(0xFF));
57cdf0e10cSrcweir
58cdf0e10cSrcweir static char const legacyPrefix[] = "org.openoffice.legacy.";
59cdf0e10cSrcweir
oldKey(::rtl::OUString const & fileName)60cdf0e10cSrcweir ::rtl::OString oldKey(::rtl::OUString const & fileName) {
61cdf0e10cSrcweir return ::rtl::OUStringToOString(fileName, RTL_TEXTENCODING_UTF8);
62cdf0e10cSrcweir }
63cdf0e10cSrcweir
newKey(::rtl::OUString const & id)64cdf0e10cSrcweir ::rtl::OString newKey(::rtl::OUString const & id) {
65cdf0e10cSrcweir ::rtl::OStringBuffer b;
66cdf0e10cSrcweir b.append(separator);
67cdf0e10cSrcweir b.append(::rtl::OUStringToOString(id, RTL_TEXTENCODING_UTF8));
68cdf0e10cSrcweir return b.makeStringAndClear();
69cdf0e10cSrcweir }
70cdf0e10cSrcweir
decodeOldData(::rtl::OUString const & fileName,::rtl::OString const & value)71cdf0e10cSrcweir ::dp_manager::ActivePackages::Data decodeOldData(
72cdf0e10cSrcweir ::rtl::OUString const & fileName, ::rtl::OString const & value)
73cdf0e10cSrcweir {
74cdf0e10cSrcweir ::dp_manager::ActivePackages::Data d;
75cdf0e10cSrcweir sal_Int32 i = value.indexOf(';');
76cdf0e10cSrcweir OSL_ASSERT(i >= 0);
77cdf0e10cSrcweir d.temporaryName = ::rtl::OUString(value.getStr(), i, RTL_TEXTENCODING_UTF8);
78cdf0e10cSrcweir d.fileName = fileName;
79cdf0e10cSrcweir d.mediaType = ::rtl::OUString(
80cdf0e10cSrcweir value.getStr() + i + 1, value.getLength() - i - 1,
81cdf0e10cSrcweir RTL_TEXTENCODING_UTF8);
82cdf0e10cSrcweir return d;
83cdf0e10cSrcweir }
84cdf0e10cSrcweir
decodeNewData(::rtl::OString const & value)85cdf0e10cSrcweir ::dp_manager::ActivePackages::Data decodeNewData(::rtl::OString const & value) {
86cdf0e10cSrcweir ::dp_manager::ActivePackages::Data d;
87cdf0e10cSrcweir sal_Int32 i1 = value.indexOf(separator);
88cdf0e10cSrcweir OSL_ASSERT(i1 >= 0);
89cdf0e10cSrcweir d.temporaryName = ::rtl::OUString(
90cdf0e10cSrcweir value.getStr(), i1, RTL_TEXTENCODING_UTF8);
91cdf0e10cSrcweir sal_Int32 i2 = value.indexOf(separator, i1 + 1);
92cdf0e10cSrcweir OSL_ASSERT(i2 >= 0);
93cdf0e10cSrcweir d.fileName = ::rtl::OUString(
94cdf0e10cSrcweir value.getStr() + i1 + 1, i2 - i1 - 1, RTL_TEXTENCODING_UTF8);
95cdf0e10cSrcweir sal_Int32 i3 = value.indexOf(separator, i2 + 1);
96cdf0e10cSrcweir
97cdf0e10cSrcweir if (i3 < 0)
98cdf0e10cSrcweir {
99cdf0e10cSrcweir //Before ActivePackages::Data::version was added
100cdf0e10cSrcweir d.mediaType = ::rtl::OUString(
101cdf0e10cSrcweir value.getStr() + i2 + 1, value.getLength() - i2 - 1,
102cdf0e10cSrcweir RTL_TEXTENCODING_UTF8);
103cdf0e10cSrcweir }
104cdf0e10cSrcweir else
105cdf0e10cSrcweir {
106cdf0e10cSrcweir sal_Int32 i4 = value.indexOf(separator, i3 + 1);
107cdf0e10cSrcweir d.mediaType = ::rtl::OUString(
108cdf0e10cSrcweir value.getStr() + i2 + 1, i3 - i2 -1, RTL_TEXTENCODING_UTF8);
109cdf0e10cSrcweir d.version = ::rtl::OUString(
110cdf0e10cSrcweir value.getStr() + i3 + 1, i4 - i3 - 1,
111cdf0e10cSrcweir RTL_TEXTENCODING_UTF8);
112cdf0e10cSrcweir d.failedPrerequisites = ::rtl::OUString(
113cdf0e10cSrcweir value.getStr() + i4 + 1, value.getLength() - i4 - 1,
114cdf0e10cSrcweir RTL_TEXTENCODING_UTF8);
115cdf0e10cSrcweir }
116cdf0e10cSrcweir return d;
117cdf0e10cSrcweir }
118cdf0e10cSrcweir
119cdf0e10cSrcweir }
120cdf0e10cSrcweir
121cdf0e10cSrcweir namespace dp_manager {
122cdf0e10cSrcweir
ActivePackages()123cdf0e10cSrcweir ActivePackages::ActivePackages() {}
124cdf0e10cSrcweir
ActivePackages(::rtl::OUString const & url,bool readOnly)125cdf0e10cSrcweir ActivePackages::ActivePackages(::rtl::OUString const & url, bool readOnly):
126cdf0e10cSrcweir m_map(url, readOnly) {}
127cdf0e10cSrcweir
~ActivePackages()128cdf0e10cSrcweir ActivePackages::~ActivePackages() {}
129cdf0e10cSrcweir
has(::rtl::OUString const & id,::rtl::OUString const & fileName) const130cdf0e10cSrcweir bool ActivePackages::has(
131cdf0e10cSrcweir ::rtl::OUString const & id, ::rtl::OUString const & fileName) const
132cdf0e10cSrcweir {
133cdf0e10cSrcweir return get(NULL, id, fileName);
134cdf0e10cSrcweir }
135cdf0e10cSrcweir
get(Data * data,::rtl::OUString const & id,::rtl::OUString const & fileName) const136cdf0e10cSrcweir bool ActivePackages::get(
137cdf0e10cSrcweir Data * data, ::rtl::OUString const & id, ::rtl::OUString const & fileName)
138cdf0e10cSrcweir const
139cdf0e10cSrcweir {
140cdf0e10cSrcweir ::rtl::OString v;
141cdf0e10cSrcweir if (m_map.get(&v, newKey(id))) {
142cdf0e10cSrcweir if (data != NULL) {
143cdf0e10cSrcweir *data = decodeNewData(v);
144cdf0e10cSrcweir }
145cdf0e10cSrcweir return true;
146cdf0e10cSrcweir } else if (m_map.get(&v, oldKey(fileName))) {
147cdf0e10cSrcweir if (data != NULL) {
148cdf0e10cSrcweir *data = decodeOldData(fileName, v);
149cdf0e10cSrcweir }
150cdf0e10cSrcweir return true;
151cdf0e10cSrcweir } else {
152cdf0e10cSrcweir return false;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir }
155cdf0e10cSrcweir
getEntries() const156cdf0e10cSrcweir ActivePackages::Entries ActivePackages::getEntries() const {
157cdf0e10cSrcweir Entries es;
158cdf0e10cSrcweir ::dp_misc::t_string2string_map m(m_map.getEntries());
159cdf0e10cSrcweir for (::dp_misc::t_string2string_map::const_iterator i(m.begin());
160cdf0e10cSrcweir i != m.end(); ++i)
161cdf0e10cSrcweir {
162cdf0e10cSrcweir if (i->first.getLength() > 0 && i->first[0] == separator) {
163cdf0e10cSrcweir es.push_back(
164cdf0e10cSrcweir ::std::make_pair(
165cdf0e10cSrcweir ::rtl::OUString(
166cdf0e10cSrcweir i->first.getStr() + 1, i->first.getLength() - 1,
167cdf0e10cSrcweir RTL_TEXTENCODING_UTF8),
168cdf0e10cSrcweir decodeNewData(i->second)));
169cdf0e10cSrcweir } else {
170cdf0e10cSrcweir ::rtl::OUString fn(
171cdf0e10cSrcweir ::rtl::OStringToOUString(i->first, RTL_TEXTENCODING_UTF8));
172cdf0e10cSrcweir es.push_back(
173cdf0e10cSrcweir ::std::make_pair(
174cdf0e10cSrcweir ::dp_misc::generateLegacyIdentifier(fn),
175cdf0e10cSrcweir decodeOldData(fn, i->second)));
176cdf0e10cSrcweir }
177cdf0e10cSrcweir }
178cdf0e10cSrcweir return es;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir
put(::rtl::OUString const & id,Data const & data)181cdf0e10cSrcweir void ActivePackages::put(::rtl::OUString const & id, Data const & data) {
182cdf0e10cSrcweir ::rtl::OStringBuffer b;
183cdf0e10cSrcweir b.append(
184cdf0e10cSrcweir ::rtl::OUStringToOString(data.temporaryName, RTL_TEXTENCODING_UTF8));
185cdf0e10cSrcweir b.append(separator);
186cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.fileName, RTL_TEXTENCODING_UTF8));
187cdf0e10cSrcweir b.append(separator);
188cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.mediaType, RTL_TEXTENCODING_UTF8));
189cdf0e10cSrcweir b.append(separator);
190cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.version, RTL_TEXTENCODING_UTF8));
191cdf0e10cSrcweir b.append(separator);
192cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.failedPrerequisites, RTL_TEXTENCODING_UTF8));
193cdf0e10cSrcweir m_map.put(newKey(id), b.makeStringAndClear());
194cdf0e10cSrcweir }
195cdf0e10cSrcweir
erase(::rtl::OUString const & id,::rtl::OUString const & fileName)196cdf0e10cSrcweir void ActivePackages::erase(
197cdf0e10cSrcweir ::rtl::OUString const & id, ::rtl::OUString const & fileName)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir m_map.erase(newKey(id), true) || m_map.erase(oldKey(fileName), true);
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202cdf0e10cSrcweir }
203