xref: /AOO41X/main/desktop/source/deployment/manager/dp_activepackages.cxx (revision 2722ceddc26af33ca9ed6a22fc3c4dfb805171c3)
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