chore: clean up macos code smell missed by sonarscan
This commit is contained in:
parent
e9ccd513f7
commit
99dae58fd3
22 changed files with 76 additions and 148 deletions
|
|
@ -25,13 +25,13 @@ public:
|
||||||
static bool isOwnedByDeskflow();
|
static bool isOwnedByDeskflow();
|
||||||
|
|
||||||
// IClipboard overrides
|
// IClipboard overrides
|
||||||
virtual bool empty();
|
bool empty() override;
|
||||||
virtual void add(EFormat, const std::string &data);
|
void add(EFormat, const std::string &data) override;
|
||||||
virtual bool open(Time) const;
|
bool open(Time) const override;
|
||||||
virtual void close() const;
|
void close() const override;
|
||||||
virtual Time getTime() const;
|
Time getTime() const override;
|
||||||
virtual bool has(EFormat) const;
|
bool has(EFormat) const override;
|
||||||
virtual std::string get(EFormat) const;
|
std::string get(EFormat) const override;
|
||||||
|
|
||||||
bool synchronize();
|
bool synchronize();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,16 +8,6 @@
|
||||||
#include "platform/OSXClipboardAnyBitmapConverter.h"
|
#include "platform/OSXClipboardAnyBitmapConverter.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
OSXClipboardAnyBitmapConverter::OSXClipboardAnyBitmapConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXClipboardAnyBitmapConverter::~OSXClipboardAnyBitmapConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
IClipboard::EFormat OSXClipboardAnyBitmapConverter::getFormat() const
|
IClipboard::EFormat OSXClipboardAnyBitmapConverter::getFormat() const
|
||||||
{
|
{
|
||||||
return IClipboard::kBitmap;
|
return IClipboard::kBitmap;
|
||||||
|
|
|
||||||
|
|
@ -13,14 +13,14 @@
|
||||||
class OSXClipboardAnyBitmapConverter : public IOSXClipboardConverter
|
class OSXClipboardAnyBitmapConverter : public IOSXClipboardConverter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXClipboardAnyBitmapConverter();
|
OSXClipboardAnyBitmapConverter() = default;
|
||||||
virtual ~OSXClipboardAnyBitmapConverter();
|
~OSXClipboardAnyBitmapConverter() override = default;
|
||||||
|
|
||||||
// IOSXClipboardConverter overrides
|
// IOSXClipboardConverter overrides
|
||||||
virtual IClipboard::EFormat getFormat() const;
|
IClipboard::EFormat getFormat() const override;
|
||||||
virtual CFStringRef getOSXFormat() const = 0;
|
CFStringRef getOSXFormat() const override = 0;
|
||||||
virtual std::string fromIClipboard(const std::string &) const;
|
std::string fromIClipboard(const std::string &) const override;
|
||||||
virtual std::string toIClipboard(const std::string &) const;
|
std::string toIClipboard(const std::string &) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! Convert from IClipboard format
|
//! Convert from IClipboard format
|
||||||
|
|
|
||||||
|
|
@ -13,16 +13,6 @@
|
||||||
// OSXClipboardAnyTextConverter
|
// OSXClipboardAnyTextConverter
|
||||||
//
|
//
|
||||||
|
|
||||||
OSXClipboardAnyTextConverter::OSXClipboardAnyTextConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXClipboardAnyTextConverter::~OSXClipboardAnyTextConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
IClipboard::EFormat OSXClipboardAnyTextConverter::getFormat() const
|
IClipboard::EFormat OSXClipboardAnyTextConverter::getFormat() const
|
||||||
{
|
{
|
||||||
return IClipboard::kText;
|
return IClipboard::kText;
|
||||||
|
|
|
||||||
|
|
@ -13,14 +13,14 @@
|
||||||
class OSXClipboardAnyTextConverter : public IOSXClipboardConverter
|
class OSXClipboardAnyTextConverter : public IOSXClipboardConverter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXClipboardAnyTextConverter();
|
OSXClipboardAnyTextConverter() = default;
|
||||||
virtual ~OSXClipboardAnyTextConverter();
|
~OSXClipboardAnyTextConverter() override = default;
|
||||||
|
|
||||||
// IOSXClipboardConverter overrides
|
// IOSXClipboardConverter overrides
|
||||||
virtual IClipboard::EFormat getFormat() const;
|
IClipboard::EFormat getFormat() const override;
|
||||||
virtual CFStringRef getOSXFormat() const = 0;
|
std::string fromIClipboard(const std::string &) const override;
|
||||||
virtual std::string fromIClipboard(const std::string &) const;
|
std::string toIClipboard(const std::string &) const override;
|
||||||
virtual std::string toIClipboard(const std::string &) const;
|
CFStringRef getOSXFormat() const override = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! Convert from IClipboard format
|
//! Convert from IClipboard format
|
||||||
|
|
|
||||||
|
|
@ -48,16 +48,6 @@ static void toLE(uint8_t *&dst, uint32_t src)
|
||||||
dst += 4;
|
dst += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
OSXClipboardBMPConverter::OSXClipboardBMPConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXClipboardBMPConverter::~OSXClipboardBMPConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
IClipboard::EFormat OSXClipboardBMPConverter::getFormat() const
|
IClipboard::EFormat OSXClipboardBMPConverter::getFormat() const
|
||||||
{
|
{
|
||||||
return IClipboard::kBitmap;
|
return IClipboard::kBitmap;
|
||||||
|
|
|
||||||
|
|
@ -13,17 +13,16 @@
|
||||||
class OSXClipboardBMPConverter : public IOSXClipboardConverter
|
class OSXClipboardBMPConverter : public IOSXClipboardConverter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXClipboardBMPConverter();
|
OSXClipboardBMPConverter() = default;
|
||||||
virtual ~OSXClipboardBMPConverter();
|
~OSXClipboardBMPConverter() override = default;
|
||||||
|
|
||||||
// IMSWindowsClipboardConverter overrides
|
// IMSWindowsClipboardConverter overrides
|
||||||
virtual IClipboard::EFormat getFormat() const;
|
IClipboard::EFormat getFormat() const override;
|
||||||
|
CFStringRef getOSXFormat() const override;
|
||||||
virtual CFStringRef getOSXFormat() const;
|
|
||||||
|
|
||||||
// OSXClipboardAnyBMPConverter overrides
|
// OSXClipboardAnyBMPConverter overrides
|
||||||
virtual std::string fromIClipboard(const std::string &) const;
|
std::string fromIClipboard(const std::string &) const override;
|
||||||
virtual std::string toIClipboard(const std::string &) const;
|
std::string toIClipboard(const std::string &) const override;
|
||||||
|
|
||||||
// generic encoding converter
|
// generic encoding converter
|
||||||
static std::string convertString(const std::string &data, CFStringEncoding fromEncoding, CFStringEncoding toEncoding);
|
static std::string convertString(const std::string &data, CFStringEncoding fromEncoding, CFStringEncoding toEncoding);
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,6 @@
|
||||||
|
|
||||||
#include "base/Unicode.h"
|
#include "base/Unicode.h"
|
||||||
|
|
||||||
OSXClipboardHTMLConverter::OSXClipboardHTMLConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXClipboardHTMLConverter::~OSXClipboardHTMLConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
IClipboard::EFormat OSXClipboardHTMLConverter::getFormat() const
|
IClipboard::EFormat OSXClipboardHTMLConverter::getFormat() const
|
||||||
{
|
{
|
||||||
return IClipboard::kHTML;
|
return IClipboard::kHTML;
|
||||||
|
|
|
||||||
|
|
@ -13,18 +13,17 @@
|
||||||
class OSXClipboardHTMLConverter : public OSXClipboardAnyTextConverter
|
class OSXClipboardHTMLConverter : public OSXClipboardAnyTextConverter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXClipboardHTMLConverter();
|
OSXClipboardHTMLConverter() = default;
|
||||||
virtual ~OSXClipboardHTMLConverter();
|
~OSXClipboardHTMLConverter() override = default;
|
||||||
|
|
||||||
// IMSWindowsClipboardConverter overrides
|
// IMSWindowsClipboardConverter overrides
|
||||||
virtual IClipboard::EFormat getFormat() const;
|
IClipboard::EFormat getFormat() const override;
|
||||||
|
CFStringRef getOSXFormat() const override;
|
||||||
virtual CFStringRef getOSXFormat() const;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// OSXClipboardAnyTextConverter overrides
|
// OSXClipboardAnyTextConverter overrides
|
||||||
virtual std::string doFromIClipboard(const std::string &) const;
|
std::string doFromIClipboard(const std::string &) const override;
|
||||||
virtual std::string doToIClipboard(const std::string &) const;
|
std::string doToIClipboard(const std::string &) const override;
|
||||||
|
|
||||||
// generic encoding converter
|
// generic encoding converter
|
||||||
static std::string convertString(const std::string &data, CFStringEncoding fromEncoding, CFStringEncoding toEncoding);
|
static std::string convertString(const std::string &data, CFStringEncoding fromEncoding, CFStringEncoding toEncoding);
|
||||||
|
|
|
||||||
|
|
@ -13,16 +13,6 @@
|
||||||
// OSXClipboardTextConverter
|
// OSXClipboardTextConverter
|
||||||
//
|
//
|
||||||
|
|
||||||
OSXClipboardTextConverter::OSXClipboardTextConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXClipboardTextConverter::~OSXClipboardTextConverter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
CFStringRef OSXClipboardTextConverter::getOSXFormat() const
|
CFStringRef OSXClipboardTextConverter::getOSXFormat() const
|
||||||
{
|
{
|
||||||
return CFSTR("public.plain-text");
|
return CFSTR("public.plain-text");
|
||||||
|
|
|
||||||
|
|
@ -13,16 +13,16 @@
|
||||||
class OSXClipboardTextConverter : public OSXClipboardAnyTextConverter
|
class OSXClipboardTextConverter : public OSXClipboardAnyTextConverter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXClipboardTextConverter();
|
OSXClipboardTextConverter() = default;
|
||||||
virtual ~OSXClipboardTextConverter();
|
~OSXClipboardTextConverter() override = default;
|
||||||
|
|
||||||
// IOSXClipboardAnyTextConverter overrides
|
// IOSXClipboardAnyTextConverter overrides
|
||||||
virtual CFStringRef getOSXFormat() const;
|
CFStringRef getOSXFormat() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// OSXClipboardAnyTextConverter overrides
|
// OSXClipboardAnyTextConverter overrides
|
||||||
virtual std::string doFromIClipboard(const std::string &) const;
|
std::string doFromIClipboard(const std::string &) const override;
|
||||||
virtual std::string doToIClipboard(const std::string &) const;
|
std::string doToIClipboard(const std::string &) const override;
|
||||||
|
|
||||||
// generic encoding converter
|
// generic encoding converter
|
||||||
static std::string convertString(const std::string &data, CFStringEncoding fromEncoding, CFStringEncoding toEncoding);
|
static std::string convertString(const std::string &data, CFStringEncoding fromEncoding, CFStringEncoding toEncoding);
|
||||||
|
|
|
||||||
|
|
@ -13,16 +13,6 @@
|
||||||
// OSXClipboardUTF16Converter
|
// OSXClipboardUTF16Converter
|
||||||
//
|
//
|
||||||
|
|
||||||
OSXClipboardUTF16Converter::OSXClipboardUTF16Converter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXClipboardUTF16Converter::~OSXClipboardUTF16Converter()
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
CFStringRef OSXClipboardUTF16Converter::getOSXFormat() const
|
CFStringRef OSXClipboardUTF16Converter::getOSXFormat() const
|
||||||
{
|
{
|
||||||
return CFSTR("public.utf16-plain-text");
|
return CFSTR("public.utf16-plain-text");
|
||||||
|
|
|
||||||
|
|
@ -13,14 +13,14 @@
|
||||||
class OSXClipboardUTF16Converter : public OSXClipboardAnyTextConverter
|
class OSXClipboardUTF16Converter : public OSXClipboardAnyTextConverter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXClipboardUTF16Converter();
|
OSXClipboardUTF16Converter() = default;
|
||||||
virtual ~OSXClipboardUTF16Converter();
|
~OSXClipboardUTF16Converter() override = default;
|
||||||
|
|
||||||
// IOSXClipboardAnyTextConverter overrides
|
// IOSXClipboardAnyTextConverter overrides
|
||||||
virtual CFStringRef getOSXFormat() const;
|
CFStringRef getOSXFormat() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// OSXClipboardAnyTextConverter overrides
|
// OSXClipboardAnyTextConverter overrides
|
||||||
virtual std::string doFromIClipboard(const std::string &) const;
|
std::string doFromIClipboard(const std::string &) const override;
|
||||||
virtual std::string doToIClipboard(const std::string &) const;
|
std::string doToIClipboard(const std::string &) const override;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,12 @@
|
||||||
class OSXClipboardUTF8Converter : public OSXClipboardAnyTextConverter
|
class OSXClipboardUTF8Converter : public OSXClipboardAnyTextConverter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual CFStringRef getOSXFormat() const;
|
OSXClipboardUTF8Converter() = default;
|
||||||
|
~OSXClipboardUTF8Converter() override = default;
|
||||||
|
|
||||||
|
CFStringRef getOSXFormat() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::string doFromIClipboard(const std::string &) const;
|
std::string doFromIClipboard(const std::string &) const override;
|
||||||
virtual std::string doToIClipboard(const std::string &) const;
|
std::string doToIClipboard(const std::string &) const override;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -29,11 +29,6 @@ OSXEventQueueBuffer::OSXEventQueueBuffer(IEventQueue *events) : m_eventQueue(eve
|
||||||
// Initialization is now managed using modern constructs
|
// Initialization is now managed using modern constructs
|
||||||
}
|
}
|
||||||
|
|
||||||
OSXEventQueueBuffer::~OSXEventQueueBuffer()
|
|
||||||
{
|
|
||||||
// No explicit clean-up needed as GCD and STL handle resource management
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEventQueueBuffer::init()
|
void OSXEventQueueBuffer::init()
|
||||||
{
|
{
|
||||||
// No initialization needed for GCD-based implementation
|
// No initialization needed for GCD-based implementation
|
||||||
|
|
|
||||||
|
|
@ -22,16 +22,16 @@ class OSXEventQueueBuffer : public IEventQueueBuffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXEventQueueBuffer(IEventQueue *eventQueue);
|
OSXEventQueueBuffer(IEventQueue *eventQueue);
|
||||||
virtual ~OSXEventQueueBuffer();
|
~OSXEventQueueBuffer() override = default;
|
||||||
|
|
||||||
// IEventQueueBuffer overrides
|
// IEventQueueBuffer overrides
|
||||||
virtual void init() override;
|
void init() override;
|
||||||
virtual void waitForEvent(double timeout) override;
|
void waitForEvent(double timeout) override;
|
||||||
virtual Type getEvent(Event &event, uint32_t &dataID) override;
|
Type getEvent(Event &event, uint32_t &dataID) override;
|
||||||
virtual bool addEvent(uint32_t dataID) override;
|
bool addEvent(uint32_t dataID) override;
|
||||||
virtual bool isEmpty() const override;
|
bool isEmpty() const override;
|
||||||
virtual EventQueueTimer *newTimer(double duration, bool oneShot) const override;
|
EventQueueTimer *newTimer(double duration, bool oneShot) const override;
|
||||||
virtual void deleteTimer(EventQueueTimer *timer) const override;
|
void deleteTimer(EventQueueTimer *timer) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IEventQueue *m_eventQueue;
|
IEventQueue *m_eventQueue;
|
||||||
|
|
|
||||||
|
|
@ -193,10 +193,6 @@ OSXKeyState::OSXKeyState(
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
OSXKeyState::~OSXKeyState()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXKeyState::init()
|
void OSXKeyState::init()
|
||||||
{
|
{
|
||||||
m_deadKeyState = 0;
|
m_deadKeyState = 0;
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ public:
|
||||||
|
|
||||||
OSXKeyState(IEventQueue *events, std::vector<std::string> layouts, bool isLangSyncEnabled);
|
OSXKeyState(IEventQueue *events, std::vector<std::string> layouts, bool isLangSyncEnabled);
|
||||||
OSXKeyState(IEventQueue *events, deskflow::KeyMap &keyMap, std::vector<std::string> layouts, bool isLangSyncEnabled);
|
OSXKeyState(IEventQueue *events, deskflow::KeyMap &keyMap, std::vector<std::string> layouts, bool isLangSyncEnabled);
|
||||||
virtual ~OSXKeyState();
|
~OSXKeyState() override = default;
|
||||||
|
|
||||||
//! @name modifiers
|
//! @name modifiers
|
||||||
//@{
|
//@{
|
||||||
|
|
@ -79,18 +79,18 @@ public:
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
// IKeyState overrides
|
// IKeyState overrides
|
||||||
virtual bool fakeCtrlAltDel();
|
bool fakeCtrlAltDel() override;
|
||||||
virtual bool fakeMediaKey(KeyID id);
|
bool fakeMediaKey(KeyID id) override;
|
||||||
virtual KeyModifierMask pollActiveModifiers() const;
|
KeyModifierMask pollActiveModifiers() const override;
|
||||||
virtual int32_t pollActiveGroup() const;
|
int32_t pollActiveGroup() const override;
|
||||||
virtual void pollPressedKeys(KeyButtonSet &pressedKeys) const;
|
void pollPressedKeys(KeyButtonSet &pressedKeys) const override;
|
||||||
|
|
||||||
CGEventFlags getModifierStateAsOSXFlags() const;
|
CGEventFlags getModifierStateAsOSXFlags() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// KeyState overrides
|
// KeyState overrides
|
||||||
virtual void getKeyMap(deskflow::KeyMap &keyMap);
|
void getKeyMap(deskflow::KeyMap &keyMap) override;
|
||||||
virtual void fakeKey(const Keystroke &keystroke);
|
void fakeKey(const Keystroke &keystroke) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class KeyResource;
|
class KeyResource;
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,6 @@
|
||||||
#include "OSXPowerManager.h"
|
#include "OSXPowerManager.h"
|
||||||
#include "base/Log.h"
|
#include "base/Log.h"
|
||||||
|
|
||||||
OSXPowerManager::OSXPowerManager()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXPowerManager::~OSXPowerManager()
|
OSXPowerManager::~OSXPowerManager()
|
||||||
{
|
{
|
||||||
enableSleep();
|
enableSleep();
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
class OSXPowerManager
|
class OSXPowerManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXPowerManager();
|
OSXPowerManager() = default;
|
||||||
~OSXPowerManager();
|
~OSXPowerManager();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -18,14 +18,14 @@ class OSXScreenSaver : public IScreenSaver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OSXScreenSaver(IEventQueue *events, void *eventTarget);
|
OSXScreenSaver(IEventQueue *events, void *eventTarget);
|
||||||
virtual ~OSXScreenSaver();
|
~OSXScreenSaver();
|
||||||
|
|
||||||
// IScreenSaver overrides
|
// IScreenSaver overrides
|
||||||
virtual void enable();
|
void enable() override;
|
||||||
virtual void disable();
|
void disable() override;
|
||||||
virtual void activate();
|
void activate() override;
|
||||||
virtual void deactivate();
|
void deactivate() override;
|
||||||
virtual bool isActive() const;
|
bool isActive() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void processLaunched(ProcessSerialNumber psn);
|
void processLaunched(ProcessSerialNumber psn);
|
||||||
|
|
|
||||||
|
|
@ -19,12 +19,12 @@ public:
|
||||||
OSXUchrKeyResource(const void *, uint32_t keyboardType);
|
OSXUchrKeyResource(const void *, uint32_t keyboardType);
|
||||||
|
|
||||||
// KeyResource overrides
|
// KeyResource overrides
|
||||||
virtual bool isValid() const;
|
bool isValid() const override;
|
||||||
virtual uint32_t getNumModifierCombinations() const;
|
uint32_t getNumModifierCombinations() const override;
|
||||||
virtual uint32_t getNumTables() const;
|
uint32_t getNumTables() const override;
|
||||||
virtual uint32_t getNumButtons() const;
|
uint32_t getNumButtons() const override;
|
||||||
virtual uint32_t getTableForModifier(uint32_t mask) const;
|
uint32_t getTableForModifier(uint32_t mask) const override;
|
||||||
virtual KeyID getKey(uint32_t table, uint32_t button) const;
|
KeyID getKey(uint32_t table, uint32_t button) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using KeySequence = std::vector<KeyID>;
|
using KeySequence = std::vector<KeyID>;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue