00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <Message.h>
00029
00030 #include <RemoteMessage.h>
00031
00032 #include "Compatibility.h"
00033
00062 00092 status_t
00093 RemoteMessage::SetData(BMessage* envelope, const void* data, size_t size,
00094 BMessage* parameters)
00095 {
00096
00097 if (!envelope || !data && size > 0)
00098 return B_BAD_VALUE;
00099 status_t error = B_OK;
00100 envelope->what = RMESSAGE_DATA;
00101 envelope->MakeEmpty();
00102
00103 if (size > 0) {
00104
00105 area_id area = area_for(const_cast<void*>(data));
00106 if (area < 0)
00107 return area;
00108
00109 area_info info;
00110 error = get_area_info(area, &info);
00111 if (error != B_OK)
00112 return error;
00113
00114 error = envelope->AddInt32("area", area);
00115 if (error != B_OK)
00116 return error;
00117 error = envelope->AddInt32("offset",
00118 (const uint8*)data - (const uint8*)info.address);
00119 if (error != B_OK)
00120 return error;
00121 }
00122
00123 error = envelope->AddInt32("size", (int32)size);
00124 if (error != B_OK)
00125 return error;
00126
00127 if (parameters)
00128 error = envelope->AddMessage("parameters", parameters);
00129 return error;
00130 }
00131
00132 00156 status_t
00157 RemoteMessage::GetData(const BMessage* envelope, const void** _data,
00158 size_t* _size, BMessage* parameters, bool* _hasParameters)
00159 {
00160
00161 if (!envelope || !_data || !_size)
00162 return B_BAD_VALUE;
00163
00164 if (parameters) {
00165 bool hasParameters
00166 = (envelope->FindMessage("parameters", parameters) == B_OK);
00167 if (_hasParameters)
00168 *_hasParameters = hasParameters;
00169 }
00170
00171 int32 size;
00172 status_t error = envelope->FindInt32("size", &size);
00173 if (error != B_OK)
00174 return error;
00175 if (size < 0)
00176 return B_BAD_DATA;
00177
00178 uint8* data = NULL;
00179 if (size > 0) {
00180 area_id area;
00181 error = envelope->FindInt32("area", &area);
00182 if (error != B_OK)
00183 return error;
00184 int32 offset;
00185 error = envelope->FindInt32("offset", &offset);
00186 if (error != B_OK)
00187 return error;
00188
00189 area_info info;
00190 error = get_area_info(area, &info);
00191 if (error != B_OK)
00192 return error;
00193
00194 if (offset < 0 || (uint32)offset + size > info.size)
00195 return B_BAD_DATA;
00196
00197 void* address;
00198 area_id clonedArea = clone_area("cloned rmessage data", &address,
00199 B_ANY_ADDRESS, B_READ_AREA, area);
00200 if (clonedArea < 0)
00201 return clonedArea;
00202 data = (uint8*)address + offset;
00203 }
00204 *_data = data;
00205 *_size = size;
00206 return error;
00207 }
00208
00209 00224 status_t
00225 RemoteMessage::ReleaseData(const void* data, size_t size)
00226 {
00227 if (data) {
00228 area_id area = area_for(const_cast<void*>(data));
00229 if (area >= 0)
00230 delete_area(area);
00231 } else if (size > 0)
00232 return B_BAD_VALUE;
00233 return B_OK;
00234 }
00235
00236