|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* OSSerialize.cpp created by rsulack on Wen 25-Nov-1998 */ ! 23: ! 24: #include <libkern/c++/OSContainers.h> ! 25: #include <libkern/c++/OSLib.h> ! 26: #include <libkern/c++/OSDictionary.h> ! 27: ! 28: #define super OSObject ! 29: ! 30: OSDefineMetaClassAndStructors(OSSerialize, OSObject) ! 31: ! 32: #ifdef DEBUG ! 33: extern "C" { ! 34: extern int debug_container_malloc_size; ! 35: }; ! 36: #define ACCUMSIZE(s) do { debug_container_malloc_size += (s); } while(0) ! 37: #else ! 38: #define ACCUMSIZE(s) ! 39: #endif ! 40: ! 41: char * OSSerialize::text() const ! 42: { ! 43: return data; ! 44: } ! 45: ! 46: void OSSerialize::clearText() ! 47: { ! 48: bzero((void *)data, capacity); ! 49: length = 1; ! 50: tag = 0; ! 51: tags->flushCollection(); ! 52: } ! 53: ! 54: bool OSSerialize::previouslySerialized(const OSObject* o) ! 55: { ! 56: char temp[16]; ! 57: OSString *tagString; ! 58: ! 59: // look it up ! 60: tagString = (OSString *)tags->getObject((const OSSymbol *) o); ! 61: ! 62: // does it exist? ! 63: if (tagString) { ! 64: addString("<reference IDREF=\""); ! 65: addString(tagString->getCStringNoCopy()); ! 66: addString("\"/>"); ! 67: return true; ! 68: } ! 69: ! 70: // build a tag ! 71: sprintf(temp, "%u", tag++); ! 72: tagString = OSString::withCString(temp); ! 73: ! 74: // add to tag dictionary ! 75: tags->setObject((const OSSymbol *) o, tagString);// XXX check return ! 76: tagString->release(); ! 77: ! 78: return false; ! 79: } ! 80: ! 81: bool OSSerialize::addXMLStartTag(const OSObject *o, const char *tagString) ! 82: { ! 83: ! 84: if (!addChar('<')) return false; ! 85: if (!addString(tagString)) return false; ! 86: if (!addString(" ID=\"")) return false; ! 87: if (!addString(((OSString *)tags->getObject((const OSSymbol *)o))->getCStringNoCopy())) ! 88: return false; ! 89: if (!addChar('\"')) return false; ! 90: if (!addChar('>')) return false; ! 91: return true; ! 92: } ! 93: ! 94: bool OSSerialize::addXMLEndTag(const char *tagString) ! 95: { ! 96: ! 97: if (!addChar('<')) return false; ! 98: if (!addChar('/')) return false; ! 99: if (!addString(tagString)) return false; ! 100: if (!addChar('>')) return false; ! 101: return true; ! 102: } ! 103: ! 104: bool OSSerialize::addChar(const char c) ! 105: { ! 106: // add char, possibly extending our capacity ! 107: if (length >= capacity && length >=ensureCapacity(capacity+capacityIncrement)) ! 108: return false; ! 109: ! 110: data[length - 1] = c; ! 111: length++; ! 112: ! 113: return true; ! 114: } ! 115: ! 116: bool OSSerialize::addString(const char *s) ! 117: { ! 118: bool rc = false; ! 119: ! 120: while (*s && (rc = addChar(*s++))) ; ! 121: ! 122: return rc; ! 123: } ! 124: ! 125: bool OSSerialize::initWithCapacity(unsigned int inCapacity) ! 126: { ! 127: if (!super::init()) ! 128: return false; ! 129: ! 130: tags = OSDictionary::withCapacity(32); ! 131: if (!tags) { ! 132: return false; ! 133: } ! 134: ! 135: data = (char *) kalloc(inCapacity); ! 136: if (!data) { ! 137: tags->release(); ! 138: return false; ! 139: } ! 140: bzero((void *)data, inCapacity); ! 141: ! 142: tag = 0; ! 143: length = 1; ! 144: capacity = inCapacity; ! 145: capacityIncrement = inCapacity; ! 146: ! 147: ! 148: ACCUMSIZE(capacity); ! 149: ! 150: return true; ! 151: } ! 152: ! 153: OSSerialize *OSSerialize::withCapacity(unsigned int inCapacity) ! 154: { ! 155: OSSerialize *me = new OSSerialize; ! 156: ! 157: if (me && !me->initWithCapacity(inCapacity)) { ! 158: me->free(); ! 159: return 0; ! 160: } ! 161: ! 162: return me; ! 163: } ! 164: ! 165: unsigned int OSSerialize::getLength() const { return length; } ! 166: unsigned int OSSerialize::getCapacity() const { return capacity; } ! 167: unsigned int OSSerialize::getCapacityIncrement() const { return capacityIncrement; } ! 168: unsigned int OSSerialize::setCapacityIncrement(unsigned int increment) ! 169: { ! 170: return capacityIncrement = increment; ! 171: } ! 172: ! 173: unsigned int OSSerialize::ensureCapacity(unsigned int newCapacity) ! 174: { ! 175: char *newData; ! 176: unsigned int oldCapacity; ! 177: ! 178: if (!capacityIncrement || newCapacity <= capacity) ! 179: return capacity; ! 180: ! 181: // round up ! 182: newCapacity = (((newCapacity - 1) / capacityIncrement) + 1) ! 183: * capacityIncrement; ! 184: ! 185: newData = (char *) kalloc(newCapacity); ! 186: if (newData) { ! 187: oldCapacity = capacity; ! 188: ! 189: ACCUMSIZE(newCapacity - oldCapacity); ! 190: ! 191: bcopy(data, newData, oldCapacity); ! 192: bzero(&newData[capacity], newCapacity - oldCapacity); ! 193: kfree((vm_offset_t)data, oldCapacity); ! 194: data = newData; ! 195: capacity = newCapacity; ! 196: } ! 197: ! 198: return capacity; ! 199: } ! 200: ! 201: void OSSerialize::free() ! 202: { ! 203: if (tags) ! 204: tags->release(); ! 205: ! 206: if (data) { ! 207: kfree((vm_offset_t)data, capacity); ! 208: ACCUMSIZE( -capacity ); ! 209: } ! 210: super::free(); ! 211: } ! 212: ! 213: ! 214: OSDefineMetaClassAndStructors(OSSerializer, OSObject) ! 215: ! 216: OSSerializer * OSSerializer::forTarget( void * target, ! 217: OSSerializerCallback callback, void * ref = 0 ) ! 218: { ! 219: OSSerializer * thing; ! 220: ! 221: thing = new OSSerializer; ! 222: if( thing && !thing->init()) { ! 223: thing->release(); ! 224: thing = 0; ! 225: } ! 226: ! 227: if( thing) { ! 228: thing->target = target; ! 229: thing->ref = ref; ! 230: thing->callback = callback; ! 231: } ! 232: return( thing ); ! 233: } ! 234: ! 235: bool OSSerializer::serialize( OSSerialize * s ) const ! 236: { ! 237: return( (*callback)(target, ref, s) ); ! 238: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.