This file is indexed.

/usr/include/normApi.h is in libnorm-dev 1.5r6+dfsg1-6.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
#ifndef _NORM_API
#define _NORM_API

/*******************************************************************************
 * NOTE: To use NORM as a DLL on Win32 platforms, the macro "NORM_USE_DLL" must be 
 *       defined.  Otherwise, the static library "NormLib.lib" is built and should 
 *       be used for your code compilation and linking.
 ********************************************************************************/

#ifdef WIN32
#include <winsock2.h>
#include <windows.h>
#include <basetsd.h>  // for UINT32/INT32, etc types
#ifdef NORM_USE_DLL
#ifdef _NORM_API_BUILD
#define NORM_API_LINKAGE __declspec(dllexport)  // to support building of "Norm.dll"
#else
#define NORM_API_LINKAGE __declspec(dllimport)  // to let apps use "Norm.dll" functions
#endif // if/else _NORM_API_BUILD
#else
#define NORM_API_LINKAGE
#endif // if/else NORM_USE_DLL
#else
#include <sys/types.h>  // for "off_t"
#include <stdint.h>     // for proper uint32_t, etc definitions
typedef int8_t INT8;
typedef int16_t INT16;
#ifdef _USING_X11
typedef long int INT32;
#else
typedef int32_t INT32;
#endif // if/else _USING_X11
typedef uint8_t UINT8;
typedef uint16_t UINT16;
typedef uint32_t UINT32;
#define NORM_API_LINKAGE 
#endif // if/else WIN32/UNIX

////////////////////////////////////////////////////////////
// IMPORTANT NOTICE
//  The NORM API is _very_ much in a developmental phase
//  right now.  So, although this code is available in
//  source code distribution, it is very much subject
//  to change in future revisions.  The goal of the NORM
//  API _will_ be to provide a stable base of function calls
//  for applications to use, even as the underlying NORM
//  C++ code continues to evolve.  But, until this notice
//  is removed, the API shouldn't be considered final.

#ifndef __cplusplus
#  include <stdbool.h>
#  define DEFAULT(arg)
#else
#  define DEFAULT(arg) = arg
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#define NORM_VERSION_MAJOR 1
#define NORM_VERSION_MINOR 0
#define NORM_VERSION_PATCH 0

/** NORM API Types */
typedef const void* NormInstanceHandle;
extern NORM_API_LINKAGE
const NormInstanceHandle NORM_INSTANCE_INVALID;

typedef const void* NormSessionHandle;
extern NORM_API_LINKAGE
const NormSessionHandle NORM_SESSION_INVALID;
typedef UINT16 NormSessionId;

typedef const void* NormNodeHandle;
extern NORM_API_LINKAGE 
const NormNodeHandle NORM_NODE_INVALID;
typedef UINT32 NormNodeId;
extern NORM_API_LINKAGE
const NormNodeId NORM_NODE_NONE;
extern NORM_API_LINKAGE
const NormNodeId NORM_NODE_ANY;

typedef const void* NormObjectHandle;
extern NORM_API_LINKAGE
const NormObjectHandle NORM_OBJECT_INVALID;
typedef UINT16 NormObjectTransportId;

#ifdef WIN32
typedef __int64 NormSize;
#else
typedef off_t NormSize;
#endif // WIN32

NORM_API_LINKAGE
typedef enum NormObjectType
{
    NORM_OBJECT_NONE,
    NORM_OBJECT_DATA,
    NORM_OBJECT_FILE,
    NORM_OBJECT_STREAM   
} NormObjectType;
  
NORM_API_LINKAGE
typedef enum NormFlushMode
{
    NORM_FLUSH_NONE,
    NORM_FLUSH_PASSIVE,
    NORM_FLUSH_ACTIVE   
} NormFlushMode;
    
NORM_API_LINKAGE
typedef enum NormNackingMode
{
    NORM_NACK_NONE,
    NORM_NACK_INFO_ONLY,
    NORM_NACK_NORMAL  
} NormNackingMode;

