llsdmessagereader.cpp

Go to the documentation of this file.
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 //virtual 
00045 LLSDMessageReader::~LLSDMessageReader()
00046 {
00047 }
00048 
00049 
00050 LLSD getLLSD(const LLSD& input, const char* block, const char* var, S32 blocknum)
00051 {
00052         // babbage: log error to llerrs if variable not found to mimic
00053         // LLTemplateMessageReader::getData behaviour
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
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 //virtual 
00278 //Mainly used to find size of binary block of data
00279 S32     LLSDMessageReader::getSize(const char *blockname, const char *varname)
00280 {
00281         return getElementSize(mMessage[blockname][0][varname]);
00282 }
00283 
00284 
00285 //virtual 
00286 S32     LLSDMessageReader::getSize(const char *blockname, S32 blocknum, 
00287                                                            const char *varname)
00288 {
00289         return getElementSize(mMessage[blockname][blocknum][varname]);
00290 }
00291 
00292 //virtual 
00293 void LLSDMessageReader::clearMessage()
00294 {
00295         mMessage = LLSD();
00296 }
00297 
00298 //virtual 
00299 const char* LLSDMessageReader::getMessageName() const
00300 {
00301         return mMessageName;
00302 }
00303 
00304 // virtual 
00305 S32 LLSDMessageReader::getMessageSize() const
00306 {
00307         return 0;
00308 }
00309 
00310 //virtual 
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         // TODO: Validate
00320         mMessage = message;
00321 }

Generated on Fri May 16 08:32:30 2008 for SecondLife by  doxygen 1.5.5