Overview
| Comment: | Add OFKeyValueCoding
No support for paths and auto-wrapping yet. Also, no classes like OFDictionary override it yet. |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
3ad1f2b268ce6d737b2a9072c8e8f0f8 |
| User & Date: | js on 2016-06-05 00:01:20 |
| Other Links: | manifest | tags |
Context
|
2016-06-05
| ||
| 13:18 | Key Value Coding: Implement auto-wrapping (check-in: 6a92704355 user: js tags: trunk) | |
| 00:01 | Add OFKeyValueCoding (check-in: 3ad1f2b268 user: js tags: trunk) | |
|
2016-06-04
| ||
| 22:31 | OFZIP: Cast app delegate to OFZIP* (check-in: c5901029a0 user: js tags: trunk) | |
Changes
Modified src/Makefile from [d07480767f] to [9a38cd4575].
| ︙ | ︙ | |||
34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
OFMutableArray.m \
OFMutableDictionary.m \
OFMutableSet.m \
OFMutableString.m \
OFNull.m \
OFNumber.m \
OFObject.m \
OFObject+Serialization.m \
OFOptionsParser.m \
${OFPROCESS_M} \
OFRIPEMD160Hash.m \
OFRunLoop.m \
OFSeekableStream.m \
OFSet.m \
| > | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
OFMutableArray.m \
OFMutableDictionary.m \
OFMutableSet.m \
OFMutableString.m \
OFNull.m \
OFNumber.m \
OFObject.m \
OFObject+KeyValueCoding.m \
OFObject+Serialization.m \
OFOptionsParser.m \
${OFPROCESS_M} \
OFRIPEMD160Hash.m \
OFRunLoop.m \
OFSeekableStream.m \
OFSet.m \
|
| ︙ | ︙ | |||
112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
OFThreadPool.m \
threading.m
INCLUDES := ${SRCS:.m=.h} \
OFCollection.h \
OFHash.h \
OFJSONRepresentation.h \
OFLocking.h \
OFMessagePackRepresentation.h \
OFSerialization.h \
OFTLSSocket.h \
ObjFW.h \
autorelease.h \
${ATOMIC_H} \
| > | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
OFThreadPool.m \
threading.m
INCLUDES := ${SRCS:.m=.h} \
OFCollection.h \
OFHash.h \
OFJSONRepresentation.h \
OFKeyValueCoding.h \
OFLocking.h \
OFMessagePackRepresentation.h \
OFSerialization.h \
OFTLSSocket.h \
ObjFW.h \
autorelease.h \
${ATOMIC_H} \
|
| ︙ | ︙ |
Added src/OFKeyValueCoding.h version [3dd35e7786].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ @class OFString; /*! * @protocol OFKeyValueCoding OFKeyValueCoding.h ObjFW/OFKeyValueCoding.h * * @brief A protocol for Key Value Coding. * * Key Value Coding makes it possible to access properties dynamically using * the interface described by this protocol. */ @protocol OFKeyValueCoding /*! * @brief Return the value for the specified key * * @param key The key of the value to return * @return The value for the specified key */ - (id)valueForKey: (OFString*)key; /*! * @brief This is called by @ref valueForKey: if the specified key does not * exist. * * By default, this throws an @ref OFUndefinedKeyException. * * @param key The undefined key of the value to return * @return The value for the specified undefined key */ - (id)valueForUndefinedKey: (OFString*)key; /*! * @brief Set the value for the specified key * * @param value The value for the specified key * @param key The key of the value to set */ - (void)setValue: (id)value forKey: (OFString*)key; /*! * @brief This is called by @ref setValue:forKey: if the specified key does not * exist. * * By default, this throws an @ref OFUndefinedKeyException. * * @param value The value for the specified undefined key * @param key The undefined key of the value to set */ - (void)setValue: (id)value forUndefinedKey: (OFString*)key; @end |
Added src/OFObject+KeyValueCoding.h version [1c62947d53].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016
* Jonathan Schleifer <js@heap.zone>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#import "OFObject.h"
#import "OFKeyValueCoding.h"
OF_ASSUME_NONNULL_BEGIN
#ifdef __cplusplus
extern "C" {
#endif
extern int _OFObject_KeyValueCoding_reference;
#ifdef __cplusplus
}
#endif
@interface OFObject (KeyValueCoding) <OFKeyValueCoding>
@end
OF_ASSUME_NONNULL_END
|
Added src/OFObject+KeyValueCoding.m version [76ddc597a2].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016
* Jonathan Schleifer <js@heap.zone>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#include <stdlib.h>
#include <ctype.h>
#import "OFObject.h"
#import "OFObject+KeyValueCoding.h"
#import "OFString.h"
#import "OFNull.h"
#import "OFOutOfMemoryException.h"
#import "OFUndefinedKeyException.h"
int _OFObject_KeyValueCoding_reference;
static bool
checkTypeEncoding(const char *typeEncoding, char returnType, ...)
{
va_list args;
char type;
if (typeEncoding == NULL)
return false;
if (*typeEncoding++ != returnType)
return false;
while (*typeEncoding >= '0' && *typeEncoding <= '9')
typeEncoding++;
va_start(args, returnType);
while ((type = va_arg(args, int)) != 0) {
if (*typeEncoding++ != type)
return false;
while (*typeEncoding >= '0' && *typeEncoding <= '9')
typeEncoding++;
}
if (*typeEncoding != '\0')
return false;
return true;
}
@implementation OFObject (KeyValueCoding)
- (id)valueForKey: (OFString*)key
{
SEL selector = sel_registerName([key UTF8String]);
const char *typeEncoding = [self typeEncodingForSelector: selector];
if (!checkTypeEncoding(typeEncoding, '@', '@', ':', 0))
return [self valueForUndefinedKey: key];
return [self performSelector: selector];
}
- (id)valueForUndefinedKey: (OFString*)key
{
@throw [OFUndefinedKeyException exceptionWithObject: self
key: key];
}
- (void)setValue: (id)value
forKey: (OFString*)key
{
char *name;
size_t keyLength;
SEL selector;
const char *typeEncoding;
id (*setter)(id, SEL, id);
keyLength = [key UTF8StringLength];
if (keyLength < 1) {
[self setValue: value
forUndefinedKey: key];
return;
}
if ((name = malloc(keyLength + 5)) == NULL)
@throw [OFOutOfMemoryException
exceptionWithRequestedSize: keyLength + 5];
memcpy(name, "set", 3);
memcpy(name + 3, [key UTF8String], keyLength);
memcpy(name + keyLength + 3, ":", 2);
name[3] = toupper(name[3]);
selector = sel_registerName(name);
free(name);
typeEncoding = [self typeEncodingForSelector: selector];
if (!checkTypeEncoding(typeEncoding, 'v', '@', ':', '@', 0)) {
[self setValue: value
forUndefinedKey: key];
return;
}
setter = (id(*)(id, SEL, id))[self methodForSelector: selector];
setter(self, selector, value);
}
- (void)setValue: (id)value
forUndefinedKey: (OFString*)key
{
@throw [OFUndefinedKeyException exceptionWithObject: self
key: key
value: value];
}
@end
|
Modified src/OFObject.h from [5b937156e8] to [fb4f549aa8].
| ︙ | ︙ | |||
963 964 965 966 967 968 969 970 | extern uint32_t of_hash_seed; #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END #import "OFObject+Serialization.h" | > | 963 964 965 966 967 968 969 970 971 | extern uint32_t of_hash_seed; #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END #import "OFObject+KeyValueCoding.h" #import "OFObject+Serialization.h" |
Modified src/OFObject.m from [980b1c8958] to [8d3755fc71].
| ︙ | ︙ | |||
207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
cStringWithEncoding: [OFSystemInfo native8BitEncoding]];
}
/* References for static linking */
void
_references_to_categories_of_OFObject(void)
{
_OFObject_Serialization_reference = 1;
}
@implementation OFObject
+ (void)load
{
#if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__)
| > | 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
cStringWithEncoding: [OFSystemInfo native8BitEncoding]];
}
/* References for static linking */
void
_references_to_categories_of_OFObject(void)
{
_OFObject_KeyValueCoding_reference = 1;
_OFObject_Serialization_reference = 1;
}
@implementation OFObject
+ (void)load
{
#if !defined(OF_APPLE_RUNTIME) || defined(__OBJC2__)
|
| ︙ | ︙ |
Modified src/exceptions/Makefile from [4a66a083dc] to [0569261c12].
| ︙ | ︙ | |||
37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
OFSeekFailedException.m \
OFSetOptionFailedException.m \
OFStatItemFailedException.m \
OFStillLockedException.m \
OFTruncatedDataException.m \
OFUnboundNamespaceException.m \
OFUnboundPrefixException.m \
OFUnknownXMLEntityException.m \
OFUnlockFailedException.m \
OFUnsupportedProtocolException.m \
OFUnsupportedVersionException.m \
OFWriteFailedException.m \
${USE_SRCS_SOCKETS} \
${USE_SRCS_THREADS}
| > | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
OFSeekFailedException.m \
OFSetOptionFailedException.m \
OFStatItemFailedException.m \
OFStillLockedException.m \
OFTruncatedDataException.m \
OFUnboundNamespaceException.m \
OFUnboundPrefixException.m \
OFUndefinedKeyException.m \
OFUnknownXMLEntityException.m \
OFUnlockFailedException.m \
OFUnsupportedProtocolException.m \
OFUnsupportedVersionException.m \
OFWriteFailedException.m \
${USE_SRCS_SOCKETS} \
${USE_SRCS_THREADS}
|
| ︙ | ︙ |
Added src/exceptions/OFUndefinedKeyException.h version [62c355b2c5].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016
* Jonathan Schleifer <js@heap.zone>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#import "OFException.h"
/*!
* @class OFUndefinedKeyException \
* OFUndefinedKeyException.h ObjFW/OFUndefinedKeyException.h
*
* @brief An exception indicating that a key for Key Value Coding is undefined.
*/
@interface OFUndefinedKeyException: OFException
{
id _object;
OFString *_key;
id _value;
}
/*!
* The object on which the key is undefined.
*/
@property (readonly, retain) id object;
/*!
* The key which is undefined.
*/
@property (readonly, copy) OFString *key;
/*!
* The value for the undefined key
*/
@property (readonly, retain) id value;
/*!
* @brief Creates a new, autoreleased undefined key exception.
*
* @param object The object on which the key is undefined
* @param key The key which is undefined
*
* @return A new, autoreleased undefined key exception
*/
+ (instancetype)exceptionWithObject: (id)object
key: (OFString*)key;
/*!
* @brief Creates a new, autoreleased undefined key exception.
*
* @param object The object on which the key is undefined
* @param key The key which is undefined
* @param value The value for the undefined key
*
* @return A new, autoreleased undefined key exception
*/
+ (instancetype)exceptionWithObject: (id)object
key: (OFString*)key
value: (id)value;
/*!
* @brief Initializes an already allocated undefined key exception.
*
* @param object The object on which the key is undefined
* @param key The key which is undefined
*
* @return An initialized undefined key exception
*/
- initWithObject: (id)object
key: (OFString*)key;
/*!
* @brief Initializes an already allocated undefined key exception.
*
* @param object The object on which the key is undefined
* @param key The key which is undefined
* @param value The value for the undefined key
*
* @return An initialized undefined key exception
*/
- initWithObject: (id)object
key: (OFString*)key
value: (id)value;
@end
|
Added src/exceptions/OFUndefinedKeyException.m version [4e1ca20fa6].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016
* Jonathan Schleifer <js@heap.zone>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#import "OFUndefinedKeyException.h"
#import "OFString.h"
@implementation OFUndefinedKeyException
@synthesize object = _object, key = _key, value = _value;
+ (instancetype)exceptionWithObject: (id)object
key: (OFString*)key
{
return [[[self alloc] initWithObject: object
key: key] autorelease];
}
+ (instancetype)exceptionWithObject: (id)object
key: (OFString*)key
value: (id)value
{
return [[[self alloc] initWithObject: object
key: key
value: value] autorelease];
}
- init
{
OF_INVALID_INIT_METHOD
}
- initWithObject: (id)object
key: (OFString*)key
{
self = [super init];
@try {
_object = [object retain];
_key = [key copy];
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- initWithObject: (id)object
key: (OFString*)key
value: (id)value
{
self = [super init];
@try {
_object = [object retain];
_key = [key copy];
_value = [value retain];
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- (void)dealloc
{
[_object release];
[_key release];
[_value release];
[super dealloc];
}
- (OFString*)description
{
return [OFString stringWithFormat:
@"The key \"%@\" is undefined for an object of type %@!",
_key, [_object className]];
}
@end
|