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