bool VisusIndexedData::getText(XMLNode& node, std::vector<std::vector<T > >* items, XMLDataStorage storageType) { int numItems = xmltoi(node.getAttribute("numItems")); int bufsize = xmltoi(node.getAttribute("bufsize")); unsigned char* buffer = new unsigned char[bufsize+1]; switch (storageType) { case BASE64: { // Retrieve data as BASE64 XMLParserBase64Tool base64; base64.decode(node.getText(), buffer, bufsize); } break; case EXTERNAL_FILE: { vwarning("saving data to external file is not yet supported"); return false; } break; case ASCII: { vwarning("saving data to external file is not yet supported"); return false; } break; } // Ensure vector is appropriate size if ((int)items->capacity() < numItems) items->resize(numItems); // Copy from contiguous buffer into non-contiguous data int position = 0; for (typename std::vector<std::vector<T> >::iterator iiter=items->begin(); iiter!=items->end(); ++iiter) { T value; memcpy(&value, &buffer[position], sizeof(T)); position += sizeof(T); // Ensure item that is vector is appropriate size if ((int)iiter->capacity() < (long) value) iiter->resize((long)value); // Load up item that is vector for (typename std::vector<T>::iterator idtIter=iiter->begin(); idtIter!=iiter->end(); ++idtIter) { vassert(position < bufsize); memcpy(&(*idtIter), &buffer[position], sizeof(T)); position += sizeof(T); } } vassert(position == bufsize); delete [] buffer; return true; }