author | zecke <zecke> | 2004-12-20 22:21:55 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-12-20 22:21:55 (UTC) |
commit | 2be4d5bf420dc4aff71cf78601c095a96ed88c47 (patch) (unidiff) | |
tree | f8d053d475501c2230a2c65acc1bed091d39faf9 | |
parent | b15930cd03acafd9770bca26f3388817f1a4dcbf (diff) | |
download | opie-2be4d5bf420dc4aff71cf78601c095a96ed88c47.zip opie-2be4d5bf420dc4aff71cf78601c095a96ed88c47.tar.gz opie-2be4d5bf420dc4aff71cf78601c095a96ed88c47.tar.bz2 |
Create the 'Config' instance on the Stack to avoid
that we revert changes done in between of our creation
and deletion
5 files changed, 17 insertions, 23 deletions
diff --git a/noncore/securityplugins/blueping/bluepingConfigWidget.cpp b/noncore/securityplugins/blueping/bluepingConfigWidget.cpp index 876ccda..17168f9 100644 --- a/noncore/securityplugins/blueping/bluepingConfigWidget.cpp +++ b/noncore/securityplugins/blueping/bluepingConfigWidget.cpp | |||
@@ -1,74 +1,74 @@ | |||
1 | #include "bluepingConfigWidget.h" | 1 | #include "bluepingConfigWidget.h" |
2 | 2 | ||
3 | #include <qwidget.h> | 3 | #include <qwidget.h> |
4 | #include <qlayout.h> | 4 | #include <qlayout.h> |
5 | #include <qlabel.h> | 5 | #include <qlabel.h> |
6 | #include <qgroupbox.h> | 6 | #include <qgroupbox.h> |
7 | #include <qmessagebox.h> | 7 | #include <qmessagebox.h> |
8 | #include <qregexp.h> | 8 | #include <qregexp.h> |
9 | 9 | ||
10 | using Opie::Security::MultiauthConfigWidget; | 10 | using Opie::Security::MultiauthConfigWidget; |
11 | 11 | ||
12 | BluepingConfigWidget::BluepingConfigWidget(QWidget* parent = 0, const char* name = "Blueping configuration widget") | 12 | BluepingConfigWidget::BluepingConfigWidget(QWidget* parent = 0, const char* name = "Blueping configuration widget") |
13 | : MultiauthConfigWidget(parent, name) | 13 | : MultiauthConfigWidget(parent, name) |
14 | { | 14 | { |
15 | m_config = new Config("Security"); | 15 | Config config("Security"); |
16 | m_config->setGroup("BluepingPlugin"); | 16 | config.setGroup("BluepingPlugin"); |
17 | QVBoxLayout * baseLayout = new QVBoxLayout( this); | 17 | QVBoxLayout * baseLayout = new QVBoxLayout( this); |
18 | baseLayout->setSpacing(11); | 18 | baseLayout->setSpacing(11); |
19 | baseLayout->setMargin(11); | 19 | baseLayout->setMargin(11); |
20 | baseLayout->setAlignment( Qt::AlignTop ); | 20 | baseLayout->setAlignment( Qt::AlignTop ); |
21 | 21 | ||
22 | QGroupBox * configBox = new QGroupBox(0, Qt::Vertical, tr("Set the MAC address to ping here"), this); | 22 | QGroupBox * configBox = new QGroupBox(0, Qt::Vertical, tr("Set the MAC address to ping here"), this); |
23 | baseLayout->addWidget(configBox); | 23 | baseLayout->addWidget(configBox); |
24 | QVBoxLayout *boxLayout = new QVBoxLayout( configBox->layout() ); | 24 | QVBoxLayout *boxLayout = new QVBoxLayout( configBox->layout() ); |
25 | 25 | ||
26 | QHBoxLayout * configLayout = new QHBoxLayout(); | 26 | QHBoxLayout * configLayout = new QHBoxLayout(); |
27 | configLayout->setSpacing(6); | 27 | configLayout->setSpacing(6); |
28 | boxLayout->addLayout(configLayout); | 28 | boxLayout->addLayout(configLayout); |
29 | 29 | ||
30 | QString mac = m_config->readEntry("mac"); | 30 | QString mac = config.readEntry("mac"); |
31 | if ( mac.isEmpty() ) | 31 | if ( mac.isEmpty() ) |
32 | mac = "00:00:00:00:00:00"; | 32 | mac = "00:00:00:00:00:00"; |
33 | 33 | ||
34 | editMAC = new QLineEdit( mac, configBox, "editMAC" ); | 34 | editMAC = new QLineEdit( mac, configBox, "editMAC" ); |
35 | setMAC = new QPushButton( tr("Set"), configBox, "setMAC" ); | 35 | setMAC = new QPushButton( tr("Set"), configBox, "setMAC" ); |
36 | configLayout->addWidget(editMAC); | 36 | configLayout->addWidget(editMAC); |
37 | configLayout->addWidget(setMAC); | 37 | configLayout->addWidget(setMAC); |
38 | 38 | ||
39 | QLabel * description = new QLabel( "<p>" + tr("Detecting another Bluetooth device by its MAC address provides a minimal and automatic level of protection.") + "</p><p><em>" | 39 | QLabel * description = new QLabel( "<p>" + tr("Detecting another Bluetooth device by its MAC address provides a minimal and automatic level of protection.") + "</p><p><em>" |
40 | + tr("Note: if you don't put a valid MAC here but you activate the plugin, it will always succeed!") + "</em></p>", configBox ); | 40 | + tr("Note: if you don't put a valid MAC here but you activate the plugin, it will always succeed!") + "</em></p>", configBox ); |
41 | boxLayout->addWidget(description); | 41 | boxLayout->addWidget(description); |
42 | 42 | ||
43 | 43 | ||
44 | connect(setMAC, SIGNAL( clicked() ), this, SLOT( changeMAC() )); | 44 | connect(setMAC, SIGNAL( clicked() ), this, SLOT( changeMAC() )); |
45 | 45 | ||
46 | } | 46 | } |
47 | 47 | ||
48 | /// checks and writes the MAC in the config file, if its format is OK | 48 | /// checks and writes the MAC in the config file, if its format is OK |
49 | void BluepingConfigWidget::changeMAC() { | 49 | void BluepingConfigWidget::changeMAC() { |
50 | QString mac = editMAC->text(); | 50 | QString mac = editMAC->text(); |
51 | QRegExp macPattern("[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]"); | 51 | QRegExp macPattern("[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]"); |
52 | if ( (mac.length() == 17) && (macPattern.match(mac) == 0) ) | 52 | if ( (mac.length() == 17) && (macPattern.match(mac) == 0) ) |
53 | { | 53 | { |
54 | m_config->writeEntry("mac", mac); | 54 | Config config("Security"); |
55 | config.setGroup("BluepingPlugin"); | ||
56 | config.writeEntry("mac", mac); | ||
55 | QMessageBox success( tr("MAC address saved!"), "<p>" + tr("Make sure that Bluetooth is turned on on the corresponding device when the Blueping plugin needs it.") + "</p>", | 57 | QMessageBox success( tr("MAC address saved!"), "<p>" + tr("Make sure that Bluetooth is turned on on the corresponding device when the Blueping plugin needs it.") + "</p>", |
56 | QMessageBox::Information, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton ); | 58 | QMessageBox::Information, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton ); |
57 | success.exec(); | 59 | success.exec(); |
58 | } else { | 60 | } else { |
59 | QMessageBox failure( tr("Please enter a valid MAC"), "<p>" + tr("Please separate the six pairs of digits of your MAC like this: 01:02:03:04:05:06") + tr("</p>"), | 61 | QMessageBox failure( tr("Please enter a valid MAC"), "<p>" + tr("Please separate the six pairs of digits of your MAC like this: 01:02:03:04:05:06") + tr("</p>"), |
60 | QMessageBox::Warning, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton ); | 62 | QMessageBox::Warning, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton ); |
61 | failure.exec(); | 63 | failure.exec(); |
62 | } | 64 | } |
63 | } | 65 | } |
64 | 66 | ||
65 | /// deletes the m_config pointer | 67 | /// deletes the m_config pointer |
66 | BluepingConfigWidget::~BluepingConfigWidget() | 68 | BluepingConfigWidget::~BluepingConfigWidget() |
67 | { | 69 | {} |
68 | delete m_config; | ||
69 | } | ||
70 | 70 | ||
71 | // does nothing (there's a button to save the config) | 71 | // does nothing (there's a button to save the config) |
72 | void BluepingConfigWidget::writeConfig() | 72 | void BluepingConfigWidget::writeConfig() |
73 | { | 73 | { |
74 | } | 74 | } |
diff --git a/noncore/securityplugins/blueping/bluepingConfigWidget.h b/noncore/securityplugins/blueping/bluepingConfigWidget.h index bd1bec9..643c97f 100644 --- a/noncore/securityplugins/blueping/bluepingConfigWidget.h +++ b/noncore/securityplugins/blueping/bluepingConfigWidget.h | |||
@@ -29,31 +29,30 @@ | |||
29 | Inc., 59 Temple Place - Suite 330, | 29 | Inc., 59 Temple Place - Suite 330, |
30 | Boston, MA 02111-1307, USA. | 30 | Boston, MA 02111-1307, USA. |
31 | 31 | ||
32 | */ | 32 | */ |
33 | 33 | ||
34 | #ifndef BLUEPINGCONFIGWIDGET_H | 34 | #ifndef BLUEPINGCONFIGWIDGET_H |
35 | #define BLUEPINGCONFIGWIDGET_H | 35 | #define BLUEPINGCONFIGWIDGET_H |
36 | #include <qlineedit.h> | 36 | #include <qlineedit.h> |
37 | #include <qpushbutton.h> | 37 | #include <qpushbutton.h> |
38 | #include <qpe/config.h> | 38 | #include <qpe/config.h> |
39 | 39 | ||
40 | #include <opie2/multiauthconfigwidget.h> | 40 | #include <opie2/multiauthconfigwidget.h> |
41 | 41 | ||
42 | class BluepingConfigWidget : public Opie::Security::MultiauthConfigWidget { | 42 | class BluepingConfigWidget : public Opie::Security::MultiauthConfigWidget { |
43 | 43 | ||
44 | Q_OBJECT | 44 | Q_OBJECT |
45 | 45 | ||
46 | public: | 46 | public: |
47 | BluepingConfigWidget(QWidget* parent, const char* name); | 47 | BluepingConfigWidget(QWidget* parent, const char* name); |
48 | virtual ~BluepingConfigWidget(); | 48 | virtual ~BluepingConfigWidget(); |
49 | virtual void writeConfig(); | 49 | virtual void writeConfig(); |
50 | private: | 50 | private: |
51 | QLineEdit *editMAC; | 51 | QLineEdit *editMAC; |
52 | QPushButton *setMAC; | 52 | QPushButton *setMAC; |
53 | Config *m_config; | ||
54 | private slots: | 53 | private slots: |
55 | void changeMAC(); | 54 | void changeMAC(); |
56 | 55 | ||
57 | }; | 56 | }; |
58 | 57 | ||
59 | #endif // BLUEPINGCONFIGWIDGET_H | 58 | #endif // BLUEPINGCONFIGWIDGET_H |
diff --git a/noncore/securityplugins/notice/noticeConfigWidget.cpp b/noncore/securityplugins/notice/noticeConfigWidget.cpp index e0468a7..02084f8 100644 --- a/noncore/securityplugins/notice/noticeConfigWidget.cpp +++ b/noncore/securityplugins/notice/noticeConfigWidget.cpp | |||
@@ -44,40 +44,38 @@ NoticeConfigWidget::NoticeConfigWidget(QWidget* parent = 0, const char* name = " | |||
44 | /// nothing to do | 44 | /// nothing to do |
45 | NoticeConfigWidget::~NoticeConfigWidget() | 45 | NoticeConfigWidget::~NoticeConfigWidget() |
46 | {} | 46 | {} |
47 | 47 | ||
48 | /// write the notice text in the multiauth.conf Config file | 48 | /// write the notice text in the multiauth.conf Config file |
49 | void NoticeConfigWidget::writeConfig() | 49 | void NoticeConfigWidget::writeConfig() |
50 | { | 50 | { |
51 | if ( noticeMLE->edited() ) { | 51 | if ( noticeMLE->edited() ) { |
52 | odebug << "writing new notice text in Security.conf" << oendl; | 52 | odebug << "writing new notice text in Security.conf" << oendl; |
53 | setNoticeText(noticeMLE->text()); | 53 | setNoticeText(noticeMLE->text()); |
54 | } | 54 | } |
55 | } | 55 | } |
56 | 56 | ||
57 | /// reset the notice text to the hard-coded example defaultNoticeText | 57 | /// reset the notice text to the hard-coded example defaultNoticeText |
58 | void NoticeConfigWidget::resetNotice() | 58 | void NoticeConfigWidget::resetNotice() |
59 | { | 59 | { |
60 | noticeMLE->setText(QObject::tr(defaultNoticeText)); | 60 | noticeMLE->setText(QObject::tr(defaultNoticeText)); |
61 | } | 61 | } |
62 | 62 | ||
63 | /// get the notice text from the config file (with true new lines) | 63 | /// get the notice text from the config file (with true new lines) |
64 | /** | 64 | /** |
65 | * if no text has been defined yet returns defaultNoticeText | 65 | * if no text has been defined yet returns defaultNoticeText |
66 | */ | 66 | */ |
67 | QString NoticeConfigWidget::getNoticeText() { | 67 | QString NoticeConfigWidget::getNoticeText() { |
68 | m_config = new Config("Security"); | 68 | Config config("Security"); |
69 | m_config->setGroup("NoticePlugin"); | 69 | config.setGroup("NoticePlugin"); |
70 | // Note: C++ processes '\' character, so we have to type \\\\ to mean \\ to QRegExp | 70 | // Note: C++ processes '\' character, so we have to type \\\\ to mean \\ to QRegExp |
71 | QString noticeText = m_config->readEntry("noticeText", QObject::tr(defaultNoticeText) ).replace( QRegExp("\\\\n"), "\n" ); | 71 | QString noticeText = config.readEntry("noticeText", QObject::tr(defaultNoticeText) ).replace( QRegExp("\\\\n"), "\n" ); |
72 | delete m_config; | ||
73 | return noticeText; | 72 | return noticeText; |
74 | } | 73 | } |
75 | 74 | ||
76 | /// set the notice text in our m_config config file (escaping new lines) | 75 | /// set the notice text in our m_config config file (escaping new lines) |
77 | void NoticeConfigWidget::setNoticeText(QString noticeText) { | 76 | void NoticeConfigWidget::setNoticeText(QString noticeText) { |
78 | m_config = new Config("Security"); | 77 | Config config("Security"); |
79 | m_config->setGroup("NoticePlugin"); | 78 | config.setGroup("NoticePlugin"); |
80 | // since Config files do not allow true newlines, we replace them with litteral "\n" | 79 | // since Config files do not allow true newlines, we replace them with litteral "\n" |
81 | m_config->writeEntry("noticeText", noticeText.replace( QRegExp("\n"), "\\n" )); | 80 | config.writeEntry("noticeText", noticeText.replace( QRegExp("\n"), "\\n" )); |
82 | delete m_config; | ||
83 | } | 81 | } |
diff --git a/noncore/securityplugins/notice/noticeplugin.cpp b/noncore/securityplugins/notice/noticeplugin.cpp index 5617855..d3dc7a4 100644 --- a/noncore/securityplugins/notice/noticeplugin.cpp +++ b/noncore/securityplugins/notice/noticeplugin.cpp | |||
@@ -1,45 +1,41 @@ | |||
1 | #include "noticeplugin.h" | 1 | #include "noticeplugin.h" |
2 | 2 | ||
3 | #include <opie2/oapplication.h> | 3 | #include <opie2/oapplication.h> |
4 | 4 | ||
5 | #include <qmessagebox.h> | 5 | #include <qmessagebox.h> |
6 | #include <qregexp.h> | 6 | #include <qregexp.h> |
7 | 7 | ||
8 | using Opie::Security::MultiauthPluginObject; | 8 | using Opie::Security::MultiauthPluginObject; |
9 | using Opie::Security::MultiauthConfigWidget; | 9 | using Opie::Security::MultiauthConfigWidget; |
10 | 10 | ||
11 | /// creates and initializes the m_config Config object | 11 | /// creates and initializes the m_config Config object |
12 | NoticePlugin::NoticePlugin() : MultiauthPluginObject(), m_noticeW(0) { | 12 | NoticePlugin::NoticePlugin() : MultiauthPluginObject(), m_noticeW(0) { |
13 | m_config = new Config("Security"); | ||
14 | m_config->setGroup("NoticePlugin"); | ||
15 | } | 13 | } |
16 | 14 | ||
17 | /// deletes the m_config Config object and noticeW if necessary | 15 | /// deletes the m_config Config object and noticeW if necessary |
18 | NoticePlugin::~NoticePlugin() { | 16 | NoticePlugin::~NoticePlugin() { |
19 | delete m_config; | 17 | delete m_noticeW; |
20 | if (m_noticeW != 0) | ||
21 | delete m_noticeW; | ||
22 | } | 18 | } |
23 | 19 | ||
24 | /// Simply return its name (Notice plugin) | 20 | /// Simply return its name (Notice plugin) |
25 | QString NoticePlugin::pluginName() const { | 21 | QString NoticePlugin::pluginName() const { |
26 | return "Notice plugin"; | 22 | return "Notice plugin"; |
27 | } | 23 | } |
28 | 24 | ||
29 | /// return the Notice widget configuration widget | 25 | /// return the Notice widget configuration widget |
30 | /** | 26 | /** |
31 | * \return noticeW, the NoticeConfigWidget | 27 | * \return noticeW, the NoticeConfigWidget |
32 | */ | 28 | */ |
33 | MultiauthConfigWidget * NoticePlugin::configWidget(QWidget * parent) { | 29 | MultiauthConfigWidget * NoticePlugin::configWidget(QWidget * parent) { |
34 | if (m_noticeW == 0) | 30 | if (m_noticeW == 0) |
35 | m_noticeW = new NoticeConfigWidget(parent, "Notice configuration widget"); | 31 | m_noticeW = new NoticeConfigWidget(parent, "Notice configuration widget"); |
36 | return m_noticeW; | 32 | return m_noticeW; |
37 | } | 33 | } |
38 | 34 | ||
39 | /// return the path of the small tab icon | 35 | /// return the path of the small tab icon |
40 | QString NoticePlugin::pixmapNameConfig() const { | 36 | QString NoticePlugin::pixmapNameConfig() const { |
41 | return "security/noticeplugin_small"; | 37 | return "security/noticeplugin_small"; |
42 | } | 38 | } |
43 | 39 | ||
44 | /// return the path of the big icon for the active/order checklist | 40 | /// return the path of the big icon for the active/order checklist |
45 | QString NoticePlugin::pixmapNameWidget() const { | 41 | QString NoticePlugin::pixmapNameWidget() const { |
@@ -60,27 +56,29 @@ int NoticePlugin::authenticate() { | |||
60 | 0, | 56 | 0, |
61 | "notice plugin dialog", | 57 | "notice plugin dialog", |
62 | true, | 58 | true, |
63 | Qt::WStyle_NoBorder | Qt::WStyle_Customize | Qt::WStyle_StaysOnTop); | 59 | Qt::WStyle_NoBorder | Qt::WStyle_Customize | Qt::WStyle_StaysOnTop); |
64 | 60 | ||
65 | noticeDialog.setButtonText(QMessageBox::Yes, tr("I accept")); | 61 | noticeDialog.setButtonText(QMessageBox::Yes, tr("I accept")); |
66 | 62 | ||
67 | QRect desk = oApp->desktop()->geometry(); | 63 | QRect desk = oApp->desktop()->geometry(); |
68 | noticeDialog.setGeometry( 0, 0, desk.width(), desk.height() ); | 64 | noticeDialog.setGeometry( 0, 0, desk.width(), desk.height() ); |
69 | 65 | ||
70 | switch (noticeDialog.exec()) | 66 | switch (noticeDialog.exec()) |
71 | { | 67 | { |
72 | case QMessageBox::Yes: | 68 | case QMessageBox::Yes: |
73 | return MultiauthPluginObject::Success; | 69 | return MultiauthPluginObject::Success; |
74 | } | 70 | } |
75 | return 255; //should not be returned anyway | 71 | return 255; //should not be returned anyway |
76 | } | 72 | } |
77 | 73 | ||
78 | /// get the notice text from our m_config config file (with true new lines) | 74 | /// get the notice text from our m_config config file (with true new lines) |
79 | /** | 75 | /** |
80 | * if no text has been defined yet returns defaultNoticeText | 76 | * if no text has been defined yet returns defaultNoticeText |
81 | */ | 77 | */ |
82 | QString NoticePlugin::getNoticeText() { | 78 | QString NoticePlugin::getNoticeText() { |
83 | // Note: C++ processes '\' character, so we have to type \\\\ to mean \\ to QRegExp | 79 | // Note: C++ processes '\' character, so we have to type \\\\ to mean \\ to QRegExp |
84 | return m_config->readEntry("noticeText", QObject::tr(defaultNoticeText)).replace( QRegExp("\\\\n"), "\n" ); | 80 | Config config("Security"); |
81 | config.setGroup("NoticePlugin"); | ||
82 | return config.readEntry("noticeText", QObject::tr(defaultNoticeText)).replace( QRegExp("\\\\n"), "\n" ); | ||
85 | } | 83 | } |
86 | 84 | ||
diff --git a/noncore/securityplugins/notice/noticeplugin.h b/noncore/securityplugins/notice/noticeplugin.h index 2828f58..22b2322 100644 --- a/noncore/securityplugins/notice/noticeplugin.h +++ b/noncore/securityplugins/notice/noticeplugin.h | |||
@@ -36,29 +36,28 @@ | |||
36 | 36 | ||
37 | #include <qstring.h> | 37 | #include <qstring.h> |
38 | #include <qpe/config.h> | 38 | #include <qpe/config.h> |
39 | #include <opie2/multiauthplugininterface.h> | 39 | #include <opie2/multiauthplugininterface.h> |
40 | #include "noticeConfigWidget.h" | 40 | #include "noticeConfigWidget.h" |
41 | 41 | ||
42 | /// Multi-authentication plugin, having the user accept a (legal, etc.) notice text. | 42 | /// Multi-authentication plugin, having the user accept a (legal, etc.) notice text. |
43 | /** | 43 | /** |
44 | * The plugin itself, implementing the main authenticate() function. | 44 | * The plugin itself, implementing the main authenticate() function. |
45 | */ | 45 | */ |
46 | class NoticePlugin : public QObject, public Opie::Security::MultiauthPluginObject { | 46 | class NoticePlugin : public QObject, public Opie::Security::MultiauthPluginObject { |
47 | 47 | ||
48 | Q_OBJECT; | 48 | Q_OBJECT; |
49 | 49 | ||
50 | public: | 50 | public: |
51 | NoticePlugin(); | 51 | NoticePlugin(); |
52 | virtual ~NoticePlugin(); | 52 | virtual ~NoticePlugin(); |
53 | int authenticate(); | 53 | int authenticate(); |
54 | Opie::Security::MultiauthConfigWidget * configWidget(QWidget * parent); | 54 | Opie::Security::MultiauthConfigWidget * configWidget(QWidget * parent); |
55 | QString pixmapNameConfig() const; | 55 | QString pixmapNameConfig() const; |
56 | QString pixmapNameWidget() const; | 56 | QString pixmapNameWidget() const; |
57 | QString pluginName() const; | 57 | QString pluginName() const; |
58 | private: | 58 | private: |
59 | NoticeConfigWidget * m_noticeW; | 59 | NoticeConfigWidget * m_noticeW; |
60 | Config * m_config; | ||
61 | QString getNoticeText(); | 60 | QString getNoticeText(); |
62 | }; | 61 | }; |
63 | 62 | ||
64 | #endif | 63 | #endif |