00001 
00032 #include "linden_common.h"
00033 
00034 #include "llsdmessagebuilder.h"
00035 
00036 #include "llmessagetemplate.h"
00037 #include "llquaternion.h"
00038 #include "llsdutil.h"
00039 #include "llsdserialize.h"
00040 #include "u64.h"
00041 #include "v3dmath.h"
00042 #include "v3math.h"
00043 #include "v4math.h"
00044 
00045 LLSDMessageBuilder::LLSDMessageBuilder() :
00046         mCurrentMessage(LLSD::emptyMap()),
00047         mCurrentBlock(NULL),
00048         mCurrentMessageName(""),
00049         mCurrentBlockName(""),
00050         mbSBuilt(FALSE),
00051         mbSClear(TRUE)
00052 {
00053 }
00054 
00055 
00056 LLSDMessageBuilder::~LLSDMessageBuilder()
00057 {
00058 }
00059 
00060 
00061 
00062 void LLSDMessageBuilder::newMessage(const char* name)
00063 {
00064         mbSBuilt = FALSE;
00065         mbSClear = FALSE;
00066 
00067         mCurrentMessage = LLSD::emptyMap();
00068         mCurrentMessageName = (char*)name;
00069 }
00070 
00071 
00072 void LLSDMessageBuilder::clearMessage()
00073 {
00074         mbSBuilt = FALSE;
00075         mbSClear = TRUE;
00076 
00077         mCurrentMessage = LLSD::emptyMap();
00078         mCurrentMessageName = "";
00079 }
00080 
00081 
00082 void LLSDMessageBuilder::nextBlock(const char* blockname)
00083 {
00084         LLSD& block = mCurrentMessage[blockname];
00085         if(block.isUndefined())
00086         {
00087                 block[0] = LLSD::emptyMap();
00088                 mCurrentBlock = &(block[0]);
00089         }
00090         else if(block.isArray())
00091         {
00092                 block[block.size()] = LLSD::emptyMap();
00093                 mCurrentBlock = &(block[block.size() - 1]);
00094         }
00095         else
00096         {
00097                 llerrs << "existing block not array" << llendl;
00098         }
00099 }
00100 
00101 
00102 BOOL LLSDMessageBuilder::removeLastBlock()
00103 {
00104         
00105         return FALSE;
00106 }
00107 
00108 void LLSDMessageBuilder::addBinaryData(
00109         const char* varname, 
00110         const void* data,
00111         S32 size)
00112 {
00113         std::vector<U8> v;
00114         v.resize(size);
00115         memcpy(&(v[0]), reinterpret_cast<const U8*>(data), size);
00116         (*mCurrentBlock)[varname] = v;
00117 }
00118 
00119 void LLSDMessageBuilder::addS8(const char* varname, S8 v)
00120 {
00121         (*mCurrentBlock)[varname] = v;
00122 }
00123 
00124 void LLSDMessageBuilder::addU8(const char* varname, U8 v)
00125 {
00126         (*mCurrentBlock)[varname] = v;
00127 }
00128 
00129 void LLSDMessageBuilder::addS16(const char* varname, S16 v)
00130 {
00131         (*mCurrentBlock)[varname] = v;
00132 }
00133 
00134 void LLSDMessageBuilder::addU16(const char* varname, U16 v)
00135 {
00136         (*mCurrentBlock)[varname] = v;
00137 }
00138 
00139 void LLSDMessageBuilder::addF32(const char* varname, F32 v)
00140 {
00141         (*mCurrentBlock)[varname] = v;
00142 }
00143 
00144 void LLSDMessageBuilder::addS32(const char* varname, S32 v)
00145 {
00146         (*mCurrentBlock)[varname] = v;
00147 }
00148 
00149 void LLSDMessageBuilder::addU32(const char* varname, U32 v)
00150 {
00151         (*mCurrentBlock)[varname] = ll_sd_from_U32(v);
00152 }
00153 
00154 void LLSDMessageBuilder::addU64(const char* varname, U64 v)
00155 {
00156         (*mCurrentBlock)[varname] = ll_sd_from_U64(v);
00157 }
00158 
00159 void LLSDMessageBuilder::addF64(const char* varname, F64 v)
00160 {
00161         (*mCurrentBlock)[varname] = v;
00162 }
00163 
00164 void LLSDMessageBuilder::addIPAddr(const char* varname, U32 v)
00165 {
00166         (*mCurrentBlock)[varname] = ll_sd_from_ipaddr(v);
00167 }
00168 
00169 void LLSDMessageBuilder::addIPPort(const char* varname, U16 v)
00170 {
00171         (*mCurrentBlock)[varname] = v;
00172 }
00173 
00174 void LLSDMessageBuilder::addBOOL(const char* varname, BOOL v)
00175 {
00176         (*mCurrentBlock)[varname] = (v == TRUE);
00177 }
00178 
00179 void LLSDMessageBuilder::addString(const char* varname, const char* v)
00180 {
00181         if (v)
00182                 (*mCurrentBlock)[varname] = v;    
00183         else
00184                 (*mCurrentBlock)[varname] = ""; 
00185 }
00186 
00187 void LLSDMessageBuilder::addString(const char* varname, const std::string& v)
00188 {
00189         if (v.size())
00190                 (*mCurrentBlock)[varname] = v; 
00191         else
00192                 (*mCurrentBlock)[varname] = ""; 
00193 }
00194 
00195 void LLSDMessageBuilder::addVector3(const char* varname, const LLVector3& v)
00196 {
00197         (*mCurrentBlock)[varname] = ll_sd_from_vector3(v);
00198 }
00199 
00200 void LLSDMessageBuilder::addVector4(const char* varname, const LLVector4& v)
00201 {
00202         (*mCurrentBlock)[varname] = ll_sd_from_vector4(v);
00203 }
00204 
00205 void LLSDMessageBuilder::addVector3d(const char* varname, const LLVector3d& v)
00206 {
00207         (*mCurrentBlock)[varname] = ll_sd_from_vector3d(v);
00208 }
00209 
00210 void LLSDMessageBuilder::addQuat(const char* varname, const LLQuaternion& v)
00211 {
00212         (*mCurrentBlock)[varname] = ll_sd_from_quaternion(v);
00213 }
00214 
00215 void LLSDMessageBuilder::addUUID(const char* varname, const LLUUID& v)
00216 {
00217         (*mCurrentBlock)[varname] = v;
00218 }
00219 
00220 void LLSDMessageBuilder::compressMessage(U8*& buf_ptr, U32& buffer_length)
00221 {
00222 }
00223 
00224 BOOL LLSDMessageBuilder::isMessageFull(const char* blockname) const
00225 {
00226         return FALSE;
00227 }
00228 
00229 U32 LLSDMessageBuilder::buildMessage(U8*, U32, U8)
00230 {
00231         return 0;
00232 }
00233 
00234 void LLSDMessageBuilder::copyFromMessageData(const LLMsgData& data)
00235 {
00236         
00237         
00238         S32 block_count = 0;
00239     char* block_name = NULL;
00240 
00241         
00242         
00243         LLMsgData::msg_blk_data_map_t::const_iterator iter = 
00244                 data.mMemberBlocks.begin();
00245         LLMsgData::msg_blk_data_map_t::const_iterator end = 
00246                 data.mMemberBlocks.end();
00247         for(; iter != end; ++iter)
00248         {
00249                 const LLMsgBlkData* mbci = iter->second;
00250                 if(!mbci) continue;
00251 
00252                 
00253                 if (block_count == 0)
00254                 {
00255                         block_count = mbci->mBlockNumber;
00256                         block_name = (char*)mbci->mName;
00257                 }
00258 
00259                 
00260                 block_count--;
00261 
00262                 nextBlock(block_name);
00263 
00264                 
00265                 LLMsgBlkData::msg_var_data_map_t::const_iterator dit = mbci->mMemberVarData.begin();
00266                 LLMsgBlkData::msg_var_data_map_t::const_iterator dend = mbci->mMemberVarData.end();
00267                 
00268                 for(; dit != dend; ++dit)
00269                 {
00270                         
00271 
00272                         
00273                         
00274                 }
00275         }
00276 }
00277 
00278 
00279 void LLSDMessageBuilder::copyFromLLSD(const LLSD& msg)
00280 {
00281         mCurrentMessage = msg;
00282         lldebugs << LLSDNotationStreamer(mCurrentMessage) << llendl;
00283 }
00284 
00285 const LLSD& LLSDMessageBuilder::getMessage() const
00286 {
00287          return mCurrentMessage;
00288 }
00289 
00290 
00291 void LLSDMessageBuilder::setBuilt(BOOL b) { mbSBuilt = b; }
00292 
00293 
00294 BOOL LLSDMessageBuilder::isBuilt() const {return mbSBuilt;}
00295 
00296 
00297 BOOL LLSDMessageBuilder::isClear() const {return mbSClear;}
00298 
00299 
00300 S32 LLSDMessageBuilder::getMessageSize()
00301 {
00302         
00303         
00304         
00305         return mCurrentMessage.size()? 1 : 0;
00306 }
00307 
00308 
00309 const char* LLSDMessageBuilder::getMessageName() const 
00310 {
00311         return mCurrentMessageName.c_str();
00312 }