Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  sal.py   Sprache: Python

 
# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
#

import gdb
import gdb.types
import six

from libreoffice.util import printing
from libreoffice.util.string import StringPrinterHelper

class RtlStringPrinter(StringPrinterHelper):
    '''Prints rtl_String or rtl_uString'''

    def __init__(self, typename, val, encoding = None):
        super(RtlStringPrinter, self).__init__(typename, val, encoding)

    def data(self):
        return self.val['buffer'].address

    def length(self):
        return self.val['length']

class StringPrinter(StringPrinterHelper):
    '''Prints rtl:: strings and string buffers'''

    def __init__(self, typename, val, encoding = None):
        super(StringPrinter, self).__init__(typename, val, encoding)

    def valid(self):
        return self.val['pData']

    def data(self):
        assert self.val['pData']
        return self.val['pData'].dereference()['buffer'].address

    def length(self):
        assert self.val['pData']
        return self.val['pData'].dereference()['length']

class SalUnicodePrinter(StringPrinterHelper):
    '''Prints a sal_Unicode*'''

    def __init__(self, typename, val):
        super(SalUnicodePrinter, self).__init__(typename, val, 'utf-16')

    def data(self):
        return self.val

    @staticmethod
    def query(type):
        type = type.unqualified()
        if type.code != gdb.TYPE_CODE_PTR:
            return False
        return str(type.target()) == 'sal_Unicode'

class RtlReferencePrinter(object):
    '''Prints rtl::Reference'''

    def __init__(self, typename, val):
        self.typename = typename
        self.val = val

    def to_string(self):
        pointee = self.val['m_pBody']
        if pointee:
            return '%s to %s' % (self.typename, str(pointee))
        else:
            return "empty %s" % self.typename

class OslFileStatusPrinter(object):
    '''Prints oslFileStatus'''

    def __init__(self, typename, val):
        self.val = val

    def to_string(self):
        osl_file_type = gdb.lookup_type('oslFileType').strip_typedefs()
        fields_to_enum_val = gdb.types.make_enum_dict(osl_file_type)

        etype = self.field_val_if_valid('eType')
        if etype is not None:
            pretty_etype = '' # in case it's not one of the fields

            for field_name, field_val in six.iteritems(fields_to_enum_val):
                if etype == field_val:
                    pretty_etype = self.pretty_file_type(field_name)
        else:
            pretty_etype = ''

        file_url = self.field_val_if_valid('ustrFileURL')
        if file_url is not None:
            pretty_file_url = str(file_url.dereference())
        else:
            pretty_file_url = ''

        pretty_file_status = pretty_etype + ': ' + pretty_file_url

        # for links append the link target if valid
        if etype == fields_to_enum_val['osl_File_Type_Link']:
            link_target = self.field_val_if_valid('ustrLinkTargetURL')
            if link_target is None:
                pretty_link_target = ''
            else:
                pretty_link_target = str(link_target.dereference())

            pretty_file_status += ' -> ' + pretty_link_target

        return pretty_file_status

    def pretty_file_type(self, file_type_name):
        if file_type_name != 'osl_File_Type_Regular':
            return file_type_name.replace('osl_File_Type_''').lower()
        else:
            return 'file' # regular is not very descriptive, file is better

    def field_val_if_valid(self, field):
        mask_for_field = {'eType': 0x00000001,
                          'uAttributes': 0x00000002,
                          'aCreationTime': 0x00000010,
                          'aAccessTime': 0x00000020,
                          'aModifyTime': 0x00000040,
                          'uFileSize': 0x00000080,
                          'ustrFileName': 0x00000100,
                          'ustrFileURL': 0x00000200,
                          'ustrLinkTargetURL': 0x00000400}

        valid_fields = self.val['uValidFields']
        if valid_fields & mask_for_field[field]:
            return self.val[field]
        else:
            return None

printer = None

def build_pretty_printers():
    global printer

    printer = printing.Printer("libreoffice/sal")

    # strings and string buffers
    printer.add('_rtl_String', RtlStringPrinter)
    printer.add('_rtl_uString'lambda name, val: RtlStringPrinter(name,
        val, 'utf-16le'))
    printer.add('rtl::OString', StringPrinter)
    printer.add('rtl::OUString'lambda name, val: StringPrinter(name, val, 'utf-16'))
    printer.add('rtl::OStringBuffer', StringPrinter)
    printer.add('rtl::OUStringBuffer'lambda name, val: StringPrinter(name, val, 'utf-16'))
    printer.add('sal_Unicode', SalUnicodePrinter, SalUnicodePrinter.query)

    # other stuff
    printer.add('rtl::Reference', RtlReferencePrinter)
    printer.add('_oslFileStatus', OslFileStatusPrinter)

    return printer

def register_pretty_printers(obj):
    printing.register_pretty_printer(printer, obj)

build_pretty_printers()

# vim:set shiftwidth=4 softtabstop=4 expandtab:

Messung V0.5
C=92 H=98 G=94

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge