12397827aSAxel Dörfler /* 2*5232a619SAxel Dörfler * Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3*5232a619SAxel Dörfler * Distributed under the terms of the MIT License. 42397827aSAxel Dörfler */ 52397827aSAxel Dörfler 652a38012Sejakowatz 752a38012Sejakowatz #include <ByteOrder.h> 82397827aSAxel Dörfler #include <Messenger.h> 94b8aafeaSIngo Weinhold #include <MessengerPrivate.h> 1052a38012Sejakowatz 1152a38012Sejakowatz 1252a38012Sejakowatz status_t 132397827aSAxel Dörfler swap_data(type_code type, void *_data, size_t length, swap_action action) 1452a38012Sejakowatz { 1547550b1eSAxel Dörfler if (_data == NULL || length == 0) 1647550b1eSAxel Dörfler return B_BAD_VALUE; 1747550b1eSAxel Dörfler 1847550b1eSAxel Dörfler switch (type) { 1947550b1eSAxel Dörfler // allowed types 2047550b1eSAxel Dörfler case B_INT16_TYPE: 2147550b1eSAxel Dörfler case B_UINT16_TYPE: 2247550b1eSAxel Dörfler case B_FLOAT_TYPE: 2347550b1eSAxel Dörfler case B_INT32_TYPE: 2447550b1eSAxel Dörfler case B_UINT32_TYPE: 2547550b1eSAxel Dörfler case B_SIZE_T_TYPE: 2647550b1eSAxel Dörfler case B_SSIZE_T_TYPE: 2747550b1eSAxel Dörfler case B_TIME_TYPE: 2847550b1eSAxel Dörfler case B_POINTER_TYPE: 2947550b1eSAxel Dörfler case B_RECT_TYPE: 3047550b1eSAxel Dörfler case B_POINT_TYPE: 3147550b1eSAxel Dörfler case B_DOUBLE_TYPE: 3247550b1eSAxel Dörfler case B_INT64_TYPE: 3347550b1eSAxel Dörfler case B_UINT64_TYPE: 3447550b1eSAxel Dörfler case B_OFF_T_TYPE: 3547550b1eSAxel Dörfler case B_MESSENGER_TYPE: 3647550b1eSAxel Dörfler break; 3747550b1eSAxel Dörfler 3847550b1eSAxel Dörfler default: 3947550b1eSAxel Dörfler // not swappable or recognized type! 4047550b1eSAxel Dörfler return B_BAD_VALUE; 4147550b1eSAxel Dörfler } 4247550b1eSAxel Dörfler 432397827aSAxel Dörfler // is there anything to do? 442397827aSAxel Dörfler #if B_HOST_IS_LENDIAN 452397827aSAxel Dörfler if (action == B_SWAP_HOST_TO_LENDIAN || action == B_SWAP_LENDIAN_TO_HOST) 462397827aSAxel Dörfler return B_OK; 472397827aSAxel Dörfler #else 482397827aSAxel Dörfler if (action == B_SWAP_HOST_TO_BENDIAN || action == B_SWAP_BENDIAN_TO_HOST) 492397827aSAxel Dörfler return B_OK; 502397827aSAxel Dörfler #endif 512397827aSAxel Dörfler 522397827aSAxel Dörfler switch (type) { 532397827aSAxel Dörfler // 16 bit types 542397827aSAxel Dörfler case B_INT16_TYPE: 552397827aSAxel Dörfler case B_UINT16_TYPE: 562397827aSAxel Dörfler { 572397827aSAxel Dörfler uint16 *data = (uint16 *)_data; 582397827aSAxel Dörfler uint16 *end = (uint16 *)((addr_t)_data + length); 592397827aSAxel Dörfler 602397827aSAxel Dörfler while (data < end) { 612397827aSAxel Dörfler *data = __swap_int16(*data); 622397827aSAxel Dörfler data++; 632397827aSAxel Dörfler } 642397827aSAxel Dörfler break; 6552a38012Sejakowatz } 6652a38012Sejakowatz 672397827aSAxel Dörfler // 32 bit types 682397827aSAxel Dörfler case B_FLOAT_TYPE: 692397827aSAxel Dörfler case B_INT32_TYPE: 702397827aSAxel Dörfler case B_UINT32_TYPE: 712397827aSAxel Dörfler case B_SIZE_T_TYPE: 722397827aSAxel Dörfler case B_SSIZE_T_TYPE: 732397827aSAxel Dörfler case B_TIME_TYPE: 742397827aSAxel Dörfler case B_POINTER_TYPE: 752397827aSAxel Dörfler case B_RECT_TYPE: 762397827aSAxel Dörfler case B_POINT_TYPE: 772397827aSAxel Dörfler { 782397827aSAxel Dörfler // ToDo: some of these types may not be 32-bit on 64-bit platforms! 792397827aSAxel Dörfler uint32 *data = (uint32 *)_data; 802397827aSAxel Dörfler uint32 *end = (uint32 *)((addr_t)_data + length); 812397827aSAxel Dörfler 822397827aSAxel Dörfler while (data < end) { 832397827aSAxel Dörfler *data = __swap_int32(*data); 842397827aSAxel Dörfler data++; 852397827aSAxel Dörfler } 862397827aSAxel Dörfler break; 872397827aSAxel Dörfler } 882397827aSAxel Dörfler 892397827aSAxel Dörfler // 64 bit types 902397827aSAxel Dörfler case B_DOUBLE_TYPE: 912397827aSAxel Dörfler case B_INT64_TYPE: 922397827aSAxel Dörfler case B_UINT64_TYPE: 932397827aSAxel Dörfler case B_OFF_T_TYPE: 942397827aSAxel Dörfler { 952397827aSAxel Dörfler uint64 *data = (uint64 *)_data; 962397827aSAxel Dörfler uint64 *end = (uint64 *)((addr_t)_data + length); 972397827aSAxel Dörfler 982397827aSAxel Dörfler while (data < end) { 992397827aSAxel Dörfler *data = __swap_int64(*data); 1002397827aSAxel Dörfler data++; 1012397827aSAxel Dörfler } 1022397827aSAxel Dörfler break; 1032397827aSAxel Dörfler } 1042397827aSAxel Dörfler 1052397827aSAxel Dörfler // special types 1062397827aSAxel Dörfler case B_MESSENGER_TYPE: 1072397827aSAxel Dörfler { 1082397827aSAxel Dörfler BMessenger *messenger = (BMessenger *)_data; 1092397827aSAxel Dörfler BMessenger *end = (BMessenger *)((addr_t)_data + length); 1102397827aSAxel Dörfler 1112397827aSAxel Dörfler while (messenger < end) { 1124b8aafeaSIngo Weinhold BMessenger::Private messengerPrivate(messenger); 1132397827aSAxel Dörfler // ToDo: if the additional fields change, this function has to be updated! 1144b8aafeaSIngo Weinhold messengerPrivate.SetTo( 1154b8aafeaSIngo Weinhold __swap_int32(messengerPrivate.Team()), 1164b8aafeaSIngo Weinhold __swap_int32(messengerPrivate.Port()), 117*5232a619SAxel Dörfler __swap_int32(messengerPrivate.Token())); 1182397827aSAxel Dörfler messenger++; 1192397827aSAxel Dörfler } 1202397827aSAxel Dörfler break; 1212397827aSAxel Dörfler } 1222397827aSAxel Dörfler } 1232397827aSAxel Dörfler 1242397827aSAxel Dörfler return B_OK; 1252397827aSAxel Dörfler } 1262397827aSAxel Dörfler 1272397827aSAxel Dörfler 12852a38012Sejakowatz bool 12952a38012Sejakowatz is_type_swapped(type_code type) 13052a38012Sejakowatz { 1312397827aSAxel Dörfler // Returns true when the type is in the host's native format 1322397827aSAxel Dörfler // Looks like a pretty strange function to me :) 1332397827aSAxel Dörfler 1342397827aSAxel Dörfler switch (type) { 1352397827aSAxel Dörfler case B_ANY_TYPE: 1362397827aSAxel Dörfler case B_BOOL_TYPE: 1372397827aSAxel Dörfler case B_CHAR_TYPE: 1382397827aSAxel Dörfler case B_COLOR_8_BIT_TYPE: 1392397827aSAxel Dörfler case B_DOUBLE_TYPE: 1402397827aSAxel Dörfler case B_FLOAT_TYPE: 1412397827aSAxel Dörfler case B_GRAYSCALE_8_BIT_TYPE: 1422397827aSAxel Dörfler case B_INT64_TYPE: 1432397827aSAxel Dörfler case B_INT32_TYPE: 1442397827aSAxel Dörfler case B_INT16_TYPE: 1452397827aSAxel Dörfler case B_INT8_TYPE: 1462397827aSAxel Dörfler case B_MESSAGE_TYPE: 1472397827aSAxel Dörfler case B_MESSENGER_TYPE: 1482397827aSAxel Dörfler case B_MIME_TYPE: 1492397827aSAxel Dörfler case B_MONOCHROME_1_BIT_TYPE: 1502397827aSAxel Dörfler case B_OBJECT_TYPE: 1512397827aSAxel Dörfler case B_OFF_T_TYPE: 1522397827aSAxel Dörfler case B_PATTERN_TYPE: 1532397827aSAxel Dörfler case B_POINTER_TYPE: 1542397827aSAxel Dörfler case B_POINT_TYPE: 1552397827aSAxel Dörfler case B_RAW_TYPE: 1562397827aSAxel Dörfler case B_RECT_TYPE: 1572397827aSAxel Dörfler case B_REF_TYPE: 1582397827aSAxel Dörfler case B_RGB_32_BIT_TYPE: 1592397827aSAxel Dörfler case B_RGB_COLOR_TYPE: 1602397827aSAxel Dörfler case B_SIZE_T_TYPE: 1612397827aSAxel Dörfler case B_SSIZE_T_TYPE: 1622397827aSAxel Dörfler case B_STRING_TYPE: 1632397827aSAxel Dörfler case B_TIME_TYPE: 1642397827aSAxel Dörfler case B_UINT64_TYPE: 1652397827aSAxel Dörfler case B_UINT32_TYPE: 1662397827aSAxel Dörfler case B_UINT16_TYPE: 1672397827aSAxel Dörfler case B_UINT8_TYPE: 1682397827aSAxel Dörfler case B_MEDIA_PARAMETER_TYPE: 1692397827aSAxel Dörfler case B_MEDIA_PARAMETER_WEB_TYPE: 1702397827aSAxel Dörfler case B_MEDIA_PARAMETER_GROUP_TYPE: 1712397827aSAxel Dörfler return true; 1722397827aSAxel Dörfler } 1732397827aSAxel Dörfler 1742397827aSAxel Dörfler return false; 17552a38012Sejakowatz } 17652a38012Sejakowatz 177