00001
00031 #include "linden_common.h"
00032
00033 #include "llcategory.h"
00034
00035 #include "message.h"
00036
00037 const LLCategory LLCategory::none;
00038
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 const S32 CATEGORY_INDEX[] =
00053 {
00054 1,
00055 6,
00056 7,
00057 7,
00058 7,
00059 7,
00060 7,
00061 7,
00062 };
00063
00064
00065 const char* CATEGORY_NAME[] =
00066 {
00067 "(none)",
00068 "Object",
00069 "Clothing",
00070 "Texture",
00071 "Sound",
00072 "Landmark",
00073 "Component",
00074 NULL
00075 };
00076
00080
00081 LLCategory::LLCategory()
00082 {
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 mData[0] = 0;
00093 mData[1] = 0;
00094 mData[2] = 0;
00095 mData[3] = 0;
00096 }
00097
00098 void LLCategory::init(U32 value)
00099 {
00100 U8 v;
00101 for(S32 i = 0; i < CATEGORY_DEPTH; i++)
00102 {
00103 v = (U8)((0x000000ff) & value);
00104 mData[CATEGORY_DEPTH - 1 - i] = v;
00105 value >>= 8;
00106 }
00107 }
00108
00109 U32 LLCategory::getU32() const
00110 {
00111 U32 rv = 0;
00112 rv |= mData[0];
00113 rv <<= 8;
00114 rv |= mData[1];
00115 rv <<= 8;
00116 rv |= mData[2];
00117 rv <<= 8;
00118 rv |= mData[3];
00119 return rv;
00120 }
00121
00122 S32 LLCategory::getSubCategoryCount() const
00123 {
00124 S32 rv = CATEGORY_INDEX[mData[0] + 1] - CATEGORY_INDEX[mData[0]];
00125 return rv;
00126 }
00127
00128
00129
00130
00131 LLCategory LLCategory::getSubCategory(U8 n) const
00132 {
00133 LLCategory rv(*this);
00134 for(S32 i = 0; i < (CATEGORY_DEPTH - 1); i++)
00135 {
00136 if(rv.mData[i] == 0)
00137 {
00138 rv.mData[i] = n + 1;
00139 break;
00140 }
00141 }
00142 return rv;
00143 }
00144
00145
00146 const char* LLCategory::lookupName() const
00147 {
00148 S32 i = 0;
00149 S32 index = mData[i++];
00150 while((i < CATEGORY_DEPTH) && (mData[i] != 0))
00151 {
00152 index = CATEGORY_INDEX[index];
00153 ++i;
00154 }
00155 return CATEGORY_NAME[index];
00156 }
00157
00158
00159 void LLCategory::packMessage(LLMessageSystem* msg) const
00160 {
00161 U32 data = getU32();
00162 msg->addU32Fast(_PREHASH_Category, data);
00163 }
00164
00165
00166 void LLCategory::unpackMessage(LLMessageSystem* msg, const char* block)
00167 {
00168 U32 data;
00169 msg->getU32Fast(block, _PREHASH_Category, data);
00170 init(data);
00171 }
00172
00173
00174 void LLCategory::unpackMultiMessage(LLMessageSystem* msg, const char* block,
00175 S32 block_num)
00176 {
00177 U32 data;
00178 msg->getU32Fast(block, _PREHASH_Category, data, block_num);
00179 init(data);
00180 }
00181