/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   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 .
 */

#ifndef INCLUDED_SC_INC_TABPROTECTION_HXX
#define INCLUDED_SC_INC_TABPROTECTION_HXX

#include <sal/types.h>
#include <com/sun/star/uno/Sequence.hxx>

#include "global.hxx"
#include "rangelst.hxx"
#include <boost/shared_ptr.hpp>

class ScDocument;
class ScTableProtectionImpl;

enum ScPasswordHash
{
    PASSHASH_SHA1 = 0,
    PASSHASH_XL,
    PASSHASH_UNSPECIFIED
};

class ScPassHashHelper
{
public:
    /** Check for the compatibility of all password hashes.  If there is at
     * least one hash that needs to be regenerated, it returns true.  If all
     * hash values are compatible with the specified hash type, then it
     * returns false. */
    static bool needsPassHashRegen(const ScDocument& rDoc, ScPasswordHash eHash1, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED);

    static OUString getHashURI(ScPasswordHash eHash);

    static ScPasswordHash getHashTypeFromURI(const OUString& rURI);

private:
    ScPassHashHelper();
    ~ScPassHashHelper();
};

class SAL_NO_VTABLE ScPassHashProtectable
{
public:
    virtual ~ScPassHashProtectable() = 0;

    virtual bool isProtected() const = 0;
    virtual bool isProtectedWithPass() const = 0;
    virtual void setProtected(bool bProtected) = 0;

    virtual bool isPasswordEmpty() const = 0;
    virtual bool hasPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) const = 0;
    virtual void setPassword(const OUString& aPassText) = 0;
    virtual ::com::sun::star::uno::Sequence<sal_Int8> getPasswordHash(
        ScPasswordHash eHash, ScPasswordHash eHas2 = PASSHASH_UNSPECIFIED) const = 0;
    virtual void setPasswordHash(
        const ::com::sun::star::uno::Sequence<sal_Int8>& aPassword,
        ScPasswordHash eHash = PASSHASH_SHA1, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) = 0;
    virtual bool verifyPassword(const OUString& aPassText) const = 0;
};

class SC_DLLPUBLIC ScDocProtection : public ScPassHashProtectable
{
public:
    enum Option
    {
        STRUCTURE = 0,
        WINDOWS,
        CONTENT,
        NONE        ///< last item - used to resize the vector
    };

    explicit ScDocProtection();
    explicit ScDocProtection(const ScDocProtection& r);
    virtual ~ScDocProtection();

    virtual bool isProtected() const SAL_OVERRIDE;
    virtual bool isProtectedWithPass() const SAL_OVERRIDE;
    virtual void setProtected(bool bProtected) SAL_OVERRIDE;

    virtual bool isPasswordEmpty() const SAL_OVERRIDE;
    virtual bool hasPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) const SAL_OVERRIDE;
    virtual void setPassword(const OUString& aPassText) SAL_OVERRIDE;
    virtual ::com::sun::star::uno::Sequence<sal_Int8> getPasswordHash(
        ScPasswordHash eHash, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) const SAL_OVERRIDE;
    virtual void setPasswordHash(
        const ::com::sun::star::uno::Sequence<sal_Int8>& aPassword,
        ScPasswordHash eHash = PASSHASH_SHA1, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) SAL_OVERRIDE;
    virtual bool verifyPassword(const OUString& aPassText) const SAL_OVERRIDE;

    bool isOptionEnabled(Option eOption) const;
    void setOption(Option eOption, bool bEnabled);

private:
    ::boost::shared_ptr<ScTableProtectionImpl> mpImpl;
};

/** Container for the Excel EnhancedProtection feature.
 */
struct ScEnhancedProtection
{
    ScRangeListRef              maRangeList;
    sal_uInt32                  mnAreserved;
    sal_uInt32                  mnPasswordVerifier;
    OUString                    maTitle;
    ::std::vector< sal_uInt8 >  maSecurityDescriptor;       // imported as raw BIFF data
    OUString                    maSecurityDescriptorXML;    // imported from OOXML
    // OOXML password definitions
    OUString                    maAlgorithmName;
    OUString                    maHashValue;
    OUString                    maSaltValue;
    sal_uInt32                  mnSpinCount;

    ScEnhancedProtection() : mnAreserved(0), mnPasswordVerifier(0), mnSpinCount(0) {}

