00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 static const char *rcsid = "$Header: /export/cvs-gridlab/wp-1/Codes/GATEngine/C-reference/src/GATResource.c,v 1.19 2004/05/10 15:17:32 hartmutkaiser Exp $";
00018
00019
00020 #include <stdlib.h>
00021 #include <string.h>
00022 #include <assert.h>
00023
00024
00025 #include "GAT.h"
00026 #include "GATInternal.h"
00027 #include "GATRegistry.h"
00028 #include "GATResourceCPI.h"
00029 #include "GATXdsWrapper.h"
00030 #include "GATMetricEvent.h"
00031
00032
00033 GATOBJECT_DEFINE_VTABLE(GATResource);
00034 GATSERIALISABLE_DEFINE_VTABLE(GATResource);
00035 GATMONITORABLE_DEFINE_VTABLE(GATResource);
00036 GATRESOURCE_DEFINE_VTABLE(GATResource);
00037
00038
00039 GATOBJECT_DEFINE_CONVERTERS(GATResource)
00040
00041
00042 #define GATRESOURCE_IMPLEMENTATION(type) \
00043 GATOBJECT_DEFINE_CONVERTERS(type); \
00044 GATOBJECT_DEFINE_CONVERTERS_QUALIFIED_EX(extern, type, GATType_ ## type, \
00045 GATResource); \
00046 \
00047 type type ## _Create(GATContext context, GATPreferences_const prefs, \
00048 void *instance_data) \
00049 { \
00050 return (type) GATResource_Impl_Create(GATType_ ## type, context, prefs, \
00051 instance_data); \
00052 } \
00053 \
00054 void type ## _Destroy(type *object) \
00055 { \
00056 GATResource_Destroy((GATResource *)object); \
00057 } \
00058 \
00059 GATResult type ## _Equals(type ## _const lhs, type ## _const rhs, \
00060 GATBool *isequal) \
00061 { \
00062 return GATResource_Equals((GATResource_const) lhs, \
00063 (GATResource_const) rhs, isequal); \
00064 } \
00065 \
00066 GATResult type ## _Clone(type ## _const object, type *new_object) \
00067 { \
00068 return GATResource_Clone((GATResource_const) object, \
00069 (GATResource *)new_object); \
00070 } \
00071 \
00072 GATType type ## _GetType(type ## _const object) \
00073 { \
00074 return GATResource_GetType((GATResource_const) object); \
00075 } \
00076 \
00077 GATResult type ## _GetInterface(type ## _const object, GATInterface iftype, \
00078 void const **ifp) \
00079 { \
00080 return GATResource_GetInterface((GATResource_const) object, iftype, \
00081 ifp); \
00082 } \
00083 \
00084 GATResult type ## _GetResourceDescription(type ## _const object, \
00085 type ## Description_const *description) \
00086 { \
00087 return GATResource_Impl_GetResourceDescription((GATResource_const) object,\
00088 (GATResourceDescription_const *) description); \
00089 } \
00090 GATResult type ## _GetReservation(type ## _const object, \
00091 GATReservation_const *reservation) \
00092 { \
00093 return GATResource_Impl_GetReservation((GATResource_const) object, \
00094 reservation); \
00095 } \
00096 \
00097 GATResult type ## _AddMetricListener(type object, GATMetricListener listener,\
00098 void *listener_data, GATMetric metric, GATuint32 *cookie) \
00099 { \
00100 return GATResource_Impl_AddMetricListener((GATResource) object, listener, \
00101 listener_data, metric, cookie); \
00102 } \
00103 \
00104 GATResult type ## _RegisterPolling(type object, GATMetric metric, \
00105 GATMetricEvent *event, GATuint32 *cookie) \
00106 { \
00107 return GATResource_Impl_RegisterPolling((GATResource) object, metric, \
00108 event, cookie); \
00109 } \
00110 \
00111 GATResult type ## _RemoveRegisteredMetric(type object, GATMetric metric, \
00112 GATuint32 cookie) \
00113 { \
00114 return GATResource_Impl_RemoveRegisteredMetric((GATResource) object, \
00115 metric, cookie); \
00116 } \
00117 \
00118 GATResult type ## _GetMetrics(type ## _const object, \
00119 GATList_GATMetric *metrics) \
00120 { \
00121 return GATResource_Impl_GetMetrics((GATResource_const) object, metrics); \
00122 } \
00123 \
00124 GATResult type ## _Serialise(type object, GATObject stream, \
00125 GATBool clear_dirty) \
00126 { \
00127 return GATResource_Serialise((GATResource) object, stream, \
00128 clear_dirty); \
00129 } \
00130 \
00131 type type ## _DeSerialise(GATContext context, GATObject stream, \
00132 GATResult *result) \
00133 { \
00134 return (type) GATResource_DeSerialise(context, stream, result); \
00135 } \
00136 \
00137 GATResult type ## _GetIsDirty(type ## _const object, GATBool *isdirty) \
00138 { \
00139 return GATResource_GetIsDirty((GATResource_const) object, isdirty); \
00140 } \
00141
00142
00143
00144
00145 struct GATResource_S {
00146
00147 GATResource_vtable *GATObject__vtable;
00148 GATResource_ISerialisable_vtable *GATSerialisable__vtable;
00149 GATResource_IMonitorable_vtable *GATMonitorable__vtable;
00150 GATResource_IResource_vtable *GATResource__vtable;
00151
00152
00153 GATResourceCPI_Instance data;
00154 GATResourceCPI cpi;
00155 GATResourceCPIList cpilist;
00156 };
00157
00158
00159
00160 static GATResult
00161 GATResource_DeSerialise_Create(GATContext context, GATObject stream,
00162 GATuint32 type, GATResource *new_object);
00163
00164
00165 static GATResource
00166 GATResource_Impl_Create(GATType type, GATContext context,
00167 GATPreferences_const preferences, void *instance_data);
00168
00169
00170
00171 static GATResult
00172 GATResource_Impl_GetResourceDescription(GATResource_const object,
00173 GATResourceDescription_const *description);
00174
00175 static GATResult
00176 GATResource_Impl_GetReservation(GATResource_const object,
00177 GATReservation_const *reservation);
00178
00179
00180
00181 static GATResult
00182 GATResource_Impl_AddMetricListener(GATResource object,
00183 GATMetricListener listener, void *listener_data, GATMetric metric,
00184 GATuint32 *cookie);
00185
00186 static GATResult
00187 GATResource_Impl_RegisterPolling(GATResource object, GATMetric metric,
00188 GATMetricEvent *event, GATuint32 *cookie);
00189
00190 static GATResult
00191 GATResource_Impl_RemoveRegisteredMetric(GATResource object,
00192 GATMetric metric, GATuint32 cookie);
00193
00194 static GATResult
00195 GATResource_Impl_GetMetrics(GATResource_const object,
00196 GATList_GATMetric *metrics);
00197
00198 static GATResult
00199 GATResource_GetCPIInstanceData(GATResource object, void **data);
00200
00201
00202 GATResource_vtable GATResource__vtable = {
00203 GATResource_GetType,
00204 GATResource_Destroy,
00205 GATResource_Equals,
00206 GATResource_Clone,
00207 GATResource_GetInterface,
00208 GATResource_GetCPIInstanceData
00209 };
00210
00211 static GATResource_ISerialisable_vtable
00212 GATResource_ISerialisable__vtable =
00213 {
00214 GATResource_Serialise,
00215 GATResource_DeSerialise,
00216 GATResource_GetIsDirty,
00217 };
00218
00219 static GATResource_IMonitorable_vtable
00220 GATResource_IMonitorable__vtable =
00221 {
00222 GATResource_Impl_AddMetricListener,
00223 GATResource_Impl_RegisterPolling,
00224 GATResource_Impl_RemoveRegisteredMetric,
00225 GATResource_Impl_GetMetrics
00226 };
00227
00228 static GATResource_IResource_vtable
00229 GATResource_IResource__vtable =
00230 {
00231 GATResource_Impl_GetResourceDescription,
00232 GATResource_Impl_GetReservation
00233 };
00234
00235
00236
00237 GATRESOURCE_IMPLEMENTATION(GATSoftwareResource);
00238 GATRESOURCE_IMPLEMENTATION(GATHardwareResource);
00239
00240
00241
00242
00243
00244
00245
00246 GATResult GATResource_Register_GATSerialisable(void)
00247 {
00248 GATResult retval = GATObject_Register_GATSerialisable(
00249 GATType_GATHardwareResource, &GATResource_ISerialisable__vtable);
00250
00251 if (GAT_SUCCESS == retval)
00252 {
00253 retval = GATObject_Register_GATSerialisable(GATType_GATSoftwareResource,
00254 &GATResource_ISerialisable__vtable);
00255 }
00256 return retval;
00257 }
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 static GATResource
00283 GATResource_Impl_Create(GATType type, GATContext context,
00284 GATPreferences_const preferences, void *instance_data)
00285 {
00286 GATResult err_code = GAT_MEMORYFAILURE;
00287 GATResource retval = (GATResource) malloc(
00288 sizeof(struct GATResource_S));
00289
00290 if (NULL != retval)
00291 {
00292 memset(retval, 0, sizeof(struct GATResource_S));
00293 retval->GATObject__vtable = &GATResource__vtable;
00294 retval->GATSerialisable__vtable = &GATResource_ISerialisable__vtable;
00295 retval->GATMonitorable__vtable = &GATResource_IMonitorable__vtable;
00296 retval->GATResource__vtable = &GATResource_IResource__vtable;
00297
00298 retval->data.context = context;
00299 retval->data.type = type;
00300 retval->data.isdirty = GATFalse;
00301 retval->data.source = GATResource_ToGATObject_const(retval);
00302
00303
00304 {
00305 GATBool found_cpi = GATFalse;
00306 GATResourceCPIList current = NULL;
00307 GATRegistry_const registry = GATContext_internal_GetRegistry(context);
00308
00309
00310 if (NULL == preferences)
00311 {
00312 preferences = GATContext_GetPreferences(context);
00313 }
00314 retval->cpilist = GATRegistry_FindGATResourceCPI(registry, preferences);
00315 if (NULL == retval->cpilist)
00316 {
00317 GATResource_Destroy(&retval);
00318
00319 }
00320 else
00321 {
00322
00323 err_code = GAT_NO_MATCHING_CPI;
00324 for(current = retval->cpilist; NULL != current; current = current->next)
00325 {
00326 err_code = GATResourceCPI_CreateInstance(current->cpi,
00327 &retval->data, instance_data);
00328
00329 if (GAT_SUCCESS == err_code)
00330 {
00331 retval->cpi = current->cpi;
00332 found_cpi = GATTrue;
00333 break;
00334 }
00335 }
00336
00337 if (GATTrue == found_cpi)
00338 {
00339
00340
00341 GATList_GATMetric metrics = NULL;
00342
00343 err_code = GATResourceCPI_GetMetrics(retval->cpi,
00344 &retval->data, &metrics);
00345 if (GAT_SUCCEEDED(err_code))
00346 {
00347 retval->data.monitorable = GATMonitorable_Impl_Create(metrics);
00348 if (NULL == retval->data.monitorable)
00349 {
00350 err_code = GAT_MEMORYFAILURE;
00351 }
00352 GATList_GATMetric_Destroy(&metrics);
00353 }
00354 else if (GAT_NOTIMPL == err_code)
00355 {
00356 err_code = GAT_SUCCESS;
00357 }
00358
00359
00360 if (GAT_SUCCEEDED(retval))
00361 {
00362 err_code = GATRegistry_AddGATResourceToCPIList(context, retval->cpi,
00363 retval);
00364 }
00365 }
00366 }
00367 }
00368 }
00369
00370
00371 if (GAT_FAILED(err_code))
00372 {
00373 GATResource_Destroy(&retval);
00374 }
00375 return retval;
00376 }
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 void
00390 GATResource_Destroy(GATResource *object)
00391 {
00392 if (NULL != object && NULL != *object)
00393 {
00394
00395 GATMonitorable_Impl_Destroy(&(*object)->data.monitorable);
00396 if (NULL != (*object)->cpi)
00397 {
00398 GATRegistry_RemoveGATResourceFromCPIList((*object)->data.context, (*object)->cpi,
00399 *object);
00400 GATResourceCPI_DestroyInstance((*object)->cpi, &(*object)->data);
00401 }
00402 GATResourceCPIList_Destroy((*object)->cpilist);
00403 free(*object);
00404 *object = NULL;
00405 }
00406 }
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425 GATResult
00426 GATResource_Equals(GATResource_const lhs,
00427 GATResource_const rhs, GATBool *isequal)
00428 {
00429 GATResult retval = GAT_INVALID_HANDLE;
00430
00431 if (NULL != lhs && NULL != rhs)
00432 {
00433 retval = GAT_INVALID_PARAMETER;
00434 if (NULL != isequal)
00435 {
00436
00437
00438
00439 retval = GATResourceCPI_EqualsInstance(lhs->cpi, &lhs->data,
00440 &rhs->data, isequal);
00441 }
00442 }
00443 return retval;
00444 }
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462 GATResult
00463 GATResource_Clone(GATResource_const handle,
00464 GATResource *new_handle)
00465 {
00466 GATResult retval = GAT_INVALID_HANDLE;
00467 if (NULL != handle)
00468 {
00469 if (NULL == new_handle)
00470 {
00471 retval = GAT_INVALID_PARAMETER;
00472 }
00473 else
00474 {
00475 struct GATResource_S const *object = handle;
00476 GATResource new_object = (GATResource) malloc(sizeof(struct GATResource_S));
00477
00478 *new_handle = NULL;
00479 if (NULL == new_object)
00480 {
00481 retval = GAT_MEMORYFAILURE;
00482 }
00483 else
00484 {
00485 memset(new_object, 0, sizeof(struct GATResource_S));
00486 new_object->GATObject__vtable = &GATResource__vtable;
00487 new_object->GATSerialisable__vtable = &GATResource_ISerialisable__vtable;
00488 new_object->GATMonitorable__vtable = &GATResource_IMonitorable__vtable;
00489 new_object->GATResource__vtable = &GATResource_IResource__vtable;
00490
00491 new_object->data.context = object->data.context;
00492 new_object->data.type = object->data.type;
00493 new_object->data.isdirty = GATFalse;
00494 new_object->data.source = GATResource_ToGATObject_const(new_object);
00495
00496
00497
00498 new_object->cpilist = GATRegistry_CloneGATResourceCPIList(object->cpilist);
00499 if (NULL == new_object->cpilist)
00500 {
00501 retval = GAT_MEMORYFAILURE;
00502 GATResource_Destroy(&new_object);
00503 }
00504 else
00505 {
00506
00507 GATResourceCPIList current = object->cpilist;
00508 GATResourceCPIList new_current = new_object->cpilist;
00509
00510 for (; NULL != current;
00511 current = current->next, new_current = new_current->next)
00512 {
00513 if (current->cpi == object->cpi)
00514 {
00515 new_object->cpi = new_current->cpi;
00516 break;
00517 }
00518 }
00519 assert(NULL != new_object->cpi);
00520
00521
00522 retval = GATResourceCPI_CloneInstance(object->cpi, &object->data,
00523 &new_object->data);
00524 if (GAT_SUCCESS != retval)
00525 {
00526 GATResource_Destroy(&new_object);
00527 }
00528 else
00529 {
00530
00531 if (NULL != object->data.monitorable)
00532 {
00533 retval = GATMonitorable_Impl_Clone(object->data.monitorable,
00534 &new_object->data.monitorable);
00535 }
00536
00537
00538 if (GAT_SUCCEEDED(retval))
00539 {
00540 retval = GATRegistry_AddGATResourceToCPIList(
00541 new_object->data.context, new_object->cpi, new_object);
00542 }
00543
00544 if (GAT_FAILED(retval))
00545 {
00546 GATResource_Destroy(&new_object);
00547 }
00548 else
00549 {
00550
00551 *new_handle = new_object;
00552 }
00553 }
00554 }
00555 }
00556 }
00557 }
00558 return retval;
00559 }
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575 GATType
00576 GATResource_GetType(GATResource_const object)
00577 {
00578 GATType retval = GATType_NoType;
00579 if (NULL != object)
00580 {
00581 retval = object->data.type;
00582 }
00583 return retval;
00584 }
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 GATResult
00603 GATResource_GetInterface(GATResource_const object, GATInterface iftype,
00604 void const **ifp)
00605 {
00606 GATResult retval = GAT_INVALID_PARAMETER;
00607
00608 if (NULL != ifp)
00609 {
00610 *ifp = NULL;
00611 if (GATInterface_ISerialisable == iftype ||
00612 GATInterface_IAdvertisable == iftype)
00613 {
00614 *ifp = (void const *) &object->GATSerialisable__vtable;
00615 retval = GAT_SUCCESS;
00616 }
00617 else
00618 if (GATInterface_IResource == iftype)
00619 {
00620 *ifp = (void const *) &object->GATResource__vtable;
00621 retval = GAT_SUCCESS;
00622 }
00623 else
00624 if (GATInterface_IMonitorable == iftype && NULL != object->data.monitorable)
00625 {
00626 *ifp = (void const *) &object->GATMonitorable__vtable;
00627 retval = GAT_SUCCESS;
00628 }
00629 else
00630 {
00631 retval = GAT_NO_INTERFACE;
00632 }
00633 }
00634 return retval;
00635 }
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655 static GATResult
00656 GATResource_Impl_GetResourceDescription(GATResource_const object,
00657 GATResourceDescription_const *description)
00658 {
00659 return GATResourceCPI_GetResourceDescription(object->cpi, &object->data,
00660 description);
00661 }
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679 static GATResult
00680 GATResource_Impl_GetReservation(GATResource_const object,
00681 GATReservation_const *reservation)
00682 {
00683 return GATResourceCPI_GetReservation(object->cpi, &object->data, reservation);
00684 }
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711 static GATResult
00712 GATResource_Impl_AddMetricListener(GATResource object,
00713 GATMetricListener listener, void *listener_data, GATMetric metric,
00714 GATuint32 *cookie)
00715 {
00716 GATResult retval = GAT_INVALID_HANDLE;
00717 if (NULL != object)
00718 {
00719 if (NULL != object->data.monitorable)
00720 {
00721 retval = GATMonitorable_Impl_AddMetricListener(object->data.monitorable,
00722 listener, listener_data, metric, cookie);
00723 }
00724 else
00725 {
00726
00727 retval = GAT_NO_INTERFACE;
00728 }
00729 }
00730 return retval;
00731 }
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754 static GATResult
00755 GATResource_Impl_RegisterPolling(GATResource object, GATMetric metric,
00756 GATMetricEvent *event, GATuint32 *cookie)
00757 {
00758 GATResult retval = GAT_INVALID_HANDLE;
00759 if (NULL != object)
00760 {
00761 if (NULL != object->data.monitorable)
00762 {
00763 retval = GATMonitorable_Impl_RegisterPolling(object->data.monitorable,
00764 metric, 0, cookie);
00765 if (GAT_SUCCESS == retval)
00766 {
00767
00768 retval = GATResourceCPI_GetMetricEvent(object->cpi, &object->data,
00769 metric, event);
00770 if (GAT_SUCCESS != retval)
00771 {
00772 GATMonitorable_Impl_RemoveRegisteredMetric(object->data.monitorable,
00773 metric, *cookie);
00774 *cookie = 0;
00775 }
00776 }
00777 }
00778 else
00779 {
00780
00781 retval = GAT_NO_INTERFACE;
00782 }
00783 }
00784 return retval;
00785 }
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807 static GATResult
00808 GATResource_Impl_RemoveRegisteredMetric(GATResource object,
00809 GATMetric metric, GATuint32 cookie)
00810 {
00811 GATResult retval = GAT_INVALID_HANDLE;
00812 if (NULL != object)
00813 {
00814 if (NULL != object->data.monitorable)
00815 {
00816 retval = GATMonitorable_Impl_RemoveRegisteredMetric(
00817 object->data.monitorable, metric, cookie);
00818 }
00819 else
00820 {
00821
00822 retval = GAT_NO_INTERFACE;
00823 }
00824 }
00825 return retval;
00826 }
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844 static GATResult
00845 GATResource_Impl_GetMetrics(GATResource_const object,
00846 GATList_GATMetric *metrics)
00847 {
00848 GATResult retval = GAT_INVALID_HANDLE;
00849 if (NULL != object)
00850 {
00851 if (NULL != object->data.monitorable)
00852 {
00853 retval = GATMonitorable_Impl_GetMetrics(object->data.monitorable, metrics);
00854 }
00855 else
00856 {
00857
00858 retval = GAT_NO_INTERFACE;
00859 }
00860 }
00861 return retval;
00862 }
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889 static GATResult
00890 GATResourceCPI_SerialiseCallback(GATObject handle, GATObject stream,
00891 GATBool clear_dirty)
00892 {
00893 GATResult retval = GAT_INVALID_PARAMETER;
00894 GATType type = GATObject_GetType(handle);
00895
00896 if (GATType_GATSoftwareResource == type)
00897 {
00898 GATResource object = (GATResource) GATObject_ToGATSoftwareResource(handle);
00899 retval = GATResourceCPI_Serialise(object->cpi, &object->data, stream,
00900 clear_dirty);
00901 if (GAT_SUCCEEDED(retval) && GATTrue == clear_dirty)
00902 {
00903 object->data.isdirty = GATFalse;
00904 }
00905 }
00906 else if (GATType_GATHardwareResource == type)
00907 {
00908 GATResource object = (GATResource) GATObject_ToGATHardwareResource(handle);
00909 retval = GATResourceCPI_Serialise(object->cpi, &object->data, stream,
00910 clear_dirty);
00911 if (GAT_SUCCEEDED(retval) && GATTrue == clear_dirty)
00912 {
00913 object->data.isdirty = GATFalse;
00914 }
00915 }
00916 return retval;
00917 }
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936 GATResult
00937 GATResource_Serialise(GATResource object, GATObject stream,
00938 GATBool clear_dirty)
00939 {
00940 GATResult retval = GAT_INVALID_HANDLE;
00941 if (NULL != object)
00942 {
00943 retval = GATXds_SerialiseObject(GATResource_ToGATObject(object), stream,
00944 clear_dirty, GATResourceCPI_SerialiseCallback, "uint32 uint32",
00945 GATRESOURCE_VERSION1, (GATuint32)object->data.type);
00946
00947 if (GAT_SUCCEEDED(retval) && clear_dirty)
00948 {
00949 object->data.isdirty = GATFalse;
00950 }
00951 }
00952 return retval;
00953 }
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973 static GATBool
00974 GATResource_Impl_VersionCallback(GATuint32 version)
00975 {
00976 GATBool retval = GATFalse;
00977 if ((version & ~GATRESOURCE_MINOR_MASK) <= GATRESOURCE_LASTVERSION)
00978 {
00979 retval = GATTrue;
00980 }
00981 return retval;
00982 }
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011 static GATResult
01012 GATResource_DeSerialiseCallback(GATContext context, GATObject stream,
01013 GATObject *new_object, GATuint32 version, va_list args)
01014 {
01015
01016 GATuint32 *type = va_arg(args, GATuint32 *);
01017 GATResource object = NULL;
01018
01019
01020 GATResult retval = GATResource_DeSerialise_Create(context, stream, *type,
01021 &object);
01022
01023 GAT_UNUSED_PARAMETER(version);
01024
01025 if (GAT_SUCCESS == retval)
01026 {
01027 if (NULL != object)
01028 {
01029 *new_object = GATResource_ToGATObject(object);
01030 }
01031 else
01032 {
01033 GATResource_Destroy(&object);
01034 retval = GAT_INVALID_PARAMETER;
01035 }
01036 }
01037 return retval;
01038 }
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058 GATResource
01059 GATResource_DeSerialise(GATContext context, GATObject stream,
01060 GATResult *result)
01061 {
01062 GATObject object = NULL;
01063
01064
01065
01066 GATuint32 version = 0;
01067 GATuint32 type = GATType_NoType;
01068
01069
01070 GATResult retval = GATXds_DeSerialiseObject(context, stream,
01071 GATResource_DeSerialiseCallback, GATResource_Impl_VersionCallback,
01072 &object, "uint32 uint32", &version, &type);
01073
01074
01075 if (NULL != result)
01076 {
01077 *result = retval;
01078 }
01079 return (GATResource) object;
01080 }
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096 GATResult
01097 GATResource_GetIsDirty(GATResource_const object, GATBool *isdirty)
01098 {
01099 GATResult retval = GAT_INVALID_HANDLE;
01100 if (NULL != object)
01101 {
01102 if (NULL != isdirty)
01103 {
01104 *isdirty = object->data.isdirty;
01105 retval = GAT_SUCCESS;
01106 }
01107 else
01108 {
01109 retval = GAT_INVALID_PARAMETER;
01110 }
01111 }
01112 return retval;
01113 }
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133 static GATResult
01134 GATResource_DeSerialise_Create(GATContext context, GATObject stream,
01135 GATuint32 type, GATResource *object)
01136 {
01137 GATResult retval = GAT_MEMORYFAILURE;
01138 GATResource new_object = (GATResource) malloc(sizeof(struct GATResource_S));
01139
01140 if(NULL != new_object)
01141 {
01142 memset(new_object, 0, sizeof(struct GATResource_S));
01143 new_object->GATObject__vtable = &GATResource__vtable;
01144 new_object->GATSerialisable__vtable = &GATResource_ISerialisable__vtable;
01145 new_object->GATMonitorable__vtable = &GATResource_IMonitorable__vtable;
01146 new_object->GATResource__vtable = &GATResource_IResource__vtable;
01147
01148 new_object->data.context = context;
01149 new_object->data.type = (GATType)type;
01150 new_object->data.isdirty = GATFalse;
01151 new_object->data.source = GATResource_ToGATObject_const(new_object);
01152
01153
01154
01155 {
01156 GATRegistry_const registry = GATContext_internal_GetRegistry(context);
01157 GATPreferences_const preferences = NULL;
01158
01159
01160 if (NULL == preferences)
01161 {
01162 preferences = GATContext_GetPreferences(context);
01163 }
01164
01165 new_object->cpilist = GATRegistry_FindGATResourceCPI(registry, preferences);
01166 if (NULL == new_object->cpilist)
01167 {
01168 retval = GAT_NO_REGISTERED_CPI;
01169 }
01170 else
01171 {
01172
01173 GATuint32 offset = 0;
01174 GATBool found_cpi = GATFalse;
01175 GATResourceCPIList current = NULL;
01176
01177 retval = GATStreamable_Seek(stream, GATOrigin_Current, 0, &offset);
01178 if (GAT_SUCCESS == retval)
01179 {
01180
01181 for(current = new_object->cpilist; NULL != current; current = current->next)
01182 {
01183
01184 retval = GATResourceCPI_DeSerialise(current->cpi, stream,
01185 &new_object->data);
01186 if (GAT_SUCCESS == retval)
01187 {
01188 new_object->cpi = current->cpi;
01189 found_cpi = GATTrue;
01190 break;
01191 }
01192
01193
01194 retval = GATStreamable_Seek(stream, GATOrigin_Set, offset, 0);
01195 if (GAT_SUCCESS != retval)
01196 {
01197 break;
01198 }
01199 }
01200 }
01201
01202
01203 if (GATFalse == found_cpi)
01204 {
01205 retval = GAT_NO_MATCHING_CPI;
01206 }
01207 else
01208 {
01209
01210
01211 GATList_GATMetric metrics = NULL;
01212
01213 retval = GATResourceCPI_GetMetrics(new_object->cpi, &new_object->data,
01214 &metrics);
01215 if (GAT_SUCCEEDED(retval))
01216 {
01217 new_object->data.monitorable = GATMonitorable_Impl_Create(metrics);
01218 if (NULL != new_object->data.monitorable)
01219 {
01220 retval = GAT_MEMORYFAILURE;
01221 }
01222 GATList_GATMetric_Destroy(&metrics);
01223 }
01224 else if (GAT_NOTIMPL == retval)
01225 {
01226 retval = GAT_SUCCESS;
01227 }
01228
01229 if (GAT_SUCCEEDED(retval))
01230 {
01231 retval = GATRegistry_AddGATResourceToCPIList(
01232 new_object->data.context, new_object->cpi, new_object);
01233 }
01234 }
01235 }
01236 }
01237 }
01238
01239 if (GAT_SUCCESS == retval)
01240 {
01241 if (NULL != new_object)
01242 {
01243 *object = new_object;
01244 }
01245 else
01246 {
01247 GATResource_Destroy(&new_object);
01248 retval = GAT_INVALID_PARAMETER;
01249 }
01250 }
01251 else
01252 {
01253 GATResource_Destroy(&new_object);
01254 }
01255 return retval;
01256 }
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269 static GATResult
01270 GATResource_GetCPIInstanceData(GATResource object, void **data)
01271 {
01272 GATResult retval = GAT_INVALID_HANDLE;
01273 if (NULL != object)
01274 {
01275 if (NULL != data)
01276 {
01277 *data = (void *)&object->data;
01278 retval = GAT_SUCCESS;
01279 }
01280 else
01281 {
01282 retval = GAT_INVALID_PARAMETER;
01283 }
01284 }
01285 return retval;
01286 }
01287