Annotation of Examples/IndexingKit/Ledger/JFTableVectorConfiguration.m, revision 1.1.1.1

1.1       root        1: /* 
                      2:  *     JFTableVectorConfiguration
                      3:  *     Written by Joe Freeman, NeXT Systems Engineering
                      4:  *
                      5:  *     A list of these configuration objects is fed to a JFTableViewLoader
                      6:  *     to tell it what ivars and titles map into a DBTableView
                      7:  */
                      8: 
                      9: #import "JFTableVectorConfiguration.h"
                     10: #import <ansi/ctype.h>
                     11: #import <objc/objc-runtime.h>
                     12: 
                     13: @interface JFTableVectorConfiguration(Private)
                     14: 
                     15: - buildCachedInfo:sender;
                     16: 
                     17: @end
                     18: 
                     19: @implementation JFTableVectorConfiguration(Private)
                     20: 
                     21: /*======================================================================
                     22:  *     Private Methods
                     23:  *======================================================================*/
                     24: 
                     25: /* rebuild the selector and slot number stuff for performance reasons */
                     26: - buildCachedInfo:sender
                     27: {
                     28:     char tmpName[80];
                     29:     
                     30:     if (ivarName && *ivarName && template){
                     31:        /* support either - ivarName or - getIvarName methods on get */
                     32:        ivarInfo = class_getInstanceVariable(template, ivarName);
                     33:        getMethod = sel_getUid(ivarName);
                     34:        if (!getMethod){
                     35:                strcpy(tmpName,"get");
                     36:                strcat(tmpName,ivarName);
                     37:                tmpName[3] = toupper(tmpName[3]);
                     38:                getMethod = sel_getUid(tmpName);
                     39:        }
                     40:        /* now try and figure out the setMethod name 
                     41:         * try -setIvarName: or -ivarName: 
                     42:         */
                     43:        strcpy(tmpName,"set");
                     44:        strcat(tmpName,ivarName);
                     45:        strcat(tmpName,":");
                     46:        tmpName[3] = toupper(tmpName[3]);
                     47:        setMethod = sel_getUid(tmpName) ;
                     48:        if (!setMethod){
                     49:                strcpy(tmpName,ivarName);
                     50:                strcat(tmpName,":");
                     51:                setMethod = sel_getUid(tmpName);
                     52:        }
                     53:     }
                     54:     return self;
                     55: }
                     56: @end
                     57: 
                     58: @implementation JFTableVectorConfiguration
                     59: 
                     60: 
                     61: /*======================================================================
                     62:  *     designated initializer
                     63:  *======================================================================*/
                     64: 
                     65: - init
                     66: {
                     67:     [super init];
                     68:     kindOfStringTable = NO;
                     69:     return self;
                     70: }
                     71: 
                     72: - initDataClassName:(const char *)aString 
                     73:        titleName:(const char *)newTitle 
                     74:        ivarName:(const char *)newIvar
                     75: {
                     76:     [self init];
                     77:     [self setDataClassName:aString];
                     78:     [self setTitle:newTitle];
                     79:     [self setIvarName:newIvar];
                     80:     return self;
                     81: }
                     82: 
                     83: /*======================================================================
                     84:  *     set up methods for this configuration object
                     85:  *======================================================================*/
                     86: 
                     87: - setDataClassName:(const char *)aString
                     88: {
                     89:     if (!aString)
                     90:        templateName = NXUniqueString("");
                     91:     else
                     92:        templateName = NXUniqueString(aString);
                     93:     if (objc_lookUpClass(aString)){
                     94:        template =  objc_lookUpClass(aString);
                     95:        kindOfStringTable = [template isKindOfClassNamed:"NXStringTable"];
                     96:        [self buildCachedInfo:self];
                     97:     }
                     98:     return self;
                     99: }
                    100: 
                    101: - setTitle:(const char *)newTitle
                    102: {
                    103:     if (newTitle)
                    104:        title = NXUniqueString(newTitle);
                    105:     else 
                    106:        title = "";
                    107:     return self;
                    108: }
                    109: 
                    110: - setIvarName:(const char *)newIvar
                    111: {
                    112:     if (newIvar)
                    113:        ivarName = NXUniqueString(newIvar);
                    114:     else
                    115:        ivarName = "";
                    116:     [self buildCachedInfo:self];
                    117:     return self;
                    118: }
                    119: 
                    120: - (const char *)dataClassName;
                    121: {
                    122:     return templateName;
                    123: }
                    124: 
                    125: 
                    126: - (const char *)title
                    127: {
                    128:     return title;
                    129: }
                    130: 
                    131: - (const char *)ivarName
                    132: {
                    133:     return ivarName;
                    134: }
                    135: 
                    136: 
                    137: /*======================================================================
                    138:  *     archiving support (for the palette!)
                    139:  *======================================================================*/
                    140: 
                    141: - awake
                    142: {
                    143:     [self setDataClassName: templateName];     /* force cache rebuild */
                    144:     return self;
                    145: }
                    146: 
                    147: - read:(NXTypedStream *)typedStream
                    148: {
                    149:     [super read:typedStream];
                    150:     
                    151:     NXReadType(typedStream,"%",&templateName);
                    152:     NXReadType(typedStream,"%",&title);
                    153:     NXReadType(typedStream,"%",&ivarName);
                    154:    
                    155:     return self;
                    156: }
                    157: - write:(NXTypedStream *)typedStream
                    158: {
                    159:     [super write:typedStream];
                    160:     
                    161:     NXWriteType(typedStream,"%",&templateName);
                    162:     NXWriteType(typedStream,"%",&title);
                    163:     NXWriteType(typedStream,"%",&ivarName);
                    164:     
                    165:     return self;
                    166: }
                    167: 
                    168: 
                    169: 
                    170: /*======================================================================
                    171:  *     use this thing to transfer data from dbvalues to datastore objects
                    172:  *======================================================================*/
                    173: 
                    174: /*
                    175:  * Load up the DBValue object (aValue) from the portion of the 
                    176:  * dataObject specified by this configuration object
                    177:  */
                    178: - getValueFromObject:dataObject into:aValue
                    179: {
                    180:     /* we may have dynamicly loaded the data class after we init'd */
                    181:     if (!template)
                    182:        [self setDataClassName:templateName];
                    183: 
                    184:     if (kindOfStringTable)
                    185:        [aValue setStringValue:(char*)[dataObject valueForStringKey:ivarName]];
                    186:     else if (!ivarInfo || !getMethod)
                    187:        [aValue setStringValue:"???"];
                    188:     /* Get that run time religion */
                    189:     else if (ivarInfo->ivar_type[0] == 'f')
                    190:        [aValue setFloatValue:  ( (float (*)(id, SEL))
                    191:                 [dataObject methodFor:getMethod] )(dataObject, getMethod)];
                    192:     else if (ivarInfo->ivar_type[0] == 'd')
                    193:        [aValue setDoubleValue:  ( (double (*)(id, SEL))
                    194:                 [dataObject methodFor:getMethod] )(dataObject, getMethod)];
                    195:     else if (ivarInfo->ivar_type[0] == 'i')
                    196:        [aValue setIntValue:  ( (int (*)(id, SEL))
                    197:                 [dataObject methodFor:getMethod] )(dataObject, getMethod)];
                    198:     else if (ivarInfo->ivar_type[0] == '*')
                    199:        [aValue setStringValue: (char *)[dataObject perform: getMethod]];
                    200:     else if (ivarInfo->ivar_type[0] == '[' &&
                    201:        ivarInfo->ivar_type[strlen(ivarInfo->ivar_type)-2] == 'c')
                    202:        [aValue setStringValue: (char *)[dataObject perform: getMethod]];
                    203:     else 
                    204:        [aValue setStringValue:""];
                    205:     return self;
                    206: }
                    207: 
                    208: /*
                    209:  * save the dbvalue object into the portion of the data object specified by
                    210:  * this configuration object 
                    211:  */
                    212: - setValueForObject:dataObject from:aValue
                    213: {
                    214:        id (* fConvert)(id, SEL, float);
                    215:        id (* dConvert)(id, SEL, double);
                    216:        id (* iConvert)(id, SEL, int);
                    217:        char *oldString;
                    218: 
                    219:     /* we may have dynamicly loaded the data class after we init'd */
                    220:     if (!template)
                    221:        [self setDataClassName:templateName];
                    222: 
                    223:     if (kindOfStringTable) {
                    224:        oldString = [dataObject insertKey:(const void *)ivarName 
                    225:                value:(void *)NXCopyStringBuffer([aValue stringValue])];
                    226: ///    if (malloc_size(oldString)>0) 
                    227: ///            NXFree(oldString);
                    228:     } else if (!ivarInfo || !setMethod)
                    229:        return nil;
                    230:     /* Get that run time religion */
                    231:     else if (ivarInfo->ivar_type[0] == 'f') {
                    232:        fConvert = (id (*)(id, SEL, float))[dataObject methodFor: setMethod];
                    233:        fConvert(dataObject,setMethod,[aValue floatValue]);
                    234:     } else if (ivarInfo->ivar_type[0] == 'd') {
                    235:        dConvert = (id (*)(id, SEL, double))[dataObject methodFor: setMethod];
                    236:        dConvert(dataObject,setMethod,[aValue doubleValue]);
                    237:     } else if (ivarInfo->ivar_type[0] == 'i') {
                    238:        iConvert = (id (*)(id, SEL, int))[dataObject methodFor: setMethod];
                    239:        iConvert(dataObject,setMethod,[aValue intValue]);
                    240:     } else if (ivarInfo->ivar_type[0] == '*')
                    241:        [dataObject perform:setMethod with:(id)[aValue stringValue]];
                    242:     else if (ivarInfo->ivar_type[0] == '[' &&
                    243:        ivarInfo->ivar_type[strlen(ivarInfo->ivar_type)-2] == 'c')
                    244:        [dataObject perform:setMethod with:(id)[aValue stringValue]];
                    245:     return self;
                    246: }
                    247: 
                    248: 
                    249: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.