    bool hasSecurityDescriptor() const
    {
        return !maSecurityDescriptor.empty() || !maSecurityDescriptorXML.isEmpty();
    }

    bool hasPassword() const
    {
        return mnPasswordVerifier != 0 || !maHashValue.isEmpty();
    }
};

/** sheet protection state container
 *
 * This class stores sheet's protection state: 1) whether the protection
 * is on, 2) password and/or password hash, and 3) any associated
 * protection options.  This class is also used as a protection state
 * container for the undo/redo stack, in which case the password, hash and
 * the options need to be preserved even when the protection flag is
 * off. */
class SC_DLLPUBLIC ScTableProtection : public ScPassHashProtectable
{
public:
    enum Option
    {
        AUTOFILTER = 0,
        DELETE_COLUMNS,
        DELETE_ROWS,
        FORMAT_CELLS,
        FORMAT_COLUMNS,
        FORMAT_ROWS,
        INSERT_COLUMNS,
        INSERT_HYPERLINKS,
        INSERT_ROWS,
        OBJECTS,
        PIVOT_TABLES,
        SCENARIOS,
        SELECT_LOCKED_CELLS,
        SELECT_UNLOCKED_CELLS,
        SHEET,
        SORT,
        NONE        ///< last item - used to resize the vector
    };

    explicit ScTableProtection();
    explicit ScTableProtection(const ScTableProtection& r);
    virtual ~ScTableProtection();

    virtual bool isProtected() const SAL_OVERRIDE;
    virtual bool isProtectedWithPass() const SAL_OVERRIDE;
    virtual void setProtected(bool bProtected) SAL_OVERRIDE;

    virtual bool isPasswordEmpty() const SAL_OVERRIDE;
    virtual bool hasPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) const SAL_OVERRIDE;
    virtual void setPassword(const OUString& aPassText) SAL_OVERRIDE;
    virtual ::com::sun::star::uno::Sequence<sal_Int8> getPasswordHash(
        ScPasswordHash eHash, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) const SAL_OVERRIDE;
    virtual void setPasswordHash(
        const ::com::sun::star::uno::Sequence<sal_Int8>& aPassword,
        ScPasswordHash eHash = PASSHASH_SHA1, ScPasswordHash eHash2 = PASSHASH_UNSPECIFIED) SAL_OVERRIDE;
    virtual bool verifyPassword(const OUString& aPassText) const SAL_OVERRIDE;

    bool isOptionEnabled(Option eOption) const;
    void setOption(Option eOption, bool bEnabled);

    void setEnhancedProtection( const ::std::vector< ScEnhancedProtection > & rProt );
    const ::std::vector< ScEnhancedProtection > & getEnhancedProtection() const;
    bool updateReference( UpdateRefMode, ScDocument*, const ScRange& rWhere, SCsCOL nDx, SCsROW nDy, SCsTAB nDz );
    bool isBlockEditable( const ScRange& rRange ) const;
    bool isSelectionEditable( const ScRangeList& rRangeList ) const;

