|
|
1.1 root 1: /* AppController.m
2: *
3: * Sets up an EOController and a DataSource objects which are not based on an underlying
4: * RDBMS.
5: *
6: * You may freely copy, distribute, and reuse the code in this example.
7: * NeXT disclaims any warranty of any kind, expressed or implied, as to its
8: * fitness for any particular use.
9: *
10: *
11: */
12:
13: #import <eoaccess/eoaccess.h>
14: #import <eointerface/eointerface.h>
15: #import<foundation/NSString.h>
16: #import <foundation/NSException.h>
17:
18: #import "AppController.h"
19: #import "TableDataSource.h"
20:
21: @implementation AppController
22:
23:
24: #define EXAMPLE_MODEL @"example"
25: #define PRODUCT_ENTITY @"Product"
26: #define DATABASE @"DATABASE"
27:
28: void MyTopLevelErrorHandler(NXHandler *errorState);
29:
30: - awakeFromNib {
31: NSString *modelPath = [EOModel findPathForModelNamed:EXAMPLE_MODEL];
32: EOEntity *productEntity;
33: TableDataSource *masterSource;
34: EOModel *model;
35: NSString *databasePath;
36:
37:
38: NXSetTopLevelErrorHandler(MyTopLevelErrorHandler);
39:
40: if (!modelPath) {
41: NSString *emess = [NSString stringWithFormat:@"Cannot find path for model %@", EXAMPLE_MODEL];
42: NXRunAlertPanel("ERROR", [emess cString], "OK", NULL, NULL);
43: return self;
44: }
45:
46: // Get the Product entity from the model. We are in trouble if it is not there!!!
47: model = [[EOModel alloc] initWithContentsOfFile:modelPath];
48: [model autorelease];
49: if ( !(productEntity = [model entityNamed:PRODUCT_ENTITY]) ) {
50: NSString *emess = [NSString stringWithFormat:@"Cannot find entity %@ in model %@", PRODUCT_ENTITY, EXAMPLE_MODEL];
51: NXRunAlertPanel("ERROR", [emess cString], "OK", NULL, NULL);
52: return self;
53: }
54:
55: // Instantiate a TableDataSource for the product entity and connect
56: // the product controller to it.
57: // The detail item data source will be automatically created and attached to
58: // the detail controller (look at the qualified association set in IB
59: // that connects the master controller (Product) to its detail (Item).
60: // The association key is @"toItem"). That's the only thing that needs to be done,
61: // et voila...
62: databasePath = [NSString stringWithFormat:@"%@/../%@", [self applicationPath], DATABASE];
63: masterSource = [[TableDataSource alloc] initWithEntity:productEntity tablePath:databasePath];
64: [masterSource autorelease];
65: if (!masterSource) {
66: NSString *emess = [NSString stringWithCString:"Cannot access the flat file database!!! You need to set the absolute path to the flat file db (AppController.m) or run the application from the example directory..."];
67: NXRunAlertPanel("ERROR", [emess cString], "OK", NULL, NULL);
68: return self;
69: }
70: [productController setDataSource:masterSource];
71: [productController fetch:self];
72: return self;
73: }
74:
75: void MyTopLevelErrorHandler(NXHandler *errorState)
76: {
77: if (errorState->code >= NSExceptionBase &&
78: errorState->code <= NSLastException) {
79: NSException *exception = (id) errorState->data1;
80:
81: NSLog(@"%@: %@\n", [exception exceptionName], [exception exceptionReason]);
82: }
83: }
84:
85: #undef EXAMPLE_MODEL
86: #undef PRODUCT_ENTITY
87: #undef DATABASE
88:
89: - (NSString *)applicationPath {
90: int i;
91: NSString *appPathName = nil;
92:
93: for (i = strlen(NXArgv[0]) - 1; (i >= 0) && (NXArgv[0][i] != '/'); i--);
94: appPathName = [NSString stringWithCString:NXArgv[0] length:i];
95: if (NXArgv[0][0] != '/') {
96: char path[MAXPATHLEN+1];
97: appPathName = [NSString stringWithFormat:@"%s/%@", getwd(path), appPathName];
98: }
99: return appPathName;
100: }
101:
102:
103: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.