App Kit: style changes.
No functional change intended. Focused on documented classes only. * Update copyright information. * whitespace fixes. * pointer style * Rename some variables, msg => message, form => what * Need consistent variable names to make documentation easier, allows us to use \copydoc or \copydetails instead of repeating ourselves over and over again.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2009, Haiku Inc.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef _APPLICATION_H
|
#ifndef _APPLICATION_H
|
||||||
@@ -21,8 +21,10 @@ class BMessageRunner;
|
|||||||
class BResources;
|
class BResources;
|
||||||
class BServer;
|
class BServer;
|
||||||
class BWindow;
|
class BWindow;
|
||||||
|
|
||||||
struct app_info;
|
struct app_info;
|
||||||
|
|
||||||
|
|
||||||
namespace BPrivate {
|
namespace BPrivate {
|
||||||
class PortLink;
|
class PortLink;
|
||||||
class ServerMemoryAllocator;
|
class ServerMemoryAllocator;
|
||||||
@@ -151,9 +153,11 @@ private:
|
|||||||
bool fReadyToRunCalled;
|
bool fReadyToRunCalled;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Global Objects
|
// Global Objects
|
||||||
|
|
||||||
extern BApplication* be_app;
|
extern BApplication* be_app;
|
||||||
extern BMessenger be_app_messenger;
|
extern BMessenger be_app_messenger;
|
||||||
|
|
||||||
|
|
||||||
#endif // _APPLICATION_H
|
#endif // _APPLICATION_H
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku Inc. All Rights Reserved.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Erik Jaesler ([email protected])
|
* Erik Jaesler, [email protected]
|
||||||
*/
|
*/
|
||||||
#ifndef _HANDLER_H
|
#ifndef _HANDLER_H
|
||||||
#define _HANDLER_H
|
#define _HANDLER_H
|
||||||
@@ -55,8 +55,8 @@ public:
|
|||||||
void UnlockLooper();
|
void UnlockLooper();
|
||||||
|
|
||||||
// Scripting
|
// Scripting
|
||||||
virtual BHandler* ResolveSpecifier(BMessage* msg, int32 index,
|
virtual BHandler* ResolveSpecifier(BMessage* message, int32 index,
|
||||||
BMessage* specifier, int32 form,
|
BMessage* specifier, int32 what,
|
||||||
const char* property);
|
const char* property);
|
||||||
virtual status_t GetSupportedSuites(BMessage* data);
|
virtual status_t GetSupportedSuites(BMessage* data);
|
||||||
|
|
||||||
@@ -77,7 +77,8 @@ public:
|
|||||||
virtual status_t Perform(perform_code d, void* arg);
|
virtual status_t Perform(perform_code d, void* arg);
|
||||||
|
|
||||||
// Notifier calls
|
// Notifier calls
|
||||||
virtual void SendNotices(uint32 what, const BMessage* notice = NULL);
|
virtual void SendNotices(uint32 what,
|
||||||
|
const BMessage* notice = NULL);
|
||||||
bool IsWatched() const;
|
bool IsWatched() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2008, Haiku Inc. All Rights Reserved.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Erik Jaesler ([email protected])
|
* Erik Jaesler, [email protected]
|
||||||
*/
|
*/
|
||||||
#ifndef _LOOPER_H
|
#ifndef _LOOPER_H
|
||||||
#define _LOOPER_H
|
#define _LOOPER_H
|
||||||
@@ -30,7 +30,7 @@ class BLooper : public BHandler {
|
|||||||
public:
|
public:
|
||||||
BLooper(const char* name = NULL,
|
BLooper(const char* name = NULL,
|
||||||
int32 priority = B_NORMAL_PRIORITY,
|
int32 priority = B_NORMAL_PRIORITY,
|
||||||
int32 port_capacity
|
int32 portCapacity
|
||||||
= B_LOOPER_PORT_DEFAULT_CAPACITY);
|
= B_LOOPER_PORT_DEFAULT_CAPACITY);
|
||||||
virtual ~BLooper();
|
virtual ~BLooper();
|
||||||
|
|
||||||
@@ -86,8 +86,8 @@ public:
|
|||||||
sem_id Sem() const;
|
sem_id Sem() const;
|
||||||
|
|
||||||
// Scripting
|
// Scripting
|
||||||
virtual BHandler* ResolveSpecifier(BMessage* msg, int32 index,
|
virtual BHandler* ResolveSpecifier(BMessage* message, int32 index,
|
||||||
BMessage* specifier, int32 form,
|
BMessage* specifier, int32 what,
|
||||||
const char* property);
|
const char* property);
|
||||||
virtual status_t GetSupportedSuites(BMessage* data);
|
virtual status_t GetSupportedSuites(BMessage* data);
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2005-2012, Haiku Inc. All Rights Reserved.
|
* Copyright 2005-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Michael Lotz <[email protected]>
|
* Michael Lotz, [email protected]
|
||||||
*/
|
*/
|
||||||
#ifndef _MESSAGE_H
|
#ifndef _MESSAGE_H
|
||||||
#define _MESSAGE_H
|
#define _MESSAGE_H
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2005, Haiku.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Erik Jaesler (erik@cgsoftware.com)
|
* Erik Jaesler, erik@cgsoftware.com
|
||||||
*/
|
*/
|
||||||
#ifndef _MESSAGE_FILTER_H
|
#ifndef _MESSAGE_FILTER_H
|
||||||
#define _MESSAGE_FILTER_H
|
#define _MESSAGE_FILTER_H
|
||||||
@@ -14,17 +14,19 @@
|
|||||||
|
|
||||||
class BMessage;
|
class BMessage;
|
||||||
|
|
||||||
// filter_hook Return Codes and Protocol ---------------------------------------
|
|
||||||
|
// filter_hook Return Codes and Protocol
|
||||||
enum filter_result {
|
enum filter_result {
|
||||||
B_SKIP_MESSAGE,
|
B_SKIP_MESSAGE,
|
||||||
B_DISPATCH_MESSAGE
|
B_DISPATCH_MESSAGE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef filter_result (*filter_hook)
|
typedef filter_result (*filter_hook)
|
||||||
(BMessage* message, BHandler** target, BMessageFilter* filter);
|
(BMessage* message, BHandler** target, BMessageFilter* filter);
|
||||||
|
|
||||||
|
|
||||||
// BMessageFilter invocation criteria ------------------------------------------
|
// BMessageFilter invocation criteria
|
||||||
enum message_delivery {
|
enum message_delivery {
|
||||||
B_ANY_DELIVERY,
|
B_ANY_DELIVERY,
|
||||||
B_DROPPED_DELIVERY,
|
B_DROPPED_DELIVERY,
|
||||||
@@ -38,7 +40,6 @@ enum message_source {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// BMessageFilter Class --------------------------------------------------------
|
|
||||||
class BMessageFilter {
|
class BMessageFilter {
|
||||||
public:
|
public:
|
||||||
BMessageFilter(uint32 what,
|
BMessageFilter(uint32 what,
|
||||||
@@ -72,13 +73,16 @@ class BMessageFilter {
|
|||||||
|
|
||||||
void SetLooper(BLooper* owner);
|
void SetLooper(BLooper* owner);
|
||||||
filter_hook FilterFunction() const;
|
filter_hook FilterFunction() const;
|
||||||
|
|
||||||
bool fFiltersAny;
|
bool fFiltersAny;
|
||||||
uint32 fWhat;
|
uint32 fWhat;
|
||||||
message_delivery fDelivery;
|
message_delivery fDelivery;
|
||||||
message_source fSource;
|
message_source fSource;
|
||||||
BLooper* fLooper;
|
BLooper* fLooper;
|
||||||
filter_hook fFilterFunction;
|
filter_hook fFilterFunction;
|
||||||
|
|
||||||
uint32 _reserved[3];
|
uint32 _reserved[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // _MESSAGE_FILTER_H
|
#endif // _MESSAGE_FILTER_H
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku, Inc. All Rights Reserved.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef _MESSAGE_QUEUE_H
|
#ifndef _MESSAGE_QUEUE_H
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include <Locker.h>
|
#include <Locker.h>
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
/* For convenience */
|
// For convenience
|
||||||
|
|
||||||
|
|
||||||
class BMessageQueue {
|
class BMessageQueue {
|
||||||
@@ -54,4 +54,5 @@ class BMessageQueue {
|
|||||||
uint32 _reserved[3];
|
uint32 _reserved[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // _MESSAGE_QUEUE_H
|
#endif // _MESSAGE_QUEUE_H
|
||||||
|
|||||||
+130
-110
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2012, Haiku.
|
* Copyright 2001-2014 Haiku, inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Erik Jaesler (erik@cgsoftware.com)
|
|
||||||
* Jerome Duval
|
|
||||||
* Axel Dörfler, axeld@pinc-software.de
|
* Axel Dörfler, axeld@pinc-software.de
|
||||||
|
* Jerome Duval
|
||||||
|
* Erik Jaesler, erik@cgsoftware.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -67,6 +67,7 @@ enum {
|
|||||||
kApplication
|
kApplication
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static property_info sPropertyInfo[] = {
|
static property_info sPropertyInfo[] = {
|
||||||
{
|
{
|
||||||
"Window",
|
"Window",
|
||||||
@@ -161,6 +162,7 @@ static property_info sPropertyInfo[] = {
|
|||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// argc/argv
|
// argc/argv
|
||||||
extern const int __libc_argc;
|
extern const int __libc_argc;
|
||||||
extern const char* const *__libc_argv;
|
extern const char* const *__libc_argv;
|
||||||
@@ -172,23 +174,95 @@ extern const char * const *__libc_argv;
|
|||||||
#define OUT printf
|
#define OUT printf
|
||||||
|
|
||||||
|
|
||||||
// prototypes of helper functions
|
// #pragma mark - static helper functions
|
||||||
static const char* looper_name_for(const char *signature);
|
|
||||||
static status_t check_app_signature(const char *signature);
|
|
||||||
|
/*!
|
||||||
|
\brief Checks whether the supplied string is a valid application signature.
|
||||||
|
|
||||||
|
An error message is printed, if the string is no valid app signature.
|
||||||
|
|
||||||
|
\param signature The string to be checked.
|
||||||
|
|
||||||
|
\return A status code.
|
||||||
|
\retval B_OK \a signature is a valid app signature.
|
||||||
|
\retval B_BAD_VALUE \a signature is \c NULL or no valid app signature.
|
||||||
|
*/
|
||||||
|
static status_t
|
||||||
|
check_app_signature(const char* signature)
|
||||||
|
{
|
||||||
|
bool isValid = false;
|
||||||
|
BMimeType type(signature);
|
||||||
|
|
||||||
|
if (type.IsValid() && !type.IsSupertypeOnly()
|
||||||
|
&& BMimeType("application").Contains(&type)) {
|
||||||
|
isValid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
printf("bad signature (%s), must begin with \"application/\" and "
|
||||||
|
"can't conflict with existing registered mime types inside "
|
||||||
|
"the \"application\" media type.\n", signature);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (isValid ? B_OK : B_BAD_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Returns the looper name for a given signature.
|
||||||
|
// Normally this is "AppLooperPort", but in case of the registrar it gets a
|
||||||
|
// special name.
|
||||||
|
static const char*
|
||||||
|
looper_name_for(const char* signature)
|
||||||
|
{
|
||||||
|
if (signature != NULL && !strcasecmp(signature, kRegistrarSignature))
|
||||||
|
return BPrivate::get_roster_port_name();
|
||||||
|
|
||||||
|
return "AppLooperPort";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef RUN_WITHOUT_REGISTRAR
|
#ifndef RUN_WITHOUT_REGISTRAR
|
||||||
static void fill_argv_message(BMessage &message);
|
// Fills the passed BMessage with B_ARGV_RECEIVED infos.
|
||||||
|
static void
|
||||||
|
fill_argv_message(BMessage &message)
|
||||||
|
{
|
||||||
|
message.what = B_ARGV_RECEIVED;
|
||||||
|
|
||||||
|
int32 argc = __libc_argc;
|
||||||
|
const char* const *argv = __libc_argv;
|
||||||
|
|
||||||
|
// add argc
|
||||||
|
message.AddInt32("argc", argc);
|
||||||
|
|
||||||
|
// add argv
|
||||||
|
for (int32 i = 0; i < argc; i++) {
|
||||||
|
if (argv[i] != NULL)
|
||||||
|
message.AddString("argv", argv[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add current working directory
|
||||||
|
char cwd[B_PATH_NAME_LENGTH];
|
||||||
|
if (getcwd(cwd, B_PATH_NAME_LENGTH))
|
||||||
|
message.AddString("cwd", cwd);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - BApplication
|
||||||
|
|
||||||
|
|
||||||
BApplication::BApplication(const char* signature)
|
BApplication::BApplication(const char* signature)
|
||||||
: BLooper(looper_name_for(signature))
|
:
|
||||||
|
BLooper(looper_name_for(signature))
|
||||||
{
|
{
|
||||||
_InitData(signature, true, NULL);
|
_InitData(signature, true, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BApplication::BApplication(const char* signature, status_t* _error)
|
BApplication::BApplication(const char* signature, status_t* _error)
|
||||||
: BLooper(looper_name_for(signature))
|
:
|
||||||
|
BLooper(looper_name_for(signature))
|
||||||
{
|
{
|
||||||
_InitData(signature, true, _error);
|
_InitData(signature, true, _error);
|
||||||
}
|
}
|
||||||
@@ -196,7 +270,8 @@ BApplication::BApplication(const char *signature, status_t *_error)
|
|||||||
|
|
||||||
BApplication::BApplication(const char* signature, bool initGUI,
|
BApplication::BApplication(const char* signature, bool initGUI,
|
||||||
status_t* _error)
|
status_t* _error)
|
||||||
: BLooper(looper_name_for(signature))
|
:
|
||||||
|
BLooper(looper_name_for(signature))
|
||||||
{
|
{
|
||||||
_InitData(signature, initGUI, _error);
|
_InitData(signature, initGUI, _error);
|
||||||
}
|
}
|
||||||
@@ -205,7 +280,8 @@ BApplication::BApplication(const char *signature, bool initGUI,
|
|||||||
BApplication::BApplication(BMessage* data)
|
BApplication::BApplication(BMessage* data)
|
||||||
// Note: BeOS calls the private BLooper(int32, port_id, const char*)
|
// Note: BeOS calls the private BLooper(int32, port_id, const char*)
|
||||||
// constructor here, test if it's needed
|
// constructor here, test if it's needed
|
||||||
: BLooper(looper_name_for(NULL))
|
:
|
||||||
|
BLooper(looper_name_for(NULL))
|
||||||
{
|
{
|
||||||
const char* signature = NULL;
|
const char* signature = NULL;
|
||||||
data->FindString("mime_sig", &signature);
|
data->FindString("mime_sig", &signature);
|
||||||
@@ -291,7 +367,7 @@ BApplication::_InitData(const char *signature, bool initGUI, status_t *_error)
|
|||||||
|
|
||||||
#ifndef RUN_WITHOUT_REGISTRAR
|
#ifndef RUN_WITHOUT_REGISTRAR
|
||||||
bool isRegistrar = signature
|
bool isRegistrar = signature
|
||||||
&& !strcasecmp(signature, kRegistrarSignature);
|
&& strcasecmp(signature, kRegistrarSignature) == 0;
|
||||||
// get team and thread
|
// get team and thread
|
||||||
team_id team = Team();
|
team_id team = Team();
|
||||||
thread_id thread = BPrivate::main_thread_for(team);
|
thread_id thread = BPrivate::main_thread_for(team);
|
||||||
@@ -380,8 +456,9 @@ BApplication::_InitData(const char *signature, bool initGUI, status_t *_error)
|
|||||||
BMessenger otherApp(NULL, otherTeam);
|
BMessenger otherApp(NULL, otherTeam);
|
||||||
app_info otherAppInfo;
|
app_info otherAppInfo;
|
||||||
if (__libc_argc > 1
|
if (__libc_argc > 1
|
||||||
&& be_roster->GetRunningAppInfo(otherTeam, &otherAppInfo) == B_OK
|
&& be_roster->GetRunningAppInfo(otherTeam, &otherAppInfo)
|
||||||
&& !(otherAppInfo.flags & B_ARGV_ONLY)) {
|
== B_OK
|
||||||
|
&& (otherAppInfo.flags & B_ARGV_ONLY) != 0) {
|
||||||
// create an B_ARGV_RECEIVED message
|
// create an B_ARGV_RECEIVED message
|
||||||
BMessage argvMessage(B_ARGV_RECEIVED);
|
BMessage argvMessage(B_ARGV_RECEIVED);
|
||||||
fill_argv_message(argvMessage);
|
fill_argv_message(argvMessage);
|
||||||
@@ -521,8 +598,9 @@ BApplication::Quit()
|
|||||||
bool unlock = false;
|
bool unlock = false;
|
||||||
if (!IsLocked()) {
|
if (!IsLocked()) {
|
||||||
const char* name = Name();
|
const char* name = Name();
|
||||||
if (!name)
|
if (name == NULL)
|
||||||
name = "no-name";
|
name = "no-name";
|
||||||
|
|
||||||
printf("ERROR - you must Lock the application object before calling "
|
printf("ERROR - you must Lock the application object before calling "
|
||||||
"Quit(), team=%" B_PRId32 ", looper=%s\n", Team(), name);
|
"Quit(), team=%" B_PRId32 ", looper=%s\n", Team(), name);
|
||||||
unlock = true;
|
unlock = true;
|
||||||
@@ -551,6 +629,7 @@ BApplication::Quit()
|
|||||||
// message dispatching loop and return from Run().
|
// message dispatching loop and return from Run().
|
||||||
fTerminating = true;
|
fTerminating = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we had to lock the object, unlock now.
|
// If we had to lock the object, unlock now.
|
||||||
if (unlock)
|
if (unlock)
|
||||||
Unlock();
|
Unlock();
|
||||||
@@ -590,9 +669,12 @@ BApplication::MessageReceived(BMessage *message)
|
|||||||
BMessage specifier;
|
BMessage specifier;
|
||||||
int32 what;
|
int32 what;
|
||||||
const char* property = NULL;
|
const char* property = NULL;
|
||||||
if (message->GetCurrentSpecifier(&index, &specifier, &what, &property) < B_OK
|
if (message->GetCurrentSpecifier(&index, &specifier, &what,
|
||||||
|| !ScriptReceived(message, index, &specifier, what, property))
|
&property) < B_OK
|
||||||
|
|| !ScriptReceived(message, index, &specifier, what,
|
||||||
|
property)) {
|
||||||
BLooper::MessageReceived(message);
|
BLooper::MessageReceived(message);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -619,7 +701,6 @@ BApplication::MessageReceived(BMessage *message)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
BLooper::MessageReceived(message);
|
BLooper::MessageReceived(message);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -699,7 +780,8 @@ BApplication::ResolveSpecifier(BMessage *message, int32 index,
|
|||||||
err = B_NAME_NOT_FOUND;
|
err = B_NAME_NOT_FOUND;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (window->Title() != NULL && !strcmp(window->Title(), name)) {
|
if (window->Title() != NULL && !strcmp(window->Title(),
|
||||||
|
name)) {
|
||||||
message->PopSpecifier();
|
message->PopSpecifier();
|
||||||
BMessenger(window).SendMessage(message);
|
BMessenger(window).SendMessage(message);
|
||||||
break;
|
break;
|
||||||
@@ -724,6 +806,7 @@ BApplication::ResolveSpecifier(BMessage *message, int32 index,
|
|||||||
BMessenger(looper).SendMessage(message);
|
BMessenger(looper).SendMessage(message);
|
||||||
} else
|
} else
|
||||||
err = B_BAD_INDEX;
|
err = B_BAD_INDEX;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -744,7 +827,8 @@ BApplication::ResolveSpecifier(BMessage *message, int32 index,
|
|||||||
err = B_NAME_NOT_FOUND;
|
err = B_NAME_NOT_FOUND;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (looper->Name() != NULL && !strcmp(looper->Name(), name)) {
|
if (looper->Name() != NULL
|
||||||
|
&& strcmp(looper->Name(), name) == 0) {
|
||||||
message->PopSpecifier();
|
message->PopSpecifier();
|
||||||
BMessenger(looper).SendMessage(message);
|
BMessenger(looper).SendMessage(message);
|
||||||
break;
|
break;
|
||||||
@@ -1027,7 +1111,7 @@ BApplication::SetPulseRate(bigtime_t rate)
|
|||||||
status_t
|
status_t
|
||||||
BApplication::GetSupportedSuites(BMessage* data)
|
BApplication::GetSupportedSuites(BMessage* data)
|
||||||
{
|
{
|
||||||
if (!data)
|
if (data == NULL)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
status_t status = data->AddString("suites", "suite/vnd.Be-application");
|
status_t status = data->AddString("suites", "suite/vnd.Be-application");
|
||||||
@@ -1091,16 +1175,20 @@ BApplication::ScriptReceived(BMessage *message, int32 index,
|
|||||||
err = specifier->FindInt32("index", &index);
|
err = specifier->FindInt32("index", &index);
|
||||||
if (err != B_OK)
|
if (err != B_OK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (what == B_REVERSE_INDEX_SPECIFIER)
|
if (what == B_REVERSE_INDEX_SPECIFIER)
|
||||||
index = CountWindows() - index;
|
index = CountWindows() - index;
|
||||||
|
|
||||||
err = B_BAD_INDEX;
|
err = B_BAD_INDEX;
|
||||||
BWindow *win = WindowAt(index);
|
BWindow* window = WindowAt(index);
|
||||||
if (!win)
|
if (window == NULL)
|
||||||
break;
|
break;
|
||||||
BMessenger messenger(win);
|
|
||||||
|
BMessenger messenger(window);
|
||||||
err = reply.AddMessenger("result", messenger);
|
err = reply.AddMessenger("result", messenger);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case B_NAME_SPECIFIER:
|
case B_NAME_SPECIFIER:
|
||||||
{
|
{
|
||||||
const char* name;
|
const char* name;
|
||||||
@@ -1129,16 +1217,20 @@ BApplication::ScriptReceived(BMessage *message, int32 index,
|
|||||||
err = specifier->FindInt32("index", &index);
|
err = specifier->FindInt32("index", &index);
|
||||||
if (err != B_OK)
|
if (err != B_OK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (what == B_REVERSE_INDEX_SPECIFIER)
|
if (what == B_REVERSE_INDEX_SPECIFIER)
|
||||||
index = CountLoopers() - index;
|
index = CountLoopers() - index;
|
||||||
|
|
||||||
err = B_BAD_INDEX;
|
err = B_BAD_INDEX;
|
||||||
BLooper* looper = LooperAt(index);
|
BLooper* looper = LooperAt(index);
|
||||||
if (!looper)
|
if (looper == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
BMessenger messenger(looper);
|
BMessenger messenger(looper);
|
||||||
err = reply.AddMessenger("result", messenger);
|
err = reply.AddMessenger("result", messenger);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case B_NAME_SPECIFIER:
|
case B_NAME_SPECIFIER:
|
||||||
{
|
{
|
||||||
const char* name;
|
const char* name;
|
||||||
@@ -1148,8 +1240,8 @@ BApplication::ScriptReceived(BMessage *message, int32 index,
|
|||||||
err = B_NAME_NOT_FOUND;
|
err = B_NAME_NOT_FOUND;
|
||||||
for (int32 i = 0; i < CountLoopers(); i++) {
|
for (int32 i = 0; i < CountLoopers(); i++) {
|
||||||
BLooper* looper = LooperAt(i);
|
BLooper* looper = LooperAt(i);
|
||||||
if (looper && looper->Name()
|
if (looper != NULL && looper->Name()
|
||||||
&& !strcmp(looper->Name(), name)) {
|
&& strcmp(looper->Name(), name) == 0) {
|
||||||
BMessenger messenger(looper);
|
BMessenger messenger(looper);
|
||||||
err = reply.AddMessenger("result", messenger);
|
err = reply.AddMessenger("result", messenger);
|
||||||
break;
|
break;
|
||||||
@@ -1157,6 +1249,7 @@ BApplication::ScriptReceived(BMessage *message, int32 index,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case B_ID_SPECIFIER:
|
case B_ID_SPECIFIER:
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
@@ -1164,16 +1257,17 @@ BApplication::ScriptReceived(BMessage *message, int32 index,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (strcmp("Name", property) == 0) {
|
} else if (strcmp("Name", property) == 0)
|
||||||
err = reply.AddString("result", Name());
|
err = reply.AddString("result", Name());
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_COUNT_PROPERTIES:
|
case B_COUNT_PROPERTIES:
|
||||||
if (strcmp("Looper", property) == 0) {
|
if (strcmp("Looper", property) == 0)
|
||||||
err = reply.AddInt32("result", CountLoopers());
|
err = reply.AddInt32("result", CountLoopers());
|
||||||
} else if (strcmp("Window", property) == 0) {
|
else if (strcmp("Window", property) == 0)
|
||||||
err = reply.AddInt32("result", CountWindows());
|
err = reply.AddInt32("result", CountWindows());
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (err == B_BAD_SCRIPT_SYNTAX)
|
if (err == B_BAD_SCRIPT_SYNTAX)
|
||||||
@@ -1185,6 +1279,7 @@ BApplication::ScriptReceived(BMessage *message, int32 index,
|
|||||||
}
|
}
|
||||||
reply.AddInt32("error", err);
|
reply.AddInt32("error", err);
|
||||||
message->SendReply(&reply);
|
message->SendReply(&reply);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1301,6 +1396,7 @@ BApplication::_ConnectToServer()
|
|||||||
return status;
|
return status;
|
||||||
|
|
||||||
fServerReadOnlyMemory = base;
|
fServerReadOnlyMemory = base;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1357,6 +1453,7 @@ BApplication::write_drag(_BSession_ *session, BMessage *message)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
BApplication::_WindowQuitLoop(bool quitFilePanels, bool force)
|
BApplication::_WindowQuitLoop(bool quitFilePanels, bool force)
|
||||||
{
|
{
|
||||||
@@ -1397,6 +1494,7 @@ BApplication::_WindowQuitLoop(bool quitFilePanels, bool force)
|
|||||||
// we need to continue at the start of the list again - it
|
// we need to continue at the start of the list again - it
|
||||||
// might have changed
|
// might have changed
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1547,81 +1645,3 @@ BApplication::_InitAppResources()
|
|||||||
|
|
||||||
sAppResources = resources;
|
sAppResources = resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Checks whether the supplied string is a valid application signature.
|
|
||||||
|
|
||||||
An error message is printed, if the string is no valid app signature.
|
|
||||||
|
|
||||||
\param signature The string to be checked.
|
|
||||||
\return
|
|
||||||
- \c B_OK: \a signature is a valid app signature.
|
|
||||||
- \c B_BAD_VALUE: \a signature is \c NULL or no valid app signature.
|
|
||||||
*/
|
|
||||||
static status_t
|
|
||||||
check_app_signature(const char *signature)
|
|
||||||
{
|
|
||||||
bool isValid = false;
|
|
||||||
BMimeType type(signature);
|
|
||||||
if (type.IsValid() && !type.IsSupertypeOnly()
|
|
||||||
&& BMimeType("application").Contains(&type)) {
|
|
||||||
isValid = true;
|
|
||||||
}
|
|
||||||
if (!isValid) {
|
|
||||||
printf("bad signature (%s), must begin with \"application/\" and "
|
|
||||||
"can't conflict with existing registered mime types inside "
|
|
||||||
"the \"application\" media type.\n", signature);
|
|
||||||
}
|
|
||||||
return (isValid ? B_OK : B_BAD_VALUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Returns the looper name for a given signature.
|
|
||||||
|
|
||||||
Normally this is "AppLooperPort", but in case of the registrar a
|
|
||||||
special name.
|
|
||||||
|
|
||||||
\return The looper name.
|
|
||||||
*/
|
|
||||||
static const char *
|
|
||||||
looper_name_for(const char *signature)
|
|
||||||
{
|
|
||||||
if (signature && !strcasecmp(signature, kRegistrarSignature))
|
|
||||||
return BPrivate::get_roster_port_name();
|
|
||||||
return "AppLooperPort";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Fills the passed BMessage with B_ARGV_RECEIVED infos.
|
|
||||||
*/
|
|
||||||
#ifndef RUN_WITHOUT_REGISTRAR
|
|
||||||
static void
|
|
||||||
fill_argv_message(BMessage &message)
|
|
||||||
{
|
|
||||||
message.what = B_ARGV_RECEIVED;
|
|
||||||
|
|
||||||
int32 argc = __libc_argc;
|
|
||||||
const char * const *argv = __libc_argv;
|
|
||||||
|
|
||||||
// add argc
|
|
||||||
message.AddInt32("argc", argc);
|
|
||||||
|
|
||||||
// add argv
|
|
||||||
for (int32 i = 0; i < argc; i++) {
|
|
||||||
if (argv[i] != NULL)
|
|
||||||
message.AddString("argv", argv[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add current working directory
|
|
||||||
char cwd[B_PATH_NAME_LENGTH];
|
|
||||||
if (getcwd(cwd, B_PATH_NAME_LENGTH))
|
|
||||||
message.AddString("cwd", cwd);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|||||||
+41
-33
@@ -1,10 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Erik Jaesler (erik@cgsoftware.com)
|
|
||||||
* Axel Dörfler, axeld@pinc-software.de
|
* Axel Dörfler, axeld@pinc-software.de
|
||||||
|
* Erik Jaesler, erik@cgsoftware.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -184,8 +184,9 @@ BHandler::Archive(BMessage *data, bool deep) const
|
|||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
if (!fName)
|
if (fName == NULL)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
return data->AddString(kArchiveNameField, fName);
|
return data->AddString(kArchiveNameField, fName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,8 +203,10 @@ BHandler::MessageReceived(BMessage *message)
|
|||||||
BMessenger target;
|
BMessenger target;
|
||||||
uint32 what;
|
uint32 what;
|
||||||
if (message->FindMessenger(kObserveTarget, &target) != B_OK
|
if (message->FindMessenger(kObserveTarget, &target) != B_OK
|
||||||
|| message->FindInt32(B_OBSERVE_WHAT_CHANGE, (int32*)&what) != B_OK)
|
|| message->FindInt32(B_OBSERVE_WHAT_CHANGE, (int32*)&what)
|
||||||
|
!= B_OK) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ObserverList* list = _ObserverList();
|
ObserverList* list = _ObserverList();
|
||||||
if (list != NULL) {
|
if (list != NULL) {
|
||||||
@@ -257,7 +260,8 @@ BHandler::MessageReceived(BMessage *message)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDo: there is some more work needed here (someone in the know should fill in)!
|
// ToDo: there is some more work needed here
|
||||||
|
// (someone in the know should fill in)!
|
||||||
|
|
||||||
if (fNextHandler) {
|
if (fNextHandler) {
|
||||||
// we need to apply the next handler's filters here, too
|
// we need to apply the next handler's filters here, too
|
||||||
@@ -308,7 +312,7 @@ BHandler::Name() const
|
|||||||
void
|
void
|
||||||
BHandler::SetNextHandler(BHandler* handler)
|
BHandler::SetNextHandler(BHandler* handler)
|
||||||
{
|
{
|
||||||
if (!fLooper) {
|
if (fLooper == NULL) {
|
||||||
debugger("handler must belong to looper before setting NextHandler");
|
debugger("handler must belong to looper before setting NextHandler");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -318,7 +322,7 @@ BHandler::SetNextHandler(BHandler *handler)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handler && fLooper != handler->Looper()) {
|
if (handler != NULL && fLooper != handler->Looper()) {
|
||||||
debugger("The handler and its NextHandler must have the same looper");
|
debugger("The handler and its NextHandler must have the same looper");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -338,7 +342,7 @@ void
|
|||||||
BHandler::AddFilter(BMessageFilter* filter)
|
BHandler::AddFilter(BMessageFilter* filter)
|
||||||
{
|
{
|
||||||
BLooper* looper = fLooper;
|
BLooper* looper = fLooper;
|
||||||
if (looper && !looper->IsLocked()) {
|
if (looper != NULL && !looper->IsLocked()) {
|
||||||
debugger("Owning Looper must be locked before calling SetFilterList");
|
debugger("Owning Looper must be locked before calling SetFilterList");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -346,7 +350,7 @@ BHandler::AddFilter(BMessageFilter *filter)
|
|||||||
if (looper != NULL)
|
if (looper != NULL)
|
||||||
filter->SetLooper(looper);
|
filter->SetLooper(looper);
|
||||||
|
|
||||||
if (!fFilters)
|
if (fFilters == NULL)
|
||||||
fFilters = new BList;
|
fFilters = new BList;
|
||||||
|
|
||||||
fFilters->AddItem(filter);
|
fFilters->AddItem(filter);
|
||||||
@@ -357,7 +361,7 @@ bool
|
|||||||
BHandler::RemoveFilter(BMessageFilter* filter)
|
BHandler::RemoveFilter(BMessageFilter* filter)
|
||||||
{
|
{
|
||||||
BLooper* looper = fLooper;
|
BLooper* looper = fLooper;
|
||||||
if (looper && !looper->IsLocked()) {
|
if (looper != NULL && !looper->IsLocked()) {
|
||||||
debugger("Owning Looper must be locked before calling SetFilterList");
|
debugger("Owning Looper must be locked before calling SetFilterList");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -375,7 +379,7 @@ void
|
|||||||
BHandler::SetFilterList(BList* filters)
|
BHandler::SetFilterList(BList* filters)
|
||||||
{
|
{
|
||||||
BLooper* looper = fLooper;
|
BLooper* looper = fLooper;
|
||||||
if (looper && !looper->IsLocked()) {
|
if (looper != NULL && !looper->IsLocked()) {
|
||||||
debugger("Owning Looper must be locked before calling SetFilterList");
|
debugger("Owning Looper must be locked before calling SetFilterList");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -389,7 +393,7 @@ BHandler::SetFilterList(BList* filters)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO: Explore issues with using BObjectList
|
// TODO: Explore issues with using BObjectList
|
||||||
if (fFilters) {
|
if (fFilters != NULL) {
|
||||||
fFilters->DoForEach(FilterDeleter);
|
fFilters->DoForEach(FilterDeleter);
|
||||||
delete fFilters;
|
delete fFilters;
|
||||||
}
|
}
|
||||||
@@ -461,18 +465,18 @@ BHandler::UnlockLooper()
|
|||||||
|
|
||||||
|
|
||||||
BHandler*
|
BHandler*
|
||||||
BHandler::ResolveSpecifier(BMessage *msg, int32 index,
|
BHandler::ResolveSpecifier(BMessage* message, int32 index,
|
||||||
BMessage *specifier, int32 form, const char *property)
|
BMessage* specifier, int32 what, const char* property)
|
||||||
{
|
{
|
||||||
// Straight from the BeBook
|
// Straight from the BeBook
|
||||||
BPropertyInfo propertyInfo(sHandlerPropInfo);
|
BPropertyInfo propertyInfo(sHandlerPropInfo);
|
||||||
if (propertyInfo.FindMatch(msg, index, specifier, form, property) >= 0)
|
if (propertyInfo.FindMatch(message, index, specifier, what, property) >= 0)
|
||||||
return this;
|
return this;
|
||||||
|
|
||||||
BMessage reply(B_MESSAGE_NOT_UNDERSTOOD);
|
BMessage reply(B_MESSAGE_NOT_UNDERSTOOD);
|
||||||
reply.AddInt32("error", B_BAD_SCRIPT_SYNTAX);
|
reply.AddInt32("error", B_BAD_SCRIPT_SYNTAX);
|
||||||
reply.AddString("message", "Didn't understand the specifier(s)");
|
reply.AddString("message", "Didn't understand the specifier(s)");
|
||||||
msg->SendReply(&reply);
|
message->SendReply(&reply);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -507,12 +511,12 @@ BMessage: what = (0x0, or 0)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
status_t err = B_OK;
|
status_t err = B_OK;
|
||||||
if (!data)
|
if (data == NULL)
|
||||||
err = B_BAD_VALUE;
|
err = B_BAD_VALUE;
|
||||||
|
|
||||||
if (!err) {
|
if (err != B_OK) {
|
||||||
err = data->AddString("suites", "suite/vnd.Be-handler");
|
err = data->AddString("suites", "suite/vnd.Be-handler");
|
||||||
if (!err) {
|
if (err != B_OK) {
|
||||||
BPropertyInfo propertyInfo(sHandlerPropInfo);
|
BPropertyInfo propertyInfo(sHandlerPropInfo);
|
||||||
err = data->AddFlat("messages", &propertyInfo);
|
err = data->AddFlat("messages", &propertyInfo);
|
||||||
}
|
}
|
||||||
@@ -602,10 +606,10 @@ BHandler::Perform(perform_code d, void *arg)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BHandler::SendNotices(uint32 what, const BMessage *msg)
|
BHandler::SendNotices(uint32 what, const BMessage* notice)
|
||||||
{
|
{
|
||||||
if (fObserverList != NULL)
|
if (fObserverList != NULL)
|
||||||
fObserverList->SendNotices(what, msg);
|
fObserverList->SendNotices(what, notice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -658,11 +662,14 @@ void
|
|||||||
BHandler::SetLooper(BLooper* looper)
|
BHandler::SetLooper(BLooper* looper)
|
||||||
{
|
{
|
||||||
fLooper = looper;
|
fLooper = looper;
|
||||||
gDefaultTokens.SetHandlerTarget(fToken, looper ? looper->fDirectTarget : NULL);
|
gDefaultTokens.SetHandlerTarget(fToken,
|
||||||
|
looper ? looper->fDirectTarget : NULL);
|
||||||
|
|
||||||
if (fFilters) {
|
if (fFilters != NULL) {
|
||||||
for (int32 i = 0; i < fFilters->CountItems(); i++)
|
for (int32 i = 0; i < fFilters->CountItems(); i++) {
|
||||||
static_cast<BMessageFilter *>(fFilters->ItemAtFast(i))->SetLooper(looper);
|
static_cast<BMessageFilter*>(
|
||||||
|
fFilters->ItemAtFast(i))->SetLooper(looper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -717,9 +724,10 @@ ObserverList::_ValidateHandlers(uint32 what)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ObserverList::_SendNotices(uint32 what, BMessage* message)
|
ObserverList::_SendNotices(uint32 what, BMessage* notice)
|
||||||
{
|
{
|
||||||
// first iterate over the list of handlers and try to make valid messengers out of them
|
// first iterate over the list of handlers and try to make valid
|
||||||
|
// messengers out of them
|
||||||
_ValidateHandlers(what);
|
_ValidateHandlers(what);
|
||||||
|
|
||||||
// now send it to all messengers we know
|
// now send it to all messengers we know
|
||||||
@@ -732,20 +740,20 @@ ObserverList::_SendNotices(uint32 what, BMessage* message)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*iterator).SendMessage(message);
|
(*iterator).SendMessage(notice);
|
||||||
iterator++;
|
iterator++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
ObserverList::SendNotices(uint32 what, const BMessage* message)
|
ObserverList::SendNotices(uint32 what, const BMessage* notice)
|
||||||
{
|
{
|
||||||
BMessage* copy = NULL;
|
BMessage* copy = NULL;
|
||||||
if (message) {
|
if (notice != NULL) {
|
||||||
copy = new BMessage(*message);
|
copy = new BMessage(*notice);
|
||||||
copy->what = B_OBSERVER_NOTICE_CHANGE;
|
copy->what = B_OBSERVER_NOTICE_CHANGE;
|
||||||
copy->AddInt32(B_OBSERVE_ORIGINAL_WHAT, message->what);
|
copy->AddInt32(B_OBSERVE_ORIGINAL_WHAT, notice->what);
|
||||||
} else
|
} else
|
||||||
copy = new BMessage(B_OBSERVER_NOTICE_CHANGE);
|
copy = new BMessage(B_OBSERVER_NOTICE_CHANGE);
|
||||||
|
|
||||||
@@ -755,6 +763,7 @@ ObserverList::SendNotices(uint32 what, const BMessage* message)
|
|||||||
_SendNotices(B_OBSERVER_OBSERVE_ALL, copy);
|
_SendNotices(B_OBSERVER_OBSERVE_ALL, copy);
|
||||||
|
|
||||||
delete copy;
|
delete copy;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -863,4 +872,3 @@ FilterDeleter(void *_filter)
|
|||||||
delete static_cast<BMessageFilter*>(_filter);
|
delete static_cast<BMessageFilter*>(_filter);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+47
-43
@@ -1,16 +1,16 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2013, Haiku.
|
* Copyright 2001-2013 Haiku, Inc. All rights reserved
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Erik Jaesler (erik@cgsoftware.com)
|
* DarkWyrm, bpmagic@columbus.rr.com
|
||||||
* DarkWyrm (bpmagic@columbus.rr.com)
|
|
||||||
* Ingo Weinhold, bonefish@@users.sf.net
|
|
||||||
* Axel Dörfler, axeld@pinc-software.de
|
* Axel Dörfler, axeld@pinc-software.de
|
||||||
|
* Erik Jaesler, erik@cgsoftware.com
|
||||||
|
* Ingo Weinhold, bonefish@@users.sf.net
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*! BLooper class spawns a thread that runs a message loop. */
|
// BLooper class spawns a thread that runs a message loop.
|
||||||
|
|
||||||
|
|
||||||
#include <AppMisc.h>
|
#include <AppMisc.h>
|
||||||
@@ -106,7 +106,8 @@ struct _loop_data_ {
|
|||||||
|
|
||||||
|
|
||||||
BLooper::BLooper(const char* name, int32 priority, int32 portCapacity)
|
BLooper::BLooper(const char* name, int32 priority, int32 portCapacity)
|
||||||
: BHandler(name)
|
:
|
||||||
|
BHandler(name)
|
||||||
{
|
{
|
||||||
_InitData(name, priority, portCapacity);
|
_InitData(name, priority, portCapacity);
|
||||||
}
|
}
|
||||||
@@ -626,8 +627,8 @@ BLooper::Sem() const
|
|||||||
|
|
||||||
|
|
||||||
BHandler*
|
BHandler*
|
||||||
BLooper::ResolveSpecifier(BMessage* msg, int32 index, BMessage* specifier,
|
BLooper::ResolveSpecifier(BMessage* message, int32 index, BMessage* specifier,
|
||||||
int32 form, const char* property)
|
int32 what, const char* property)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@note When I was first dumping the results of GetSupportedSuites() from
|
@note When I was first dumping the results of GetSupportedSuites() from
|
||||||
@@ -645,7 +646,7 @@ BLooper::ResolveSpecifier(BMessage* msg, int32 index, BMessage* specifier,
|
|||||||
uint32 data;
|
uint32 data;
|
||||||
status_t err = B_OK;
|
status_t err = B_OK;
|
||||||
const char* errMsg = "";
|
const char* errMsg = "";
|
||||||
if (propertyInfo.FindMatch(msg, index, specifier, form, property, &data)
|
if (propertyInfo.FindMatch(message, index, specifier, what, property, &data)
|
||||||
>= 0) {
|
>= 0) {
|
||||||
switch (data) {
|
switch (data) {
|
||||||
case BLOOPER_PROCESS_INTERNALLY:
|
case BLOOPER_PROCESS_INTERNALLY:
|
||||||
@@ -654,13 +655,13 @@ BLooper::ResolveSpecifier(BMessage* msg, int32 index, BMessage* specifier,
|
|||||||
case BLOOPER_HANDLER_BY_INDEX:
|
case BLOOPER_HANDLER_BY_INDEX:
|
||||||
{
|
{
|
||||||
int32 index = specifier->FindInt32("index");
|
int32 index = specifier->FindInt32("index");
|
||||||
if (form == B_REVERSE_INDEX_SPECIFIER) {
|
if (what == B_REVERSE_INDEX_SPECIFIER) {
|
||||||
index = CountHandlers() - index;
|
index = CountHandlers() - index;
|
||||||
}
|
}
|
||||||
BHandler* target = HandlerAt(index);
|
BHandler* target = HandlerAt(index);
|
||||||
if (target) {
|
if (target) {
|
||||||
// Specifier has been fully handled
|
// Specifier has been fully handled
|
||||||
msg->PopSpecifier();
|
message->PopSpecifier();
|
||||||
return target;
|
return target;
|
||||||
} else {
|
} else {
|
||||||
err = B_BAD_INDEX;
|
err = B_BAD_INDEX;
|
||||||
@@ -672,17 +673,16 @@ BLooper::ResolveSpecifier(BMessage* msg, int32 index, BMessage* specifier,
|
|||||||
default:
|
default:
|
||||||
err = B_BAD_SCRIPT_SYNTAX;
|
err = B_BAD_SCRIPT_SYNTAX;
|
||||||
errMsg = "Didn't understand the specifier(s)";
|
errMsg = "Didn't understand the specifier(s)";
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return BHandler::ResolveSpecifier(msg, index, specifier, form,
|
return BHandler::ResolveSpecifier(message, index, specifier, what,
|
||||||
property);
|
property);
|
||||||
}
|
}
|
||||||
|
|
||||||
BMessage reply(B_MESSAGE_NOT_UNDERSTOOD);
|
BMessage reply(B_MESSAGE_NOT_UNDERSTOOD);
|
||||||
reply.AddInt32("error", err);
|
reply.AddInt32("error", err);
|
||||||
reply.AddString("message", errMsg);
|
reply.AddString("message", errMsg);
|
||||||
msg->SendReply(&reply);
|
message->SendReply(&reply);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -709,7 +709,7 @@ BLooper::GetSupportedSuites(BMessage* data)
|
|||||||
void
|
void
|
||||||
BLooper::AddCommonFilter(BMessageFilter* filter)
|
BLooper::AddCommonFilter(BMessageFilter* filter)
|
||||||
{
|
{
|
||||||
if (!filter)
|
if (filter == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
AssertLocked();
|
AssertLocked();
|
||||||
@@ -719,7 +719,7 @@ BLooper::AddCommonFilter(BMessageFilter* filter)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fCommonFilters)
|
if (fCommonFilters == NULL)
|
||||||
fCommonFilters = new BList(FILTER_LIST_BLOCK_SIZE);
|
fCommonFilters = new BList(FILTER_LIST_BLOCK_SIZE);
|
||||||
|
|
||||||
filter->SetLooper(this);
|
filter->SetLooper(this);
|
||||||
@@ -732,7 +732,7 @@ BLooper::RemoveCommonFilter(BMessageFilter* filter)
|
|||||||
{
|
{
|
||||||
AssertLocked();
|
AssertLocked();
|
||||||
|
|
||||||
if (!fCommonFilters)
|
if (fCommonFilters == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool result = fCommonFilters->RemoveItem(filter);
|
bool result = fCommonFilters->RemoveItem(filter);
|
||||||
@@ -1048,7 +1048,9 @@ BLooper::ReadRawFromPort(int32* msgCode, bigtime_t timeout)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRINT(("BLooper::ReadRawFromPort() read: %.4s, %p (%d bytes)\n", (char *)msgCode, buffer, bufferSize));
|
PRINT(("BLooper::ReadRawFromPort() read: %.4s, %p (%d bytes)\n",
|
||||||
|
(char*)msgCode, buffer, bufferSize));
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1061,7 +1063,7 @@ BLooper::ReadMessageFromPort(bigtime_t timeout)
|
|||||||
BMessage* message = NULL;
|
BMessage* message = NULL;
|
||||||
|
|
||||||
void* buffer = ReadRawFromPort(&msgCode, timeout);
|
void* buffer = ReadRawFromPort(&msgCode, timeout);
|
||||||
if (!buffer)
|
if (buffer == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
message = ConvertToMessage(buffer, msgCode);
|
message = ConvertToMessage(buffer, msgCode);
|
||||||
@@ -1076,7 +1078,7 @@ BMessage*
|
|||||||
BLooper::ConvertToMessage(void* buffer, int32 code)
|
BLooper::ConvertToMessage(void* buffer, int32 code)
|
||||||
{
|
{
|
||||||
PRINT(("BLooper::ConvertToMessage()\n"));
|
PRINT(("BLooper::ConvertToMessage()\n"));
|
||||||
if (!buffer)
|
if (buffer == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
BMessage* message = new BMessage();
|
BMessage* message = new BMessage();
|
||||||
@@ -1139,7 +1141,7 @@ BLooper::task_looper()
|
|||||||
|
|
||||||
fLastMessage = message;
|
fLastMessage = message;
|
||||||
|
|
||||||
if (!fLastMessage) {
|
if (fLastMessage == NULL) {
|
||||||
// No more messages: Unlock the looper and terminate the
|
// No more messages: Unlock the looper and terminate the
|
||||||
// dispatch loop.
|
// dispatch loop.
|
||||||
dispatchNextMessage = false;
|
dispatchNextMessage = false;
|
||||||
@@ -1295,24 +1297,25 @@ BHandler*
|
|||||||
BLooper::_ApplyFilters(BList* list, BMessage* message, BHandler* target)
|
BLooper::_ApplyFilters(BList* list, BMessage* message, BHandler* target)
|
||||||
{
|
{
|
||||||
// This is where the action is!
|
// This is where the action is!
|
||||||
// Check the parameters
|
|
||||||
if (!list || !message)
|
// check the parameters
|
||||||
|
if (list == NULL || message == NULL)
|
||||||
return target;
|
return target;
|
||||||
|
|
||||||
// For each filter in the provided list
|
// for each filter in the provided list
|
||||||
BMessageFilter* filter = NULL;
|
BMessageFilter* filter = NULL;
|
||||||
for (int32 i = 0; i < list->CountItems(); ++i) {
|
for (int32 i = 0; i < list->CountItems(); ++i) {
|
||||||
filter = (BMessageFilter*)list->ItemAt(i);
|
filter = (BMessageFilter*)list->ItemAt(i);
|
||||||
|
|
||||||
// Check command conditions
|
// check command conditions
|
||||||
if (filter->FiltersAnyCommand() || filter->Command() == message->what) {
|
if (filter->FiltersAnyCommand() || filter->Command() == message->what) {
|
||||||
// Check delivery conditions
|
// check delivery conditions
|
||||||
message_delivery delivery = filter->MessageDelivery();
|
message_delivery delivery = filter->MessageDelivery();
|
||||||
bool dropped = message->WasDropped();
|
bool dropped = message->WasDropped();
|
||||||
if (delivery == B_ANY_DELIVERY
|
if (delivery == B_ANY_DELIVERY
|
||||||
|| (delivery == B_DROPPED_DELIVERY && dropped)
|
|| (delivery == B_DROPPED_DELIVERY && dropped)
|
||||||
|| (delivery == B_PROGRAMMED_DELIVERY && !dropped)) {
|
|| (delivery == B_PROGRAMMED_DELIVERY && !dropped)) {
|
||||||
// Check source conditions
|
// check source conditions
|
||||||
message_source source = filter->MessageSource();
|
message_source source = filter->MessageSource();
|
||||||
bool remote = message->IsSourceRemote();
|
bool remote = message->IsSourceRemote();
|
||||||
if (source == B_ANY_SOURCE
|
if (source == B_ANY_SOURCE
|
||||||
@@ -1320,15 +1323,15 @@ BLooper::_ApplyFilters(BList* list, BMessage* message, BHandler* target)
|
|||||||
|| (source == B_LOCAL_SOURCE && !remote)) {
|
|| (source == B_LOCAL_SOURCE && !remote)) {
|
||||||
// Are we using an "external" function?
|
// Are we using an "external" function?
|
||||||
filter_result result;
|
filter_result result;
|
||||||
filter_hook func = filter->FilterFunction();
|
filter_hook filterFunction = filter->FilterFunction();
|
||||||
if (func)
|
if (filterFunction != NULL)
|
||||||
result = func(message, &target, filter);
|
result = filterFunction(message, &target, filter);
|
||||||
else
|
else
|
||||||
result = filter->Filter(message, &target);
|
result = filter->Filter(message, &target);
|
||||||
|
|
||||||
// Is further processing allowed?
|
// Is further processing allowed?
|
||||||
if (result == B_SKIP_MESSAGE) {
|
if (result == B_SKIP_MESSAGE) {
|
||||||
// No; time to bail out
|
// no, time to bail out
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1343,13 +1346,14 @@ BLooper::_ApplyFilters(BList* list, BMessage* message, BHandler* target)
|
|||||||
void
|
void
|
||||||
BLooper::check_lock()
|
BLooper::check_lock()
|
||||||
{
|
{
|
||||||
// This is a cheap variant of AssertLocked()
|
// this is a cheap variant of AssertLocked()
|
||||||
// It is used in situations where it's clear that the looper is valid,
|
// it is used in situations where it's clear that the looper is valid,
|
||||||
// ie. from handlers
|
// i.e. from handlers
|
||||||
uint32 stack;
|
uint32 stack;
|
||||||
if (((addr_t)&stack & ~(B_PAGE_SIZE - 1)) == fCachedStack
|
if (((addr_t)&stack & ~(B_PAGE_SIZE - 1)) == fCachedStack
|
||||||
|| fOwner == find_thread(NULL))
|
|| fOwner == find_thread(NULL)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
debugger("Looper must be locked.");
|
debugger("Looper must be locked.");
|
||||||
}
|
}
|
||||||
@@ -1358,7 +1362,7 @@ BLooper::check_lock()
|
|||||||
BHandler*
|
BHandler*
|
||||||
BLooper::resolve_specifier(BHandler* target, BMessage* message)
|
BLooper::resolve_specifier(BHandler* target, BMessage* message)
|
||||||
{
|
{
|
||||||
// Check params
|
// check params
|
||||||
if (!target || !message)
|
if (!target || !message)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -1368,27 +1372,28 @@ BLooper::resolve_specifier(BHandler* target, BMessage* message)
|
|||||||
const char* property;
|
const char* property;
|
||||||
status_t err = B_OK;
|
status_t err = B_OK;
|
||||||
BHandler* newTarget = target;
|
BHandler* newTarget = target;
|
||||||
// Loop to deal with nested specifiers
|
// loop to deal with nested specifiers
|
||||||
// (e.g., the 3rd button on the 4th view)
|
// (e.g., the 3rd button on the 4th view)
|
||||||
do {
|
do {
|
||||||
err = message->GetCurrentSpecifier(&index, &specifier, &form, &property);
|
err = message->GetCurrentSpecifier(&index, &specifier, &form,
|
||||||
|
&property);
|
||||||
if (err != B_OK) {
|
if (err != B_OK) {
|
||||||
BMessage reply(B_REPLY);
|
BMessage reply(B_REPLY);
|
||||||
reply.AddInt32("error", err);
|
reply.AddInt32("error", err);
|
||||||
message->SendReply(&reply);
|
message->SendReply(&reply);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
// Current target gets what was the new target
|
// current target gets what was the new target
|
||||||
target = newTarget;
|
target = newTarget;
|
||||||
newTarget = target->ResolveSpecifier(message, index, &specifier, form,
|
newTarget = target->ResolveSpecifier(message, index, &specifier, form,
|
||||||
property);
|
property);
|
||||||
// Check that new target is owned by looper; use IndexOf() to avoid
|
// check that new target is owned by looper; use IndexOf() to avoid
|
||||||
// dereferencing newTarget (possible race condition with object
|
// dereferencing newTarget (possible race condition with object
|
||||||
// destruction by another looper)
|
// destruction by another looper)
|
||||||
if (!newTarget || IndexOf(newTarget) < 0)
|
if (newTarget == NULL || IndexOf(newTarget) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// Get current specifier index (may change in ResolveSpecifier())
|
// get current specifier index (may change in ResolveSpecifier())
|
||||||
err = message->GetCurrentSpecifier(&index);
|
err = message->GetCurrentSpecifier(&index);
|
||||||
} while (newTarget && newTarget != target && err == B_OK && index >= 0);
|
} while (newTarget && newTarget != target && err == B_OK && index >= 0);
|
||||||
|
|
||||||
@@ -1426,4 +1431,3 @@ _get_looper_port_(const BLooper* looper)
|
|||||||
{
|
{
|
||||||
return looper->fMsgPort;
|
return looper->fMsgPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-11
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2005-2012, Haiku Inc. All rights reserved.
|
* Copyright 2005-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Michael Lotz <mmlr@mlotz.ch>
|
* Michael Lotz, mmlr@mlotz.ch
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -67,8 +67,9 @@ const char *B_PROPERTY_ENTRY = "property";
|
|||||||
const char* B_PROPERTY_NAME_ENTRY = "name";
|
const char* B_PROPERTY_NAME_ENTRY = "name";
|
||||||
|
|
||||||
|
|
||||||
static status_t handle_reply(port_id replyPort, int32 *pCode, bigtime_t timeout,
|
static status_t handle_reply(port_id replyPort, int32* pCode,
|
||||||
BMessage *reply);
|
bigtime_t timeout, BMessage* reply);
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
// private os function to set the owning team of an area
|
// private os function to set the owning team of an area
|
||||||
@@ -476,8 +477,8 @@ BMessage::GetInfo(type_code typeRequested, int32 index, char **nameFound,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BMessage::GetInfo(const char *name, type_code *typeFound, int32 *countFound)
|
BMessage::GetInfo(const char* name, type_code* typeFound,
|
||||||
const
|
int32* countFound) const
|
||||||
{
|
{
|
||||||
DEBUG_FUNCTION_ENTER;
|
DEBUG_FUNCTION_ENTER;
|
||||||
if (countFound != NULL)
|
if (countFound != NULL)
|
||||||
@@ -2241,9 +2242,7 @@ BMessage::_SendMessage(port_id port, team_id portOwner, int32 token,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
// Sends a message and waits synchronously for a reply.
|
||||||
Sends a message and waits synchronously for a reply.
|
|
||||||
*/
|
|
||||||
status_t
|
status_t
|
||||||
BMessage::_SendMessage(port_id port, team_id portOwner, int32 token,
|
BMessage::_SendMessage(port_id port, team_id portOwner, int32 token,
|
||||||
BMessage* reply, bigtime_t sendTimeout, bigtime_t replyTimeout) const
|
BMessage* reply, bigtime_t sendTimeout, bigtime_t replyTimeout) const
|
||||||
@@ -2895,8 +2894,8 @@ BMessage::FindMessenger(const char *name, BMessenger *messenger) const
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BMessage::FindMessenger(const char *name, int32 index, BMessenger *messenger)
|
BMessage::FindMessenger(const char* name, int32 index,
|
||||||
const
|
BMessenger* messenger) const
|
||||||
{
|
{
|
||||||
if (messenger == NULL)
|
if (messenger == NULL)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2005, Haiku.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku, Inc. All Rights Reserved.
|
* Copyright 2001-2014 Haiku, Inc. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -7,7 +7,8 @@
|
|||||||
* Axel Dörfler, axeld@pinc-software.de
|
* Axel Dörfler, axeld@pinc-software.de
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** Queue for holding BMessages */
|
|
||||||
|
// Queue for holding BMessages
|
||||||
|
|
||||||
|
|
||||||
#include <MessageQueue.h>
|
#include <MessageQueue.h>
|
||||||
@@ -213,10 +214,8 @@ BMessageQueue::IsNextMessage(const BMessage* message) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
// This method is only here for R5 binary compatibility!
|
||||||
\brief This method is only here for R5 binary compatibility!
|
// It should be dropped as soon as possible (it misses the const qualifier).
|
||||||
It should be dropped as soon as possible (it misses the const qualifier).
|
|
||||||
*/
|
|
||||||
bool
|
bool
|
||||||
BMessageQueue::IsLocked()
|
BMessageQueue::IsLocked()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user