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