1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "precompiled_desktop.hxx" 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include "sal/config.h" 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <cstddef> 33*cdf0e10cSrcweir #include <utility> 34*cdf0e10cSrcweir #include <vector> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include "osl/diagnose.h" 37*cdf0e10cSrcweir #include "rtl/strbuf.hxx" 38*cdf0e10cSrcweir #include "rtl/string.hxx" 39*cdf0e10cSrcweir #include "rtl/textenc.h" 40*cdf0e10cSrcweir #include "rtl/uri.h" 41*cdf0e10cSrcweir #include "rtl/uri.hxx" 42*cdf0e10cSrcweir #include "rtl/ustring.hxx" 43*cdf0e10cSrcweir #include <hash_map> 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir #include "dp_identifier.hxx" 46*cdf0e10cSrcweir #include "dp_persmap.h" 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir #include "dp_activepackages.hxx" 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir // Old format of database entry: 51*cdf0e10cSrcweir // key: UTF8(filename) 52*cdf0e10cSrcweir // value: UTF8(tempname ";" mediatype) 53*cdf0e10cSrcweir // New format of database entry: 54*cdf0e10cSrcweir // key: 0xFF UTF8(identifier) 55*cdf0e10cSrcweir // value: UTF8(tempname) 0xFF UTF8(filename) 0xFF UTF8(mediatype) 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir namespace { 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir static char const separator = static_cast< char >( 60*cdf0e10cSrcweir static_cast< unsigned char >(0xFF)); 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir static char const legacyPrefix[] = "org.openoffice.legacy."; 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir ::rtl::OString oldKey(::rtl::OUString const & fileName) { 65*cdf0e10cSrcweir return ::rtl::OUStringToOString(fileName, RTL_TEXTENCODING_UTF8); 66*cdf0e10cSrcweir } 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir ::rtl::OString newKey(::rtl::OUString const & id) { 69*cdf0e10cSrcweir ::rtl::OStringBuffer b; 70*cdf0e10cSrcweir b.append(separator); 71*cdf0e10cSrcweir b.append(::rtl::OUStringToOString(id, RTL_TEXTENCODING_UTF8)); 72*cdf0e10cSrcweir return b.makeStringAndClear(); 73*cdf0e10cSrcweir } 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir ::dp_manager::ActivePackages::Data decodeOldData( 76*cdf0e10cSrcweir ::rtl::OUString const & fileName, ::rtl::OString const & value) 77*cdf0e10cSrcweir { 78*cdf0e10cSrcweir ::dp_manager::ActivePackages::Data d; 79*cdf0e10cSrcweir sal_Int32 i = value.indexOf(';'); 80*cdf0e10cSrcweir OSL_ASSERT(i >= 0); 81*cdf0e10cSrcweir d.temporaryName = ::rtl::OUString(value.getStr(), i, RTL_TEXTENCODING_UTF8); 82*cdf0e10cSrcweir d.fileName = fileName; 83*cdf0e10cSrcweir d.mediaType = ::rtl::OUString( 84*cdf0e10cSrcweir value.getStr() + i + 1, value.getLength() - i - 1, 85*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 86*cdf0e10cSrcweir return d; 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir ::dp_manager::ActivePackages::Data decodeNewData(::rtl::OString const & value) { 90*cdf0e10cSrcweir ::dp_manager::ActivePackages::Data d; 91*cdf0e10cSrcweir sal_Int32 i1 = value.indexOf(separator); 92*cdf0e10cSrcweir OSL_ASSERT(i1 >= 0); 93*cdf0e10cSrcweir d.temporaryName = ::rtl::OUString( 94*cdf0e10cSrcweir value.getStr(), i1, RTL_TEXTENCODING_UTF8); 95*cdf0e10cSrcweir sal_Int32 i2 = value.indexOf(separator, i1 + 1); 96*cdf0e10cSrcweir OSL_ASSERT(i2 >= 0); 97*cdf0e10cSrcweir d.fileName = ::rtl::OUString( 98*cdf0e10cSrcweir value.getStr() + i1 + 1, i2 - i1 - 1, RTL_TEXTENCODING_UTF8); 99*cdf0e10cSrcweir sal_Int32 i3 = value.indexOf(separator, i2 + 1); 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir if (i3 < 0) 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir //Before ActivePackages::Data::version was added 104*cdf0e10cSrcweir d.mediaType = ::rtl::OUString( 105*cdf0e10cSrcweir value.getStr() + i2 + 1, value.getLength() - i2 - 1, 106*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir else 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir sal_Int32 i4 = value.indexOf(separator, i3 + 1); 111*cdf0e10cSrcweir d.mediaType = ::rtl::OUString( 112*cdf0e10cSrcweir value.getStr() + i2 + 1, i3 - i2 -1, RTL_TEXTENCODING_UTF8); 113*cdf0e10cSrcweir d.version = ::rtl::OUString( 114*cdf0e10cSrcweir value.getStr() + i3 + 1, i4 - i3 - 1, 115*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 116*cdf0e10cSrcweir d.failedPrerequisites = ::rtl::OUString( 117*cdf0e10cSrcweir value.getStr() + i4 + 1, value.getLength() - i4 - 1, 118*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir return d; 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir namespace dp_manager { 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir ActivePackages::ActivePackages() {} 128*cdf0e10cSrcweir 129*cdf0e10cSrcweir ActivePackages::ActivePackages(::rtl::OUString const & url, bool readOnly): 130*cdf0e10cSrcweir m_map(url, readOnly) {} 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir ActivePackages::~ActivePackages() {} 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir bool ActivePackages::has( 135*cdf0e10cSrcweir ::rtl::OUString const & id, ::rtl::OUString const & fileName) const 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir return get(NULL, id, fileName); 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir bool ActivePackages::get( 141*cdf0e10cSrcweir Data * data, ::rtl::OUString const & id, ::rtl::OUString const & fileName) 142*cdf0e10cSrcweir const 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir ::rtl::OString v; 145*cdf0e10cSrcweir if (m_map.get(&v, newKey(id))) { 146*cdf0e10cSrcweir if (data != NULL) { 147*cdf0e10cSrcweir *data = decodeNewData(v); 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir return true; 150*cdf0e10cSrcweir } else if (m_map.get(&v, oldKey(fileName))) { 151*cdf0e10cSrcweir if (data != NULL) { 152*cdf0e10cSrcweir *data = decodeOldData(fileName, v); 153*cdf0e10cSrcweir } 154*cdf0e10cSrcweir return true; 155*cdf0e10cSrcweir } else { 156*cdf0e10cSrcweir return false; 157*cdf0e10cSrcweir } 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir ActivePackages::Entries ActivePackages::getEntries() const { 161*cdf0e10cSrcweir Entries es; 162*cdf0e10cSrcweir ::dp_misc::t_string2string_map m(m_map.getEntries()); 163*cdf0e10cSrcweir for (::dp_misc::t_string2string_map::const_iterator i(m.begin()); 164*cdf0e10cSrcweir i != m.end(); ++i) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir if (i->first.getLength() > 0 && i->first[0] == separator) { 167*cdf0e10cSrcweir es.push_back( 168*cdf0e10cSrcweir ::std::make_pair( 169*cdf0e10cSrcweir ::rtl::OUString( 170*cdf0e10cSrcweir i->first.getStr() + 1, i->first.getLength() - 1, 171*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8), 172*cdf0e10cSrcweir decodeNewData(i->second))); 173*cdf0e10cSrcweir } else { 174*cdf0e10cSrcweir ::rtl::OUString fn( 175*cdf0e10cSrcweir ::rtl::OStringToOUString(i->first, RTL_TEXTENCODING_UTF8)); 176*cdf0e10cSrcweir es.push_back( 177*cdf0e10cSrcweir ::std::make_pair( 178*cdf0e10cSrcweir ::dp_misc::generateLegacyIdentifier(fn), 179*cdf0e10cSrcweir decodeOldData(fn, i->second))); 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir return es; 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir void ActivePackages::put(::rtl::OUString const & id, Data const & data) { 186*cdf0e10cSrcweir ::rtl::OStringBuffer b; 187*cdf0e10cSrcweir b.append( 188*cdf0e10cSrcweir ::rtl::OUStringToOString(data.temporaryName, RTL_TEXTENCODING_UTF8)); 189*cdf0e10cSrcweir b.append(separator); 190*cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.fileName, RTL_TEXTENCODING_UTF8)); 191*cdf0e10cSrcweir b.append(separator); 192*cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.mediaType, RTL_TEXTENCODING_UTF8)); 193*cdf0e10cSrcweir b.append(separator); 194*cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.version, RTL_TEXTENCODING_UTF8)); 195*cdf0e10cSrcweir b.append(separator); 196*cdf0e10cSrcweir b.append(::rtl::OUStringToOString(data.failedPrerequisites, RTL_TEXTENCODING_UTF8)); 197*cdf0e10cSrcweir m_map.put(newKey(id), b.makeStringAndClear()); 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir void ActivePackages::erase( 201*cdf0e10cSrcweir ::rtl::OUString const & id, ::rtl::OUString const & fileName) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir m_map.erase(newKey(id), true) || m_map.erase(oldKey(fileName), true); 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir } 207