NORM_API_LINKAGE
typedef enum NormAckingStatus
{
    NORM_ACK_INVALID,
    NORM_ACK_FAILURE,
    NORM_ACK_PENDING,
    NORM_ACK_SUCCESS  
} NormAckingStatus;
 
NORM_API_LINKAGE
typedef enum NormTrackingStatus
{
    NORM_TRACK_NONE,
    NORM_TRACK_RECEIVERS,
    NORM_TRACK_SENDERS,
    NORM_TRACK_ALL  
} NormTrackingStatus;
    

NORM_API_LINKAGE
typedef enum NormProbingMode
{
    NORM_PROBE_NONE,
    NORM_PROBE_PASSIVE,
    NORM_PROBE_ACTIVE  
} NormProbingMode;
    
NORM_API_LINKAGE
typedef enum NormSyncPolicy
{
    NORM_SYNC_CURRENT,  // attempt to receiver current/new objects only, join mid-stream
    NORM_SYNC_STREAM,   // sync to current stream, but to beginning of stream
    NORM_SYNC_ALL       // attempt to receive old and new objects
} NormSyncPolicy;
    
NORM_API_LINKAGE
typedef enum NormRepairBoundary
{
    NORM_BOUNDARY_BLOCK,
    NORM_BOUNDARY_OBJECT
} NormRepairBoundary;
    
NORM_API_LINKAGE
typedef enum NormEventType
{
    NORM_EVENT_INVALID = 0,
    NORM_TX_QUEUE_VACANCY,
    NORM_TX_QUEUE_EMPTY,
    NORM_TX_FLUSH_COMPLETED,
    NORM_TX_WATERMARK_COMPLETED,
    NORM_TX_CMD_SENT,
    NORM_TX_OBJECT_SENT,
    NORM_TX_OBJECT_PURGED,
    NORM_TX_RATE_CHANGED,
    NORM_LOCAL_SENDER_CLOSED,
    NORM_REMOTE_SENDER_NEW,
    NORM_REMOTE_SENDER_RESET,     // remote sender instanceId or FEC params changed
    NORM_REMOTE_SENDER_ADDRESS,   // remote sender src addr and/or port changed
    NORM_REMOTE_SENDER_ACTIVE,
    NORM_REMOTE_SENDER_INACTIVE,
    NORM_REMOTE_SENDER_PURGED,    // not yet implemented
    NORM_RX_CMD_NEW,
    NORM_RX_OBJECT_NEW,
    NORM_RX_OBJECT_INFO,
    NORM_RX_OBJECT_UPDATED,
    NORM_RX_OBJECT_COMPLETED,
    NORM_RX_OBJECT_ABORTED,
    NORM_GRTT_UPDATED,
    NORM_CC_ACTIVE,
    NORM_CC_INACTIVE,
    NORM_ACKING_NODE_NEW,        // whe NormSetAutoAcking xxx
    NORM_SEND_ERROR,             // ICMP error (e.g. destination unreachable)
    NORM_USER_TIMEOUT            // issues when timeout set by NormSetUserTimer() expires
} NormEventType;

typedef struct
{
    NormEventType       type;
    NormSessionHandle   session;
    NormNodeHandle      sender;
    NormObjectHandle    object;
} NormEvent;
    

/** NORM API General Initialization and Operation Functions */

NORM_API_LINKAGE 
int NormGetVersion(int* major DEFAULT((int*)0), 
                   int* minor DEFAULT((int*)0), 
                   int* patch  DEFAULT((int*)0));

NORM_API_LINKAGE 
NormInstanceHandle NormCreateInstance(bool priorityBoost DEFAULT(false));

NORM_API_LINKAGE 
void NormDestroyInstance(NormInstanceHandle instanceHandle);

NORM_API_LINKAGE 
void NormStopInstance(NormInstanceHandle instanceHandle);

