xref: /haiku/src/kits/app/MessageUtils.cpp (revision 2ae568931fcac7deb9f1e6ff4e47213fbfe4029b)
1 /*
2  * Copyright 2001-2005, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Erik Jaesler (erik@cgsoftware.com)
7  */
8 
9 #ifdef USING_MESSAGE4
10 #	include "MessageUtils4.cpp"
11 #else
12 
13 /**	Extra messaging utility functions */
14 
15 #include <string.h>
16 #include <ByteOrder.h>
17 
18 #include <MessageUtils.h>
19 
20 
21 uint32
22 _checksum_(const uchar* buf, int32 size)
23 {
24 	uint32 sum = 0;
25 	uint32 temp = 0;
26 
27 	while (size > 3) {
28 #if defined(__INTEL__)
29 		sum += B_SWAP_INT32(*(int*)buf);
30 #else
31 		sum += *(int*)buf;
32 #endif
33 
34 		buf += 4;
35 		size -= 4;
36 	}
37 
38 	while (size > 0) {
39 		temp = (temp << 8) + *buf++;
40 		size -= 1;
41 	}
42 
43 	return sum + temp;
44 }
45 
46 
47 namespace BPrivate {	// Only putting these here because Be did
48 
49 status_t
50 entry_ref_flatten(char* buffer, size_t* size, const entry_ref* ref)
51 {
52 	memcpy((void*)buffer, (const void*)&ref->device, sizeof (ref->device));
53 	buffer += sizeof (ref->device);
54 	memcpy((void*)buffer, (const void*)&ref->directory, sizeof (ref->directory));
55 	buffer += sizeof (ref->directory);
56 
57 	size_t len = 0;
58 	if (ref->name) {
59 		len = strlen(ref->name) + 1;	// extra for NULL terminator
60 		memcpy((void*)buffer, (const void*)ref->name, len);
61 	}
62 
63 	*size = sizeof (ref->device) + sizeof (ref->directory) + len;
64 	return B_OK;
65 }
66 
67 
68 status_t
69 entry_ref_unflatten(entry_ref* ref, const char* buffer, size_t size)
70 {
71 	if (size < (sizeof (ref->device) + sizeof (ref->directory))) {
72 		*ref = entry_ref();
73 		return B_BAD_VALUE;
74 	}
75 
76 	memcpy((void*)&ref->device, (const void*)buffer, sizeof (ref->device));
77 	buffer += sizeof (ref->device);
78 	memcpy((void*)&ref->directory, (const void*)buffer,
79 		   sizeof (ref->directory));
80 	buffer += sizeof (ref->directory);
81 
82 	if (ref->device != -1
83 		&& size > (sizeof (ref->device) + sizeof (ref->directory))) {
84 		ref->set_name(buffer);
85 		if (ref->name == NULL) {
86 			*ref = entry_ref();
87 			return B_NO_MEMORY;
88 		}
89 	} else
90 		ref->set_name(NULL);
91 
92 	return B_OK;
93 }
94 
95 
96 status_t
97 entry_ref_swap(char* buffer, size_t size)
98 {
99 	if (size < (sizeof (dev_t) + sizeof (ino_t)))
100 		return B_BAD_DATA;
101 
102 	dev_t* dev = (dev_t*)buffer;
103 	*dev = B_SWAP_INT32(*dev);
104 	buffer += sizeof (dev_t);
105 
106 	ino_t* ino = (ino_t*)buffer;
107 	*ino = B_SWAP_INT64(*ino);
108 
109 	return B_OK;
110 }
111 
112 
113 size_t
114 calc_padding(size_t size, size_t boundary)
115 {
116 	size_t pad = size % boundary;
117 	if (pad)
118 		pad = boundary - pad;
119 
120 	return pad;
121 }
122 
123 }	// namespace BPrivate
124 
125 
126 //	#pragma mark -
127 
128 
129 int32
130 TChecksumHelper::CheckSum()
131 {
132 	 return _checksum_(fBuffer, fBufPtr - fBuffer);
133 }
134 
135 #endif	// USING_MESSAGE4
136