Yes I noticed, but that is a bug in ntfimcn_notifier.c, isn't it? The 
SAF spec says that for SA_NTF_VALUE_LDAP_NAME, the data type is SaNameT.

/ Anders Widell

On 07/31/2014 12:45 PM, minhchau wrote:
> Note that the usage of SA_NTF_VALUE_LDAP_NAME for SaNtfValueT is not 
> consistent. Currently the ntfimcn_notifier.c , function 
> fill_attribute_value(), treat SA_NTF_VALUE_LDAP_NAME as 
> SA_NTF_VALUE_STRING, it drop out 2 bytes of .length.
> . So it's not always "strlen(x) + 3" in document.
>
> On 7/31/2014 8:17 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.
>>
>> 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

Reply via email to