Hi Bjoern,
I have hit a problem that i don't fully understand. Disabled items are
SfxVoidItem with Which 0, but inserted with different one. State of Item is
check with TYPE Macro as below
if ( (*ppFnd)->Type() == TYPE(SfxVoidItem) )
return SFX_ITEM_DISABLED;
So it just type that decides about disabled state of item. I've changed
places where conditions like
if( !(*ppFnd)->Which() )
to
if ( (*ppFnd)->ISA(SfxVoidItem) )
because I saw in an assert that this is used. At this moment problem
started, code compiles but fails at runtime with segfault at
itemset.cxx:313 (line like above)
I've checked with gdb that there is no method ISA, but IsA. With the
changed method to IsA code does not compile.
(gdb) call (*ppFnd)->IsA(SfxVoidItem)
$1 = {sal_Bool (const SfxPoolItem * const, TypeId)} 0x44980824
<SfxPoolItem::IsA(void* (*)()) const>
(gdb) call (*ppFnd)->ISA(SfxVoidItem)
There is no member or method named ISA.
Moreover I tried the way with Type and TYPE with no success, gdb output
below:
Program received signal SIGSEGV, Segmentation fault.
0x4496cb31 in SfxItemSet::~SfxItemSet (this=0xbfff51e8,
__in_chrg=<optimized out>) at
/home/maciej/programowanie/libreoffice/libo/svl/source/items/itemset.cxx:314
314 if( (*ppFnd)->Type() == TYPE(SfxVoidItem) )
(gdb) call (*ppFnd)->Type()
Cannot access memory at address 0xfca0f97
(gdb) call (*ppFnd)->Which()
$1 = 4040
(gdb) call (SfxPoolItem *)(*ppFnd)->Type()
Cannot access memory at address 0xfca0f97
(gdb) ptype (*ppFnd)
type = const class SfxPoolItem {
private:
sal_uLong nRefCount;
sal_uInt16 nWhich;
sal_uInt16 nKind;
void SetRefCount(sal_uLong);
void SetKind(sal_uInt16);
public:
sal_uLong AddRef(sal_uLong) const;
private:
sal_uLong ReleaseRef(sal_uLong) const;
long Delete_Impl(void *);
protected:
SfxPoolItem(sal_uInt16);
SfxPoolItem(const SfxPoolItem &);
public:
static void * CreateType(void);
static TypeId StaticType(void);
static sal_Bool IsOf(TypeId);
virtual TypeId Type(void) const;
virtual sal_Bool IsA(TypeId) const;
~SfxPoolItem(int);
void SetWhich(sal_uInt16);
sal_uInt16 Which(void) const;
virtual int operator==(const SfxPoolItem &) const;
int operator!=(const SfxPoolItem &) const;
virtual int Compare(const SfxPoolItem &) const;
virtual int Compare(const SfxPoolItem &, const IntlWrapper &) const;
virtual SfxItemPresentation GetPresentation(SfxItemPresentation,
SfxMapUnit, SfxMapUnit, String &, const IntlWrapper *) const;
virtual sal_uInt16 GetVersion(sal_uInt16) const;
virtual bool ScaleMetrics(long, long);
virtual bool HasMetrics(void) const;
virtual bool QueryValue(com::sun::star::uno::Any &, sal_uInt8) const;
virtual bool PutValue(const com::sun::star::uno::Any &, sal_uInt8);
virtual SfxPoolItem * Create(SvStream &, sal_uInt16) const;
virtual SvStream & Store(SvStream &, sal_uInt16) const;
virtual SfxPoolItem * Clone(SfxItemPool *) const;
virtual SfxPoolItem * CloneAtWhich(sal_uInt16, SfxItemPool *) const;
sal_uLong GetRefCount(void) const;
sal_uInt16 GetKind(void) const;
static rtl::OUString readByteString(SvStream &);
static void writeByteString(SvStream &, const rtl::OUString &);
static rtl::OUString readUnicodeString(SvStream &, bool);
static void writeUnicodeString(SvStream &, const rtl::OUString &);
private:
SfxPoolItem & operator=(const SfxPoolItem &);
} *
(gdb) call (*ppFnd)->StaticType()
$2 = (void *(*)(void)) 0x4498077e <SfxPoolItem::CreateType()>
Thanks in advance for help :)
Maciek
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.