NORM_API_LINKAGE 
bool NormRestartInstance(NormInstanceHandle instanceHandle);

NORM_API_LINKAGE 
bool NormSuspendInstance(NormInstanceHandle instanceHandle);

NORM_API_LINKAGE 
void NormResumeInstance(NormInstanceHandle instanceHandle);


// This MUST be set to enable NORM_OBJECT_FILE reception!
// (otherwise received files are ignored)
NORM_API_LINKAGE
bool NormSetCacheDirectory(NormInstanceHandle instanceHandle, 
                           const char*        cachePath);

// This call blocks until the next NormEvent is ready unless asynchronous
// notification is used (see below)
NORM_API_LINKAGE 
bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent, bool waitForEvent DEFAULT(true));

// The "NormGetDescriptor()" function returns a HANDLE (WIN32) or
// a file descriptor (UNIX) which can be used for async notification
// of pending NORM events. On WIN32, the returned HANDLE can be used 
// with system calls like "WaitForSingleEvent()", and on Unix the
// returned descriptor can be used in a "select()" call.  If this type
// of asynchronous notification is used, calls to "NormGetNextEvent()" will
// not block when the notification is posted.

#ifdef WIN32
typedef HANDLE NormDescriptor;
#else
typedef int NormDescriptor;
#endif // if/else WIN32/UNIX
extern NORM_API_LINKAGE
const NormDescriptor NORM_DESCRIPTOR_INVALID;
NORM_API_LINKAGE 
NormDescriptor NormGetDescriptor(NormInstanceHandle instanceHandle);

/** NORM Session Creation and Control Functions */

NORM_API_LINKAGE 
NormSessionHandle NormCreateSession(NormInstanceHandle instanceHandle,
                                    const char*        sessionAddress,
                                    UINT16             sessionPort,
                                    NormNodeId         localNodeId);