private:
    ::boost::shared_ptr<ScTableProtectionImpl> mpImpl;
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
office-4-0'>libreoffice-4-0</option>
<option value='libreoffice-4-0-0'>libreoffice-4-0-0</option>
<option value='libreoffice-4-0-1'>libreoffice-4-0-1</option>
<option value='libreoffice-4-0-2'>libreoffice-4-0-2</option>
<option value='libreoffice-4-0-3'>libreoffice-4-0-3</option>
<option value='libreoffice-4-0-4'>libreoffice-4-0-4</option>
<option value='libreoffice-4-0-5'>libreoffice-4-0-5</option>
<option value='libreoffice-4-0-6'>libreoffice-4-0-6</option>
<option value='libreoffice-4-1'>libreoffice-4-1</option>
<option value='libreoffice-4-1-0'>libreoffice-4-1-0</option>
<option value='libreoffice-4-1-1'>libreoffice-4-1-1</option>
<option value='libreoffice-4-1-2'>libreoffice-4-1-2</option>
<option value='libreoffice-4-1-3'>libreoffice-4-1-3</option>
<option value='libreoffice-4-1-4'>libreoffice-4-1-4</option>
<option value='libreoffice-4-1-5'>libreoffice-4-1-5</option>
<option value='libreoffice-4-1-6'>libreoffice-4-1-6</option>
<option value='libreoffice-4-2'>libreoffice-4-2</option>
<option value='libreoffice-4-2-0'>libreoffice-4-2-0</option>
<option value='libreoffice-4-2-1'>libreoffice-4-2-1</option>
<option value='libreoffice-4-2-2'>libreoffice-4-2-2</option>
<option value='libreoffice-4-2-3'>libreoffice-4-2-3</option>
<option value='libreoffice-4-2-4'>libreoffice-4-2-4</option>
<option value='libreoffice-4-2-5'>libreoffice-4-2-5</option>
<option value='libreoffice-4-2-6'>libreoffice-4-2-6</option>
<option value='libreoffice-4-2-7'>libreoffice-4-2-7</option>
<option value='libreoffice-4-2-8'>libreoffice-4-2-8</option>
<option value='libreoffice-4-3'>libreoffice-4-3</option>
<option value='libreoffice-4-3-0'>libreoffice-4-3-0</option>
<option value='libreoffice-4-3-1'>libreoffice-4-3-1</option>
<option value='libreoffice-4-3-2'>libreoffice-4-3-2</option>
<option value='libreoffice-4-3-3'>libreoffice-4-3-3</option>
<option value='libreoffice-4-3-4'>libreoffice-4-3-4</option>
<option value='libreoffice-4-3-5'>libreoffice-4-3-5</option>
<option value='libreoffice-4-3-6'>libreoffice-4-3-6</option>
<option value='libreoffice-4-3-7'>libreoffice-4-3-7</option>
<option value='libreoffice-4-4'>libreoffice-4-4</option>
<option value='libreoffice-4-4-0'>libreoffice-4-4-0</option>
<option value='libreoffice-4-4-1'>libreoffice-4-4-1</option>
<option value='libreoffice-4-4-2'>libreoffice-4-4-2</option>
<option value='libreoffice-4-4-3'>libreoffice-4-4-3</option>
<option value='libreoffice-4-4-4'>libreoffice-4-4-4</option>
<option value='libreoffice-4-4-5'>libreoffice-4-4-5</option>
<option value='libreoffice-4-4-6'>libreoffice-4-4-6</option>
<option value='libreoffice-4-4-7'>libreoffice-4-4-7</option>
<option value='libreoffice-5-0'>libreoffice-5-0</option>
<option value='libreoffice-5-0-0'>libreoffice-5-0-0</option>
<option value='libreoffice-5-0-1'>libreoffice-5-0-1</option>
<option value='libreoffice-5-0-2'>libreoffice-5-0-2</option>
<option value='libreoffice-5-0-3'>libreoffice-5-0-3</option>
<option value='libreoffice-5-0-4'>libreoffice-5-0-4</option>
<option value='libreoffice-5-0-5'>libreoffice-5-0-5</option>
<option value='libreoffice-5-0-6'>libreoffice-5-0-6</option>
<option value='libreoffice-5-1'>libreoffice-5-1</option>
<option value='libreoffice-5-1-0'>libreoffice-5-1-0</option>
<option value='libreoffice-5-1-1'>libreoffice-5-1-1</option>
<option value='libreoffice-5-1-2'>libreoffice-5-1-2</option>
<option value='libreoffice-5-1-3'>libreoffice-5-1-3</option>
<option value='libreoffice-5-1-4'>libreoffice-5-1-4</option>
<option value='libreoffice-5-1-5'>libreoffice-5-1-5</option>
<option value='libreoffice-5-1-6'>libreoffice-5-1-6</option>
<option value='libreoffice-5-2'>libreoffice-5-2</option>
<option value='libreoffice-5-2-0'>libreoffice-5-2-0</option>
<option value='libreoffice-5-2-1'>libreoffice-5-2-1</option>
<option value='libreoffice-5-2-2'>libreoffice-5-2-2</option>
<option value='libreoffice-5-2-3'>libreoffice-5-2-3</option>
<option value='libreoffice-5-2-4'>libreoffice-5-2-4</option>
<option value='libreoffice-5-2-5'>libreoffice-5-2-5</option>
<option value='libreoffice-5-2-6'>libreoffice-5-2-6</option>
<option value='libreoffice-5-2-7'>libreoffice-5-2-7</option>
<option value='libreoffice-5-3'>libreoffice-5-3</option>
<option value='libreoffice-5-3-0'>libreoffice-5-3-0</option>
<option value='libreoffice-5-3-1'>libreoffice-5-3-1</option>
<option value='libreoffice-5-3-2'>libreoffice-5-3-2</option>
<option value='libreoffice-5-3-3'>libreoffice-5-3-3</option>
<option value='libreoffice-5-3-4'>libreoffice-5-3-4</option>
<option value='libreoffice-5-3-5'>libreoffice-5-3-5</option>
<option value='libreoffice-5-3-6'>libreoffice-5-3-6</option>
<option value='libreoffice-5-3-7'>libreoffice-5-3-7</option>
<option value='libreoffice-5-4'>libreoffice-5-4</option>
<option value='libreoffice-5-4-0'>libreoffice-5-4-0</option>
<option value='libreoffice-5-4-1'>libreoffice-5-4-1</option>
<option value='libreoffice-5-4-2'>libreoffice-5-4-2</option>
<option value='libreoffice-5-4-3'>libreoffice-5-4-3</option>
<option value='libreoffice-5-4-4'>libreoffice-5-4-4</option>
<option value='libreoffice-5-4-5'>libreoffice-5-4-5</option>
<option value='libreoffice-5-4-6'>libreoffice-5-4-6</option>
<option value='libreoffice-5-4-7'>libreoffice-5-4-7</option>
<option value='libreoffice-6-0'>libreoffice-6-0</option>
<option value='libreoffice-6-0-0'>libreoffice-6-0-0</option>
<option value='libreoffice-6-0-1'>libreoffice-6-0-1</option>
<option value='libreoffice-6-0-2'>libreoffice-6-0-2</option>
<option value='libreoffice-6-0-3'>libreoffice-6-0-3</option>
<option value='libreoffice-6-0-4'>libreoffice-6-0-4</option>
<option value='libreoffice-6-0-5'>libreoffice-6-0-5</option>
<option value='libreoffice-6-0-6'>libreoffice-6-0-6</option>
<option value='libreoffice-6-0-7'>libreoffice-6-0-7</option>
<option value='libreoffice-6-1'>libreoffice-6-1</option>
<option value='libreoffice-6-1-0'>libreoffice-6-1-0</option>
<option value='libreoffice-6-1-1'>libreoffice-6-1-1</option>
<option value='libreoffice-6-1-2'>libreoffice-6-1-2</option>
<option value='libreoffice-6-1-3'>libreoffice-6-1-3</option>
<option value='libreoffice-6-1-4'>libreoffice-6-1-4</option>
<option value='libreoffice-6-1-5'>libreoffice-6-1-5</option>
<option value='libreoffice-6-1-6'>libreoffice-6-1-6</option>
<option value='libreoffice-6-2'>libreoffice-6-2</option>
<option value='libreoffice-6-2-0'>libreoffice-6-2-0</option>
<option value='libreoffice-6-2-1'>libreoffice-6-2-1</option>
<option value='libreoffice-6-2-2'>libreoffice-6-2-2</option>
<option value='libreoffice-6-2-3'>libreoffice-6-2-3</option>
<option value='libreoffice-6-2-4'>libreoffice-6-2-4</option>
<option value='libreoffice-6-2-5'>libreoffice-6-2-5</option>
<option value='libreoffice-6-2-6'>libreoffice-6-2-6</option>
<option value='libreoffice-6-2-7'>libreoffice-6-2-7</option>
<option value='libreoffice-6-2-8'>libreoffice-6-2-8</option>
<option value='libreoffice-6-3'>libreoffice-6-3</option>
<option value='libreoffice-6-3-0'>libreoffice-6-3-0</option>
<option value='libreoffice-6-3-1'>libreoffice-6-3-1</option>
<option value='libreoffice-6-3-2'>libreoffice-6-3-2</option>
<option value='libreoffice-6-3-3'>libreoffice-6-3-3</option>
<option value='libreoffice-6-3-4'>libreoffice-6-3-4</option>
<option value='libreoffice-6-3-5'>libreoffice-6-3-5</option>
<option value='libreoffice-6-3-6'>libreoffice-6-3-6</option>
<option value='libreoffice-6-4'>libreoffice-6-4</option>
<option value='libreoffice-6-4-0'>libreoffice-6-4-0</option>
<option value='libreoffice-6-4-1'>libreoffice-6-4-1</option>
<option value='libreoffice-6-4-2'>libreoffice-6-4-2</option>
<option value='libreoffice-6-4-3'>libreoffice-6-4-3</option>
<option value='libreoffice-6-4-4'>libreoffice-6-4-4</option>
<option value='libreoffice-6-4-5'>libreoffice-6-4-5</option>
<option value='libreoffice-6-4-6'>libreoffice-6-4-6</option>
<option value='libreoffice-6-4-7'>libreoffice-6-4-7</option>
<option value='libreoffice-7-0'>libreoffice-7-0</option>
<option value='libreoffice-7-0-0'>libreoffice-7-0-0</option>
<option value='libreoffice-7-0-1'>libreoffice-7-0-1</option>
<option value='libreoffice-7-0-2'>libreoffice-7-0-2</option>
<option value='libreoffice-7-0-3'>libreoffice-7-0-3</option>
<option value='libreoffice-7-0-4'>libreoffice-7-0-4</option>
<option value='libreoffice-7-0-5'>libreoffice-7-0-5</option>
<option value='libreoffice-7-0-6'>libreoffice-7-0-6</option>
<option value='libreoffice-7-1'>libreoffice-7-1</option>
<option value='libreoffice-7-1-0'>libreoffice-7-1-0</option>
<option value='libreoffice-7-1-1'>libreoffice-7-1-1</option>
<option value='libreoffice-7-1-2'>libreoffice-7-1-2</option>
<option value='libreoffice-7-1-3'>libreoffice-7-1-3</option>
<option value='libreoffice-7-1-4'>libreoffice-7-1-4</option>
<option value='libreoffice-7-1-5'>libreoffice-7-1-5</option>
<option value='libreoffice-7-1-6'>libreoffice-7-1-6</option>
<option value='libreoffice-7-1-7'>libreoffice-7-1-7</option>
<option value='libreoffice-7-2'>libreoffice-7-2</option>
<option value='libreoffice-7-2-0'>libreoffice-7-2-0</option>
<option value='libreoffice-7-2-1'>libreoffice-7-2-1</option>
<option value='libreoffice-7-2-2'>libreoffice-7-2-2</option>
<option value='libreoffice-7-2-3'>libreoffice-7-2-3</option>
<option value='libreoffice-7-2-5'>libreoffice-7-2-5</option>
<option value='libreoffice-7-2-6'>libreoffice-7-2-6</option>
<option value='libreoffice-7-2-7'>libreoffice-7-2-7</option>
<option value='libreoffice-7-3'>libreoffice-7-3</option>
<option value='libreoffice-7-3-0'>libreoffice-7-3-0</option>
<option value='libreoffice-7-3-1'>libreoffice-7-3-1</option>
<option value='libreoffice-7-3-2'>libreoffice-7-3-2</option>
<option value='libreoffice-7-3-3'>libreoffice-7-3-3</option>
<option value='libreoffice-7-3-4'>libreoffice-7-3-4</option>
<option value='libreoffice-7-3-5'>libreoffice-7-3-5</option>
<option value='libreoffice-7-3-6'>libreoffice-7-3-6</option>
<option value='libreoffice-7-3-7'>libreoffice-7-3-7</option>
<option value='libreoffice-7-4'>libreoffice-7-4</option>
<option value='libreoffice-7-4-0'>libreoffice-7-4-0</option>
<option value='libreoffice-7-4-1'>libreoffice-7-4-1</option>
<option value='libreoffice-7-4-2'>libreoffice-7-4-2</option>
<option value='libreoffice-7-4-3'>libreoffice-7-4-3</option>
<option value='libreoffice-7-4-4'>libreoffice-7-4-4</option>
<option value='libreoffice-7-4-6'>libreoffice-7-4-6</option>
<option value='libreoffice-7-4-7'>libreoffice-7-4-7</option>
<option value='libreoffice-7-5'>libreoffice-7-5</option>
<option value='libreoffice-7-5-0'>libreoffice-7-5-0</option>
<option value='libreoffice-7-5-1'>libreoffice-7-5-1</option>
<option value='libreoffice-7-5-2'>libreoffice-7-5-2</option>
<option value='libreoffice-7-5-3'>libreoffice-7-5-3</option>
<option value='libreoffice-7-5-4'>libreoffice-7-5-4</option>
<option value='libreoffice-7-5-5'>libreoffice-7-5-5</option>
<option value='libreoffice-7-5-6'>libreoffice-7-5-6</option>
<option value='libreoffice-7-5-7'>libreoffice-7-5-7</option>
<option value='libreoffice-7-5-8'>libreoffice-7-5-8</option>
<option value='libreoffice-7-5-9'>libreoffice-7-5-9</option>
<option value='libreoffice-7-6'>libreoffice-7-6</option>
<option value='libreoffice-7-6-0'>libreoffice-7-6-0</option>
<option value='libreoffice-7-6-1'>libreoffice-7-6-1</option>
<option value='libreoffice-7-6-2'>libreoffice-7-6-2</option>
<option value='libreoffice-7-6-3'>libreoffice-7-6-3</option>
<option value='libreoffice-7-6-4'>libreoffice-7-6-4</option>
<option value='libreoffice-7-6-5'>libreoffice-7-6-5</option>
<option value='libreoffice-7-6-6'>libreoffice-7-6-6</option>
<option value='libreoffice-7-6-7'>libreoffice-7-6-7</option>
<option value='master'>master</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>LibreOffice 界面翻译代码仓库</td><td class='sub right'>文档基金会</td></tr></table>
<table class='tabs'><tr><td>
<a href='/cgit/lo/translations/about/?h=co-21.06.24-1'>about</a><a href='/cgit/lo/translations/?h=co-21.06.24-1'>summary</a><a href='/cgit/lo/translations/refs/?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>refs</a><a href='/cgit/lo/translations/log/source/ss/sfx2?h=co-21.06.24-1'>log</a><a href='/cgit/lo/translations/tree/source/ss/sfx2?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>tree</a><a class='active' href='/cgit/lo/translations/commit/source/ss/sfx2?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>commit</a><a href='/cgit/lo/translations/diff/source/ss/sfx2?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit/lo/translations/log/source/ss/sfx2'>
<input type='hidden' name='h' value='co-21.06.24-1'/><input type='hidden' name='id' value='eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit/lo/translations/commit/?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>root</a>/<a href='/cgit/lo/translations/commit/source?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>source</a>/<a href='/cgit/lo/translations/commit/source/ss?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>ss</a>/<a href='/cgit/lo/translations/commit/source/ss/sfx2?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>sfx2</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='h' value='co-21.06.24-1'/><input type='hidden' name='id' value='eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Andras Timar &lt;atimar@suse.com&gt;</td><td class='right'>2013-04-15 16:44:07 +0200</td></tr>
<tr><th>committer</th><td>Andras Timar &lt;atimar@suse.com&gt;</td><td class='right'>2013-05-07 10:21:03 -0700</td></tr>
<tr><th>commit</th><td colspan='2' class='sha1'><a href='/cgit/lo/translations/commit/source/ss/sfx2?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5</a> (<a href='/cgit/lo/translations/patch/source/ss/sfx2?id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='sha1'><a href='/cgit/lo/translations/tree/?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>f40632db40d999e6bce121cb7adff86266e3c212</a> /<a href='/cgit/lo/translations/tree/source/ss/sfx2?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>source/ss/sfx2</a></td></tr>
<tr><th>parent</th><td colspan='2' class='sha1'><a href='/cgit/lo/translations/commit/source/ss/sfx2?h=co-21.06.24-1&amp;id=3b967bbce7fae6b042bbbe5c2bf9fad14941192f'>3b967bbce7fae6b042bbbe5c2bf9fad14941192f</a> (<a href='/cgit/lo/translations/diff/source/ss/sfx2?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5&amp;id2=3b967bbce7fae6b042bbbe5c2bf9fad14941192f'>diff</a>)</td></tr></table>
<div class='commit-subject'>update non-Pootle languages (sh, sl, sr) for 4.0.3
</div><div class='commit-msg'>Change-Id: Ibfcf76f6f3aeb3e82dade3384e5bc16f2f2a5a42
</div><div class='diffstat-header'><a href='/cgit/lo/translations/diff/?h=co-21.06.24-1&amp;id=eae8e2dc4358c21873a2472bcaa4fbbcea9ffaa5'>Diffstat</a> (limited to 'source/ss/sfx2')</div><table summary='diffstat' class='diffstat'></table><div class='diffstat-summary'>0 files changed, 0 insertions, 0 deletions</div><table summary='diff' class='diff'><tr><td></td></tr></table></div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit </a> (<a href='https://git-scm.com/'>git 2.34.1</a>) at 2025-03-05 22:17:37 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>