00001
00032 #include "linden_common.h"
00033
00034 #include "llsdmessagereader.h"
00035
00036 #include "llmessagebuilder.h"
00037 #include "llsdmessagebuilder.h"
00038 #include "llsdutil.h"
00039
00040 LLSDMessageReader::LLSDMessageReader()
00041 {
00042 }
00043
00044
00045 LLSDMessageReader::~LLSDMessageReader()
00046 {
00047 }
00048
00049
00050 LLSD getLLSD(const LLSD& input, const char* block, const char* var, S32 blocknum)
00051 {
00052
00053
00054 if(NULL == block)
00055 {
00056 llerrs << "NULL block name" << llendl;
00057 return LLSD();
00058 }
00059 if(NULL == var)
00060 {
00061 llerrs << "NULL var name" << llendl;
00062 return LLSD();
00063 }
00064 if(! input[block].isArray())
00065 {
00066 llerrs << "block " << block << " not found" << llendl;
00067 return LLSD();
00068 }
00069
00070 LLSD result = input[block][blocknum][var];
00071 if(result.isUndefined())
00072 {
00073 llerrs << "var " << var << " not found" << llendl;
00074 }
00075 return result;
00076 }
00077
00078
00079 void LLSDMessageReader::getBinaryData(const char *block, const char *var,
00080 void *datap, S32 size, S32 blocknum,
00081 S32 max_size)
00082 {
00083 std::vector<U8> data = getLLSD(mMessage, block, var, blocknum);
00084 S32 data_size = (S32)data.size();
00085
00086 if (size && data_size != size)
00087 {
00088 return;
00089 }
00090
00091 if (max_size < data_size)
00092 {
00093 data_size = max_size;
00094 }
00095
00096 memcpy(datap, &(data[0]), data_size);
00097 }
00098
00099
00100 void LLSDMessageReader::getBOOL(const char *block, const char *var,
00101 BOOL &data,
00102 S32 blocknum)
00103 {
00104 data = getLLSD(mMessage, block, var, blocknum);
00105 }
00106
00107
00108 void LLSDMessageReader::getS8(const char *block, const char *var, S8 &data,
00109 S32 blocknum)
00110 {
00111 data = getLLSD(mMessage, block, var, blocknum).asInteger();
00112 }
00113
00114
00115 void LLSDMessageReader::getU8(const char *block, const char *var, U8 &data,
00116 S32 blocknum)
00117 {
00118 data = getLLSD(mMessage, block, var, blocknum).asInteger();
00119 }
00120
00121
00122 void LLSDMessageReader::getS16(const char *block, const char *var, S16 &data,
00123 S32 blocknum)
00124 {
00125 data = getLLSD(mMessage, block, var, blocknum).asInteger();
00126 }
00127
00128
00129 void LLSDMessageReader::getU16(const char *block, const char *var, U16 &data,
00130 S32 blocknum)
00131 {
00132 data = getLLSD(mMessage, block, var, blocknum).asInteger();
00133 }
00134
00135
00136 void LLSDMessageReader::getS32(const char *block, const char *var, S32 &data,
00137 S32 blocknum)
00138 {
00139 data = getLLSD(mMessage, block, var, blocknum);
00140 }
00141
00142
00143 void LLSDMessageReader::getF32(const char *block, const char *var, F32 &data,
00144 S32 blocknum)
00145 {
00146 data = (F32)getLLSD(mMessage, block, var, blocknum).asReal();
00147 }
00148
00149
00150 void LLSDMessageReader::getU32(const char *block, const char *var, U32 &data,
00151 S32 blocknum)
00152 {
00153 data = ll_U32_from_sd(getLLSD(mMessage, block, var, blocknum));
00154 }
00155
00156
00157 void LLSDMessageReader::getU64(const char *block, const char *var,
00158 U64 &data, S32 blocknum)
00159 {
00160 data = ll_U64_from_sd(getLLSD(mMessage, block, var, blocknum));
00161 }
00162
00163
00164 void LLSDMessageReader::getF64(const char *block, const char *var,
00165 F64 &data, S32 blocknum)
00166 {
00167 data = getLLSD(mMessage, block, var, blocknum);
00168 }
00169
00170
00171 void LLSDMessageReader::getVector3(const char *block, const char *var,
00172 LLVector3 &vec, S32 blocknum)
00173 {
00174 vec = ll_vector3_from_sd(getLLSD(mMessage, block, var, blocknum));
00175 }
00176
00177
00178 void LLSDMessageReader::getVector4(const char *block, const char *var,
00179 LLVector4 &vec, S32 blocknum)
00180 {
00181 vec = ll_vector4_from_sd(getLLSD(mMessage, block, var, blocknum));
00182 }
00183
00184
00185 void LLSDMessageReader::getVector3d(const char *block, const char *var,
00186 LLVector3d &vec, S32 blocknum)
00187 {
00188 vec = ll_vector3d_from_sd(getLLSD(mMessage, block, var, blocknum));
00189 }
00190
00191
00192 void LLSDMessageReader::getQuat(const char *block, const char *var,
00193 LLQuaternion &q, S32 blocknum)
00194 {
00195 q = ll_quaternion_from_sd(getLLSD(mMessage, block, var, blocknum));
00196 }
00197
00198
00199 void LLSDMessageReader::getUUID(const char *block, const char *var,
00200 LLUUID &uuid, S32 blocknum)
00201 {
00202 uuid = getLLSD(mMessage, block, var, blocknum);
00203 }
00204
00205
00206 void LLSDMessageReader::getIPAddr(const char *block, const char *var,
00207 U32 &ip, S32 blocknum)
00208 {
00209 ip = ll_ipaddr_from_sd(getLLSD(mMessage, block, var, blocknum));
00210 }
00211
00212
00213 void LLSDMessageReader::getIPPort(const char *block, const char *var,
00214 U16 &port, S32 blocknum)
00215 {
00216 port = getLLSD(mMessage, block, var, blocknum).asInteger();
00217 }
00218
00219
00220 void LLSDMessageReader::getString(const char *block, const char *var,
00221 S32 buffer_size, char *buffer, S32 blocknum)
00222 {
00223 if(buffer_size <= 0)
00224 {
00225 llwarns << "buffer_size <= 0" << llendl;
00226 return;
00227 }
00228 std::string data = getLLSD(mMessage, block, var, blocknum);
00229 S32 data_size = data.size();
00230 if (data_size >= buffer_size)
00231 {
00232 data_size = buffer_size - 1;
00233 }
00234 memcpy(buffer, data.data(), data_size);
00235 buffer[data_size] = '\0';
00236 }
00237
00238
00239
00240 S32 LLSDMessageReader::getNumberOfBlocks(const char *blockname)
00241 {
00242 return mMessage[blockname].size();
00243 }
00244
00245 S32 getElementSize(const LLSD& llsd)
00246 {
00247 LLSD::Type type = llsd.type();
00248 switch(type)
00249 {
00250 case LLSD::TypeBoolean:
00251 return sizeof(bool);
00252 case LLSD::TypeInteger:
00253 return sizeof(S32);
00254 case LLSD::TypeReal:
00255 return sizeof(F64);
00256 case LLSD::TypeString:
00257 return llsd.asString().size();
00258 case LLSD::TypeUUID:
00259 return sizeof(LLUUID);
00260 case LLSD::TypeDate:
00261 return sizeof(LLDate);
00262 case LLSD::TypeURI:
00263 return sizeof(LLURI);
00264 case LLSD::TypeBinary:
00265 {
00266 std::vector<U8> data = llsd;
00267 return data.size() * sizeof(U8);
00268 }
00269 case LLSD::TypeMap:
00270 case LLSD::TypeArray:
00271 case LLSD::TypeUndefined:
00272 return 0;
00273 }
00274 return 0;
00275 }
00276
00277
00278
00279 S32 LLSDMessageReader::getSize(const char *blockname, const char *varname)
00280 {
00281 return getElementSize(mMessage[blockname][0][varname]);
00282 }
00283
00284
00285
00286 S32 LLSDMessageReader::getSize(const char *blockname, S32 blocknum,
00287 const char *varname)
00288 {
00289 return getElementSize(mMessage[blockname][blocknum][varname]);
00290 }
00291
00292
00293 void LLSDMessageReader::clearMessage()
00294 {
00295 mMessage = LLSD();
00296 }
00297
00298
00299 const char* LLSDMessageReader::getMessageName() const
00300 {
00301 return mMessageName;
00302 }
00303
00304
00305 S32 LLSDMessageReader::getMessageSize() const
00306 {
00307 return 0;
00308 }
00309
00310
00311 void LLSDMessageReader::copyToBuilder(LLMessageBuilder& builder) const
00312 {
00313 builder.copyFromLLSD(mMessage);
00314 }
00315
00316 void LLSDMessageReader::setMessage(const char* name, const LLSD& message)
00317 {
00318 mMessageName = name;
00319
00320 mMessage = message;
00321 }