NORM_API_LINKAGE 
void NormDestroySession(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
NormInstanceHandle NormGetInstance(NormSessionHandle sessionHandle);

NORM_API_LINKAGE
bool NormIsUnicastAddress(const char* address);

NORM_API_LINKAGE 
void NormSetUserData(NormSessionHandle sessionHandle, const void* userData);

NORM_API_LINKAGE 
const void* NormGetUserData(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
void NormSetUserTimer(NormSessionHandle sessionHandle, double seconds);

NORM_API_LINKAGE 
void NormCancelUserTimer(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle);


NORM_API_LINKAGE
UINT16 NormGetRxPort(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
bool NormSetTxPort(NormSessionHandle sessionHandle,
                   UINT16            txPortNumber,
                   bool              enableReuse DEFAULT(false),
                   const char*       txBindAddress DEFAULT((const char*)0));  // if non-NULL, bind() to <txBindAddress>/<txPortNumber>

NORM_API_LINKAGE
UINT16 NormGetTxPort(NormSessionHandle sessionHandle);

NORM_API_LINKAGE
void NormSetTxOnly(NormSessionHandle sessionHandle,
                   bool              txOnly,
                   bool              connectToSessionAddress DEFAULT(false));


// This does not affect the rx_socket binding if already bound (sender or receiver already started)
// (i.e., just affects where NORM packets are sent)
NORM_API_LINKAGE
bool NormChangeDestination(NormSessionHandle sessionHandle,
                           const char*       sessionAddress,
                           UINT16            sessionPort,
                           bool              connectToSessionAddress DEFAULT(false));

NORM_API_LINKAGE 
void NormSetRxPortReuse(NormSessionHandle sessionHandle,
                        bool              enableReuse,
                        const char*       rxBindAddress DEFAULT((const char*)0), // if non-NULL, bind() to <rxBindAddress>/<sessionPort>
                        const char*       senderAddress DEFAULT((const char*)0), // if non-NULL, connect() to <senderAddress>/<senderPort>
                        UINT16            senderPort DEFAULT(0));

NORM_API_LINKAGE
UINT16 NormGetRxPort(NormSessionHandle sessionHandle);

// TBD - We should probably have a "NormSetCCMode(NormCCMode ccMode)" function for users
NORM_API_LINKAGE
void NormSetEcnSupport(NormSessionHandle  sessionHandle, 
                       bool               ecnEnable,             // enables NORM ECN (congestion control) support
                       bool               ignoreLoss DEFAULT(false),    // With "ecnEnable", use ECN-only, ignoring packet loss
                       bool               tolerateLoss DEFAULT(false)); // loss-tolerant congestion control, ecnEnable or not, ignoreLoss = false

NORM_API_LINKAGE 
bool NormSetMulticastInterface(NormSessionHandle sessionHandle,
                               const char*       interfaceName);

NORM_API_LINKAGE 
bool NormSetSSM(NormSessionHandle sessionHandle,
                const char*       sourceAddress);

NORM_API_LINKAGE 
bool NormSetTTL(NormSessionHandle sessionHandle,
                unsigned char     ttl);

NORM_API_LINKAGE 
bool NormSetTOS(NormSessionHandle sessionHandle,
                unsigned char     tos);

NORM_API_LINKAGE 
bool NormSetLoopback(NormSessionHandle sessionHandle,
                     bool              loopback);

NORM_API_LINKAGE 
bool NormSetMulticastLoopback(NormSessionHandle sessionHandle,
                              bool              loopback);


NORM_API_LINKAGE
bool NormSetFragmentation(NormSessionHandle sessionHandle,
                          bool              fragmentation);

// Special functions for debug support
NORM_API_LINKAGE 
void NormSetMessageTrace(NormSessionHandle sessionHandle, bool state);

NORM_API_LINKAGE 
void NormSetTxLoss(NormSessionHandle sessionHandle, double percent);

NORM_API_LINKAGE 
void NormSetRxLoss(NormSessionHandle sessionHandle, double percent);

NORM_API_LINKAGE
bool NormOpenDebugLog(NormInstanceHandle instanceHandle, const char *path);

NORM_API_LINKAGE
void NormCloseDebugLog(NormInstanceHandle instanceHandle);

NORM_API_LINKAGE
bool NormOpenDebugPipe(NormInstanceHandle instanceHandle, const char *pipeName);

NORM_API_LINKAGE
void NormCloseDebugPipe(NormInstanceHandle instanceHandle);

NORM_API_LINKAGE
void NormSetDebugLevel(unsigned int level);

NORM_API_LINKAGE
unsigned int NormGetDebugLevel();

NORM_API_LINKAGE
void NormSetReportInterval(NormSessionHandle sessionHandle, double interval);

NORM_API_LINKAGE
double NormGetReportInterval(NormSessionHandle sessionHandle);

/** NORM Sender Functions */

NORM_API_LINKAGE
NormSessionId NormGetRandomSessionId();


// This function has been updated so that 16-bit Reed-Solomon
// codecs can be accessed.  This may cause an issue for linking
// to older versions of the NORM library
NORM_API_LINKAGE 
bool NormStartSender(NormSessionHandle  sessionHandle,
                     NormSessionId      instanceId,
                     UINT32             bufferSpace,
                     UINT16             segmentSize,
                     UINT16             numData,
                     UINT16             numParity);

NORM_API_LINKAGE 
void NormStopSender(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
void NormSetTxRate(NormSessionHandle sessionHandle,
                   double            bitsPerSecond);
NORM_API_LINKAGE 
double NormGetTxRate(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
bool NormSetTxSocketBuffer(NormSessionHandle sessionHandle,
                           unsigned int      bufferSize);

NORM_API_LINKAGE 
void NormSetFlowControl(NormSessionHandle sessionHandle,
                        double            flowControlFactor);

NORM_API_LINKAGE 
void NormSetCongestionControl(NormSessionHandle sessionHandle,
                              bool              enable,
                              bool              adjustRate DEFAULT(true));

NORM_API_LINKAGE 
void NormSetTxRateBounds(NormSessionHandle sessionHandle,
                         double            rateMin,
                         double            rateMax);

NORM_API_LINKAGE 
void NormSetTxCacheBounds(NormSessionHandle sessionHandle,
                          NormSize          sizeMax,
                          UINT32            countMin,
                          UINT32            countMax);

NORM_API_LINKAGE 
void NormSetAutoParity(NormSessionHandle sessionHandle,
                       unsigned char     autoParity);

NORM_API_LINKAGE 
void NormSetGrttEstimate(NormSessionHandle sessionHandle,
                         double            grttEstimate);

NORM_API_LINKAGE
double NormGetGrttEstimate(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
void NormSetGrttMax(NormSessionHandle sessionHandle,
                    double            grttMax);

NORM_API_LINKAGE 
void NormSetGrttProbingMode(NormSessionHandle sessionHandle,
                            NormProbingMode   probingMode);

NORM_API_LINKAGE 
void NormSetGrttProbingInterval(NormSessionHandle sessionHandle,
                                double            intervalMin,
                                double            intervalMax);

NORM_API_LINKAGE 
void NormSetBackoffFactor(NormSessionHandle sessionHandle,
                          double            backoffFactor);

NORM_API_LINKAGE 
void NormSetGroupSize(NormSessionHandle sessionHandle,
                      unsigned int      groupSize);

NORM_API_LINKAGE 
void NormSetTxRobustFactor(NormSessionHandle sessionHandle,
                           int               robustFactor);

NORM_API_LINKAGE 
NormObjectHandle NormFileEnqueue(NormSessionHandle sessionHandle,
                                 const char*       fileName,
                                 const char*       infoPtr DEFAULT((const char*)0),
                                 unsigned int      infoLen DEFAULT(0));

NORM_API_LINKAGE 
NormObjectHandle NormDataEnqueue(NormSessionHandle sessionHandle,
                                 const char*       dataPtr,
                                 UINT32            dataLen,
                                 const char*       infoPtr DEFAULT((const char*)0),
                                 unsigned int      infoLen DEFAULT(0));

NORM_API_LINKAGE 
bool NormRequeueObject(NormSessionHandle sessionHandle, NormObjectHandle objectHandle);
                                     
NORM_API_LINKAGE 
NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
                                UINT32            bufferSize,
                                const char*       infoPtr DEFAULT((const char*)0),
                                unsigned int      infoLen DEFAULT(0));

NORM_API_LINKAGE 
void NormObjectSetUserData(NormObjectHandle objectHandle, const void* userData);

NORM_API_LINKAGE 
const void* NormObjectGetUserData(NormObjectHandle objectHandle);

// TBD - we should add a "bool watermark" option to "graceful" stream closure???
NORM_API_LINKAGE 
void NormStreamClose(NormObjectHandle streamHandle, bool graceful DEFAULT(false));

NORM_API_LINKAGE
unsigned int NormGetStreamBufferSegmentCount(unsigned int bufferBytes, UINT16 segmentSize, UINT16 blockSize);
        
NORM_API_LINKAGE 
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
                             const char*      buffer,
                             unsigned int     numBytes);

NORM_API_LINKAGE 
void NormStreamFlush(NormObjectHandle streamHandle, 
                     bool             eom DEFAULT(false),
                     NormFlushMode    flushMode DEFAULT(NORM_FLUSH_PASSIVE));

NORM_API_LINKAGE 
void NormStreamSetAutoFlush(NormObjectHandle streamHandle,
                            NormFlushMode    flushMode);

NORM_API_LINKAGE 
void NormStreamSetPushEnable(NormObjectHandle streamHandle, 
                             bool             pushEnable);

NORM_API_LINKAGE 
bool NormStreamHasVacancy(NormObjectHandle streamHandle);

NORM_API_LINKAGE 
void NormStreamMarkEom(NormObjectHandle streamHandle);

NORM_API_LINKAGE 
bool NormSetWatermark(NormSessionHandle  sessionHandle,
                      NormObjectHandle   objectHandle,
                      bool               overrideFlush DEFAULT(false));
NORM_API_LINKAGE 
bool NormResetWatermark(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
void NormCancelWatermark(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
bool NormAddAckingNode(NormSessionHandle  sessionHandle,
                       NormNodeId         nodeId);

NORM_API_LINKAGE 
void NormRemoveAckingNode(NormSessionHandle  sessionHandle,
                          NormNodeId         nodeId);

NORM_API_LINKAGE
NormNodeHandle NormGetAckingNodeHandle(NormSessionHandle  sessionHandle,
                                       NormNodeId         nodeId);

NORM_API_LINKAGE
void NormSetAutoAckingNodes(NormSessionHandle   sessionHandle,
                            NormTrackingStatus  trackingStatus);

NORM_API_LINKAGE 
NormAckingStatus NormGetAckingStatus(NormSessionHandle sessionHandle,
                                     NormNodeId        nodeId DEFAULT(NORM_NODE_ANY));

NORM_API_LINKAGE 
bool NormGetNextAckingNode(NormSessionHandle    sessionHandle,
                           NormNodeId*          nodeId,   
                           NormAckingStatus*    ackingStatus DEFAULT(0));

NORM_API_LINKAGE 
bool NormSendCommand(NormSessionHandle  sessionHandle,
                     const char*        cmdBuffer, 
                     unsigned int       cmdLength, 
                     bool               robust DEFAULT(false));

NORM_API_LINKAGE 
void NormCancelCommand(NormSessionHandle  sessionHandle);
        
/* NORM Receiver Functions */

NORM_API_LINKAGE 
bool NormStartReceiver(NormSessionHandle  sessionHandle,
                       UINT32             bufferSpace);

NORM_API_LINKAGE 
void NormStopReceiver(NormSessionHandle sessionHandle);

NORM_API_LINKAGE 
void NormSetRxCacheLimit(NormSessionHandle sessionHandle,
                         unsigned short    countMax);

NORM_API_LINKAGE 
bool NormSetRxSocketBuffer(NormSessionHandle sessionHandle,
                           unsigned int      bufferSize);

NORM_API_LINKAGE 
void NormSetSilentReceiver(NormSessionHandle sessionHandle,
                           bool              silent,
                           int               maxDelay DEFAULT(-1));

NORM_API_LINKAGE 
void NormSetDefaultUnicastNack(NormSessionHandle sessionHandle,
                               bool              unicastNacks);

NORM_API_LINKAGE 
void NormNodeSetUnicastNack(NormNodeHandle   remoteSender,
                            bool             unicastNacks);

NORM_API_LINKAGE 
void NormSetDefaultSyncPolicy(NormSessionHandle sessionHandle,
                              NormSyncPolicy    syncPolicy);

NORM_API_LINKAGE 
void NormSetDefaultNackingMode(NormSessionHandle sessionHandle,
                               NormNackingMode   nackingMode);
    
NORM_API_LINKAGE 
void NormNodeSetNackingMode(NormNodeHandle   remoteSender,
                            NormNackingMode  nackingMode);

NORM_API_LINKAGE 
void NormObjectSetNackingMode(NormObjectHandle objectHandle,
                              NormNackingMode  nackingMode);    

NORM_API_LINKAGE 
void NormSetDefaultRepairBoundary(NormSessionHandle  sessionHandle,
                                  NormRepairBoundary repairBoundary); 

NORM_API_LINKAGE 
void NormNodeSetRepairBoundary(NormNodeHandle     remoteSender,
                               NormRepairBoundary repairBoundary);

NORM_API_LINKAGE 
void NormSetDefaultRxRobustFactor(NormSessionHandle sessionHandle,
                                  int               robustFactor);

NORM_API_LINKAGE 
void NormNodeSetRxRobustFactor(NormNodeHandle   remoteSender,
                               int              robustFactor);

NORM_API_LINKAGE 
bool NormStreamRead(NormObjectHandle   streamHandle,
                    char*              buffer,
                    unsigned int*      numBytes);

NORM_API_LINKAGE 
bool NormStreamSeekMsgStart(NormObjectHandle streamHandle);

NORM_API_LINKAGE 
UINT32 NormStreamGetReadOffset(NormObjectHandle streamHandle);

NORM_API_LINKAGE 
UINT32 NormStreamGetBufferUsage(NormObjectHandle streamHandle);

/** NORM Object Functions */

NORM_API_LINKAGE 
NormObjectType NormObjectGetType(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
bool NormObjectHasInfo(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
UINT16 NormObjectGetInfoLength(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
UINT16 NormObjectGetInfo(NormObjectHandle objectHandle,
                         char*            buffer,
                         UINT16           bufferLen);

NORM_API_LINKAGE 
NormSize NormObjectGetSize(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
NormSize NormObjectGetBytesPending(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
void NormObjectCancel(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
void NormObjectRetain(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
void NormObjectRelease(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
bool NormFileGetName(NormObjectHandle   fileHandle,
                     char*              nameBuffer,
                     unsigned int       bufferLen);

NORM_API_LINKAGE 
bool NormFileRename(NormObjectHandle   fileHandle,
                    const char*        fileName);

NORM_API_LINKAGE 
const char* NormDataAccessData(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
char* NormDataDetachData(NormObjectHandle objectHandle);

NORM_API_LINKAGE 
NormNodeHandle NormObjectGetSender(NormObjectHandle objectHandle);

/** NORM Node Functions */

NORM_API_LINKAGE 
NormNodeId NormNodeGetId(NormNodeHandle nodeHandle);

NORM_API_LINKAGE 
bool NormNodeGetAddress(NormNodeHandle  nodeHandle,
                        char*           addrBuffer, 
                        unsigned int*   bufferLen,
                        UINT16*         port DEFAULT((UINT16*)0));

NORM_API_LINKAGE 
void NormNodeSetUserData(NormNodeHandle nodeHandle, const void* userData);

NORM_API_LINKAGE 
const void* NormNodeGetUserData(NormNodeHandle nodeHandle);

NORM_API_LINKAGE
double NormNodeGetGrtt(NormNodeHandle remoteSender);


NORM_API_LINKAGE
bool NormNodeGetCommand(NormNodeHandle remoteSender,
                        char*          buffer,
                        unsigned int*  buflen);

NORM_API_LINKAGE
void NormNodeFreeBuffers(NormNodeHandle remoteSender);

NORM_API_LINKAGE
void NormNodeDelete(NormNodeHandle remoteSender);

NORM_API_LINKAGE 
void NormNodeRetain(NormNodeHandle nodeHandle);

NORM_API_LINKAGE 
void NormNodeRelease(NormNodeHandle nodeHandle);

/** Some experimental functions */

NORM_API_LINKAGE
void NormReleasePreviousEvent(NormInstanceHandle instanceHandle);

NORM_API_LINKAGE 
UINT32 NormCountCompletedObjects(NormSessionHandle sessionHandle);


// The next functions have _not_ yet been implemented
// (work in progress)
NORM_API_LINKAGE
void NormNodeSetAutoDelete(NormNodeHandle remoteSender,
                           bool           autoDelete);

NORM_API_LINKAGE
bool NormNodeAllowSender(NormNodeId senderId);

NORM_API_LINKAGE
bool NormNodeDenySender(NormNodeId senderId);     

#ifdef __cplusplus
} // end extern "C"
#endif /* __cplusplus */

#endif // _NORM_API