* use new (nothrow) when checking the returned pointer
* better handling of errors in various versions of AddItem() git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17506 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+40
-12
@@ -7,6 +7,7 @@
|
|||||||
* Stefano Ceccherini ([email protected])
|
* Stefano Ceccherini ([email protected])
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <new>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <Debug.h>
|
#include <Debug.h>
|
||||||
@@ -26,6 +27,7 @@
|
|||||||
#include <MenuWindow.h>
|
#include <MenuWindow.h>
|
||||||
#include <ServerProtocol.h>
|
#include <ServerProtocol.h>
|
||||||
|
|
||||||
|
using std::nothrow;
|
||||||
|
|
||||||
class _ExtraMenuData_ {
|
class _ExtraMenuData_ {
|
||||||
public:
|
public:
|
||||||
@@ -225,7 +227,7 @@ BArchivable *
|
|||||||
BMenu::Instantiate(BMessage *data)
|
BMenu::Instantiate(BMessage *data)
|
||||||
{
|
{
|
||||||
if (validate_instantiation(data, "BMenu"))
|
if (validate_instantiation(data, "BMenu"))
|
||||||
return new BMenu(data);
|
return new (nothrow) BMenu(data);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -344,11 +346,17 @@ BMenu::AddItem(BMenuItem *item, BRect frame)
|
|||||||
bool
|
bool
|
||||||
BMenu::AddItem(BMenu *submenu)
|
BMenu::AddItem(BMenu *submenu)
|
||||||
{
|
{
|
||||||
BMenuItem *item = new BMenuItem(submenu);
|
BMenuItem *item = new (nothrow) BMenuItem(submenu);
|
||||||
if (!item)
|
if (!item)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return AddItem(item, CountItems());
|
if (!AddItem(item, CountItems())) {
|
||||||
|
item->fSubmenu = NULL;
|
||||||
|
delete item;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -359,11 +367,17 @@ BMenu::AddItem(BMenu *submenu, int32 index)
|
|||||||
debugger("BMenu::AddItem(BMenuItem *, int32) this method can only "
|
debugger("BMenu::AddItem(BMenuItem *, int32) this method can only "
|
||||||
"be called if the menu layout is not B_ITEMS_IN_MATRIX");
|
"be called if the menu layout is not B_ITEMS_IN_MATRIX");
|
||||||
|
|
||||||
BMenuItem *item = new BMenuItem(submenu);
|
BMenuItem *item = new (nothrow) BMenuItem(submenu);
|
||||||
if (!item)
|
if (!item)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return AddItem(item, index);
|
if (!AddItem(item, index)) {
|
||||||
|
item->fSubmenu = NULL;
|
||||||
|
delete item;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -374,10 +388,19 @@ BMenu::AddItem(BMenu *submenu, BRect frame)
|
|||||||
debugger("BMenu::AddItem(BMenu *, BRect) this method can only "
|
debugger("BMenu::AddItem(BMenu *, BRect) this method can only "
|
||||||
"be called if the menu layout is B_ITEMS_IN_MATRIX");
|
"be called if the menu layout is B_ITEMS_IN_MATRIX");
|
||||||
|
|
||||||
BMenuItem *item = new BMenuItem(submenu);
|
BMenuItem *item = new (nothrow) BMenuItem(submenu);
|
||||||
|
if (!item)
|
||||||
|
return false;
|
||||||
|
|
||||||
item->fBounds = frame;
|
item->fBounds = frame;
|
||||||
|
|
||||||
return AddItem(item, CountItems());
|
if (!AddItem(item, CountItems())) {
|
||||||
|
item->fSubmenu = NULL;
|
||||||
|
delete item;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -416,8 +439,13 @@ BMenu::AddList(BList *list, int32 index)
|
|||||||
bool
|
bool
|
||||||
BMenu::AddSeparatorItem()
|
BMenu::AddSeparatorItem()
|
||||||
{
|
{
|
||||||
BMenuItem *item = new BSeparatorItem();
|
BMenuItem *item = new (nothrow) BSeparatorItem();
|
||||||
return AddItem(item, CountItems());
|
if (!item || !AddItem(item, CountItems())) {
|
||||||
|
delete item;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1040,7 +1068,7 @@ void
|
|||||||
BMenu::SetTrackingHook(menu_tracking_hook func, void *state)
|
BMenu::SetTrackingHook(menu_tracking_hook func, void *state)
|
||||||
{
|
{
|
||||||
delete fExtraMenuData;
|
delete fExtraMenuData;
|
||||||
fExtraMenuData = new _ExtraMenuData_(func, state);
|
fExtraMenuData = new (nothrow) _ExtraMenuData_(func, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1102,7 +1130,7 @@ BMenu::_show(bool selectFirstItem)
|
|||||||
// (i.e. not within a BMenuField)
|
// (i.e. not within a BMenuField)
|
||||||
if (window == NULL) {
|
if (window == NULL) {
|
||||||
// Menu windows get the BMenu's handler name
|
// Menu windows get the BMenu's handler name
|
||||||
window = new BMenuWindow(Name());
|
window = new (nothrow) BMenuWindow(Name());
|
||||||
ourWindow = true;
|
ourWindow = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1690,7 +1718,7 @@ BMenu::MenuWindow()
|
|||||||
if (fCachedMenuWindow == NULL) {
|
if (fCachedMenuWindow == NULL) {
|
||||||
char windowName[64];
|
char windowName[64];
|
||||||
snprintf(windowName, 64, "%s cached menu", Name());
|
snprintf(windowName, 64, "%s cached menu", Name());
|
||||||
fCachedMenuWindow = new BMenuWindow(windowName);
|
fCachedMenuWindow = new (nothrow) BMenuWindow(windowName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return fCachedMenuWindow;
|
return fCachedMenuWindow;
|
||||||
|
|||||||
Reference in New Issue
Block a user