On 31-Jul-14 5:31 PM, Anders Widell wrote: > > On 07/31/2014 01:40 PM, praveen malviya wrote: >> >> On 31-Jul-14 3:47 PM, Anders Widell wrote: >>> I am leaning towards your suggested solution for >>> SA_NTF_VALUE_LDAP_NAME now. :-) It will be the easiest one to >>> implement in NTF, but it may be a bit non-obvious to the user. We >>> have to clearly document that for SA_NTF_VALUE_LDAP_NAME, the user >>> must allocate strlen(x) + 3 bytes. >>> >>> With the help of Praveen's patch, it is possible to use >>> saAisNameLend() on the allocated data for additional info. Something >>> similar must then be done also at other places where SaNtfValueT is >>> used, and I think this is still missing. Also, at the receiving end >>> it is still not possible to use saAisNameBorrow() because we would >>> need to perform the opposite conversion first. >>> >>> A mabe simpler yet solution is to state in the documentation that >>> saAisNameLend() / saAisNameBorrow() must NOT be used for data type >>> SA_NTF_VALUE_LDAP_NAME. Instead, the user would himself be >>> responsible for filling in 16-bit length + NUL terminated string. >>> >> V3 of the patches is already uses this way for >> SA_NTF_VALUE_LDAP_NAME. In the newly added test cases for longDns: >> >> - *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >> - memcpy(dest_ptr + 2, saAisNameBorrow(&name), >> strlen(saAisNameBorrow(&name))); >> >> But then when notification is received, ntfsv should give SaNameT >> through saNtfPtrValGet() and user will get the string using >> saAisNameBorrow(). > This is not part of the current patch. How will it work? Let's say the > string is longer than 255 bytes and doesn't fit in the old SaNameT > structure. Will saNtfPtrValGet() dynamically allocate a temporary > SaNameT with a pointer to the data? How is this dynamically allocated > memory going to be released? saNtfPtrValGet() is called inside notificaion callback. In notificaion callback user has to call saNtfNotificaionFree() that time ntffsv can release memory.
Thanks Praveen >> >> Thanks, >> Praveen >>> When I look at the existing code, it seems rather buggy for >>> SA_NTF_VALUE_LDAP_NAME. This 16-bit length field in SaNameT, >>> shouldn't it be encoded so that we handle big-endian / little endian >>> conversion properly? I don't see where this is done in the old code. >>> >>> / Anders Widell >>> >>> On 07/31/2014 11:45 AM, praveen malviya wrote: >>>> >>>> On 31-Jul-14 2:50 PM, Anders Widell wrote: >>>>> >>>>> On 07/31/2014 11:10 AM, praveen malviya wrote: >>>>>> >>>>>> On 31-Jul-14 1:39 PM, Anders Widell wrote: >>>>>>> saAisNameLend() adds a terminating NUL character, so I think you >>>>>>> would still need strlen(saAisNameBorrow(&name)) + 2 + 1 even >>>>>>> with Praveen's patch, otherwise saAisNameLend() will write one >>>>>>> byte past the end of the allocated buffer when the string is >>>>>>> shorter than 256 bytes.Another concern is, can a notification be >>>>>>> re-used and be sent multiple times? The current version of the >>>>>>> patch will not work in the (rare) case that the string length is >>>>>>> equal to kExtendedNameMagic. >>>>>> If string length is >= kExtendedNameMagic then NtfSend() API can >>>>>> return error as it is already doing it for other parameters. >>>>> You are right, kExtendedNameMagic is larger than kMaxDnLength is >>>>> it is not a problem as long as we check against kMaxDnLength. >>>>> >>>>>>> Third concern: there is no check that the user has allocated >>>>>>> enough space. What if the user has by mistake allocated a buffer >>>>>>> that is too small, e.g. sizeof(SaNameT) bytes, when the string >>>>>>> is longer than 256 bytes? >>>>>>> >>>>>> This problem can come in any other service also. Does this >>>>>> require some extensions in saAis*.h in future. >>>>> Well it is mainly a problem in the NTF API due to it's very >>>>> strange way of handling memory allocations, e.g. >>>>> saNtfPtrValAllocate(). Is there a similar memory allocation API in >>>>> some other service that could cause problems with SaNameT? >>>> I am not aware of such a case in other service. But, as pointed out >>>> already in this mail thread, a user will also not know this just by >>>> the sizeof (SaNameT). I think >>>> the description of aisa_api.c for bot the APIs should also be kept >>>> in saAis_B_5_14.h and AIS PR doc. >>>> >>>> Thanks, >>>> Praveen >>>>>>> The + 2 (or rather, + 2 + 1) will work, but it is a bit >>>>>>> non-obvious. It would need to be documented clearly since I see >>>>>>> a potential for user mistakes here. The user is not supposed to >>>>>>> know or care about the internal structure of SaNameT anymore; it >>>>>>> is supposed to be opaque. My proposal is that you instead handle >>>>>>> extended SaNameT during encoding, i.e. in encodeSaNtfValueT(). >>>>>>> >>>>>>> / Anders Widell >>>>>>> >>>>>>> On 07/31/2014 09:08 AM, minhchau wrote: >>>>>>>> Hi Anders, Praveen, >>>>>>>> >>>>>>>> sizeof(SaNameT) is not the right size to request the memory >>>>>>>> allocation any more. It should be the real size (length of >>>>>>>> string + 2 bytes of .length). It will looks like this >>>>>>>> >>>>>>>> saNtfPtrValAllocate(notHandle, strlen(saAisNameBorrow(&name)) + 2, >>>>>>>> (void**)&dest_ptr, >>>>>>>> &(head->additionalInfo[1].infoValue)); >>>>>>>> saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>> (SaNameT*) dest_ptr); >>>>>>>> >>>>>>>> @Praveen: I agree with you and can I take your patch for the >>>>>>>> next version? >>>>>>>> >>>>>>>> Thanks/Minh >>>>>>>> On 7/30/2014 10:53 PM, Anders Widell wrote: >>>>>>>>> Hi! >>>>>>>>> >>>>>>>>> This + 2 thing looks a bit hairy to me. The size of the >>>>>>>>> SaNameT type has not changed; it is exactly 258 bytes. >>>>>>>>> Wouldn't it be more natural if the client, when using the >>>>>>>>> SA_NTF_VALUE_LDAP_NAME data type, requests to allocate >>>>>>>>> sizeof(SaNameT) bytes, and then stores a pointer to the string >>>>>>>>> in this allocated data by calling saAisNameLend() ? >>>>>>>>> >>>>>>>>> Not sure how this code used to work before. What happened if >>>>>>>>> the user uses SA_NTF_VALUE_LDAP_NAME and requests to allocate >>>>>>>>> space that is smaller than sizeof(SaNameT)? I guess it would >>>>>>>>> be OK, as long as the size is large enough to hold the entire >>>>>>>>> string as indicated by the SaNameT.length field. But what >>>>>>>>> happens if the allocated memory is not large enough to hold >>>>>>>>> the entire string? The NTF agent should have a check for this, >>>>>>>>> I guess... >>>>>>>>> >>>>>>>>> / Anders Widell >>>>>>>>> >>>>>>>>> On 07/30/2014 11:26 AM, praveen malviya wrote: >>>>>>>>>> >>>>>>>>>> On 30-Jul-14 7:17 AM, minhchau wrote: >>>>>>>>>>> Hi Praveen, >>>>>>>>>>> >>>>>>>>>>> I think the main purpose in your patch is to let the Send() >>>>>>>>>>> API takes care the variable_data and the client just simply >>>>>>>>>>> uses saAisNameLend() >>>>>>>>>>> >>>>>>>>>>> + >>>>>>>>>>> saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>>>>> (SaNameT*) >>>>>>>>>>> dest_ptr); >>>>>>>>>>> >>>>>>>>>>> Instead of: >>>>>>>>>>> >>>>>>>>>>> - *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>>>>> - memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>>>>> strlen(saAisNameBorrow(&name))); >>>>>>>>>>> >>>>>>>>>>> Looks good, but it's risky because the >>>>>>>>>>> test1_ext_notification_object must not be >>>>>>>>>>> changed/deallocated before calling the Send() API. We can't >>>>>>>>>>> stop the client doing that, since >>>>>>>>>>> test1_ext_notification_object could be reused for other >>>>>>>>>>> purpose, unless the client must have N string variables >>>>>>>>>>> (like this test1_ext_notification_object) if it wants to add >>>>>>>>>>> respectively N SA_NTF_VALUE_LDAP_NAME into AdditionalInfo >>>>>>>>>>> >>>>>>>>>> But, description of the SaAisNameLend() API says: >>>>>>>>>> " If length of the string >>>>>>>>>> is greater than or equal to >>>>>>>>>> SA_MAX_UNEXTENDED_NAME_LENGTH, no >>>>>>>>>> copying is performed. Instead, a reference >>>>>>>>>> to the original >>>>>>>>>> string is stored in the SaNameT type. In >>>>>>>>>> this case, it is >>>>>>>>>> therefore important that the original >>>>>>>>>> string is not modified >>>>>>>>>> or freed for as long as the SaNameT type >>>>>>>>>> may still used. >>>>>>>>>> " >>>>>>>>>> So a user should not reuse the same memory or should not >>>>>>>>>> modified till SaNameT is in use. >>>>>>>>>> Referring to this, I think, in the NTFsv case, we can change >>>>>>>>>> the test1_ext_notification_object only after calling Send() API. >>>>>>>>>> At the same time it is aligned with NTF service >>>>>>>>>> saNtf*Allocate() API also. A user calls saNtf*Allocate() API >>>>>>>>>> and fills the parameter and sends notification, then >>>>>>>>>> again refills the values and send the notification on same >>>>>>>>>> call of saNtf*Allocate() API. >>>>>>>>>> >>>>>>>>>> What do you think? >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Praveen >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Minh >>>>>>>>>>> On 7/28/2014 6:56 PM, praveen malviya wrote: >>>>>>>>>>>> Re: [PATCH 6 of 7] NTF: Add ntftest test cases for >>>>>>>>>>>> notification, with long dn objects [#873] v2 Hi Minh, >>>>>>>>>>>> >>>>>>>>>>>> I have tried a small patch to use saAisNameLend() for >>>>>>>>>>>> extended name in saNtfPtrValAllocate() for the discussed case. >>>>>>>>>>>> It is handled in Send() API. Patch is generated on top of >>>>>>>>>>>> V3 patchs and also includes relevant test changes in >>>>>>>>>>>> extFillHeaderAddInfo() in tet_longDnObject_notification.c. >>>>>>>>>>>> Please review it. >>>>>>>>>>>> >>>>>>>>>>>> Thanks >>>>>>>>>>>> Praveen >>>>>>>>>>>> On 18-Jul-14 5:22 AM, minhchau wrote: >>>>>>>>>>>>> Hi Praveen, >>>>>>>>>>>>> >>>>>>>>>>>>> Please find my comments inline >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks, >>>>>>>>>>>>> Minh >>>>>>>>>>>>> On 7/17/2014 5:02 PM, praveen malviya wrote: >>>>>>>>>>>>>> Hi Minh, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I saw the test and the way long DN is being used in the API. >>>>>>>>>>>>>> I tried to modified that in one way for short DN(below is >>>>>>>>>>>>>> the patch/diff on top this patch). >>>>>>>>>>>>>> >>>>>>>>>>>>>> But I have certain doubts: >>>>>>>>>>>>>> In case ldap_name is less the 256, it can be set directly >>>>>>>>>>>>>> using saAisNameLend(),below diff, and ntfsubscribe >>>>>>>>>>>>>> successfully receives it. >>>>>>>>>>>>>> This goes by the description of saAisNameLend() as in >>>>>>>>>>>>>> such a case the contents of the string is copied into the >>>>>>>>>>>>>> SaNameT type and can be read in a >>>>>>>>>>>>>> backwards compatible way by legacy applications that do >>>>>>>>>>>>>> not support the extended SaNameT format". >>>>>>>>>>>>>> Because of this I was able to set ldap_name directly >>>>>>>>>>>>>> using saAisNameLend(). >>>>>>>>>>>>>> >>>>>>>>>>>>>> But in case ldap_name is greater than 256 then >>>>>>>>>>>>>> saAisNameLend() description says "if length of the string >>>>>>>>>>>>>> is greater than or equal to >>>>>>>>>>>>>> SA_MAX_UNEXTENDED_NAME_LENGTH, no copying is performed. >>>>>>>>>>>>>> Instead, a reference to the original >>>>>>>>>>>>>> string is stored in the SaNameT type." >>>>>>>>>>>>>> So for long DN the same does not work and ntfsubscribe >>>>>>>>>>>>>> receives the garbage value because the buffer contains >>>>>>>>>>>>>> the reference and not the original value. >>>>>>>>>>>>>> But above description we know what saAisNanmeLend() has >>>>>>>>>>>>>> done. So I think we need to decide: this should be >>>>>>>>>>>>>> considered internally in the Send () API or let it to >>>>>>>>>>>>>> user to >>>>>>>>>>>>>> set the longDn as in the example test case. For >>>>>>>>>>>>>> notificationObject and NotifyingObject we are setting >>>>>>>>>>>>>> longDn by directly using saAisNameLend(). >>>>>>>>>>>>>> >>>>>>>>>>>>> [Minh]: I did think about "this should be considered >>>>>>>>>>>>> internally in the Send () API" in order that user can do >>>>>>>>>>>>> the same way short long dn has been specified. >>>>>>>>>>>>> And inside the Send() API, before sending the >>>>>>>>>>>>> notification, we have to re-package variable_data (reason >>>>>>>>>>>>> that *sizeof(SaNameT)+1* is not the right size any more). >>>>>>>>>>>>> But this is really inefficient >>>>>>>>>>>>> >>>>>>>>>>>>> In the other hands, the description of >>>>>>>>>>>>> saNtfPtrValAllocate(SaNtfNotificationHandleT >>>>>>>>>>>>> notificationHandle, SaUint16T dataSize, void **dataPtr, >>>>>>>>>>>>> SaNtfValueT *value): >>>>>>>>>>>>> /*dataSize - [in] The number of bytes to be reserved.*//* >>>>>>>>>>>>> *//*dataPtr - [out] A pointer to a pointer to the memory >>>>>>>>>>>>> location that will be reserved with this function.*/ >>>>>>>>>>>>> >>>>>>>>>>>>> Thus, the dataSize is the number of bytes that user wants >>>>>>>>>>>>> to put the content of SaNameT (both short or long dn) into >>>>>>>>>>>>> a chunk inside variable_data which will be sent as part of >>>>>>>>>>>>> notification message. >>>>>>>>>>>>> The app built with extended name, using saAisNameXXX, >>>>>>>>>>>>> should understand that *sizeof(SaNameT)* is not the real >>>>>>>>>>>>> size of SaNameT's content any more. The way that user >>>>>>>>>>>>> setting longdn is upon the description of >>>>>>>>>>>>> saNtfPtrValAllocate plus saAisNameXXX. >>>>>>>>>>>>> I wish to have: >>>>>>>>>>>>> *saAisNameEncode(SaNameT* name, char* bytes), which pours >>>>>>>>>>>>> the content of @.name into @.bytes. It is bit more >>>>>>>>>>>>> *friendly*, and keep user not to make the endian mistake, >>>>>>>>>>>>> since user has to set the length of string as well: >>>>>>>>>>>>> */ *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); /**/ >>>>>>>>>>>>> /**/ memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>>>>>>> strlen(saAisNameBorrow(&name)) + 1); /* >>>>>>>>>>>> But here, as in the test case, a user always have to keep >>>>>>>>>>>> in mind this "+2 " logic while setting the DN name and its >>>>>>>>>>>> length and while retreving it (we are doing it in ntfclient.c). >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>>> *saAisNameDecode(...) does in reverse. >>>>>>>>>>>>> These above functions can be done by user, but it'd be >>>>>>>>>>>>> good to have it as api that every user doesn't have to >>>>>>>>>>>>> create it. >>>>>>>>>>>>> Above all of things, there's an exception that the legacy >>>>>>>>>>>>> application by somehow receives the longDn object, then it >>>>>>>>>>>>> uses the saNtfPtrValAllocate in the *legacy* way, that >>>>>>>>>>>>> would be a problem. But for now, I can't imagine which >>>>>>>>>>>>> situation happening >>>>>>>>>>>>> >>>>>>>>>>>>>> What do you think? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>> Praveen >>>>>>>>>>>>>> >>>>>>>>>>>>>> Here is the modified test case of ldap_name less than 256: >>>>>>>>>>>>>> diff --git a/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>>>>>>>> b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>>>>>>>> --- a/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>>>>>>>> +++ b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>>>>>>>> @@ -359,15 +359,15 @@ void >>>>>>>>>>>>>> extFillHeader(SaNtfNotificationHead >>>>>>>>>>>>>> /* Fill fourth additionalInfo as unextended >>>>>>>>>>>>>> SaNameT */ >>>>>>>>>>>>>> head->additionalInfo[3].infoType = SA_NTF_VALUE_LDAP_NAME; >>>>>>>>>>>>>> head->additionalInfo[3].infoId = 1; >>>>>>>>>>>>>> - saAisNameLend(DEFAULT_UNEXT_NAME_STRING, &name); >>>>>>>>>>>>>> - >>>>>>>>>>>>>> + SaNameT *name_buffer; >>>>>>>>>>>>>> safassert(saNtfPtrValAllocate(notHandle, >>>>>>>>>>>>>> - strlen(saAisNameBorrow(&name)) + 2 + 1, >>>>>>>>>>>>>> - (void**)&dest_ptr, >>>>>>>>>>>>>> + sizeof(SaNameT)+ 1, >>>>>>>>>>>>>> + (void**)&name_buffer, >>>>>>>>>>>>>> &(head->additionalInfo[3].infoValue)), SA_AIS_OK); >>>>>>>>>>>>>> + saAisNameLend(DEFAULT_UNEXT_NAME_STRING, name_buffer); >>>>>>>>>>>>>> + //Comment log DN setting >>>>>>>>>>>>>> + >>>>>>>>>>>>>> //saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>>>>>>>> name_buffer); >>>>>>>>>>>>>> >>>>>>>>>>>>>> - *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>>>>>>>> - memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>>>>>>>> strlen(saAisNameBorrow(&name)) + 1); >>>>>>>>>>>>>> } >>>>>>>>>>>>>> >>>>>>>>>>>>>> /** >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 17-Jul-14 5:55 AM, minhchau wrote: >>>>>>>>>>>>>>> Hi Praveen, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Regarding extended name in AdditionalInfo, I have added >>>>>>>>>>>>>>> the test for it, as in extFillHeaderAddInfo() and >>>>>>>>>>>>>>> extAdditionalInfoTest(). >>>>>>>>>>>>>>> If the app built with extended name and using SaNameT in >>>>>>>>>>>>>>> AdditionalInfo, it certainly knows how the extented name >>>>>>>>>>>>>>> shaping, thus it has to change the way it specifies >>>>>>>>>>>>>>> dataSize and dataPtr (there's one example in >>>>>>>>>>>>>>> extFillHeaderAddInfo) >>>>>>>>>>>>>>> osaf/tools/safntf/src/ntfclient.c has also fixed the >>>>>>>>>>>>>>> crash problem when ntfread/ntfsubscribe print extended >>>>>>>>>>>>>>> name in AdditionalInfo. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>> Minh >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> tests/ntfsv/Makefile.am | 3 +- >>>>>>>>>>>>>>> tests/ntfsv/tet_longDnObject_notification.c | 957 >>>>>>>>>>>>>>> ++++++++++++++++++++++++++++ >>>>>>>>>>>>>>> tests/unit_test_fw/inc/util.h | 5 +- >>>>>>>>>>>>>>> tests/unit_test_fw/src/Makefile.am | 1 + >>>>>>>>>>>>>>> tests/unit_test_fw/src/util.c | 14 +- >>>>>>>>>>>>>>> 5 files changed, 963 insertions(+), 17 deletions(-) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> (1) Add testcase for AdditionalInfo with extended SaNameT >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> diff --git a/tests/ntfsv/Makefile.am >>>>>>>>>>>>>>> b/tests/ntfsv/Makefile.am >>>>>>>>>>>>>>> --- a/tests/ntfsv/Makefile.am >>>>>>>>>>>>>>> +++ b/tests/ntfsv/Makefile.am >>>>>>>>>>>>>>> @@ -64,7 +64,8 @@ ntftest_SOURCES = \ >>>>>>>>>>>>>>> tet_saNtfPtrValAllocate.c \ >>>>>>>>>>>>>>> tet_saNtfArrayValGet.c \ >>>>>>>>>>>>>>> tet_saNtfPtrValGet.c \ >>>>>>>>>>>>>>> - test_ntfFilterVerification.c >>>>>>>>>>>>>>> + test_ntfFilterVerification.c \ >>>>>>>>>>>>>>> + tet_longDnObject_notification.c >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ntftest_LDADD = \ >>>>>>>>>>>>>>> $(top_builddir)/tests/unit_test_fw/src/libutest.la >>>>>>>>>>>>>>> diff --git a/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>>>>>>>>> b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>>>>>>>>> new file mode 100644 >>>>>>>>>>>>>>> --- /dev/null >>>>>>>>>>>>>>> +++ b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>>>>>>>>> @@ -0,0 +1,957 @@ >>>>>>>>>>>>>>> +/* -*- OpenSAF -*- >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + * (C) Copyright 2009 The OpenSAF Foundation >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + * This program is distributed in the hope that it will >>>>>>>>>>>>>>> be useful, but >>>>>>>>>>>>>>> + * WITHOUT ANY WARRANTY; without even the implied >>>>>>>>>>>>>>> warranty of MERCHANTABILITY >>>>>>>>>>>>>>> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and >>>>>>>>>>>>>>> program are licensed >>>>>>>>>>>>>>> + * under the GNU Lesser General Public License Version >>>>>>>>>>>>>>> 2.1, February 1999. >>>>>>>>>>>>>>> + * The complete license can be accessed from the >>>>>>>>>>>>>>> following location: >>>>>>>>>>>>>>> + *http://opensource.org/licenses/lgpl-license.php >>>>>>>>>>>>>>> + * See the Copying file included with the OpenSAF >>>>>>>>>>>>>>> distribution for full >>>>>>>>>>>>>>> + * licensing terms. >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + * Author(s): Ericsson AB >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +#include <utest.h> >>>>>>>>>>>>>>> +#include <util.h> >>>>>>>>>>>>>>> +#include "tet_ntf.h" >>>>>>>>>>>>>>> +#include "tet_ntf_common.h" >>>>>>>>>>>>>>> +//#include "util.h" >>>>>>>>>>>>>>> +#define NOTIFYING_OBJECT_TEST "AVND" >>>>>>>>>>>>>>> +#define NTF_REST_MAX_IDS 30 >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +#define DEFAULT_EXT_NAME_LENGTH 300 >>>>>>>>>>>>>>> +#define DEFAULT_UNEXT_NAME_STRING "This is unextended >>>>>>>>>>>>>>> SaNameT string (<256)" >>>>>>>>>>>>>>> +struct not_idsT { >>>>>>>>>>>>>>> + int length; >>>>>>>>>>>>>>> + SaNtfIdentifierT ids[NTF_REST_MAX_IDS]; >>>>>>>>>>>>>>> +}; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +static struct not_idsT received_ids = {0,}; >>>>>>>>>>>>>>> +static struct not_idsT ok_ids = {0,}; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +static char >>>>>>>>>>>>>>> default_ext_notification_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>>>>>>>>> +static char >>>>>>>>>>>>>>> default_ext_notifying_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>>>>>>>>> +static char >>>>>>>>>>>>>>> test1_ext_notification_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>>>>>>>>> +static char >>>>>>>>>>>>>>> test1_ext_notifying_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +static SaNtfNotificationTypeFilterHandlesT >>>>>>>>>>>>>>> myNotificationFilterHandles; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/* Used to keep track of which ntf we got */ >>>>>>>>>>>>>>> +static SaNtfNotificationTypeFilterHandlesT ntfRecieved; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +static int errors; >>>>>>>>>>>>>>> +static SaNtfSubscriptionIdT subscriptionId; >>>>>>>>>>>>>>> +static SaNtfAlarmNotificationT myAlarmNotification; >>>>>>>>>>>>>>> +static SaNtfObjectCreateDeleteNotificationT >>>>>>>>>>>>>>> myObjCrDelNotification; >>>>>>>>>>>>>>> +static SaNtfAttributeChangeNotificationT >>>>>>>>>>>>>>> myAttrChangeNotification; >>>>>>>>>>>>>>> +static SaNtfStateChangeNotificationT >>>>>>>>>>>>>>> myStateChangeNotification; >>>>>>>>>>>>>>> +static SaNtfSecurityAlarmNotificationT >>>>>>>>>>>>>>> mySecAlarmNotification; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +extern void saAisNameLend(SaConstStringT value, >>>>>>>>>>>>>>> SaNameT* name); >>>>>>>>>>>>>>> +extern SaConstStringT saAisNameBorrow(const SaNameT* >>>>>>>>>>>>>>> name); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Init default long dn objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +static void init_ext_object() >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + safassert(setenv("SA_ENABLE_EXTENDED_NAMES", "1", 1), 0); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + memset(&default_ext_notification_object, 'A', >>>>>>>>>>>>>>> DEFAULT_EXT_NAME_LENGTH - 1); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> default_ext_notification_object[DEFAULT_EXT_NAME_LENGTH >>>>>>>>>>>>>>> - 1] = '\0'; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + memset(&default_ext_notifying_object, 'B', >>>>>>>>>>>>>>> DEFAULT_EXT_NAME_LENGTH - 1); >>>>>>>>>>>>>>> + default_ext_notifying_object[DEFAULT_EXT_NAME_LENGTH - >>>>>>>>>>>>>>> 1] = '\0'; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + memset(&test1_ext_notification_object, 'C', >>>>>>>>>>>>>>> DEFAULT_EXT_NAME_LENGTH - 1); >>>>>>>>>>>>>>> + test1_ext_notification_object[DEFAULT_EXT_NAME_LENGTH >>>>>>>>>>>>>>> - 1] = '\0'; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + memcpy(&test1_ext_notifying_object, >>>>>>>>>>>>>>> NOTIFYING_OBJECT_TEST, sizeof(NOTIFYING_OBJECT_TEST)); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Store all recieved notificationIds >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +static void ntf_id_store(SaNtfIdentifierT n_id) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + assert(NTF_REST_MAX_IDS > received_ids.length); >>>>>>>>>>>>>>> + received_ids.ids[received_ids.length++] = n_id; >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Post process all recived notificationIds towards the >>>>>>>>>>>>>>> ids that >>>>>>>>>>>>>>> + * are expected to be received. >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +static SaAisErrorT check_errors() >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + int i, j, found; >>>>>>>>>>>>>>> + SaAisErrorT rc = SA_AIS_OK; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + for (i = 0; i< received_ids.length; i++) { >>>>>>>>>>>>>>> + found=0; >>>>>>>>>>>>>>> + for (j= 0; j< ok_ids.length; j++) { >>>>>>>>>>>>>>> + if (received_ids.ids[i] == ok_ids.ids[j]){ >>>>>>>>>>>>>>> + found = 1; >>>>>>>>>>>>>>> + break; >>>>>>>>>>>>>>> + } >>>>>>>>>>>>>>> + } >>>>>>>>>>>>>>> + if(!found) >>>>>>>>>>>>>>> + errors++; >>>>>>>>>>>>>>> + } >>>>>>>>>>>>>>> + if(errors) >>>>>>>>>>>>>>> + { >>>>>>>>>>>>>>> + rc = SA_AIS_ERR_FAILED_OPERATION; >>>>>>>>>>>>>>> + printf("num of failed notifications: %d\n", >>>>>>>>>>>>>>> errors); >>>>>>>>>>>>>>> + } >>>>>>>>>>>>>>> + return rc; >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +static void resetCounters() >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + errors = 0; >>>>>>>>>>>>>>> + received_ids.length = 0; >>>>>>>>>>>>>>> + ok_ids.length = 0; >>>>>>>>>>>>>>> + ntfRecieved.alarmFilterHandle = 0; >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle = 0; >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle = 0; >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle = 0; >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle = 0; >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Creates an ObjectCreateDeleteNotification with >>>>>>>>>>>>>>> default values. >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + * @param ntfHandle >>>>>>>>>>>>>>> + * @param myObjCreDelNotification >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void >>>>>>>>>>>>>>> extCreateObjectCreateDeleteNotification(SaNtfHandleT >>>>>>>>>>>>>>> ntfHandle, >>>>>>>>>>>>>>> + SaNtfObjectCreateDeleteNotificationT >>>>>>>>>>>>>>> *myObjCrDelNotification) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + createObjectCreateDeleteNotification(ntfHandle, >>>>>>>>>>>>>>> myObjCrDelNotification); >>>>>>>>>>>>>>> + head = &myObjCrDelNotification->notificationHeader; >>>>>>>>>>>>>>> + /* Overwrite with long dn object */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>>>>>>>>> head->notificationObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>>>>>>>>> head->notifyingObject); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Creates an AttributeChangeNotification with default >>>>>>>>>>>>>>> values. >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + * @param ntfhandle >>>>>>>>>>>>>>> + * @param myAttrChangeNotification >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extCreateAttributeChangeNotification(SaNtfHandleT >>>>>>>>>>>>>>> ntfHandle, >>>>>>>>>>>>>>> + SaNtfAttributeChangeNotificationT >>>>>>>>>>>>>>> *myAttrChangeNotification) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + createAttributeChangeNotification(ntfHandle, >>>>>>>>>>>>>>> myAttrChangeNotification); >>>>>>>>>>>>>>> + head = &myAttrChangeNotification->notificationHeader; >>>>>>>>>>>>>>> + /* Overwrite with long dn object */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>>>>>>>>> head->notificationObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>>>>>>>>> head->notifyingObject); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Create a StateChangeNotification with default values. >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + * @param ntfHandle >>>>>>>>>>>>>>> + * @param myStateChangeNotification >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extCreateStateChangeNotification(SaNtfHandleT >>>>>>>>>>>>>>> ntfHandle, >>>>>>>>>>>>>>> + SaNtfStateChangeNotificationT >>>>>>>>>>>>>>> *myStateChangeNotification) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + createStateChangeNotification(ntfHandle, >>>>>>>>>>>>>>> myStateChangeNotification); >>>>>>>>>>>>>>> + head = &myStateChangeNotification->notificationHeader; >>>>>>>>>>>>>>> + /* Overwrite with long dn object */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>>>>>>>>> head->notificationObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>>>>>>>>> head->notifyingObject); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Create a SecurityAlarmNotification with default values. >>>>>>>>>>>>>>> + * >>>>>>>>>>>>>>> + * @param ntfHandle >>>>>>>>>>>>>>> + * @param mySecAlarmNotification >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extCreateSecurityAlarmNotification(SaNtfHandleT >>>>>>>>>>>>>>> ntfHandle, >>>>>>>>>>>>>>> + SaNtfSecurityAlarmNotificationT *mySecAlarmNotification) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + createSecurityAlarmNotification(ntfHandle, >>>>>>>>>>>>>>> mySecAlarmNotification); >>>>>>>>>>>>>>> + head = &mySecAlarmNotification->notificationHeader; >>>>>>>>>>>>>>> + /* Overwrite with long dn object */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>>>>>>>>> head->notificationObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>>>>>>>>> head->notifyingObject); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Verify the contents in the notification. >>>>>>>>>>>>>>> + * We use the myNotificationFilterHandles to know which >>>>>>>>>>>>>>> notifications to expect. >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +static void saNtfNotificationCallbackT( >>>>>>>>>>>>>>> + SaNtfSubscriptionIdT subscriptionId, >>>>>>>>>>>>>>> + const SaNtfNotificationsT *notification) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfNotificationHandleT notificationHandle = 0; >>>>>>>>>>>>>>> + switch(notification->notificationType) >>>>>>>>>>>>>>> + { >>>>>>>>>>>>>>> + case SA_NTF_TYPE_OBJECT_CREATE_DELETE: >>>>>>>>>>>>>>> + notificationHandle = >>>>>>>>>>>>>>> notification->notification.objectCreateDeleteNotification.notificationHandle; >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle += 1; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> if(myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> == 0) >>>>>>>>>>>>>>> + errors +=1; >>>>>>>>>>>>>>> + else >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> ntf_id_store(*notification->notification.objectCreateDeleteNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + break; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + case SA_NTF_TYPE_ATTRIBUTE_CHANGE: >>>>>>>>>>>>>>> + notificationHandle = >>>>>>>>>>>>>>> notification->notification.attributeChangeNotification.notificationHandle; >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle += 1; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> if(myNotificationFilterHandles.attributeChangeFilterHandle >>>>>>>>>>>>>>> == 0) >>>>>>>>>>>>>>> + errors += 1; >>>>>>>>>>>>>>> + else >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> ntf_id_store(*notification->notification.attributeChangeNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + break; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + case SA_NTF_TYPE_STATE_CHANGE: >>>>>>>>>>>>>>> + notificationHandle = >>>>>>>>>>>>>>> notification->notification.stateChangeNotification.notificationHandle; >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle += 1; >>>>>>>>>>>>>>> + if(myNotificationFilterHandles.stateChangeFilterHandle >>>>>>>>>>>>>>> == 0) >>>>>>>>>>>>>>> + errors += 1; >>>>>>>>>>>>>>> + else >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> ntf_id_store(*notification->notification.stateChangeNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + break; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + case SA_NTF_TYPE_ALARM: >>>>>>>>>>>>>>> + notificationHandle = >>>>>>>>>>>>>>> notification->notification.alarmNotification.notificationHandle; >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + ntfRecieved.alarmFilterHandle += 1; >>>>>>>>>>>>>>> + if(myNotificationFilterHandles.alarmFilterHandle == 0) { >>>>>>>>>>>>>>> + printf("alarmFilterHandle == 0\n"); >>>>>>>>>>>>>>> + errors +=1; >>>>>>>>>>>>>>> + } else >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> ntf_id_store(*notification->notification.alarmNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + break; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + case SA_NTF_TYPE_SECURITY_ALARM: >>>>>>>>>>>>>>> + notificationHandle = >>>>>>>>>>>>>>> notification->notification.securityAlarmNotification.notificationHandle; >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle += 1; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> if(myNotificationFilterHandles.securityAlarmFilterHandle >>>>>>>>>>>>>>> == 0) >>>>>>>>>>>>>>> + errors += 1; >>>>>>>>>>>>>>> + else >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> ntf_id_store(*notification->notification.securityAlarmNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + break; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + default: >>>>>>>>>>>>>>> + errors +=1; >>>>>>>>>>>>>>> + assert(0); >>>>>>>>>>>>>>> + break; >>>>>>>>>>>>>>> + } >>>>>>>>>>>>>>> + last_not_id = get_ntf_id(notification); >>>>>>>>>>>>>>> + if (notificationHandle != 0) >>>>>>>>>>>>>>> + safassert(saNtfNotificationFree(notificationHandle), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +static SaNtfCallbacksT ntfCbTest = { >>>>>>>>>>>>>>> + saNtfNotificationCallbackT, >>>>>>>>>>>>>>> + NULL >>>>>>>>>>>>>>> +}; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Fill the filter header with long dn objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extFillFilterHeader(SaNtfNotificationFilterHeaderT >>>>>>>>>>>>>>> *head) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + fillFilterHeader(head); >>>>>>>>>>>>>>> + /* Overwrite the objects with long dn */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>>>>>>>>> &head->notificationObjects[0]); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>>>>>>>>> &head->notifyingObjects[0]); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Fill the header with long dn objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extFillHeader(SaNtfNotificationHeaderT *head) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + fillHeader(head); >>>>>>>>>>>>>>> + /* Overwrite the objects with long dn */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>>>>>>>>> head->notificationObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>>>>>>>>> head->notifyingObject); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Fill header with extended SaNameT in additionalInfo >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> + void extFillHeaderAddInfo(SaNtfNotificationHeaderT >>>>>>>>>>>>>>> *head, SaNtfNotificationHandleT notHandle) >>>>>>>>>>>>>>> + { >>>>>>>>>>>>>>> + int i; >>>>>>>>>>>>>>> + SaStringT dest_ptr; >>>>>>>>>>>>>>> + SaNameT name; >>>>>>>>>>>>>>> + *(head->eventType) = SA_NTF_ALARM_COMMUNICATION; >>>>>>>>>>>>>>> + *(head->eventTime) = SA_TIME_UNKNOWN; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>>>>>>>>> head->notificationObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>>>>>>>>> head->notifyingObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + head->notificationClassId->vendorId = ERICSSON_VENDOR_ID; >>>>>>>>>>>>>>> + head->notificationClassId->majorId = 92; >>>>>>>>>>>>>>> + head->notificationClassId->minorId = 12; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* set additional text */ >>>>>>>>>>>>>>> + (void)strncpy(head->additionalText, >>>>>>>>>>>>>>> + DEFAULT_ADDITIONAL_TEXT, >>>>>>>>>>>>>>> + (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1)); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + for (i = 0; i < head->numCorrelatedNotifications; i++) >>>>>>>>>>>>>>> + head->correlatedNotifications[i] = (SaNtfIdentifierT) >>>>>>>>>>>>>>> (i + 400); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Fill first additionalInfo as extended SaNameT >>>>>>>>>>>>>>> including NULL character */ >>>>>>>>>>>>>>> + head->additionalInfo[0].infoType = >>>>>>>>>>>>>>> SA_NTF_VALUE_LDAP_NAME; >>>>>>>>>>>>>>> + head->additionalInfo[0].infoId = 1; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>>>>>>>>> &name); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>>>>>>>>> + strlen(saAisNameBorrow(&name)) + 2 + 1, >>>>>>>>>>>>>>> + (void**)&dest_ptr, >>>>>>>>>>>>>>> + &(head->additionalInfo[0].infoValue)), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>>>>>>>>> + memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>>>>>>>>> strlen(saAisNameBorrow(&name)) + 1); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Fill first additionalInfo as extended SaNameT >>>>>>>>>>>>>>> excluding NULL character */ >>>>>>>>>>>>>>> + head->additionalInfo[1].infoType = >>>>>>>>>>>>>>> SA_NTF_VALUE_LDAP_NAME; >>>>>>>>>>>>>>> + head->additionalInfo[1].infoId = 1; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>>>>>>>>> &name); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>>>>>>>>> + strlen(saAisNameBorrow(&name)) + 2, >>>>>>>>>>>>>>> + (void**)&dest_ptr, >>>>>>>>>>>>>>> + &(head->additionalInfo[1].infoValue)), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>>>>>>>>> + memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>>>>>>>>> strlen(saAisNameBorrow(&name))); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Fill third additionalInfo as unextended SaNameT >>>>>>>>>>>>>>> as legacy code */ >>>>>>>>>>>>>>> + head->additionalInfo[2].infoType = >>>>>>>>>>>>>>> SA_NTF_VALUE_LDAP_NAME; >>>>>>>>>>>>>>> + head->additionalInfo[2].infoId = 1; >>>>>>>>>>>>>>> + saAisNameLend(DEFAULT_UNEXT_NAME_STRING, &name); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>>>>>>>>> + sizeof(name), >>>>>>>>>>>>>>> + (void**)&dest_ptr, >>>>>>>>>>>>>>> + &(head->additionalInfo[2].infoValue)), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + memcpy(dest_ptr, &name, sizeof(name)); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Fill fourth additionalInfo as unextended SaNameT */ >>>>>>>>>>>>>>> + head->additionalInfo[3].infoType = >>>>>>>>>>>>>>> SA_NTF_VALUE_LDAP_NAME; >>>>>>>>>>>>>>> + head->additionalInfo[3].infoId = 1; >>>>>>>>>>>>>>> + saAisNameLend(DEFAULT_UNEXT_NAME_STRING, &name); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>>>>>>>>> + strlen(saAisNameBorrow(&name)) + 2 + 1, >>>>>>>>>>>>>>> + (void**)&dest_ptr, >>>>>>>>>>>>>>> + &(head->additionalInfo[3].infoValue)), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>>>>>>>>> + memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>>>>>>>>> strlen(saAisNameBorrow(&name)) + 1); >>>>>>>>>>>>>>> + } >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /** >>>>>>>>>>>>>>> + * Test AdditionalInfo with extended SaNameT type >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> + void extAdditionalInfoTest(void) >>>>>>>>>>>>>>> + { >>>>>>>>>>>>>>> + SaNtfAlarmNotificationFilterT myAlarmFilter; >>>>>>>>>>>>>>> + subscriptionId = 1; >>>>>>>>>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + rc = SA_AIS_OK; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + resetCounters(); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>>>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>>>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* specify complex filter */ >>>>>>>>>>>>>>> + safassert(saNtfAlarmNotificationFilterAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myAlarmFilter, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0), SA_AIS_OK); >>>>>>>>>>>>>>> + /* set header filter specific fields */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> extFillFilterHeader(&myAlarmFilter.notificationFilterHeader); >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Initialize filter handles */ >>>>>>>>>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = >>>>>>>>>>>>>>> + myAlarmFilter.notificationFilterHandle; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.attributeChangeFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Create a notification and send it */ >>>>>>>>>>>>>>> + safassert(saNtfAlarmNotificationAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myAlarmNotification, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1), >>>>>>>>>>>>>>> + 4, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + SA_NTF_ALLOC_SYSTEM_LIMIT), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + head = &myAlarmNotification.notificationHeader; >>>>>>>>>>>>>>> + extFillHeaderAddInfo(head, >>>>>>>>>>>>>>> myAlarmNotification.notificationHandle); >>>>>>>>>>>>>>> + /* These 3 fields is alarm filter items */ >>>>>>>>>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>>>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>>>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>>>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>>>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_MORE_SEVERE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdValueType >>>>>>>>>>>>>>> = SA_NTF_VALUE_UINT32; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdValue.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 600; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdHysteresis.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 100; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->observedValue.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 567; >>>>>>>>>>>>>>> + myAlarmNotification.thresholdInformation->armTime = >>>>>>>>>>>>>>> SA_TIME_UNKNOWN; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* only this notification should be caught */ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myAlarmNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + poll_until_received(ntfHandle, >>>>>>>>>>>>>>> *myAlarmNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + if(ntfRecieved.alarmFilterHandle != 1 || >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>>>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFree(myAlarmNotification.notificationHandle) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>>>>>>>>> + rc = check_errors(); >>>>>>>>>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>>>>>>>>> + } >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Test all filter header fields >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extFilterNotificationTest(void) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfAlarmNotificationFilterT myAlarmFilter; >>>>>>>>>>>>>>> + subscriptionId = 1; >>>>>>>>>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + rc = SA_AIS_OK; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + resetCounters(); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>>>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>>>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* specify complex filter */ >>>>>>>>>>>>>>> + safassert(saNtfAlarmNotificationFilterAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myAlarmFilter, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0), SA_AIS_OK); >>>>>>>>>>>>>>> + /* set header filter specific fields */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> extFillFilterHeader(&myAlarmFilter.notificationFilterHeader); >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Initialize filter handles */ >>>>>>>>>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = >>>>>>>>>>>>>>> + myAlarmFilter.notificationFilterHandle; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.attributeChangeFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Create a notification and send it */ >>>>>>>>>>>>>>> + safassert(saNtfAlarmNotificationAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myAlarmNotification, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1), >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + SA_NTF_ALLOC_SYSTEM_LIMIT), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + head = &myAlarmNotification.notificationHeader; >>>>>>>>>>>>>>> + extFillHeader(head); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* These 3 fields is alarm filter items */ >>>>>>>>>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>>>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>>>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>>>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>>>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_MORE_SEVERE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdValueType >>>>>>>>>>>>>>> = SA_NTF_VALUE_UINT32; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdValue.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 600; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdHysteresis.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 100; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->observedValue.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 567; >>>>>>>>>>>>>>> + myAlarmNotification.thresholdInformation->armTime = >>>>>>>>>>>>>>> SA_TIME_UNKNOWN; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(head->eventType) = SA_NTF_ALARM_EQUIPMENT; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>>>>>>>>> head->notificationObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + extFillHeader(head); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> saAisNameLend((SaConstStringT)&test1_ext_notifying_object, >>>>>>>>>>>>>>> head->notifyingObject); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + extFillHeader(head); >>>>>>>>>>>>>>> + head->notificationClassId->vendorId = 199; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + extFillHeader(head); >>>>>>>>>>>>>>> + head->notificationClassId->majorId = 89; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + extFillHeader(head); >>>>>>>>>>>>>>> + head->notificationClassId->minorId = 24; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + extFillHeader(head); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* only this notification should be caught */ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myAlarmNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + poll_until_received(ntfHandle, >>>>>>>>>>>>>>> *myAlarmNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + if(ntfRecieved.alarmFilterHandle != 1 || >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>>>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFree(myAlarmNotification.notificationHandle) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>>>>>>>>> + rc = check_errors(); >>>>>>>>>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Test Alarm notification with long dn objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extAlarmNotificationTest(void) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfAlarmNotificationFilterT myAlarmFilter; >>>>>>>>>>>>>>> + subscriptionId = 1; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + rc = SA_AIS_OK; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + resetCounters(); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>>>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>>>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfAlarmNotificationFilterAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myAlarmFilter, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1), SA_AIS_OK); >>>>>>>>>>>>>>> + /* Set perceived severities */ >>>>>>>>>>>>>>> + myAlarmFilter.perceivedSeverities[0] = >>>>>>>>>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>>>>>>>>> + myAlarmFilter.probableCauses[0] = >>>>>>>>>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>>>>>>>>> + myAlarmFilter.trends[0] = SA_NTF_TREND_MORE_SEVERE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Initialize filter handles */ >>>>>>>>>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = >>>>>>>>>>>>>>> + myAlarmFilter.notificationFilterHandle; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.attributeChangeFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Create a notification and send it */ >>>>>>>>>>>>>>> + safassert(saNtfAlarmNotificationAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myAlarmNotification, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1), >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + SA_NTF_ALLOC_SYSTEM_LIMIT), SA_AIS_OK); >>>>>>>>>>>>>>> + extFillHeader(&myAlarmNotification.notificationHeader); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>>>>>>>>> SA_NTF_SEVERITY_CRITICAL; >>>>>>>>>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>>>>>>>>> SA_NTF_CALL_ESTABLISHMENT_ERROR; >>>>>>>>>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_NO_CHANGE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>>>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>>>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>>>>>>>>> SA_NTF_PRESSURE_UNACCEPTABLE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>>>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>>>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>>>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>>>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_NO_CHANGE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + extFillHeader(&myAlarmNotification.notificationHeader); >>>>>>>>>>>>>>> + /* These 3 fields is filter items */ >>>>>>>>>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>>>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>>>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>>>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>>>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_MORE_SEVERE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdValueType >>>>>>>>>>>>>>> = SA_NTF_VALUE_UINT32; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdValue.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 600; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->thresholdHysteresis.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 100; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myAlarmNotification.thresholdInformation->observedValue.uint32Val >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> = 567; >>>>>>>>>>>>>>> + myAlarmNotification.thresholdInformation->armTime = >>>>>>>>>>>>>>> SA_TIME_UNKNOWN; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + /* only this notification should be caught*/ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myAlarmNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + poll_until_received(ntfHandle, >>>>>>>>>>>>>>> *myAlarmNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + if(ntfRecieved.alarmFilterHandle != 1 || >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>>>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFree(myAlarmNotification.notificationHandle) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>>>>>>>>> + rc = check_errors(); >>>>>>>>>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Test Object Create/Delete notification with long dn >>>>>>>>>>>>>>> objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extObjectCreateDeleteNotificationTest(void) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfObjectCreateDeleteNotificationFilterT myFilter; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + subscriptionId = 2; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + resetCounters(); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>>>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>>>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfObjectCreateDeleteNotificationFilterAllocate( >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myFilter, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 2), SA_AIS_OK); >>>>>>>>>>>>>>> + myFilter.sourceIndicators[0] = >>>>>>>>>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>>>>>>>>> + myFilter.sourceIndicators[1] = >>>>>>>>>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>>>>>>>>> + extFillFilterHeader(&myFilter.notificationFilterHeader); >>>>>>>>>>>>>>> + myFilter.notificationFilterHeader.eventTypes[0] = >>>>>>>>>>>>>>> SA_NTF_OBJECT_CREATION; >>>>>>>>>>>>>>> + /* Initialize filter handles */ >>>>>>>>>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.attributeChangeFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> = >>>>>>>>>>>>>>> + myFilter.notificationFilterHandle; >>>>>>>>>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>>>>>>>>> + extCreateObjectCreateDeleteNotification(ntfHandle, >>>>>>>>>>>>>>> &myObjCrDelNotification); >>>>>>>>>>>>>>> + *(myObjCrDelNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myObjCrDelNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + /* this notification should be caught*/ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myObjCrDelNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myObjCrDelNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_UNKNOWN_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myObjCrDelNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myObjCrDelNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myObjCrDelNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + /* this notification should be caught*/ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myObjCrDelNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + poll_until_received(ntfHandle, >>>>>>>>>>>>>>> *myObjCrDelNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle != >>>>>>>>>>>>>>> ok_ids.length|| >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>>>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFree(myObjCrDelNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfFinalize(ntfHandle) , SA_AIS_OK); >>>>>>>>>>>>>>> + rc = check_errors(); >>>>>>>>>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Test Attribute Change notification with long dn objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extAttributeChangeNotificationTest(void) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfAttributeChangeNotificationFilterT myFilter; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + subscriptionId = 2; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + resetCounters(); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>>>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>>>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfAttributeChangeNotificationFilterAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myFilter, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 2), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + myFilter.sourceIndicators[0] = >>>>>>>>>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>>>>>>>>> + myFilter.sourceIndicators[1] = >>>>>>>>>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>>>>>>>>> + extFillFilterHeader(&myFilter.notificationFilterHeader); >>>>>>>>>>>>>>> + myFilter.notificationFilterHeader.eventTypes[0] = >>>>>>>>>>>>>>> SA_NTF_ATTRIBUTE_CHANGED; >>>>>>>>>>>>>>> + /* Initialize filter handles */ >>>>>>>>>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = >>>>>>>>>>>>>>> + myFilter.notificationFilterHandle; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>>>>>>>>> + extCreateAttributeChangeNotification(ntfHandle, >>>>>>>>>>>>>>> &myAttrChangeNotification); >>>>>>>>>>>>>>> + *(myAttrChangeNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAttrChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + /* this notification should be caught*/ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myAttrChangeNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myAttrChangeNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_UNKNOWN_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAttrChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myAttrChangeNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myAttrChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + /* this notification should be caught*/ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myAttrChangeNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + poll_until_received(ntfHandle, >>>>>>>>>>>>>>> *myAttrChangeNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle != >>>>>>>>>>>>>>> ok_ids.length || >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle != 0|| >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>>>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFree(myAttrChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfFinalize(ntfHandle) , SA_AIS_OK); >>>>>>>>>>>>>>> + rc = check_errors(); >>>>>>>>>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Test State Change notification with long dn objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extStateChangeNotificationTest(void) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfStateChangeNotificationFilterT myFilter; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + subscriptionId = 2; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + resetCounters(); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>>>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>>>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfStateChangeNotificationFilterAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myFilter, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 1, >>>>>>>>>>>>>>> + 2, >>>>>>>>>>>>>>> + 0), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + myFilter.sourceIndicators[0] = >>>>>>>>>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>>>>>>>>> + myFilter.sourceIndicators[1] = >>>>>>>>>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>>>>>>>>> + extFillFilterHeader(&myFilter.notificationFilterHeader); >>>>>>>>>>>>>>> + myFilter.notificationFilterHeader.eventTypes[0] = >>>>>>>>>>>>>>> SA_NTF_OBJECT_STATE_CHANGE; >>>>>>>>>>>>>>> + /* Initialize filter handles */ >>>>>>>>>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.attributeChangeFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = >>>>>>>>>>>>>>> myFilter.notificationFilterHandle; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + extCreateStateChangeNotification(ntfHandle, >>>>>>>>>>>>>>> &myStateChangeNotification); >>>>>>>>>>>>>>> + *(myStateChangeNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myStateChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + /* this notification should be caught*/ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myStateChangeNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myStateChangeNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_UNKNOWN_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myStateChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *(myStateChangeNotification.sourceIndicator) = >>>>>>>>>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(myStateChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + /* this notification should be caught*/ >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *myStateChangeNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + poll_until_received(ntfHandle, >>>>>>>>>>>>>>> *myStateChangeNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle != 0|| >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle != ok_ids.length) >>>>>>>>>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFree(myStateChangeNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>>>>>>>>> + rc = check_errors(); >>>>>>>>>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +/** >>>>>>>>>>>>>>> + * Test Security Alarm notification with long dn objects >>>>>>>>>>>>>>> + */ >>>>>>>>>>>>>>> +void extSecurityAlarmNotificationTest(void) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + SaNtfSecurityAlarmNotificationFilterT myFilter; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + subscriptionId = 5; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + resetCounters(); >>>>>>>>>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>>>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>>>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + safassert(saNtfSecurityAlarmNotificationFilterAllocate( >>>>>>>>>>>>>>> + ntfHandle, >>>>>>>>>>>>>>> + &myFilter, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 3, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0, >>>>>>>>>>>>>>> + 0), SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* Initialize filter handles */ >>>>>>>>>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.attributeChangeFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>>>>>>>>> = 0; >>>>>>>>>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = >>>>>>>>>>>>>>> + myFilter.notificationFilterHandle; >>>>>>>>>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>>>>>>>>> + myFilter.probableCauses[0] = SA_NTF_ADAPTER_ERROR; >>>>>>>>>>>>>>> + myFilter.probableCauses[1] = >>>>>>>>>>>>>>> SA_NTF_EQUIPMENT_MALFUNCTION; >>>>>>>>>>>>>>> + myFilter.probableCauses[2] = SA_NTF_VERSION_MISMATCH; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + /* subscribe */ >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>>>>>>>>> + extCreateSecurityAlarmNotification(ntfHandle, >>>>>>>>>>>>>>> &mySecAlarmNotification); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>>>>>>>>> SA_NTF_VERSION_MISMATCH; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>>>>>>>>> SA_NTF_RESPONSE_TIME_EXCESSIVE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>>>>>>>>> SA_NTF_NON_REPUDIATION_FAILURE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>>>>>>>>> SA_NTF_EQUIPMENT_MALFUNCTION; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>>>>>>>>> SA_NTF_STORAGE_CAPACITY_PROBLEM; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>>>>>>>>> SA_NTF_DENIAL_OF_SERVICE; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>>>>>>>>> SA_NTF_ADAPTER_ERROR; >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>>>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId; >>>>>>>>>>>>>>> + poll_until_received(ntfHandle, >>>>>>>>>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId); >>>>>>>>>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>>>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>>>>>>>>> + ntfRecieved.securityAlarmFilterHandle != ok_ids.length || >>>>>>>>>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>>>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFree(mySecAlarmNotification.notificationHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>>>>>>>>> SA_AIS_OK); >>>>>>>>>>>>>>> + safassert(saNtfFinalize(ntfHandle) , SA_AIS_OK); >>>>>>>>>>>>>>> + rc = check_errors(); >>>>>>>>>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> +__attribute__ ((constructor)) static void >>>>>>>>>>>>>>> longDnObject_notification_constructor(void) >>>>>>>>>>>>>>> +{ >>>>>>>>>>>>>>> + init_ext_object(); >>>>>>>>>>>>>>> + test_suite_add(35, "Long DNs Test"); >>>>>>>>>>>>>>> + test_case_add(35, extAdditionalInfoTest >>>>>>>>>>>>>>> + , "Test additional info with >>>>>>>>>>>>>>> extended SaNameT type"); >>>>>>>>>>>>>>> + test_case_add(35, extFilterNotificationTest >>>>>>>>>>>>>>> + , "Test filter with longDn objects"); >>>>>>>>>>>>>>> + test_case_add(35, extAlarmNotificationTest >>>>>>>>>>>>>>> + , "Test Alarm notification with >>>>>>>>>>>>>>> longDn objects"); >>>>>>>>>>>>>>> + test_case_add(35, >>>>>>>>>>>>>>> extObjectCreateDeleteNotificationTest >>>>>>>>>>>>>>> + , "Test Object Create/Delete >>>>>>>>>>>>>>> notification with longDn objects"); >>>>>>>>>>>>>>> + test_case_add(35, extAttributeChangeNotificationTest >>>>>>>>>>>>>>> + , "Test Attribute Change >>>>>>>>>>>>>>> notification with longDn objects"); >>>>>>>>>>>>>>> + test_case_add(35, extStateChangeNotificationTest >>>>>>>>>>>>>>> + , "Test State Change notification >>>>>>>>>>>>>>> with longDn objects"); >>>>>>>>>>>>>>> + test_case_add(35, extSecurityAlarmNotificationTest >>>>>>>>>>>>>>> + , "Test Security Alarm notification >>>>>>>>>>>>>>> with longDn objects"); >>>>>>>>>>>>>>> +} >>>>>>>>>>>>>>> diff --git a/tests/unit_test_fw/inc/util.h >>>>>>>>>>>>>>> b/tests/unit_test_fw/inc/util.h >>>>>>>>>>>>>>> --- a/tests/unit_test_fw/inc/util.h >>>>>>>>>>>>>>> +++ b/tests/unit_test_fw/inc/util.h >>>>>>>>>>>>>>> @@ -19,11 +19,10 @@ >>>>>>>>>>>>>>> #ifndef util_h >>>>>>>>>>>>>>> #define util_h >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> +#include <saAis.h> >>>>>>>>>>>>>>> + >>>>>>>>>>>>>>> extern SaTimeT getSaTimeT(void); >>>>>>>>>>>>>>> -extern void create_dn(char *rdn, char *parent, SaNameT >>>>>>>>>>>>>>> *dn); >>>>>>>>>>>>>>> -extern void sa_namet_init(char *value, SaNameT *namet); >>>>>>>>>>>>>>> extern const char *get_saf_error(SaAisErrorT rc); >>>>>>>>>>>>>>> - >>>>>>>>>>>>>>> extern void safassert_impl(const char* file, unsigned >>>>>>>>>>>>>>> int line, SaAisErrorT actual, SaAisErrorT expected); >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> /** >>>>>>>>>>>>>>> diff --git a/tests/unit_test_fw/src/Makefile.am >>>>>>>>>>>>>>> b/tests/unit_test_fw/src/Makefile.am >>>>>>>>>>>>>>> --- a/tests/unit_test_fw/src/Makefile.am >>>>>>>>>>>>>>> +++ b/tests/unit_test_fw/src/Makefile.am >>>>>>>>>>>>>>> @@ -22,6 +22,7 @@ noinst_LTLIBRARIES = libutest.la >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> libutest_la_CPPFLAGS = \ >>>>>>>>>>>>>>> $(AM_CPPFLAGS) \ >>>>>>>>>>>>>>> + -DSA_EXTENDED_NAME_SOURCE \ >>>>>>>>>>>>>>> -I$(top_srcdir)/tests/unit_test_fw/inc \ >>>>>>>>>>>>>>> -I$(top_srcdir)/osaf/libs/saf/include >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> diff --git a/tests/unit_test_fw/src/util.c >>>>>>>>>>>>>>> b/tests/unit_test_fw/src/util.c >>>>>>>>>>>>>>> --- a/tests/unit_test_fw/src/util.c >>>>>>>>>>>>>>> +++ b/tests/unit_test_fw/src/util.c >>>>>>>>>>>>>>> @@ -21,8 +21,7 @@ >>>>>>>>>>>>>>> #include <sys/time.h> >>>>>>>>>>>>>>> #include <unistd.h> >>>>>>>>>>>>>>> #include <assert.h> >>>>>>>>>>>>>>> -#include <saAis.h> >>>>>>>>>>>>>>> - >>>>>>>>>>>>>>> +#include "util.h" >>>>>>>>>>>>>>> static const char *saf_error[] = >>>>>>>>>>>>>>> { >>>>>>>>>>>>>>> "SA_AIS_NOT_VALID", >>>>>>>>>>>>>>> @@ -65,17 +64,6 @@ SaTimeT getSaTimeT(void) >>>>>>>>>>>>>>> (tp.tv_usec * SA_TIME_ONE_MICROSECOND); >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -void create_dn(char *rdn, char *parent, SaNameT *dn) >>>>>>>>>>>>>>> -{ >>>>>>>>>>>>>>> - dn->length = sprintf((char*)dn->value, "%s,%s", >>>>>>>>>>>>>>> rdn, parent); >>>>>>>>>>>>>>> - assert(dn->length < SA_MAX_NAME_LENGTH); >>>>>>>>>>>>>>> -} >>>>>>>>>>>>>>> - >>>>>>>>>>>>>>> -void sa_namet_init(char *value, SaNameT *namet) >>>>>>>>>>>>>>> -{ >>>>>>>>>>>>>>> - namet->length = sprintf((char*)namet->value, "%s", >>>>>>>>>>>>>>> value); >>>>>>>>>>>>>>> -} >>>>>>>>>>>>>>> - >>>>>>>>>>>>>>> const char *get_saf_error(SaAisErrorT rc) >>>>>>>>>>>>>>> { >>>>>>>>>>>>>>> if (rc <= SA_AIS_ERR_UNAVAILABLE) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> > ------------------------------------------------------------------------------ Infragistics Professional Build stunning WinForms apps today! Reboot your WinForms applications with our WinForms controls. Build a bridge from your legacy apps to the future. http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
