blob: 59578147fa484d84fe41e225e71231c918eedd58 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "precompiled_desktop.hxx"
#include "sal/config.h"
#include <cstddef>
#include <utility>
#include <vector>
#include "osl/diagnose.h"
#include "rtl/strbuf.hxx"
#include "rtl/string.hxx"
#include "rtl/textenc.h"
#include "rtl/uri.h"
#include "rtl/uri.hxx"
#include "rtl/ustring.hxx"
#include <hash_map>
#include "dp_identifier.hxx"
#include "dp_persmap.h"
#include "dp_activepackages.hxx"
// Old format of database entry:
// key: UTF8(filename)
// value: UTF8(tempname ";" mediatype)
// New format of database entry:
// key: 0xFF UTF8(identifier)
// value: UTF8(tempname) 0xFF UTF8(filename) 0xFF UTF8(mediatype)
namespace {
static char const separator = static_cast< char >(
static_cast< unsigned char >(0xFF));
static char const legacyPrefix[] = "org.openoffice.legacy.";
::rtl::OString oldKey(::rtl::OUString const & fileName) {
return ::rtl::OUStringToOString(fileName, RTL_TEXTENCODING_UTF8);
}
::rtl::OString newKey(::rtl::OUString const & id) {
::rtl::OStringBuffer b;
b.append(separator);
b.append(::rtl::OUStringToOString(id, RTL_TEXTENCODING_UTF8));
return b.makeStringAndClear();
}
::dp_manager::ActivePackages::Data decodeOldData(
::rtl::OUString const & fileName, ::rtl::OString const & value)
{
::dp_manager::ActivePackages::Data d;
sal_Int32 i = value.indexOf(';');
OSL_ASSERT(i >= 0);
d.temporaryName = ::rtl::OUString(value.getStr(), i, RTL_TEXTENCODING_UTF8);
d.fileName = fileName;
d.mediaType = ::rtl::OUString(
value.getStr() + i + 1, value.getLength() - i - 1,
RTL_TEXTENCODING_UTF8);
return d;
}
::dp_manager::ActivePackages::Data decodeNewData(::rtl::OString const & value) {
::dp_manager::ActivePackages::Data d;
sal_Int32 i1 = value.indexOf(separator);
OSL_ASSERT(i1 >= 0);
d.temporaryName = ::rtl::OUString(
value.getStr(), i1, RTL_TEXTENCODING_UTF8);
sal_Int32 i2 = value.indexOf(separator, i1 + 1);
OSL_ASSERT(i2 >= 0);
d.fileName = ::rtl::OUString(
value.getStr() + i1 + 1, i2 - i1 - 1, RTL_TEXTENCODING_UTF8);
sal_Int32 i3 = value.indexOf(separator, i2 + 1);
if (i3 < 0)
{
//Before ActivePackages::Data::version was added
d.mediaType = ::rtl::OUString(
value.getStr() + i2 + 1, value.getLength() - i2 - 1,
RTL_TEXTENCODING_UTF8);
}
else
{
sal_Int32 i4 = value.indexOf(separator, i3 + 1);
d.mediaType = ::rtl::OUString(
value.getStr() + i2 + 1, i3 - i2 -1, RTL_TEXTENCODING_UTF8);
d.version = ::rtl::OUString(
value.getStr() + i3 + 1, i4 - i3 - 1,
RTL_TEXTENCODING_UTF8);
d.failedPrerequisites = ::rtl::OUString(
value.getStr() + i4 + 1, value.getLength() - i4 - 1,
RTL_TEXTENCODING_UTF8);
}
return d;
}
}
namespace dp_manager {
ActivePackages::ActivePackages() {}
ActivePackages::ActivePackages(::rtl::OUString const & url, bool readOnly):
m_map(url, readOnly) {}
ActivePackages::~ActivePackages() {}
bool ActivePackages::has(
::rtl::OUString const & id, ::rtl::OUString const & fileName) const
{
return get(NULL, id, fileName);
}
bool ActivePackages::get(
Data * data, ::rtl::OUString const & id, ::rtl::OUString const & fileName)
const
{
::rtl::OString v;
if (m_map.get(&v, newKey(id))) {
if (data != NULL) {
*data = decodeNewData(v);
}
return true;
} else if (m_map.get(&v, oldKey(fileName))) {
if (data != NULL) {
*data = decodeOldData(fileName, v);
}
return true;
} else {
return false;
}
}
ActivePackages::Entries ActivePackages::getEntries() const {
Entries es;
::dp_misc::t_string2string_map m(m_map.getEntries());
for (::dp_misc::t_string2string_map::const_iterator i(m.begin());
i != m.end(); ++i)
{
if (i->first.getLength() > 0 && i->first[0] == separator) {
es.push_back(
::std::make_pair(
::rtl::OUString(
i->first.getStr() + 1, i->first.getLength() - 1,
RTL_TEXTENCODING_UTF8),
decodeNewData(i->second)));
} else {
::rtl::OUString fn(
::rtl::OStringToOUString(i->first, RTL_TEXTENCODING_UTF8));
es.push_back(
::std::make_pair(
::dp_misc::generateLegacyIdentifier(fn),
decodeOldData(fn, i->second)));
}
}
return es;
}
void ActivePackages::put(::rtl::OUString const & id, Data const & data) {
::rtl::OStringBuffer b;
b.append(
::rtl::OUStringToOString(data.temporaryName, RTL_TEXTENCODING_UTF8));
b.append(separator);
b.append(::rtl::OUStringToOString(data.fileName, RTL_TEXTENCODING_UTF8));
b.append(separator);
b.append(::rtl::OUStringToOString(data.mediaType, RTL_TEXTENCODING_UTF8));
b.append(separator);
b.append(::rtl::OUStringToOString(data.version, RTL_TEXTENCODING_UTF8));
b.append(separator);
b.append(::rtl::OUStringToOString(data.failedPrerequisites, RTL_TEXTENCODING_UTF8));
m_map.put(newKey(id), b.makeStringAndClear());
}
void ActivePackages::erase(
::rtl::OUString const & id, ::rtl::OUString const & fileName)
{
m_map.erase(newKey(id), true) || m_map.erase(oldKey(fileName), true);
}
}