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