2 * Copyright 2005-2015 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * Michael Lotz, mmlr@mlotz.ch
16 #include <Flattenable.h>
21 #include <AppDefs.h> /* For convenience */
22 #include <TypeConstants.h> /* For convenience */
35 // Name lengths and Scripting specifiers
36 #define B_FIELD_NAME_LENGTH 255
37 #define B_PROPERTY_NAME_LENGTH 255
41 B_DIRECT_SPECIFIER
= 1,
43 B_REVERSE_INDEX_SPECIFIER
,
45 B_REVERSE_RANGE_SPECIFIER
,
49 B_SPECIFIERS_END
= 128
50 // app-defined specifiers start at B_SPECIFIERS_END + 1
59 BMessage(uint32 what
);
60 BMessage(const BMessage
& other
);
63 BMessage
& operator=(const BMessage
& other
);
65 // Statistics and misc info
66 status_t
GetInfo(type_code typeRequested
, int32 index
,
67 char** nameFound
, type_code
* typeFound
,
68 int32
* countFound
= NULL
) const;
69 status_t
GetInfo(const char* name
, type_code
* typeFound
,
70 int32
* countFound
= NULL
) const;
71 status_t
GetInfo(const char* name
, type_code
* typeFound
,
72 bool* fixedSize
) const;
73 status_t
GetInfo(const char* name
, type_code
* typeFound
,
74 int32
* countFound
, bool* fixedSize
) const;
76 int32
CountNames(type_code type
) const;
78 bool IsSystem() const;
80 void PrintToStream() const;
82 status_t
Rename(const char* oldEntry
,
83 const char* newEntry
);
86 bool WasDelivered() const;
87 bool IsSourceWaiting() const;
88 bool IsSourceRemote() const;
89 BMessenger
ReturnAddress() const;
90 const BMessage
* Previous() const;
91 bool WasDropped() const;
92 BPoint
DropPoint(BPoint
* offset
= NULL
) const;
95 status_t
SendReply(uint32 command
,
96 BHandler
* replyTo
= NULL
);
97 status_t
SendReply(BMessage
* reply
,
98 BHandler
* replyTo
= NULL
,
99 bigtime_t timeout
= B_INFINITE_TIMEOUT
);
100 status_t
SendReply(BMessage
* reply
, BMessenger replyTo
,
101 bigtime_t timeout
= B_INFINITE_TIMEOUT
);
103 status_t
SendReply(uint32 command
,
104 BMessage
* replyToReply
);
105 status_t
SendReply(BMessage
* reply
,
106 BMessage
* replyToReply
,
107 bigtime_t sendTimeout
= B_INFINITE_TIMEOUT
,
108 bigtime_t replyTimeout
109 = B_INFINITE_TIMEOUT
);
112 ssize_t
FlattenedSize() const;
113 status_t
Flatten(char* buffer
, ssize_t size
) const;
114 status_t
Flatten(BDataIO
* stream
,
115 ssize_t
* size
= NULL
) const;
116 status_t
Unflatten(const char* flatBuffer
);
117 status_t
Unflatten(BDataIO
* stream
);
119 // Specifiers (scripting)
120 status_t
AddSpecifier(const char* property
);
121 status_t
AddSpecifier(const char* property
, int32 index
);
122 status_t
AddSpecifier(const char* property
, int32 index
,
124 status_t
AddSpecifier(const char* property
,
126 status_t
AddSpecifier(const BMessage
* specifier
);
128 status_t
SetCurrentSpecifier(int32 index
);
129 status_t
GetCurrentSpecifier(int32
* index
,
130 BMessage
* specifier
= NULL
,
132 const char** property
= NULL
) const;
133 bool HasSpecifiers() const;
134 status_t
PopSpecifier();
137 status_t
AddAlignment(const char* name
,
138 const BAlignment
& alignment
);
139 status_t
AddRect(const char* name
, BRect rect
);
140 status_t
AddPoint(const char* name
, BPoint point
);
141 status_t
AddSize(const char* name
, BSize size
);
142 status_t
AddString(const char* name
, const char* string
);
143 status_t
AddString(const char* name
,
144 const BString
& string
);
145 status_t
AddStrings(const char* name
,
146 const BStringList
& list
);
147 status_t
AddInt8(const char* name
, int8 value
);
148 status_t
AddUInt8(const char* name
, uint8 value
);
149 status_t
AddInt16(const char* name
, int16 value
);
150 status_t
AddUInt16(const char* name
, uint16 value
);
151 status_t
AddInt32(const char* name
, int32 value
);
152 status_t
AddUInt32(const char* name
, uint32 value
);
153 status_t
AddInt64(const char* name
, int64 value
);
154 status_t
AddUInt64(const char* name
, uint64 value
);
155 status_t
AddBool(const char* name
, bool value
);
156 status_t
AddFloat(const char* name
, float value
);
157 status_t
AddDouble(const char* name
, double value
);
158 status_t
AddColor(const char* name
, rgb_color value
);
159 status_t
AddPointer(const char* name
,
160 const void* pointer
);
161 status_t
AddMessenger(const char* name
,
162 BMessenger messenger
);
163 status_t
AddRef(const char* name
, const entry_ref
* ref
);
164 status_t
AddMessage(const char* name
,
165 const BMessage
* message
);
166 status_t
AddFlat(const char* name
, BFlattenable
* object
,
168 status_t
AddFlat(const char* name
,
169 const BFlattenable
* object
, int32 count
= 1);
170 status_t
AddData(const char* name
, type_code type
,
171 const void* data
, ssize_t numBytes
,
172 bool isFixedSize
= true, int32 count
= 1);
174 status_t
Append(const BMessage
& message
);
177 status_t
RemoveData(const char* name
, int32 index
= 0);
178 status_t
RemoveName(const char* name
);
179 status_t
MakeEmpty();
182 status_t
FindAlignment(const char* name
,
183 BAlignment
* alignment
) const;
184 status_t
FindAlignment(const char* name
, int32 index
,
185 BAlignment
* alignment
) const;
187 status_t
FindRect(const char* name
, BRect
* rect
) const;
188 status_t
FindRect(const char* name
, int32 index
,
190 status_t
FindPoint(const char* name
,
191 BPoint
* point
) const;
192 status_t
FindPoint(const char* name
, int32 index
,
193 BPoint
* point
) const;
195 status_t
FindSize(const char* name
, BSize
* size
) const;
196 status_t
FindSize(const char* name
, int32 index
,
199 status_t
FindString(const char* name
,
200 const char** string
) const;
201 status_t
FindString(const char* name
, int32 index
,
202 const char** string
) const;
203 status_t
FindString(const char* name
,
204 BString
* string
) const;
205 status_t
FindString(const char* name
, int32 index
,
206 BString
* string
) const;
207 status_t
FindStrings(const char* name
,
208 BStringList
* list
) const;
209 status_t
FindInt8(const char* name
, int8
* value
) const;
210 status_t
FindInt8(const char* name
, int32 index
,
212 status_t
FindUInt8(const char* name
, uint8
* value
) const;
213 status_t
FindUInt8(const char* name
, int32 index
,
215 status_t
FindInt16(const char* name
, int16
* value
) const;
216 status_t
FindInt16(const char* name
, int32 index
,
218 status_t
FindUInt16(const char* name
,
219 uint16
* value
) const;
220 status_t
FindUInt16(const char* name
, int32 index
,
221 uint16
* value
) const;
222 status_t
FindInt32(const char* name
, int32
* value
) const;
223 status_t
FindInt32(const char* name
, int32 index
,
225 status_t
FindUInt32(const char* name
,
226 uint32
* value
) const;
227 status_t
FindUInt32(const char* name
, int32 index
,
228 uint32
* value
) const;
229 status_t
FindInt64(const char* name
, int64
* value
) const;
230 status_t
FindInt64(const char* name
, int32 index
,
232 status_t
FindUInt64(const char* name
,
233 uint64
* value
) const;
234 status_t
FindUInt64(const char* name
, int32 index
,
235 uint64
* value
) const;
236 status_t
FindBool(const char* name
, bool* value
) const;
237 status_t
FindBool(const char* name
, int32 index
,
239 status_t
FindFloat(const char* name
, float* value
) const;
240 status_t
FindFloat(const char* name
, int32 index
,
242 status_t
FindDouble(const char* name
,
243 double* value
) const;
244 status_t
FindDouble(const char* name
, int32 index
,
245 double* value
) const;
246 status_t
FindColor(const char* name
,
247 rgb_color
* value
) const;
248 status_t
FindColor(const char* name
, int32 index
,
249 rgb_color
* value
) const;
250 status_t
FindPointer(const char* name
,
251 void** pointer
) const;
252 status_t
FindPointer(const char* name
, int32 index
,
253 void** pointer
) const;
254 status_t
FindMessenger(const char* name
,
255 BMessenger
* messenger
) const;
256 status_t
FindMessenger(const char* name
, int32 index
,
257 BMessenger
* messenger
) const;
258 status_t
FindRef(const char* name
, entry_ref
* ref
) const;
259 status_t
FindRef(const char* name
, int32 index
,
260 entry_ref
* ref
) const;
261 status_t
FindMessage(const char* name
,
262 BMessage
* message
) const;
263 status_t
FindMessage(const char* name
, int32 index
,
264 BMessage
* message
) const;
265 status_t
FindFlat(const char* name
,
266 BFlattenable
* object
) const;
267 status_t
FindFlat(const char* name
, int32 index
,
268 BFlattenable
* object
) const;
269 status_t
FindData(const char* name
, type_code type
,
270 const void** data
, ssize_t
* numBytes
) const;
271 status_t
FindData(const char* name
, type_code type
,
272 int32 index
, const void** data
,
273 ssize_t
* numBytes
) const;
276 status_t
ReplaceAlignment(const char* name
,
277 const BAlignment
& alignment
);
278 status_t
ReplaceAlignment(const char* name
, int32 index
,
279 const BAlignment
& alignment
);
281 status_t
ReplaceRect(const char* name
, BRect rect
);
282 status_t
ReplaceRect(const char* name
, int32 index
,
285 status_t
ReplacePoint(const char* name
, BPoint aPoint
);
286 status_t
ReplacePoint(const char* name
, int32 index
,
288 status_t
ReplaceSize(const char* name
, BSize aSize
);
289 status_t
ReplaceSize(const char* name
, int32 index
,
292 status_t
ReplaceString(const char* name
,
294 status_t
ReplaceString(const char* name
, int32 index
,
296 status_t
ReplaceString(const char* name
,
297 const BString
& string
);
298 status_t
ReplaceString(const char* name
, int32 index
,
299 const BString
& string
);
300 status_t
ReplaceInt8(const char* name
, int8 value
);
301 status_t
ReplaceInt8(const char* name
, int32 index
,
303 status_t
ReplaceUInt8(const char* name
, uint8 value
);
304 status_t
ReplaceUInt8(const char* name
, int32 index
,
306 status_t
ReplaceInt16(const char* name
, int16 value
);
307 status_t
ReplaceInt16(const char* name
, int32 index
,
309 status_t
ReplaceUInt16(const char* name
, uint16 value
);
310 status_t
ReplaceUInt16(const char* name
, int32 index
,
312 status_t
ReplaceInt32(const char* name
, int32 value
);
313 status_t
ReplaceInt32(const char* name
, int32 index
,
315 status_t
ReplaceUInt32(const char* name
, uint32 value
);
316 status_t
ReplaceUInt32(const char* name
, int32 index
,
318 status_t
ReplaceInt64(const char* name
, int64 value
);
319 status_t
ReplaceInt64(const char* name
, int32 index
,
321 status_t
ReplaceUInt64(const char* name
, uint64 value
);
322 status_t
ReplaceUInt64(const char* name
, int32 index
,
324 status_t
ReplaceBool(const char* name
, bool aBoolean
);
325 status_t
ReplaceBool(const char* name
, int32 index
,
327 status_t
ReplaceFloat(const char* name
, float value
);
328 status_t
ReplaceFloat(const char* name
, int32 index
,
330 status_t
ReplaceDouble(const char* name
, double value
);
331 status_t
ReplaceDouble(const char* name
, int32 index
,
333 status_t
ReplaceColor(const char* name
,
335 status_t
ReplaceColor(const char* name
, int32 index
,
337 status_t
ReplacePointer(const char* name
,
338 const void* pointer
);
339 status_t
ReplacePointer(const char* name
, int32 index
,
340 const void* pointer
);
341 status_t
ReplaceMessenger(const char* name
,
342 BMessenger messenger
);
343 status_t
ReplaceMessenger(const char* name
, int32 index
,
344 BMessenger messenger
);
345 status_t
ReplaceRef(const char* name
,
346 const entry_ref
* ref
);
347 status_t
ReplaceRef(const char* name
, int32 index
,
348 const entry_ref
* ref
);
349 status_t
ReplaceMessage(const char* name
,
350 const BMessage
* message
);
351 status_t
ReplaceMessage(const char* name
, int32 index
,
352 const BMessage
* message
);
353 status_t
ReplaceFlat(const char* name
,
354 BFlattenable
* object
);
355 status_t
ReplaceFlat(const char* name
, int32 index
,
356 BFlattenable
* object
);
357 status_t
ReplaceData(const char* name
, type_code type
,
358 const void* data
, ssize_t numBytes
);
359 status_t
ReplaceData(const char* name
, type_code type
,
360 int32 index
, const void* data
,
363 // Comparing data - Haiku experimental API
364 bool HasSameData(const BMessage
& other
,
365 bool ignoreFieldOrder
= true,
366 bool deep
= false) const;
368 void* operator new(size_t size
);
369 void* operator new(size_t, void* pointer
);
370 void* operator new(size_t,
371 const std::nothrow_t
& noThrow
);
372 void operator delete(void* pointer
, size_t size
);
374 // Private, reserved, or obsolete
375 bool HasAlignment(const char* name
,
377 bool HasRect(const char* name
, int32 n
= 0) const;
378 bool HasPoint(const char* name
, int32 n
= 0) const;
379 bool HasSize(const char* name
, int32 n
= 0) const;
380 bool HasString(const char* name
, int32 n
= 0) const;
381 bool HasInt8(const char* name
, int32 n
= 0) const;
382 bool HasUInt8(const char* name
, int32 n
= 0) const;
383 bool HasInt16(const char* name
, int32 n
= 0) const;
384 bool HasUInt16(const char* name
, int32 n
= 0) const;
385 bool HasInt32(const char* name
, int32 n
= 0) const;
386 bool HasUInt32(const char* name
, int32 n
= 0) const;
387 bool HasInt64(const char* name
, int32 n
= 0) const;
388 bool HasUInt64(const char* name
, int32 n
= 0) const;
389 bool HasBool(const char* name
, int32 n
= 0) const;
390 bool HasFloat(const char* name
, int32 n
= 0) const;
391 bool HasDouble(const char* name
, int32 n
= 0) const;
392 bool HasColor(const char* name
, int32 n
= 0) const;
393 bool HasPointer(const char* name
, int32 n
= 0) const;
394 bool HasMessenger(const char* name
,
396 bool HasRef(const char* name
, int32 n
= 0) const;
397 bool HasMessage(const char* name
, int32 n
= 0) const;
398 bool HasFlat(const char* name
,
399 const BFlattenable
* object
) const;
400 bool HasFlat(const char* name
, int32 n
,
401 const BFlattenable
* object
) const;
402 bool HasData(const char* name
, type_code
,
404 BRect
FindRect(const char* name
, int32 n
= 0) const;
405 BPoint
FindPoint(const char* name
, int32 n
= 0) const;
406 const char* FindString(const char* name
, int32 n
= 0) const;
407 int8
FindInt8(const char* name
, int32 n
= 0) const;
408 int16
FindInt16(const char* name
, int32 n
= 0) const;
409 int32
FindInt32(const char* name
, int32 n
= 0) const;
410 int64
FindInt64(const char* name
, int32 n
= 0) const;
411 bool FindBool(const char* name
, int32 n
= 0) const;
412 float FindFloat(const char* name
, int32 n
= 0) const;
413 double FindDouble(const char* name
, int32 n
= 0) const;
415 // Convenience methods
416 bool GetBool(const char* name
,
417 bool defaultValue
= false) const;
418 bool GetBool(const char* name
, int32 index
,
419 bool defaultValue
) const;
420 int8
GetInt8(const char* name
,
421 int8 defaultValue
) const;
422 int8
GetInt8(const char* name
, int32 index
,
423 int8 defaultValue
) const;
424 uint8
GetUInt8(const char* name
,
425 uint8 defaultValue
) const;
426 uint8
GetUInt8(const char* name
, int32 index
,
427 uint8 defaultValue
) const;
428 int16
GetInt16(const char* name
,
429 int16 defaultValue
) const;
430 int16
GetInt16(const char* name
, int32 index
,
431 int16 defaultValue
) const;
432 uint16
GetUInt16(const char* name
,
433 uint16 defaultValue
) const;
434 uint16
GetUInt16(const char* name
, int32 index
,
435 uint16 defaultValue
) const;
436 int32
GetInt32(const char* name
,
437 int32 defaultValue
) const;
438 int32
GetInt32(const char* name
, int32 index
,
439 int32 defaultValue
) const;
440 uint32
GetUInt32(const char* name
,
441 uint32 defaultValue
) const;
442 uint32
GetUInt32(const char* name
, int32 index
,
443 uint32 defaultValue
) const;
444 int64
GetInt64(const char* name
,
445 int64 defaultValue
) const;
446 int64
GetInt64(const char* name
, int32 index
,
447 int64 defaultValue
) const;
448 uint64
GetUInt64(const char* name
,
449 uint64 defaultValue
) const;
450 uint64
GetUInt64(const char* name
, int32 index
,
451 uint64 defaultValue
) const;
452 float GetFloat(const char* name
,
453 float defaultValue
) const;
454 float GetFloat(const char* name
, int32 index
,
455 float defaultValue
) const;
456 double GetDouble(const char* name
,
457 double defaultValue
) const;
458 double GetDouble(const char* name
, int32 index
,
459 double defaultValue
) const;
460 rgb_color
GetColor(const char* name
,
461 rgb_color defaultValue
) const;
462 rgb_color
GetColor(const char* name
, int32 index
,
463 rgb_color defaultValue
) const;
464 const char* GetString(const char* name
,
465 const char* defaultValue
= NULL
) const;
466 const char* GetString(const char* name
, int32 index
,
467 const char* defaultValue
) const;
468 BAlignment
GetAlignment(const char* name
, int32 index
,
469 const BAlignment
& defaultValue
) const;
470 BAlignment
GetAlignment(const char* name
,
471 const BAlignment
& defaultValue
) const;
472 BRect
GetRect(const char* name
, int32 index
,
473 const BRect
& defaultValue
) const;
474 BRect
GetRect(const char* name
,
475 const BRect
& defaultValue
) const;
476 BPoint
GetPoint(const char* name
, int32 index
,
477 const BPoint
& defaultValue
) const;
478 BPoint
GetPoint(const char* name
,
479 const BPoint
& defaultValue
) const;
480 BSize
GetSize(const char* name
, int32 index
,
481 const BSize
& defaultValue
) const;
482 BSize
GetSize(const char* name
,
483 const BSize
& defaultValue
) const;
485 // fixed size fields only
486 status_t
SetBool(const char* name
, bool value
);
487 status_t
SetInt8(const char* name
, int8 value
);
488 status_t
SetUInt8(const char* name
, uint8 value
);
489 status_t
SetInt16(const char* name
, int16 value
);
490 status_t
SetUInt16(const char* name
, uint16 value
);
491 status_t
SetInt32(const char* name
, int32 value
);
492 status_t
SetUInt32(const char* name
, uint32 value
);
493 status_t
SetInt64(const char* name
, int64 value
);
494 status_t
SetUInt64(const char* name
, uint64 value
);
495 status_t
SetColor(const char* name
, rgb_color value
);
496 status_t
SetPointer(const char* name
, const void* value
);
497 status_t
SetString(const char* name
, const char* string
);
498 status_t
SetString(const char* name
,
499 const BString
& string
);
500 status_t
SetFloat(const char* name
, float value
);
501 status_t
SetDouble(const char* name
, double value
);
502 status_t
SetAlignment(const char* name
,
503 const BAlignment
& value
);
504 status_t
SetPoint(const char* name
, const BPoint
& value
);
505 status_t
SetRect(const char* name
, const BRect
& value
);
506 status_t
SetSize(const char* name
, const BSize
& value
);
507 status_t
SetData(const char* name
, type_code type
,
508 const void* data
, ssize_t numBytes
,
509 bool fixedSize
= true, int count
= 1);
512 struct message_header
;
516 friend class Private
;
517 friend class BMessageQueue
;
519 status_t
_InitCommon(bool initHeader
);
520 status_t
_InitHeader();
523 status_t
_FlattenToArea(message_header
** _header
) const;
524 status_t
_CopyForWrite();
525 status_t
_Reference();
526 status_t
_Dereference();
528 status_t
_ValidateMessage();
530 void _UpdateOffsets(uint32 offset
, int32 change
);
531 status_t
_ResizeData(uint32 offset
, int32 change
);
533 uint32
_HashName(const char* name
) const;
534 status_t
_FindField(const char* name
, type_code type
,
535 field_header
** _result
) const;
536 status_t
_AddField(const char* name
, type_code type
,
537 bool isFixedSize
, field_header
** _result
);
538 status_t
_RemoveField(field_header
* field
);
540 void _PrintToStream(const char* indent
) const;
543 BMessage(BMessage
* message
);
546 virtual void _ReservedMessage1();
547 virtual void _ReservedMessage2();
548 virtual void _ReservedMessage3();
550 status_t
_SendMessage(port_id port
, team_id portOwner
,
551 int32 token
, bigtime_t timeout
,
553 BMessenger
& replyTo
) const;
554 status_t
_SendMessage(port_id port
, team_id portOwner
,
555 int32 token
, BMessage
* reply
,
556 bigtime_t sendTimeout
,
557 bigtime_t replyTimeout
) const;
558 static status_t
_SendFlattenedMessage(void* data
, int32 size
,
559 port_id port
, int32 token
,
562 static void _StaticInit();
563 static void _StaticReInitForkedChild();
564 static void _StaticCleanup();
565 static void _StaticCacheCleanup();
566 static int32
_StaticGetCachedReplyPort();
569 message_header
* fHeader
;
570 field_header
* fFields
;
573 uint32 fFieldsAvailable
;
574 size_t fDataAvailable
;
576 mutable BMessage
* fOriginal
;
578 BMessage
* fQueueLink
;
579 // fQueueLink is used by BMessageQueue to build a linked list
581 void* fArchivingPointer
;
585 enum { sNumReplyPorts
= 3 };
586 static port_id sReplyPorts
[sNumReplyPorts
];
587 static int32 sReplyPortInUse
[sNumReplyPorts
];
588 static int32
sGetCachedReplyPort();
590 static BBlockCache
* sMsgCache
;