int32_t nsTreeContentView::InsertRow(int32_t aParentIndex, int32_t aIndex, nsIContent* aContent) { nsAutoTArray<Row*, 8> rows; nsIAtom *tag = aContent->Tag(); if (aContent->IsXUL()) { if (tag == nsGkAtoms::treeitem) SerializeItem(aContent, aParentIndex, &aIndex, rows); else if (tag == nsGkAtoms::treeseparator) SerializeSeparator(aContent, aParentIndex, &aIndex, rows); } mRows.InsertElementsAt(aParentIndex + aIndex + 1, rows); int32_t count = rows.Length(); UpdateSubtreeSizes(aParentIndex, count); // Update parent indexes, but skip added rows. // They already have correct values. UpdateParentIndexes(aParentIndex + aIndex, count + 1, count); return count; }
// Recursively serialize content, starting with aContent. void nsTreeContentView::Serialize(nsIContent* aContent, int32_t aParentIndex, int32_t* aIndex, nsTArray<Row*>& aRows) { // Don't allow non-XUL nodes. if (!aContent->IsXUL()) return; ChildIterator iter, last; for (ChildIterator::Init(aContent, &iter, &last); iter != last; ++iter) { nsIContent* content = *iter; nsIAtom *tag = content->Tag(); int32_t count = aRows.Length(); if (content->IsXUL()) { if (tag == nsGkAtoms::treeitem) SerializeItem(content, aParentIndex, aIndex, aRows); else if (tag == nsGkAtoms::treeseparator) SerializeSeparator(content, aParentIndex, aIndex, aRows); } *aIndex += aRows.Length() - count; } }
char *SerializeItem(const ItemInst *inst, int16 slot_id, uint32 *length, uint8 depth) { char *serialization = NULL; char *instance = NULL; const char *protection=(const char *)"\\\\\\\\\\"; char *sub_items[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; bool stackable=inst->IsStackable(); uint32 merchant_slot=inst->GetMerchantSlot(); int16 charges=inst->GetCharges(); const Item_Struct *item=inst->GetItem(); int i; uint32 sub_length; MakeAnyLenString(&instance, "%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|", stackable ? charges : 1, 0, (merchant_slot==0) ? slot_id : merchant_slot, inst->GetPrice(), (merchant_slot==0) ? 1 : inst->GetMerchantCount(), 0, //merchant_slot, //instance ID, bullshit for now // The 'Merchant Slot' needs to be some unique id for bazaar to work properly (merchant_slot==0) ? inst->GetSerialNumber() : merchant_slot, inst->IsInstNoDrop() ? 1 : 0, //not sure where this field is (stackable ? ((inst->GetItem()->ItemType == ItemTypePotion) ? charges : 0) : charges), 0 ); for(i=0;i<10;i++) { ItemInst *sub=inst->GetItem(i); if (sub) { sub_items[i]=SerializeItem(sub,0,&sub_length,depth+1); } } *length=MakeAnyLenString(&serialization, "%.*s%s" // For leading quotes (and protection) if a subitem; "%s" // Instance data "%.*s\"" // Quotes (and protection, if needed) around static data "%i" // item->ItemClass so we can do |%s instead of %s| #define I(field) "|%i" #define C(field) "|%s" #define S(field) "|%s" #define F(field) "|%f" #include "Client62_itemfields.h" "%.*s\"" // Quotes (and protection, if needed) around static data "|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s" // Sub items "%.*s%s" // For trailing quotes (and protection) if a subitem; ,depth ? depth-1 : 0,protection,(depth) ? "\"" : "" ,instance ,depth,protection ,item->ItemClass #define I(field) ,item->field #define C(field) ,field #define S(field) ,item->field #define F(field) ,item->field #include "Client62_itemfields.h" ,depth,protection ,sub_items[0] ? sub_items[0] : "" ,sub_items[1] ? sub_items[1] : "" ,sub_items[2] ? sub_items[2] : "" ,sub_items[3] ? sub_items[3] : "" ,sub_items[4] ? sub_items[4] : "" ,sub_items[5] ? sub_items[5] : "" ,sub_items[6] ? sub_items[6] : "" ,sub_items[7] ? sub_items[7] : "" ,sub_items[8] ? sub_items[8] : "" ,sub_items[9] ? sub_items[9] : "" ,(depth) ? depth-1 : 0,protection,(depth) ? "\"" : "" ); for(i=0;i<10;i++) { if (sub_items[i]) safe_delete_array(sub_items[i]); } safe_delete_array(instance); return serialization; }