pull/2/head
Jeff Weston 2019-09-11 11:49:30 -04:00
parent cca3e58c8b
commit 9c3ea04ba8
24 changed files with 1487 additions and 279 deletions

View File

@ -6,7 +6,7 @@
<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.2 (Linux)"> <META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.2 (Linux)">
<META NAME="AUTHOR" CONTENT="Robert Adamson"> <META NAME="AUTHOR" CONTENT="Robert Adamson">
<META NAME="CREATED" CONTENT="20040824;15180000"> <META NAME="CREATED" CONTENT="20040824;15180000">
<META NAME="CHANGED" CONTENT="20050420;17075300"> <META NAME="CHANGED" CONTENT="20050427;11094100">
<META NAME="DESCRIPTION" CONTENT="NORM Object Functions 42 NORM Object Functions NORM_OBJECT_STREAM NORM Sender Functions 19 NORM Sender Functions "> <META NAME="DESCRIPTION" CONTENT="NORM Object Functions 42 NORM Object Functions NORM_OBJECT_STREAM NORM Sender Functions 19 NORM Sender Functions ">
<META NAME="KEYWORDS" CONTENT="norm object value application function "> <META NAME="KEYWORDS" CONTENT="norm object value application function ">
<STYLE> <STYLE>
@ -70,7 +70,7 @@ Engineering Task Force RFC 3940.</P>
<P CLASS="western" STYLE="font-style: normal">The NORM protocol is <P CLASS="western" STYLE="font-style: normal">The NORM protocol is
designed to provide end-to-end reliable transport of bulk data designed to provide end-to-end reliable transport of bulk data
objects or streams over generic IP multicast routing and forwarding objects or streams over generic IP multicast routing and forwarding
services. NORM uses a selective, negative acknowledgement (NACK) services. NORM uses a selective, negative acknowledgment (NACK)
mechanism for transport reliability and offers additional protocol mechanism for transport reliability and offers additional protocol
mechanisms to conduct reliable multicast sessions with limited &quot;a mechanisms to conduct reliable multicast sessions with limited &quot;a
priori&quot; coordination among senders and receivers. A congestion priori&quot; coordination among senders and receivers. A congestion
@ -84,10 +84,9 @@ to allow different types of applications or possibly other higher
level transport protocols to utilize its service in different ways. level transport protocols to utilize its service in different ways.
The protocol leverages the use of FEC-based repair and other proven The protocol leverages the use of FEC-based repair and other proven
reliable multicast transport techniques in its design.</P> reliable multicast transport techniques in its design.</P>
<H1 CLASS="western" ALIGN=CENTER STYLE="page-break-before: always">Contents</H1> <H1 CLASS="western" ALIGN=CENTER STYLE="page-break-before: always">Table
of Contents</H1>
<DIV ID="Table of Contents1" DIR="LTR"> <DIV ID="Table of Contents1" DIR="LTR">
<P STYLE="margin-top: 0.25in; font-style: normal"><BR>
</P>
<P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>Overview</B></FONT></P> <P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>Overview</B></FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
Initialization</B></FONT></P> Initialization</B></FONT></P>
@ -96,101 +95,103 @@ reliable multicast transport techniques in its design.</P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
Data Transport</B></FONT></P> Data Transport</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM
Data Transmission</FONT></P> Data Transmission </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM
Data Reception</FONT></P> Data Reception </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
Event Notification</B></FONT></P> Event Notification</B></FONT></P>
<P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>API <P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>API
Reference</B></FONT></P> Reference</B></FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
Variable Types and Constants</B></FONT></P> Variable Types and Constants</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormInstanceHandle">NormInstanceHandle</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormInstanceHandle">NormInstanceHandle</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSessionHandle">NormSessionHandle</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSessionHandle">NormSessionHandle</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeHandle">NormNodeHandle</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeHandle">NormNodeHandle</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeId">NormNodeId</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeId">NormNodeId</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHandle">NormObjectHandle</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHandle">NormObjectHandle</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectType">NormObjectType</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectType">NormObjectType</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectTransportId">NormObjectTransportId</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectTransportId">NormObjectTransportId</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEventType">NormEventType</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEventType">NormEventType</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEvent">NormEvent</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEvent">NormEvent</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
Initialization and Operation</B></FONT></P> Initialization and Operation</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateInstance()">NormCreateInstance()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateInstance()">NormCreateInstance()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroyInstance()">NormDestroyInstance()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroyInstance()">NormDestroyInstance()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCacheDirectory()">NormSetCacheDirectory()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCacheDirectory()">NormSetCacheDirectory()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetNextEvent()">NormGetNextEvent()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetNextEvent()">NormGetNextEvent()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetDescriptor()">NormGetDescriptor()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetDescriptor()">NormGetDescriptor()</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>Session <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>Session
Creation and Control</B></FONT></P> Creation and Control</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateSession()">NormCreateSession()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateSession()">NormCreateSession()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroySession()">NormDestroySession()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroySession()">NormDestroySession()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetUserData()">NormSetUserData()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetUserData()">NormSetUserData()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetUserData()">NormGetUserData()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetUserData()">NormGetUserData()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetLocalNodeId()">NormGetLocalNodeId()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetLocalNodeId()">NormGetLocalNodeId()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxPort()">NormSetTxPort()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxPort()">NormSetTxPort()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetMulticastInterface()">NormSetMulticastInterface()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetMulticastInterface()">NormSetMulticastInterface()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTTL()">NormSetTTL()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTTL()">NormSetTTL()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTOS()">NormSetTOS()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTOS()">NormSetTOS()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetLoopback()">NormSetLoopback()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetLoopback()">NormSetLoopback()</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
Sender Functions</B></FONT></P> Sender Functions</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartSender()">NormStartSender()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartSender()">NormStartSender()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopSender()">NormStopSender()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopSender()">NormStopSender()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRate()">NormSetTransmitRate()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRate()">NormSetTransmitRate()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxSocketBuffer()">NormSetTxSocketBuffer()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxSocketBuffer()">NormSetTxSocketBuffer()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCongestionControl()">NormSetCongestionControl()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCongestionControl()">NormSetCongestionControl()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRateBounds()">NormSetTransmitRateBounds()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRateBounds()">NormSetTransmitRateBounds()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetAutoParity()">NormSetAutoParity()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetAutoParity()">NormSetAutoParity()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetGrttEstimate()">NormSetGrttEstimate()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetGrttEstimate()">NormSetGrttEstimate()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormAddAckingNode()">NormAddAckingNode()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormAddAckingNode()">NormAddAckingNode()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormRemoveAckingNode()">NormRemoveAckingNode()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormRemoveAckingNode()">NormRemoveAckingNode()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileEnqueue()">NormFileEnqueue()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileEnqueue()">NormFileEnqueue()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataEnqueue()">NormDataEnqueue()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataEnqueue()">NormDataEnqueue()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamOpen()">NormStreamOpen()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamOpen()">NormStreamOpen()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamClose()">NormStreamClose()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamClose()">NormStreamClose()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamWrite()">NormStreamWrite()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamFlush()">NormStreamFlush()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamFlush()">NormStreamFlush()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetAutoFlush()">NormStreamSetAutoFlush()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetAutoFlush()">NormStreamSetAutoFlush()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetPushEnable()">NormStreamSetPushEnable()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetPushEnable()">NormStreamSetPushEnable()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamMarkEom()">NormStreamMarkEom()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamHasVacancy()">NormStreamHasVacancy()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetWatermark()">NormSetWatermark()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamMarkEom()">NormStreamMarkEom()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetWatermark()">NormSetWatermark()</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
Receiver Functions</B></FONT></P> Receiver Functions</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartReceiver()">NormStartReceiver()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartReceiver()">NormStartReceiver()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopReceiver()">NormStopReceiver()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopReceiver()">NormStopReceiver()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetRxSocketBuffer()">NormSetRxSocketBuffer()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetRxSocketBuffer()">NormSetRxSocketBuffer()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetSilentReceiver()">NormSetSilentReceiver()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetSilentReceiver()">NormSetSilentReceiver()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultUnicastNack()">NormSetDefaultUnicastNack()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultUnicastNack()">NormSetDefaultUnicastNack()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetUnicastNack()">NormNodeSetUnicastNack()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetUnicastNack()">NormNodeSetUnicastNack()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultNackingMode()">NormSetDefaultNackingMode()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultNackingMode()">NormSetDefaultNackingMode()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetNackingMode()">NormNodeSetNackingMode()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetNackingMode()">NormNodeSetNackingMode()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectSetNackingMode()">NormObjectSetNackingMode()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectSetNackingMode()">NormObjectSetNackingMode()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultRepairBoundary()">NormSetDefaultRepairBoundary()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultRepairBoundary()">NormSetDefaultRepairBoundary()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetRepairBoundary()">NormNodeSetRepairBoundary()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetRepairBoundary()">NormNodeSetRepairBoundary()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamRead()">NormStreamRead()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamRead()">NormStreamRead()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSeekMsgStart()">NormStreamSeekMsgStart()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSeekMsgStart()">NormStreamSeekMsgStart()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamGetReadOffset()">NormStreamGetReadOffset()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamGetReadOffset()">NormStreamGetReadOffset()</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
Object Functions</B></FONT></P> Object Functions</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetType()">NormObjectGetType()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetType()">NormObjectGetType()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHasInfo()">NormObjectHasInfo()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHasInfo()">NormObjectHasInfo()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfoLength()">NormObjectGetInfoLength()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfoLength()">NormObjectGetInfoLength()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfo()">NormObjectGetInfo()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfo()">NormObjectGetInfo()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSize()">NormObjectGetSize()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSize()">NormObjectGetSize()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectCancel()">NormObjectCancel()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectCancel()">NormObjectCancel()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRetain()">NormObjectRetain()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRetain()">NormObjectRetain()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRelease()">NormObjectRelease()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRelease()">NormObjectRelease()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileGetName()">NormFileGetName()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileGetName()">NormFileGetName()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileRename()">NormFileRename()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileRename()">NormFileRename()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataAccessData()">NormDataAccessData()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataAccessData()">NormDataAccessData()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataDetachData()">NormDataDetachData()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataDetachData()">NormDataDetachData()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSender()">NormObjectGetSender()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSender()">NormObjectGetSender()</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM <P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
Node Functions</B></FONT></P> Node Functions</B></FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeGetId()">NormNodeGetId()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeGetId()">NormNodeGetId()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRetain()">NormNodeRetain()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeGetAddress()">NormNodeGetAddress()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRelease()">NormNodeRelease()</A></FONT></P> <P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRetain()">NormNodeRetain()</A> </FONT></P>
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRelease()">NormNodeRelease()</A> </FONT></P>
</DIV> </DIV>
<H1 CLASS="western" STYLE="page-break-before: always">Overview</H1> <H1 CLASS="western" STYLE="page-break-before: always">Overview</H1>
<P CLASS="western" STYLE="font-style: normal">The NORM API has been <P CLASS="western" STYLE="font-style: normal">The NORM API has been
@ -1814,16 +1815,37 @@ limit.</P>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include <P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
&lt;normApi.h&gt;</FONT></FONT></P> &lt;normApi.h&gt;</FONT></FONT></P>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>bool <P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>bool
NormStreamClose(<A HREF="#NormObjectHandle">NormObjectHandle</A> streamHandle);</FONT></FONT></P> NormStreamClose(<A HREF="#NormObjectHandle">NormObjectHandle</A>
streamHandle,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graceful
= false);</FONT></FONT></P>
<H4 CLASS="western">Description</H4> <H4 CLASS="western">Description</H4>
<P CLASS="western" STYLE="font-style: normal">This function halts <P CLASS="western" STYLE="font-style: normal">This function halts
transfer of the stream specified by the <FONT FACE="Courier"><U>streamHandle</U></FONT> transfer of the stream specified by the <FONT FACE="Courier"><U>streamHandle</U></FONT>
parameter and releases any resources used unless the associated parameter and releases any resources used unless the associated
object has been explicitly retained by a call to <FONT FACE="Courier"><A HREF="#NormObjectRetain()">NormObjectRetain()</A></FONT>. object has been explicitly retained by a call to <FONT FACE="Courier"><A HREF="#NormObjectRetain()">NormObjectRetain()</A></FONT>.
This function is equivalent to the <FONT FACE="Courier"><A HREF="#NormObjectCancel()">NormObjectCancel()</A></FONT> No further calls to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT>
routine and may be used for sender or receiver streams. This will be successful for the given <FONT FACE="Courier"><U>streamHandle</U></FONT>.
alternative function is simply provided to compliment the The optional <FONT FACE="Courier"><U>graceful</U></FONT> parameter,
<FONT FACE="Courier"><A HREF="#NormStreamOpen()">NormStreamOpen()</A></FONT> call.</P> when set to a value of <FONT FACE="Courier"><I>true</I></FONT>, may
be used by NORM senders to initiate &quot;graceful&quot; shutdown of
a transmit stream. In this case, the sender application will be
notified that stream has (most likely) completed reliable transfer
via the <FONT FACE="Courier"><I>NORM_TX_OBJECT_PURGED</I></FONT>
notification upon completion of the graceful shutdown process. When
the <FONT FACE="Courier"><U>graceful</U></FONT> option is set,
receivers are notified of the stream end via a &quot;FLAG_STREAM_END&quot;
flag in NORM_DATA message (<I>Note the NRL NORM implementation uses a
portion of the </I><FONT FACE="Courier"><I>NORM_DATA::payload_reserved</I></FONT><I>
field for this purpose and proposes that this type of funtionality be
added to subsequent versions of the NORM protocol specification</I>)
and will receive a <FONT FACE="Courier"><I>NORM_RX_OBJECT_COMPLETED</I></FONT>
notification after all received stream content has been read.
Otherwise, the stream is immediately terminated, regardless of
receiver state. In this case, this function is equivalent to the
<FONT FACE="Courier"><A HREF="#NormObjectCancel()">NormObjectCancel()</A></FONT> routine and may be
used for sender or receiver streams. So, it is expected this
function (<FONT FACE="Courier"><A HREF="#NormStreamClose()">NormStreamClose()</A></FONT>) will
typically be used for transmit streams by NORM senders.</P>
<H4 CLASS="western">Return Values</H4> <H4 CLASS="western">Return Values</H4>
<P CLASS="western" STYLE="font-style: normal">This function has no <P CLASS="western" STYLE="font-style: normal">This function has no
return values.</P> return values.</P>
@ -1979,9 +2001,11 @@ streamHandle<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs
how the NORM API behaves when the application attempts to enqueue new how the NORM API behaves when the application attempts to enqueue new
stream data for transmission when the associated stream's transmit stream data for transmission when the associated stream's transmit
buffer is fully occupied with data pending original or repair buffer is fully occupied with data pending original or repair
transmission. By default, a call to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT> transmission. By default (<FONT FACE="Courier"><U>pushEnable</U></FONT>
will return a zero value under this condition, indicating it was == <FONT FACE="Courier"><I>false</I></FONT>), a call to
unable to enqueue the new data. However, if <FONT FACE="Courier"><U>pushEnable</U></FONT> <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT> will return a zero
value under this condition, indicating it was unable to enqueue the
new data. However, if <FONT FACE="Courier"><U>pushEnable</U></FONT>
is set to <FONT FACE="Courier"><I>true</I></FONT> for a given is set to <FONT FACE="Courier"><I>true</I></FONT> for a given
<FONT FACE="Courier"><U>streamHandle</U></FONT>, the NORM protocol <FONT FACE="Courier"><U>streamHandle</U></FONT>, the NORM protocol
engine will discard the oldest buffered stream data (even if it is engine will discard the oldest buffered stream data (even if it is
@ -1997,6 +2021,34 @@ current transmission rate and status of the reliable repair process.</P>
<H4 CLASS="western">Return Values</H4> <H4 CLASS="western">Return Values</H4>
<P CLASS="western" STYLE="font-style: normal">This function has no <P CLASS="western" STYLE="font-style: normal">This function has no
return values.</P> return values.</P>
<H3 CLASS="functionheading-western"><A NAME="NormStreamHasVacancy()">NormStreamHasVacancy()</A></H3>
<H4 CLASS="western">Synopsis</H4>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
&lt;normApi.h&gt;</FONT></FONT></P>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>bool
NormStreamHasVacancy(<A HREF="#NormObjectHandle">NormObjectHandle</A> streamHandle);</FONT></FONT></P>
<H4 CLASS="western">Description</H4>
<P CLASS="western" STYLE="font-style: normal">This function can be
used to query whether the transmit stream, specified by the
<FONT FACE="Courier"><U>streamHandle</U></FONT> parameter, has buffer
space available so that the application may successfully make a call
to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT>. Normally, a call
to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT> itself can be used
to make this determination, but this function can be useful when
&quot;push mode&quot; has been enabled (see the description of the
<FONT FACE="Courier"><A HREF="#NormStreamSetPushEnable()">NormStreamSetPushEnable()</A> </FONT>function) and
the application wants to avoid overwriting data previously written to
the stream that has not yet been transmitted. Note that when &quot;push
mode&quot; is enabled, a call to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT>
will always succeed, overwriting previously-enqueued data if
necessary. Normally, this function will return true after a
NORM_TX_QUEUE_VACANCY notification has been received for a given NORM
stream object.</P>
<H4 CLASS="western">Return Values</H4>
<P CLASS="western" STYLE="font-style: normal">This function returns a
value of <FONT FACE="Courier"><I>true</I></FONT> when there is
transmit buffer space to which the application may write and <FONT FACE="Courier"><I>false</I></FONT>
otherwise.</P>
<H3 CLASS="functionheading-western"><A NAME="NormStreamMarkEom()">NormStreamMarkEom()</A></H3> <H3 CLASS="functionheading-western"><A NAME="NormStreamMarkEom()">NormStreamMarkEom()</A></H3>
<H4 CLASS="western">Synopsis</H4> <H4 CLASS="western">Synopsis</H4>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include <P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
@ -2482,14 +2534,18 @@ notifications might not be posted until the application can has read
all available data.</P> all available data.</P>
<H4 CLASS="western">Return Values</H4> <H4 CLASS="western">Return Values</H4>
<P CLASS="western" STYLE="font-style: normal">This function normally <P CLASS="western" STYLE="font-style: normal">This function normally
returns a value of true. However, if a break in the integrity of the returns a value of <FONT FACE="Courier"><I>true</I></FONT>. However,
reliable received stream occurs, a value of false is returned to if a break in the integrity of the reliable received stream occurs
indicate the break. The application may continue to read from the (or the stream has been ended by the sender), a value of <FONT FACE="Courier"><I>false</I></FONT>
stream as the NORM protocol will automatically &quot;resync&quot; to is returned to indicate the break. Unless the stream has been ended
streams, even if network conditions are sufficiently poor that breaks (and the receiver application will receive <FONT FACE="Courier"><I>NORM_RX_OBJECT_COMPLETED</I></FONT>
in reliability occur. If such a &quot;break&quot; and &quot;resync&quot; notification for the stream in that case), the application may
occurs, the application may be able to leverage other NORM API calls continue to read from the stream as the NORM protocol will
such as <FONT FACE="Courier"><A HREF="#NormStreamSeekMsgStart()">NormStreamSeekMsgStart()</A></FONT> or automatically &quot;resync&quot; to streams, even if network
conditions are sufficiently poor that breaks in reliability occur.
If such a &quot;break&quot; and &quot;resync&quot; occurs, the
application may be able to leverage other NORM API calls such as
<FONT FACE="Courier"><A HREF="#NormStreamSeekMsgStart()">NormStreamSeekMsgStart()</A></FONT> or
<FONT FACE="Courier">NormStreamGetOffset()</FONT> if needed to <FONT FACE="Courier">NormStreamGetOffset()</FONT> if needed to
recover its alignment with received stream content. This depends recover its alignment with received stream content. This depends
upon the nature of the application and its stream content.</P> upon the nature of the application and its stream content.</P>
@ -2961,6 +3017,28 @@ specified <FONT FACE="Courier"><U>nodeHandle</U></FONT>. In the case
<FONT FACE="Courier"><U>nodeHandle</U></FONT> is equal to <FONT FACE="Courier"><U>nodeHandle</U></FONT> is equal to
<FONT FACE="Courier"><I>NORM_NODE_INVALID</I></FONT>, the return <FONT FACE="Courier"><I>NORM_NODE_INVALID</I></FONT>, the return
value will be <FONT FACE="Courier"><I>NORM_NODE_NONE</I></FONT>.</P> value will be <FONT FACE="Courier"><I>NORM_NODE_NONE</I></FONT>.</P>
<H3 CLASS="functionheading-western"><A NAME="NormNodeGetAddress()">NormNodeGetAddress()</A></H3>
<H4 CLASS="western">Synopsis</H4>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
&lt;normApi.h&gt;</FONT></FONT></P>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2><A HREF="#NormNodeId">NormNodeId</A>
NormNodeGetAddress(<A HREF="#NormNodeHandle">NormNodeHandle</A> nodeHandle)</FONT></FONT></P>
<H4 CLASS="western">Description</H4>
<P CLASS="western" STYLE="font-style: normal">This function retrieves
the <FONT FACE="Courier"><A HREF="#NormNodeId">NormNodeId</A></FONT> identifier for the remote
participant referenced by the given <FONT FACE="Courier"><U>nodeHandle</U></FONT>
value. The <A HREF="#NormNodeId">NormNodeId</A> is a 32-bit value used within the NORM
protocol to uniquely identify participants within a NORM session.
The participants identifiers are assigned by the application or
derived (by the NORM API code) from the host computers default IP
address.</P>
<H4 CLASS="western">Return Values</H4>
<P CLASS="western" STYLE="font-style: normal">This function returns
the <FONT FACE="Courier"><A HREF="#NormNodeId">NormNodeId</A></FONT> value associated with the
specified <FONT FACE="Courier"><U>nodeHandle</U></FONT>. In the case
<FONT FACE="Courier"><U>nodeHandle</U></FONT> is equal to
<FONT FACE="Courier"><I>NORM_NODE_INVALID</I></FONT>, the return
value will be <FONT FACE="Courier"><I>NORM_NODE_NONE</I></FONT>.</P>
<H3 CLASS="functionheading-western"><A NAME="NormNodeRetain()">NormNodeRetain()</A></H3> <H3 CLASS="functionheading-western"><A NAME="NormNodeRetain()">NormNodeRetain()</A></H3>
<H4 CLASS="western">Synopsis</H4> <H4 CLASS="western">Synopsis</H4>
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include <P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include

Binary file not shown.

113
README.md
View File

@ -1,24 +1,105 @@
NORM PRELIMINARY CODE RELEASE NORM SOURCE CODE RELEASE
The NORM code here is still preliminary but a functional "norm" AUTHORIZATION TO USE AND DISTRIBUTE
command-line application can be built which can send and receive
a set of files _or_ a stream piped to/from stdin/stdout. The command-
line options are not yet fully documented, but there is abbreviated "help"
available in the "norm" application. And many options are similar to the
preceding NRL MDP work (see http://mdp.pf.itd.nrl.navy.mil).
A _very_ preliminary user's guide for the "norm" demo app is now included. By receiving this distribution, you have agreed to the following
See the file "NormUserGuide.pdf" terms governing the use and redistribution of the prototype NRL
NORM software release written and developed by Brian Adamson and
Joe Macker:
A "normTest.cpp" program is now included which is a simple demonstration Redistribution and use in source and binary forms, with or without
(and active test code) of the evolving NORM API. When the API is modification, are permitted provided that:
further completed, I plan to provide a few different example applications
(file transfer, streaming, etc) which use the API.
The Win32 code is not yet as well-tested as the Unix version, but (1) source code distributions retain this paragraph in its entirety,
might be OK at this point. I will do more Win32 testing when I get
caught up on the API development and documentation. (2) distributions including binary code include this paragraph in
its entirety in the documentation or other materials provided
with the distribution, and
(3) all advertising materials mentioning features or use of this
software display the following acknowledgment:
"This product includes software written and developed
by Brian Adamson and Joe Macker of the Naval Research
Laboratory (NRL)."
The name of NRL, the name(s) of NRL employee(s), or any entity
of the United States Government may not be used to endorse or
promote products derived from this software, nor does the
inclusion of the NRL written and developed software directly or
indirectly suggest NRL or United States Government endorsement
of this product.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
---------------------------------------------------------------------
This is a release of the NRL MDP source code. For most
purposes, the authors would prefer that the code not be
re-distributed so that users will obtain the latest (and most
debugged/improved) release from the official NORM web site:
<http://norm.pf.itd.nrl.navy.mil>
SOURCE CODE
===========
The following items can be build from this source code release:
1) libnorm.a - static NORM library for Unix platforms, or
Norm.lib - static NORM protocol library for Win32 platforms
(These libraries can be used by applications using the NORM API.
The file "normApi.h" provides function prototypes for NORM API
calls and the included "Norm Developer's Guide" provides a
reference manual for NORM application development using this
API. Additional tutorial material and API usage examples will
be provided as additional documentation in the future)
2) norm (or norm.exe (WIN32) - command-line "demo" application
built from "common/normApp.cpp"
(The included "Norm User's Guide" provides a rough overview
of how to use this demo app. This document requires some
updating to be accurate and complete. This demo application
is useful for file transfers (and streaming on Unix))
3) normTest (or normTest.exe (WIN32)) - very simple test application
(The "normTest" application (see "common/normTest.cpp") is really
just a simple playground for preliminary testing of the NORM
API and does not do anything useful. But it does provide
a very simple example of NORM API usage. More sophisticated
(and better-documented) examples of NORM API usage will be
provided in the future.
OTHER FILES:
============
NormDeveloperGuide.pdf - PDF version of NORM Developer's Guide
(nice for printing)
NormDeveloperGuide.html - HTML version of NORM Developer's Guide
with Hyperlinked content
(nice for browsing)
NormUserGuide.pdf - Guide to "norm" demo app usage
VERSION.TXT - NORM version history notes
README.TXT - this file
NOTES:
======
The NORM code depends upon the current "Protolib" release. The NORM The NORM code depends upon the current "Protolib" release. The NORM
source code tarballs contain an appropriate release of "Protolib" as source code tarballs contain an appropriate release of "Protolib" as

View File

@ -1,5 +1,22 @@
NORM Version History NORM Version History
Version 1.3b2
=============
- Added "graceful" stream shutdown option to
NORM API via the NormStreamClose() call.
- Embedded FLAG_STREAM_END flag in "payload_reserved"
field of NORM_DATA messages. This is beyond
the current RFC 3940 spec for NORM, but probably
something to push for addition to the next revision
of the spec.
- Embedded equivalent FLAG_MSG_START in "payload_reserved"
field of NORM_DATA messages. This allows message
boundary recovery for streams upon FEC decoding.
Again, this is "beyond" the current NORM spec, but
probably a good idea (Other stream control functions
might use this field as well)
- Added Visual Studio .NET project files
Version 1.3b1 Version 1.3b1
============= =============
- Prevented pile-up of TX_QUEUE_VACANCY notifications - Prevented pile-up of TX_QUEUE_VACANCY notifications

View File

@ -214,6 +214,10 @@ void NormInstance::Notify(NormController::Event event,
class NormServerNode* server, class NormServerNode* server,
class NormObject* object) class NormObject* object)
{ {
// (TBD) set a limit on how many pending notifications
// we allow to queue up (it could be large and probably
// we could base it on how much memory space the pending
// notifications are allowed to consume.
Notification* n = notify_pool.RemoveHead(); Notification* n = notify_pool.RemoveHead();
if (!n) if (!n)
{ {
@ -385,10 +389,25 @@ void NormInstance::PurgeObjectNotifications(NormObjectHandle objectHandle)
Notification* next = notify_queue.GetHead(); Notification* next = notify_queue.GetHead();
while (next) while (next)
{ {
// TBD - return these to the pool?
if (objectHandle == next->event.object) if (objectHandle == next->event.object)
{
switch (next->event.type)
{
case RX_OBJECT_COMPLETED:
case TX_OBJECT_PURGED:
case RX_OBJECT_ABORTED:
((NormObject*)(next->event.object))->Release();
break;
default:
break;
}
next->event.type = NORM_EVENT_INVALID; next->event.type = NORM_EVENT_INVALID;
}
next = next->GetNext(); next = next->GetNext();
} }
// (TBD) if we put these in the pool, should we check that the queue has been emptied
// and possible reset event/fd
} // end NormInstance::PurgeObjectNotifications() } // end NormInstance::PurgeObjectNotifications()
// NormInstance::dispatcher MUST be suspended _before_ calling this // NormInstance::dispatcher MUST be suspended _before_ calling this
@ -426,8 +445,8 @@ bool NormInstance::GetNextEvent(NormEvent* theEvent)
GetErrorString()); GetErrorString());
} }
#else #else
char byte; char byte[32];
while (read(notify_fd[0], &byte, 1) > 0); // TBD - error check while (read(notify_fd[0], byte, 32) > 0); // TBD - error check
#endif // if/else WIN32/UNIX #endif // if/else WIN32/UNIX
} }
switch (n->event.type) switch (n->event.type)
@ -633,6 +652,7 @@ NormDescriptor NormGetDescriptor(NormInstanceHandle instanceHandle)
return NORM_DESCRIPTOR_INVALID; return NORM_DESCRIPTOR_INVALID;
} // end NormGetDescriptor() } // end NormGetDescriptor()
// (TBD) add a timeout option to this?
bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent) bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent)
{ {
bool result = false; bool result = false;
@ -721,7 +741,7 @@ const void* NormGetUserData(NormSessionHandle sessionHandle)
NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle) NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle)
{ {
NormSession* session = (NormSession*)sessionHandle; NormSession* session = (NormSession*)sessionHandle;
if (session) if (NULL != session)
return session->LocalNodeId(); return session->LocalNodeId();
else else
return NORM_NODE_NONE; return NORM_NODE_NONE;
@ -731,7 +751,7 @@ void NormSetTxPort(NormSessionHandle sessionHandle,
unsigned short txPort) unsigned short txPort)
{ {
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle); NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
if (instance) if (NULL != instance)
{ {
if (instance->dispatcher.SuspendThread()) if (instance->dispatcher.SuspendThread())
{ {
@ -747,7 +767,7 @@ bool NormSetMulticastInterface(NormSessionHandle sessionHandle,
{ {
bool result = false; bool result = false;
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle); NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
if (instance) if (NULL != instance)
{ {
if (instance->dispatcher.SuspendThread()) if (instance->dispatcher.SuspendThread())
{ {
@ -765,7 +785,7 @@ bool NormSetTTL(NormSessionHandle sessionHandle,
{ {
bool result = false; bool result = false;
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle); NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
if (instance) if (NULL != instance)
{ {
if (instance->dispatcher.SuspendThread()) if (instance->dispatcher.SuspendThread())
{ {
@ -924,10 +944,13 @@ void NormSetAutoParity(NormSessionHandle sessionHandle, unsigned char autoParity
void NormSetGrttEstimate(NormSessionHandle sessionHandle, void NormSetGrttEstimate(NormSessionHandle sessionHandle,
double grttEstimate) double grttEstimate)
{ {
// (TBD) suspend instance if timer reschedule is NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
// added to ServerSetGrtt() method. if (instance && instance->dispatcher.SuspendThread())
NormSession* session = (NormSession*)sessionHandle; {
if (session) session->ServerSetGrtt(grttEstimate); NormSession* session = (NormSession*)sessionHandle;
if (session) session->ServerSetGrtt(grttEstimate);
instance->dispatcher.ResumeThread();
}
} // end NormSetGrttEstimate() } // end NormSetGrttEstimate()
bool NormAddAckingNode(NormSessionHandle sessionHandle, bool NormAddAckingNode(NormSessionHandle sessionHandle,
@ -1017,9 +1040,26 @@ NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
return objectHandle; return objectHandle;
} // end NormStreamOpen() } // end NormStreamOpen()
void NormStreamClose(NormObjectHandle streamHandle) void NormStreamClose(NormObjectHandle streamHandle, bool graceful)
{ {
NormObjectCancel(streamHandle); NormStreamObject* stream =
static_cast<NormStreamObject*>((NormObject*)streamHandle);
if (NULL != stream)
{
if (graceful && (NULL == stream->GetServer()))
{
NormInstance* instance = NormInstance::GetInstanceFromObject(streamHandle);
if (instance && instance->dispatcher.SuspendThread())
{
stream->Close(true); // graceful stream closure
instance->dispatcher.ResumeThread();
}
}
else
{
NormObjectCancel(streamHandle);
}
}
} // end NormStreamClose() } // end NormStreamClose()
unsigned int NormStreamWrite(NormObjectHandle streamHandle, unsigned int NormStreamWrite(NormObjectHandle streamHandle,
@ -1075,6 +1115,20 @@ void NormStreamSetPushEnable(NormObjectHandle streamHandle, bool state)
if (stream) stream->SetPushMode(state); if (stream) stream->SetPushMode(state);
} // end NormStreamSetPushEnable() } // end NormStreamSetPushEnable()
bool NormStreamHasVacancy(NormObjectHandle streamHandle)
{
bool result = false;
NormInstance* instance = NormInstance::GetInstanceFromObject(streamHandle);
if (instance && instance->dispatcher.SuspendThread())
{
NormStreamObject* stream =
static_cast<NormStreamObject*>((NormObject*)streamHandle);
if (NULL != stream)
result = stream->HasVacancy();
instance->dispatcher.ResumeThread();
}
return result;
} // end NormStreamHasVacancy()
void NormStreamMarkEom(NormObjectHandle streamHandle) void NormStreamMarkEom(NormObjectHandle streamHandle)
{ {

View File

@ -219,7 +219,7 @@ bool NormDataEnqueue(const char* dataPtr,
NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle, NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
unsigned long bufferSize); unsigned long bufferSize);
void NormStreamClose(NormObjectHandle streamHandle); void NormStreamClose(NormObjectHandle streamHandle, bool graceful = false);
unsigned int NormStreamWrite(NormObjectHandle streamHandle, unsigned int NormStreamWrite(NormObjectHandle streamHandle,
const char* buffer, const char* buffer,
@ -235,6 +235,9 @@ void NormStreamSetAutoFlush(NormObjectHandle streamHandle,
void NormStreamSetPushEnable(NormObjectHandle streamHandle, void NormStreamSetPushEnable(NormObjectHandle streamHandle,
bool pushEnable); bool pushEnable);
bool NormStreamHasVacancy(NormObjectHandle streamHandle);
void NormStreamMarkEom(NormObjectHandle streamHandle); void NormStreamMarkEom(NormObjectHandle streamHandle);
bool NormSetWatermark(NormSessionHandle sessionHandle, bool NormSetWatermark(NormSessionHandle sessionHandle,

View File

@ -12,6 +12,10 @@
#ifdef UNIX #ifdef UNIX
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> // for "waitpid()" #include <sys/wait.h> // for "waitpid()"
#else
#ifndef _WIN32_WCE
#include <io.h> // for _mktmp()
#endif // _WIN32-WCE
#endif // UNIX #endif // UNIX
// Command-line application using Protolib EventDispatcher // Command-line application using Protolib EventDispatcher
@ -319,7 +323,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
{ {
CmdType type = CommandType(cmd); CmdType type = CommandType(cmd);
ASSERT(CMD_INVALID != type); ASSERT(CMD_INVALID != type);
unsigned int len = strlen(cmd); size_t len = strlen(cmd);
if ((CMD_ARG == type) && !val) if ((CMD_ARG == type) && !val)
{ {
DMSG(0, "NormApp::OnCommand(%s) missing argument\n", cmd); DMSG(0, "NormApp::OnCommand(%s) missing argument\n", cmd);
@ -339,7 +343,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
char buffer[8192]; char buffer[8192];
buffer[0] = '\0'; buffer[0] = '\0';
if (cmd) strncpy(buffer, cmd, 8191); if (cmd) strncpy(buffer, cmd, 8191);
unsigned int len = strlen(buffer); size_t len = strlen(buffer);
len = (len > 8191) ? 8191 : len; len = (len > 8191) ? 8191 : len;
if (val) if (val)
{ {
@ -412,7 +416,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
} }
else if (!strncmp("address", cmd, len)) else if (!strncmp("address", cmd, len))
{ {
unsigned int len = strlen(val); size_t len = strlen(val);
if (address) delete address; if (address) delete address;
if (!(address = new char[len+1])) if (!(address = new char[len+1]))
{ {
@ -630,7 +634,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
} }
else if (!strncmp("rxcachedir", cmd, len)) else if (!strncmp("rxcachedir", cmd, len))
{ {
unsigned int length = strlen(val); size_t length = strlen(val);
// Make sure there is a trailing PROTO_PATH_DELIMITER // Make sure there is a trailing PROTO_PATH_DELIMITER
if (PROTO_PATH_DELIMITER != val[length-1]) if (PROTO_PATH_DELIMITER != val[length-1])
length += 2; length += 2;
@ -774,7 +778,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
} }
else if (!strncmp("flush", cmd, len)) else if (!strncmp("flush", cmd, len))
{ {
int valLen = strlen(val); size_t valLen = strlen(val);
if (!strncmp("none", val, valLen)) if (!strncmp("none", val, valLen))
msg_flush_mode = NormStreamObject::FLUSH_NONE; msg_flush_mode = NormStreamObject::FLUSH_NONE;
else if (!strncmp("passive", val, valLen)) else if (!strncmp("passive", val, valLen))
@ -820,7 +824,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
NormApp::CmdType NormApp::CommandType(const char* cmd) NormApp::CmdType NormApp::CommandType(const char* cmd)
{ {
if (!cmd) return CMD_INVALID; if (!cmd) return CMD_INVALID;
unsigned int len = strlen(cmd); size_t len = strlen(cmd);
bool matched = false; bool matched = false;
CmdType type = CMD_INVALID; CmdType type = CMD_INVALID;
const char* const* nextCmd = cmd_list; const char* const* nextCmd = cmd_list;
@ -947,7 +951,7 @@ void NormApp::OnInputReady()
else else
{ {
input_length = 0; input_length = 0;
input_index += result; input_index += (unsigned int)result;
} }
} }
else else
@ -1196,7 +1200,7 @@ void NormApp::Notify(NormController::Event event,
// Rename rx file using newly received info // Rename rx file using newly received info
char fileName[PATH_MAX]; char fileName[PATH_MAX];
strncpy(fileName, rx_cache_path, PATH_MAX); strncpy(fileName, rx_cache_path, PATH_MAX);
UINT16 pathLen = strlen(rx_cache_path); UINT16 pathLen = (UINT16)strlen(rx_cache_path);
pathLen = MIN(pathLen, PATH_MAX); pathLen = MIN(pathLen, PATH_MAX);
UINT16 len = object->GetInfoLength(); UINT16 len = object->GetInfoLength();
len = MIN(len, (PATH_MAX - pathLen)); len = MIN(len, (PATH_MAX - pathLen));
@ -1327,7 +1331,7 @@ void NormApp::Notify(NormController::Event event,
size_t result = fwrite(output_buffer+put, sizeof(char), writeLength-put, output); size_t result = fwrite(output_buffer+put, sizeof(char), writeLength-put, output);
if (result) if (result)
{ {
put += result; put += (unsigned int)result;
} }
else else
{ {
@ -1413,9 +1417,9 @@ bool NormApp::OnIntervalTimeout(ProtoTimer& /*theTimer*/)
tx_repeat_clear = true; tx_repeat_clear = true;
char pathName[PATH_MAX]; char pathName[PATH_MAX];
tx_file_list.GetCurrentBasePath(pathName); tx_file_list.GetCurrentBasePath(pathName);
unsigned int len = strlen(pathName); size_t len = strlen(pathName);
len = MIN(len, PATH_MAX); len = MIN(len, PATH_MAX);
unsigned int maxLen = PATH_MAX - len; size_t maxLen = PATH_MAX - len;
char* ptr = fileName + len; char* ptr = fileName + len;
len = strlen(ptr); len = strlen(ptr);
len = MIN(len, maxLen); len = MIN(len, maxLen);
@ -1431,7 +1435,7 @@ bool NormApp::OnIntervalTimeout(ProtoTimer& /*theTimer*/)
char temp[PATH_MAX]; char temp[PATH_MAX];
strncpy(temp, fileNameInfo, len); strncpy(temp, fileNameInfo, len);
temp[len] = '\0'; temp[len] = '\0';
if (!session->QueueTxFile(fileName, fileNameInfo, len)) if (!session->QueueTxFile(fileName, fileNameInfo, (UINT16)len))
{ {
DMSG(0, "NormApp::OnIntervalTimeout() Error queuing tx file: %s\n", DMSG(0, "NormApp::OnIntervalTimeout() Error queuing tx file: %s\n",
fileName); fileName);

View File

@ -99,9 +99,9 @@ bool NormFile::Open(const char* thePath, int theFlags)
theFlags |= O_BINARY; theFlags |= O_BINARY;
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
if (theFlags & O_RDONLY) if (theFlags & O_RDONLY)
file_ptr = fopen(thePath, "r"); file_ptr = fopen(thePath, "rb");
else else
file_ptr = fopen(thePath, "w+"); file_ptr = fopen(thePath, "w+b");
if (NULL != file_ptr) if (NULL != file_ptr)
#else #else
// Allow sharing of read-only files but not of files being written // Allow sharing of read-only files but not of files being written

View File

@ -17,7 +17,8 @@
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#include <stdio.h> #include <stdio.h>
typedef fpos_t off_t; //typedef fpos_t off_t;
typedef long off_t;
#else #else
#include <sys/types.h> #include <sys/types.h>
#endif // if/else _WIN32_WCE #endif // if/else _WIN32_WCE
@ -37,7 +38,8 @@ enum
O_TRUNC = 0x02, O_TRUNC = 0x02,
O_RDONLY = 0x04, O_RDONLY = 0x04,
O_WRONLY = 0x08, O_WRONLY = 0x08,
O_RDWR = 0x10 O_RDWR = 0x10,
O_BINARY = 0x20
}; };
#endif // _WIN32_WCE #endif // _WIN32_WCE

View File

@ -65,7 +65,6 @@ bool NormMsg::InitFromBuffer(UINT16 msgLength)
default: default:
DMSG(0, "NormMsg::InitFromBuffer() recv'd unkown cmd flavor:%d\n", DMSG(0, "NormMsg::InitFromBuffer() recv'd unkown cmd flavor:%d\n",
((UINT8*)buffer)[NormCmdMsg::FLAVOR_OFFSET]); ((UINT8*)buffer)[NormCmdMsg::FLAVOR_OFFSET]);
ASSERT(0);
return false; return false;
} }
break; break;

View File

@ -11,7 +11,8 @@
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#include <stdio.h> #include <stdio.h>
typedef fpos_t off_t; //typedef fpos_t off_t;
typedef long off_t;
#else #else
#include <sys/types.h> // for off_t #include <sys/types.h> // for off_t
#endif // if/else _WIN32_WCE #endif // if/else _WIN32_WCE
@ -361,7 +362,8 @@ class NormMsg
{ {
const UINT32* currentBuffer = ext.GetBuffer(); const UINT32* currentBuffer = ext.GetBuffer();
UINT16 nextOffset = UINT16 nextOffset =
currentBuffer ? (currentBuffer - buffer + (ext.GetLength()/4)) : (header_length_base/4); (UINT16)(currentBuffer ? (currentBuffer - buffer + (ext.GetLength()/4)) :
(header_length_base/4));
bool result = (nextOffset < (header_length/4)); bool result = (nextOffset < (header_length/4));
ext.AttachBuffer(result ? (buffer+nextOffset) : (UINT32*)NULL); ext.AttachBuffer(result ? (buffer+nextOffset) : (UINT32*)NULL);
return result; return result;
@ -652,6 +654,25 @@ class NormDataMsg : public NormObjectMsg
// These routines are only applicable to messages containing NORM_OBJECT_STREAM content // These routines are only applicable to messages containing NORM_OBJECT_STREAM content
// Some static helper routines for reading/writing embedded payload length/offsets // Some static helper routines for reading/writing embedded payload length/offsets
static UINT16 GetStreamPayloadHeaderLength() {return (PAYLOAD_DATA_OFFSET);} static UINT16 GetStreamPayloadHeaderLength() {return (PAYLOAD_DATA_OFFSET);}
enum PayloadFlag
{
FLAG_STREAM_END = 0x01,
FLAG_MSG_START = 0x04
};
static bool StreamPayloadFlagIsSet(const char* payload,
PayloadFlag flag)
{
return (0 != (flag & ((UINT8*)payload)[PAYLOAD_FLAGS_OFFSET]));
}
static void ResetStreamPayloadFlags(char* payload)
{
((UINT8*)payload)[PAYLOAD_FLAGS_OFFSET] = 0;
}
static void SetStreamPayloadFlag(char* payload, PayloadFlag flag)
{
((UINT8*)payload)[PAYLOAD_FLAGS_OFFSET] |= flag;
}
static void WriteStreamPayloadLength(char* payload, UINT16 len) static void WriteStreamPayloadLength(char* payload, UINT16 len)
{ {
UINT16 temp16 = htons(len); UINT16 temp16 = htons(len);
@ -674,6 +695,8 @@ class NormDataMsg : public NormObjectMsg
memcpy(&temp32, payload+PAYLOAD_OFFSET_OFFSET, 4); memcpy(&temp32, payload+PAYLOAD_OFFSET_OFFSET, 4);
return (ntohl(temp32)); return (ntohl(temp32));
} }
private: private:
enum enum
@ -685,8 +708,9 @@ class NormDataMsg : public NormObjectMsg
}; };
enum enum
{ {
PAYLOAD_RESERVED_OFFSET = 0, PAYLOAD_FLAGS_OFFSET = 0,
PAYLOAD_LENGTH_OFFSET = PAYLOAD_RESERVED_OFFSET+2, PAYLOAD_RESERVED_OFFSET = PAYLOAD_FLAGS_OFFSET+1, // this is not in the NORM spec!
PAYLOAD_LENGTH_OFFSET = PAYLOAD_RESERVED_OFFSET+1,
PAYLOAD_OFFSET_OFFSET = PAYLOAD_LENGTH_OFFSET+2, PAYLOAD_OFFSET_OFFSET = PAYLOAD_LENGTH_OFFSET+2,
PAYLOAD_DATA_OFFSET = PAYLOAD_OFFSET_OFFSET+4 PAYLOAD_DATA_OFFSET = PAYLOAD_OFFSET_OFFSET+4
}; };

View File

@ -316,7 +316,7 @@ bool NormObject::ActivateRepairs()
if (GetFirstRepair(nextId)) if (GetFirstRepair(nextId))
{ {
NormBlockId lastId; NormBlockId lastId;
ASSERT(GetLastRepair(lastId)); GetLastRepair(lastId); // for debug output only
DMSG(6, "NormObject::ActivateRepairs() node>%lu obj>%hu activating blk>%lu->%lu block repairs ...\n", DMSG(6, "NormObject::ActivateRepairs() node>%lu obj>%hu activating blk>%lu->%lu block repairs ...\n",
LocalNodeId(), (UINT16)transport_id, (UINT32)nextId, (UINT32)lastId); LocalNodeId(), (UINT16)transport_id, (UINT32)nextId, (UINT32)lastId);
repairsActivated = true; repairsActivated = true;
@ -869,7 +869,7 @@ bool NormObject::AppendRepairRequest(NormNackMsg& nack,
while (iterating || (0 != consecutiveCount)) while (iterating || (0 != consecutiveCount))
{ {
NormBlockId lastId; NormBlockId lastId;
ASSERT(GetLastPending(lastId)); GetLastPending(lastId); // for debug output only
DMSG(6, "NormObject::AppendRepairRequest() node>%lu obj>%hu, blk>%lu->%lu (maxPending:%lu)\n", DMSG(6, "NormObject::AppendRepairRequest() node>%lu obj>%hu, blk>%lu->%lu (maxPending:%lu)\n",
LocalNodeId(), (UINT16)transport_id, LocalNodeId(), (UINT16)transport_id,
(UINT32)nextId, (UINT32)lastId, (UINT32)max_pending_block); (UINT32)nextId, (UINT32)lastId, (UINT32)max_pending_block);
@ -1164,8 +1164,21 @@ void NormObject::HandleObjectMessage(const NormObjectMsg& msg,
if (isSourceSymbol) if (isSourceSymbol)
{ {
block->DecrementErasureCount(); block->DecrementErasureCount();
if (WriteSegment(blockId, segmentId, data.GetPayload(), // This bit of code makes sure that NORM Protocol Version 1
data.FlagIsSet(NormObjectMsg::FLAG_MSG_START))) // use of FLAG_MSG_START is observed even when the equivalent (and better!)
// stream payload flag is not used.
if (IsStream())
{
if (data.FlagIsSet(NormObjectMsg::FLAG_MSG_START) &&
!NormDataMsg::StreamPayloadFlagIsSet(data.GetPayload(),
NormDataMsg::FLAG_MSG_START))
{
DMSG(0, "NormObject::HandleObjectMessage() setting missing FLAG_MSG_START\n");
NormDataMsg::SetStreamPayloadFlag((char*)data.GetPayload(), NormDataMsg::FLAG_MSG_START);
}
}
if (WriteSegment(blockId, segmentId, data.GetPayload()))
{ {
objectUpdated = true; objectUpdated = true;
// For statistics only (TBD) #ifdef NORM_DEBUG // For statistics only (TBD) #ifdef NORM_DEBUG
@ -1253,7 +1266,7 @@ void NormObject::HandleObjectMessage(const NormObjectMsg& msg,
NormSegmentId sid = server->GetErasureLoc(i); NormSegmentId sid = server->GetErasureLoc(i);
if (sid < numData) if (sid < numData)
{ {
if (WriteSegment(blockId, sid, block->GetSegment(sid), false)) if (WriteSegment(blockId, sid, block->GetSegment(sid)))
{ {
objectUpdated = true; objectUpdated = true;
// For statistics only (TBD) #ifdef NORM_DEBUG // For statistics only (TBD) #ifdef NORM_DEBUG
@ -1525,8 +1538,7 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg)
{ {
// Try to read data segment (Note "ReadSegment" copies in offset/length info also) // Try to read data segment (Note "ReadSegment" copies in offset/length info also)
char* buffer = data->AccessPayload(); char* buffer = data->AccessPayload();
bool msgStart = false; UINT16 payloadLength = ReadSegment(blockId, segmentId, buffer);
UINT16 payloadLength = ReadSegment(blockId, segmentId, buffer, &msgStart);
if (0 == payloadLength) if (0 == payloadLength)
{ {
// (TBD) deal with read error // (TBD) deal with read error
@ -1537,16 +1549,11 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg)
} }
data->SetPayloadLength(payloadLength); data->SetPayloadLength(payloadLength);
// Look for FLAG_MSG_START // Set FLAG_MSG_START as appropriated for NORM Protocol Version 1 compatibility
if (msgStart) if (IsStream())
{ {
data->SetFlag(NormObjectMsg::FLAG_MSG_START); if (NormDataMsg::StreamPayloadFlagIsSet(buffer, NormDataMsg::FLAG_MSG_START))
//DMSG(0, "read start segment len:%hu\n", ntohs(*((UINT16*)(buffer+2)))); data->SetFlag(NormObjectMsg::FLAG_MSG_START);
//DMSG(0, " message len:%hu\n", ntohs(*((UINT16*)(buffer+8))));
}
else
{
//DMSG(0, "non-start segment read ...\n");
} }
// Perform incremental FEC encoding as needed // Perform incremental FEC encoding as needed
@ -1826,8 +1833,7 @@ void NormFileObject::Close()
bool NormFileObject::WriteSegment(NormBlockId blockId, bool NormFileObject::WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* buffer, const char* buffer)
bool /*msgStart*/)
{ {
UINT16 len; UINT16 len;
if (blockId == final_block_id) if (blockId == final_block_id)
@ -1867,8 +1873,7 @@ bool NormFileObject::WriteSegment(NormBlockId blockId,
UINT16 NormFileObject::ReadSegment(NormBlockId blockId, UINT16 NormFileObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer)
bool* /*msgStart*/)
{ {
// Determine segment length from blockId::segmentId // Determine segment length from blockId::segmentId
UINT16 len; UINT16 len;
@ -2029,8 +2034,7 @@ void NormDataObject::Close()
bool NormDataObject::WriteSegment(NormBlockId blockId, bool NormDataObject::WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* buffer, const char* buffer)
bool /*msgStart*/)
{ {
if (NULL == data_ptr) if (NULL == data_ptr)
{ {
@ -2075,8 +2079,7 @@ bool NormDataObject::WriteSegment(NormBlockId blockId,
UINT16 NormDataObject::ReadSegment(NormBlockId blockId, UINT16 NormDataObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer)
bool* /*msgStart*/)
{ {
if (NULL == data_ptr) if (NULL == data_ptr)
{ {
@ -2191,15 +2194,29 @@ NormStreamObject::NormStreamObject(class NormSession& theSession,
const NormObjectId& objectId) const NormObjectId& objectId)
: NormObject(STREAM, theSession, theServer, objectId), : NormObject(STREAM, theSession, theServer, objectId),
stream_sync(false), sync_offset_valid(false), stream_sync(false), sync_offset_valid(false),
write_vacancy(false), posted_tx_queue_vacancy(false),
read_init(true),
flush_pending(false), msg_start(true), flush_pending(false), msg_start(true),
flush_mode(FLUSH_NONE), push_mode(false), flush_mode(FLUSH_NONE), push_mode(false),
stream_closing(false),
block_pool_threshold(0) block_pool_threshold(0)
{ {
} }
NormStreamObject::~NormStreamObject() NormStreamObject::~NormStreamObject()
{ {
Close(); Close();
tx_offset = write_offset = read_offset = 0;
NormBlock* b;
while ((b = stream_buffer.Find(stream_buffer.RangeLo())))
{
stream_buffer.Remove(b);
b->EmptyToPool(segment_pool);
block_pool.Put(b);
}
stream_buffer.Destroy();
segment_pool.Destroy();
block_pool.Destroy();
} }
bool NormStreamObject::Open(UINT32 bufferSize, bool NormStreamObject::Open(UINT32 bufferSize,
@ -2282,6 +2299,7 @@ bool NormStreamObject::Open(UINT32 bufferSize,
sync_offset_valid = false; sync_offset_valid = false;
flush_pending = false; flush_pending = false;
msg_start = true; msg_start = true;
stream_closing = false;
return true; return true;
} // end NormStreamObject::Open() } // end NormStreamObject::Open()
@ -2298,20 +2316,20 @@ bool NormStreamObject::Accept(UINT32 bufferSize, bool doubleBuffer)
} }
} // end NormStreamObject::Accept() } // end NormStreamObject::Accept()
void NormStreamObject::Close() void NormStreamObject::Close(bool graceful)
{ {
NormObject::Close(); if (graceful && (NULL == server))
tx_offset = write_offset = read_offset = 0;
NormBlock* b;
while ((b = stream_buffer.Find(stream_buffer.RangeLo())))
{ {
stream_buffer.Remove(b); stream_closing = true;
b->EmptyToPool(segment_pool); Terminate();
block_pool.Put(b); //SetFlushMode(FLUSH_ACTIVE);
//Flush();
}
else
{
NormObject::Close();
write_vacancy = false;
} }
stream_buffer.Destroy();
segment_pool.Destroy();
block_pool.Destroy();
} // end NormStreamObject::Close() } // end NormStreamObject::Close()
bool NormStreamObject::LockBlocks(NormBlockId firstId, NormBlockId lastId) bool NormStreamObject::LockBlocks(NormBlockId firstId, NormBlockId lastId)
@ -2451,8 +2469,7 @@ char* NormStreamObject::RetrieveSegment(NormBlockId blockId,
UINT16 NormStreamObject::ReadSegment(NormBlockId blockId, UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer)
bool* msgStart)
{ {
// (TBD) compare blockId with stream_buffer.RangeLo() and stream_buffer.RangeHi() // (TBD) compare blockId with stream_buffer.RangeLo() and stream_buffer.RangeHi()
NormBlock* block = stream_buffer.Find(blockId); NormBlock* block = stream_buffer.Find(blockId);
@ -2479,7 +2496,7 @@ UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
if (offsetDelta > 0) tx_offset = segmentOffset; if (offsetDelta > 0) tx_offset = segmentOffset;
// Only advertise vacancy if stream_buffer.RangeLo() is non-pending _and_ // Only advertise vacancy if stream_buffer.RangeLo() is non-pending _and_
// (write_offset - tx_offset) > streamBufferSize // (write_offset - tx_offset) < streamBufferSize
if (!write_vacancy) if (!write_vacancy)
{ {
offsetDelta = write_offset - tx_offset; offsetDelta = write_offset - tx_offset;
@ -2498,24 +2515,21 @@ UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
UINT16 segmentLength = NormDataMsg::ReadStreamPayloadLength(segment); UINT16 segmentLength = NormDataMsg::ReadStreamPayloadLength(segment);
ASSERT(segmentLength <= segment_size); ASSERT(segmentLength <= segment_size);
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
UINT16 payloadLength = segmentLength+NormDataMsg::GetStreamPayloadHeaderLength(); UINT16 payloadLength = segmentLength+NormDataMsg::GetStreamPayloadHeaderLength();
#ifdef SIMULATE #ifdef SIMULATE
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX); payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX);
UINT16 copyMax = MIN(payloadMax, payloadLength); UINT16 copyMax = MIN(payloadMax, payloadLength);
memcpy(buffer, segment, copyMax); memcpy(buffer, segment, copyMax);
#else #else
memcpy(buffer, segment, payloadLength); memcpy(buffer, segment, payloadLength);
#endif // SIMULATE #endif // SIMULATE
if (msgStart)
*msgStart = (0 != (NormDataMsg::FLAG_MSG_START & segment[payloadMax]));
return payloadLength; return payloadLength;
} // end NormStreamObject::ReadSegment() } // end NormStreamObject::ReadSegment()
bool NormStreamObject::WriteSegment(NormBlockId blockId, bool NormStreamObject::WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* segment, const char* segment)
bool msgStart)
{ {
UINT32 segmentOffset = NormDataMsg::ReadStreamPayloadOffset(segment); UINT32 segmentOffset = NormDataMsg::ReadStreamPayloadOffset(segment);
@ -2566,8 +2580,14 @@ bool NormStreamObject::WriteSegment(NormBlockId blockId,
read_index.block = block->GetId(); read_index.block = block->GetId();
block->GetFirstPending(read_index.segment); block->GetFirstPending(read_index.segment);
NormBlock* tempBlock = block; NormBlock* tempBlock = block;
UINT32 tempOffset = read_offset; UINT32 tempOffset = read_offset;
session.Notify(NormController::RX_OBJECT_UPDATED, server, this); // (TBD) uncomment the code so that only a single
// UPDATED notification is posted???
if (notify_on_update)
{
notify_on_update = false;
session.Notify(NormController::RX_OBJECT_UPDATED, server, this);
}
block = stream_buffer.Find(stream_buffer.RangeLo()); block = stream_buffer.Find(stream_buffer.RangeLo());
if (tempBlock == block) if (tempBlock == block)
{ {
@ -2631,15 +2651,12 @@ bool NormStreamObject::WriteSegment(NormBlockId blockId,
char* s = segment_pool.Get(); char* s = segment_pool.Get();
ASSERT(s != NULL); // for now, this should always succeed ASSERT(s != NULL); // for now, this should always succeed
UINT16 payloadLength = NormDataMsg::ReadStreamPayloadLength(segment) + NormDataMsg::GetStreamPayloadHeaderLength(); UINT16 payloadLength = NormDataMsg::ReadStreamPayloadLength(segment) + NormDataMsg::GetStreamPayloadHeaderLength();
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
#ifdef SIMULATE #ifdef SIMULATE
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax); payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax);
payloadLength = MIN(payloadMax, payloadLength); payloadLength = MIN(payloadMax, payloadLength);
#endif // SIMULATE #endif // SIMULATE
memcpy(s, segment, payloadLength); memcpy(s, segment, payloadLength);
// Store "msgStart" info at end of payload space
s[payloadMax] = msgStart ? NormDataMsg::FLAG_MSG_START : 0;
block->AttachSegment(segmentId, s); block->AttachSegment(segmentId, s);
block->SetPending(segmentId); block->SetPending(segmentId);
ASSERT(block->GetSegment(segmentId) == s); ASSERT(block->GetSegment(segmentId) == s);
@ -2690,10 +2707,16 @@ void NormStreamObject::Prune(NormBlockId blockId)
// Sequential (in order) read/write routines (TBD) Add a "Seek()" method // Sequential (in order) read/write routines (TBD) Add a "Seek()" method
bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStart) bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStart)
{ {
if (stream_closing)
{
DMSG(0, "NormStreamObject::Read() attempted to read from closed stream\n");
*buflen = 0;
return false;
}
Retain();
SetNotifyOnUpdate(true); // reset notification when streams are read SetNotifyOnUpdate(true); // reset notification when streams are read
unsigned int bytesRead = 0; unsigned int bytesRead = 0;
unsigned int bytesToRead = *buflen; unsigned int bytesToRead = *buflen;
//while (bytesToRead > 0)
do do
{ {
NormBlock* block = stream_buffer.Find(read_index.block); NormBlock* block = stream_buffer.Find(read_index.block);
@ -2703,6 +2726,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
*buflen = bytesRead; *buflen = bytesRead;
if (bytesRead > 0) if (bytesRead > 0)
{ {
Release();
return true; return true;
} }
else else
@ -2720,6 +2744,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
} }
else else
{ {
Release();
return findMsgStart ? false : true; return findMsgStart ? false : true;
} }
} }
@ -2735,6 +2760,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
*buflen = bytesRead; *buflen = bytesRead;
if (bytesRead > 0) if (bytesRead > 0)
{ {
Release();
return true; return true;
} }
else else
@ -2755,6 +2781,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
} }
else else
{ {
Release();
return findMsgStart ? false : true; return findMsgStart ? false : true;
} }
} }
@ -2769,12 +2796,13 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
LocalNodeId(), (UINT16)transport_id, (UINT32)read_index.block, read_index.segment, read_offset, segmentOffset); LocalNodeId(), (UINT16)transport_id, (UINT32)read_index.block, read_index.segment, read_offset, segmentOffset);
read_offset = segmentOffset; read_offset = segmentOffset;
*buflen = bytesRead; *buflen = bytesRead;
Release();
return false; return false;
} }
UINT32 index = read_offset - segmentOffset; UINT32 index = read_offset - segmentOffset;
UINT16 length = NormDataMsg::ReadStreamPayloadLength(segment); UINT16 length = NormDataMsg::ReadStreamPayloadLength(segment);
if (index >= length) if ((length > 0) && (index >= length))
{ {
DMSG(0, "NormStreamObject::Read() node>%lu obj>%hu blk>%lu seg>%hu mangled stream! index:%hu length:%hu " DMSG(0, "NormStreamObject::Read() node>%lu obj>%hu blk>%lu seg>%hu mangled stream! index:%hu length:%hu "
"read_offset:%lu segmentOffset:%lu\n", "read_offset:%lu segmentOffset:%lu\n",
@ -2782,6 +2810,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
read_offset = segmentOffset; read_offset = segmentOffset;
*buflen = bytesRead; *buflen = bytesRead;
ASSERT(0); ASSERT(0);
Release();
return false; return false;
} }
@ -2791,21 +2820,17 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
if (findMsgStart) if (findMsgStart)
{ {
bool msgStart; if ((0 != index) ||
if (0 != index) !NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_MSG_START))
{
msgStart = false;
}
else
{
UINT16 payloadMax = segment_size+NormDataMsg::GetStreamPayloadHeaderLength();
#ifdef SIMULATE
payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX);
#endif // if/else SIMULATE
msgStart = (NormObjectMsg::FLAG_MSG_START == segment[payloadMax]);
}
if (!msgStart)
{ {
// make sure msg start searches don't miss stream end ...
if (NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_STREAM_END))
{
DMSG(4, "NormStreamObject::Read() stream ended by sender 1\n");
session.Notify(NormController::RX_OBJECT_COMPLETED, server, this);
stream_closing = true;
server->DeleteObject(this);
}
// Don't bother managing individual segments since // Don't bother managing individual segments since
// stream buffers are exact multiples of block size! // stream buffers are exact multiples of block size!
//block->DetachSegment(read_index.segment); //block->DetachSegment(read_index.segment);
@ -2837,7 +2862,9 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
read_offset += count; read_offset += count;
bytesToRead -= count; bytesToRead -= count;
if (index >= length) if (index >= length)
{ {
bool streamEnded =
NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_STREAM_END);
// Don't bother managing individual segments since // Don't bother managing individual segments since
// stream buffers are multiples of block size! // stream buffers are multiples of block size!
// block->DetachSegment(read_index.segment); // block->DetachSegment(read_index.segment);
@ -2852,24 +2879,124 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
read_index.segment = 0; read_index.segment = 0;
Prune(read_index.block); Prune(read_index.block);
} }
if (streamEnded)
{
DMSG(4, "NormStreamObject::Read() stream ended by sender 2\n");
session.Notify(NormController::RX_OBJECT_COMPLETED, server, this);
stream_closing = true;
server->DeleteObject(this);
}
} }
} while (bytesToRead > 0); // end while (len > 0) } while (bytesToRead > 0); // end while (len > 0)
*buflen = bytesRead; *buflen = bytesRead;
Release();
return true; return true;
} // end NormStreamObject::Read() } // end NormStreamObject::Read()
void NormStreamObject::Terminate()
{
// If there's a pending buffer at our "write_index", mark it
// otherwise create a ZERO length segment to send
NormBlock* block = stream_buffer.Find(write_index.block);
if (!block)
{
if (!(block = block_pool.Get()))
{
block = stream_buffer.Find(stream_buffer.RangeLo());
ASSERT(block);
if (block->IsPending())
{
NormBlockId blockId = block->GetId();
pending_mask.Unset(blockId);
repair_mask.Unset(blockId);
NormBlock* b = FindBlock(blockId);
if (b)
{
block_buffer.Remove(b);
session.ServerPutFreeBlock(b);
}
if (!pending_mask.IsSet())
{
pending_mask.Set(write_index.block);
stream_next_id = write_index.block + 1;
}
}
stream_buffer.Remove(block);
block->EmptyToPool(segment_pool);
}
block->SetId(write_index.block);
block->ClearPending();
bool success = stream_buffer.Insert(block);
ASSERT(success);
} // end if (!block)
char* segment = block->GetSegment(write_index.segment);
if (!segment)
{
if (!(segment = segment_pool.Get()))
{
NormBlock* b = stream_buffer.Find(stream_buffer.RangeLo());
ASSERT(b != block);
if (b->IsPending())
{
NormBlockId blockId = b->GetId();
pending_mask.Unset(blockId);
repair_mask.Unset(blockId);
NormBlock* c = FindBlock(blockId);
if (c)
{
block_buffer.Remove(c);
session.ServerPutFreeBlock(c);
}
if (!pending_mask.IsSet())
{
pending_mask.Set(write_index.block);
stream_next_id = write_index.block + 1;
}
}
stream_buffer.Remove(b);
b->EmptyToPool(segment_pool);
block_pool.Put(b);
segment = segment_pool.Get();
ASSERT(segment);
}
NormDataMsg::WriteStreamPayloadOffset(segment, write_offset);
NormDataMsg::WriteStreamPayloadLength(segment, 0);
block->AttachSegment(write_index.segment, segment);
} // end if (!segment)
UINT16 index = NormDataMsg::ReadStreamPayloadLength(segment);
if (0 == index) NormDataMsg::ResetStreamPayloadFlags(segment);
NormDataMsg::SetStreamPayloadFlag(segment, NormDataMsg::FLAG_STREAM_END);
block->SetPending(write_index.segment);
if (++write_index.segment >= ndata)
{
write_index.block++;
write_index.segment = 0;
}
flush_pending = true;
session.TouchServer();
} // end NormStreamObject::Terminate()
UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom) UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
{ {
UINT32 nBytes = 0; UINT32 nBytes = 0;
do do
{ {
if (stream_closing)
{
if (0 != len)
{
DMSG(0, "NormStreamObject::Write() error: stream is closing\n");
len = 0;
}
break;
}
INT32 deltaOffset = write_offset - tx_offset; INT32 deltaOffset = write_offset - tx_offset;
ASSERT(deltaOffset >= 0); ASSERT(deltaOffset >= 0);
if (deltaOffset >= (INT32)object_size.LSB()) if (deltaOffset >= (INT32)object_size.LSB())
{ {
write_vacancy = false; write_vacancy = false;
DMSG(8, "NormStreamObject::Write() stream buffer full (1)\n", len, eom); DMSG(4, "NormStreamObject::Write() stream buffer full (1)\n", len, eom);
if (!push_mode) break; if (!push_mode) break;
} }
NormBlock* block = stream_buffer.Find(write_index.block); NormBlock* block = stream_buffer.Find(write_index.block);
@ -2913,7 +3040,7 @@ UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
bool success = stream_buffer.Insert(block); bool success = stream_buffer.Insert(block);
ASSERT(success); ASSERT(success);
} } // end if (!block)
char* segment = block->GetSegment(write_index.segment); char* segment = block->GetSegment(write_index.segment);
if (!segment) if (!segment)
{ {
@ -2956,24 +3083,19 @@ UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
NormDataMsg::WriteStreamPayloadOffset(segment, write_offset); NormDataMsg::WriteStreamPayloadOffset(segment, write_offset);
NormDataMsg::WriteStreamPayloadLength(segment, 0); NormDataMsg::WriteStreamPayloadLength(segment, 0);
block->AttachSegment(write_index.segment, segment); block->AttachSegment(write_index.segment, segment);
} } // end if (!segment)
UINT16 index = NormDataMsg::ReadStreamPayloadLength(segment); UINT16 index = NormDataMsg::ReadStreamPayloadLength(segment);
if (0 == index) if (0 == index)
{ {
char msgStartValue = 0; NormDataMsg::ResetStreamPayloadFlags(segment);
if (msg_start && len) if (msg_start && len)
{ {
ASSERT(0 == index); ASSERT(0 == index);
msgStartValue = NormObjectMsg::FLAG_MSG_START; NormDataMsg::SetStreamPayloadFlag(segment, NormDataMsg::FLAG_MSG_START);
msg_start = false; msg_start = false;
} }
UINT16 payloadMax = segment_size+NormDataMsg::GetStreamPayloadHeaderLength();
#ifdef SIMULATE
payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax);
#endif // SIMULATE
segment[payloadMax] = msgStartValue;
} }
else else
{ {
@ -3063,8 +3185,7 @@ bool NormSimObject::Open(UINT32 objectSize,
UINT16 NormSimObject::ReadSegment(NormBlockId blockId, UINT16 NormSimObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer)
bool* /*msgStart*/)
{ {
// Determine segment length // Determine segment length
UINT16 len; UINT16 len;

View File

@ -86,12 +86,11 @@ class NormObject
virtual bool WriteSegment(NormBlockId blockId, virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* buffer, const char* buffer) = 0;
bool msgStart) = 0;
virtual UINT16 ReadSegment(NormBlockId blockId, virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer) = 0;
bool* msgStart = NULL) = 0;
virtual char* RetrieveSegment(NormBlockId blockId, virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
@ -296,13 +295,12 @@ class NormFileObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId, virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* buffer, const char* buffer);
bool msgStart);
virtual UINT16 ReadSegment(NormBlockId blockId, virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer);
bool* msgStart = NULL);
virtual char* RetrieveSegment(NormBlockId blockId, virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
bool& tempRetrieval); bool& tempRetrieval);
@ -341,13 +339,11 @@ class NormDataObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId, virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* buffer, const char* buffer);
bool msgStart);
virtual UINT16 ReadSegment(NormBlockId blockId, virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer);
bool* msgStart = NULL);
virtual char* RetrieveSegment(NormBlockId blockId, virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
@ -375,7 +371,7 @@ class NormStreamObject : public NormObject
bool doubleBuffer = false, bool doubleBuffer = false,
const char* infoPtr = NULL, const char* infoPtr = NULL,
UINT16 infoLen = 0); UINT16 infoLen = 0);
void Close(); void Close(bool graceful = false);
bool Accept(UINT32 bufferSize, bool doubleBuffer = false); bool Accept(UINT32 bufferSize, bool doubleBuffer = false);
enum FlushMode enum FlushMode
@ -395,6 +391,11 @@ class NormStreamObject : public NormObject
SetFlushMode(oldFlushMode); SetFlushMode(oldFlushMode);
} }
void SetPushMode(bool state) {push_mode = state;} void SetPushMode(bool state) {push_mode = state;}
bool IsClosing() {return stream_closing;}
bool HasVacancy()
{return (stream_closing ? false : write_vacancy);}
bool Read(char* buffer, unsigned int* buflen, bool findMsgStart = false); bool Read(char* buffer, unsigned int* buflen, bool findMsgStart = false);
UINT32 Write(const char* buffer, UINT32 len, bool eom = false); UINT32 Write(const char* buffer, UINT32 len, bool eom = false);
@ -412,12 +413,11 @@ class NormStreamObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId, virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* buffer, const char* buffer);
bool msgStart);
virtual UINT16 ReadSegment(NormBlockId blockId, virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer);
bool* msgStart = NULL);
virtual char* RetrieveSegment(NormBlockId blockId, virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
@ -453,7 +453,7 @@ class NormStreamObject : public NormObject
void ResetPostedTxQueueVacancy() {posted_tx_queue_vacancy = false;} void ResetPostedTxQueueVacancy() {posted_tx_queue_vacancy = false;}
private: private:
void Terminate();
class Index class Index
{ {
@ -484,6 +484,8 @@ class NormStreamObject : public NormObject
FlushMode flush_mode; FlushMode flush_mode;
bool push_mode; bool push_mode;
bool stream_closing;
// For threaded API purposes // For threaded API purposes
UINT32 block_pool_threshold; UINT32 block_pool_threshold;
}; // end class NormStreamObject }; // end class NormStreamObject
@ -507,13 +509,11 @@ class NormSimObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId, virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
const char* buffer, const char* buffer) {return true;}
bool msgStart) {return true;}
virtual UINT16 ReadSegment(NormBlockId blockId, virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,
char* buffer, char* buffer);
bool* msgStart = NULL);
virtual char* RetrieveSegment(NormBlockId blockId, virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId, NormSegmentId segmentId,

View File

@ -24,10 +24,10 @@ void NormPostProcessor::GetCommand(char* buffer, unsigned int buflen)
while (buflen && (i < process_argc)) while (buflen && (i < process_argc))
{ {
strncpy(buffer, process_argv[i], buflen); strncpy(buffer, process_argv[i], buflen);
unsigned int len = strlen(process_argv[i]); size_t len = strlen(process_argv[i]);
if (len < buflen) if (len < buflen)
{ {
buflen -= len; buflen -= (unsigned int)len;
buffer += len; buffer += len;
} }
else else
@ -102,7 +102,7 @@ bool NormPostProcessor::SetCommand(const char* cmd)
{ {
const char* argStart = ptr; const char* argStart = ptr;
while (!isspace(*ptr) && ('\0' != *ptr)) ptr++; while (!isspace(*ptr) && ('\0' != *ptr)) ptr++;
unsigned int argLength = ptr - argStart; unsigned int argLength = (unsigned int)(ptr - argStart);
char* arg; char* arg;
if (!(arg = new char[argLength+1])) if (!(arg = new char[argLength+1]))
{ {

View File

@ -545,7 +545,7 @@ void NormSession::Serve()
else if (obj->IsStream()) else if (obj->IsStream())
{ {
// Is there room write to the stream // Is there room write to the stream
// should we post TX_QUEUE_VACANCY here?
} }
} }
else else
@ -554,7 +554,7 @@ void NormSession::Serve()
if (obj->IsStream()) if (obj->IsStream())
{ {
NormStreamObject* stream = static_cast<NormStreamObject*>(obj); NormStreamObject* stream = static_cast<NormStreamObject*>(obj);
if (stream->IsFlushPending()) if (stream->IsFlushPending() || stream->IsClosing())
{ {
// Queue flush message // Queue flush message
if (!flush_timer.IsActive()) if (!flush_timer.IsActive())
@ -567,6 +567,15 @@ void NormSession::Serve()
DMSG(6, "NormSession::Serve() node>%lu server flush complete ...\n", DMSG(6, "NormSession::Serve() node>%lu server flush complete ...\n",
LocalNodeId()); LocalNodeId());
flush_count++; flush_count++;
if (stream->IsClosing())
{
stream->Close();
stream->Retain();
Notify(NormController::TX_OBJECT_PURGED, (NormServerNode*)NULL, stream);
stream->Release();
DeleteTxObject(stream);
obj = NULL;
}
} }
} }
if (!posted_tx_queue_empty) if (!posted_tx_queue_empty)
@ -784,7 +793,7 @@ void NormSession::ServerQueueFlush()
flush->SetFecSymbolId(segmentId); flush->SetFecSymbolId(segmentId);
QueueMessage(flush); QueueMessage(flush);
flush_count++; flush_count++;
DMSG(0, "NormSession::ServerQueueFlush() node>%lu, flush queued (flush_count:%u)...\n", DMSG(4, "NormSession::ServerQueueFlush() node>%lu, flush queued (flush_count:%u)...\n",
LocalNodeId(), flush_count); LocalNodeId(), flush_count);
} }
else else
@ -1104,9 +1113,15 @@ void NormSession::TxSocketRecvHandler(ProtoSocket& /*theSocket*/,
msgLength, msgLength,
msg.AccessAddress())) msg.AccessAddress()))
{ {
msg.InitFromBuffer(msgLength); if (msg.InitFromBuffer(msgLength))
HandleReceiveMessage(msg, true); {
msgLength = NormMsg::MAX_SIZE; HandleReceiveMessage(msg, true);
msgLength = NormMsg::MAX_SIZE;
}
else
{
DMSG(0, "NormSession::TxSocketRecvHandler() warning: received bad message\n");
}
} }
} // end NormSession::TxSocketRecvHandler() } // end NormSession::TxSocketRecvHandler()
@ -1119,9 +1134,15 @@ void NormSession::RxSocketRecvHandler(ProtoSocket& /*theSocket*/,
msgLength, msgLength,
msg.AccessAddress())) msg.AccessAddress()))
{ {
msg.InitFromBuffer(msgLength); if (msg.InitFromBuffer(msgLength))
HandleReceiveMessage(msg, false); {
msgLength = NormMsg::MAX_SIZE; HandleReceiveMessage(msg, false);
msgLength = NormMsg::MAX_SIZE;
}
else
{
DMSG(0, "NormSession::RxSocketRecvHandler() warning: received bad message\n");
}
} }
} // end NormSession::RxSocketRecvHandler() } // end NormSession::RxSocketRecvHandler()
@ -1204,12 +1225,18 @@ void NormTrace(const struct timeval& currentTime,
(UINT16)data.GetObjectId(), (UINT16)data.GetObjectId(),
(UINT32)data.GetFecBlockId(), (UINT32)data.GetFecBlockId(),
(UINT16)data.GetFecSymbolId()); (UINT16)data.GetFecSymbolId());
if (data.IsData()) if (data.IsData() && data.IsStream())
{ {
UINT16 x; if (NormDataMsg::StreamPayloadFlagIsSet(data.GetPayload(), NormDataMsg::FLAG_MSG_START))
memcpy(&x, data.GetPayloadData(), 2); {
if (data.FlagIsSet(NormObjectMsg::FLAG_MSG_START)) // We usually use the first two bytes of "messages"
DMSG(0, "start byte>%hu ", ntohs(x)); // as a "message length" header
UINT16 x;
memcpy(&x, data.GetPayloadData(), 2);
DMSG(0, "start word>%hu ", ntohs(x));
}
if (NormDataMsg::StreamPayloadFlagIsSet(data.GetPayload(), NormDataMsg::FLAG_STREAM_END))
DMSG(0, "(stream end) ");
} }
break; break;
} }

View File

@ -1,4 +1,3 @@
////////////////////////////////////////////////////
// This is a test application for experimenting // This is a test application for experimenting
// with the NORM API implementation during its // with the NORM API implementation during its
// development. A better-documented and complete // development. A better-documented and complete
@ -9,14 +8,19 @@
#include "protokit.h" // for protolib debug, stuff, etc #include "protokit.h" // for protolib debug, stuff, etc
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> // for srand()
#ifdef UNIX #ifdef UNIX
#include <unistd.h> // for "sleep()" #include <unistd.h> // for "sleep()"
#endif // UNIX #endif // UNIX
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
printf("normTest starting ...\n"); printf("normTest starting ...\n");
SetDebugLevel(2);
NormInstanceHandle instance = NormCreateInstance(); NormInstanceHandle instance = NormCreateInstance();
@ -32,14 +36,21 @@ int main(int argc, char* argv[])
"224.1.2.3", "224.1.2.3",
6003, 6003,
NORM_NODE_ANY); NORM_NODE_ANY);
// Uncomment to turn on debug NORM message tracing
//NormSetMessageTrace(session, true);
// NOTE: These are debugging routines available (not for normal app use)
SetDebugLevel(2);
// Uncomment to turn on debug NORM message tracing
NormSetMessageTrace(session, true);
// Uncomment to turn on some random packet loss
//NormSetTxLoss(session, 1.0); // 10% packet loss //NormSetTxLoss(session, 1.0); // 10% packet loss
struct timeval currentTime;
ProtoSystemTime(currentTime);
// Uncomment to get different packet loss patterns from run to run
//srand(currentTime.tv_sec); // seed random number generator
NormSetGrttEstimate(session, 0.001); // 1 msec initial grtt NormSetGrttEstimate(session, 0.001); // 1 msec initial grtt
NormSetTransmitRate(session, 80.0e+06); // in bits/second NormSetTransmitRate(session, 60.0e+06); // in bits/second
NormSetDefaultRepairBoundary(session, NORM_BOUNDARY_BLOCK); NormSetDefaultRepairBoundary(session, NORM_BOUNDARY_BLOCK);
@ -77,8 +88,7 @@ int main(int argc, char* argv[])
// Uncomment this line to send a stream instead of the file // Uncomment this line to send a stream instead of the file
stream = NormStreamOpen(session, 4096*1024); stream = NormStreamOpen(session, 4096*1024);
// NORM_FLUSH_PASSIVE automatically flushes full writes to // NORM_FLUSH_PASSIVE automatically flushes full writes to
// the stream. // the stream.
NormStreamSetAutoFlush(stream, NORM_FLUSH_PASSIVE); NormStreamSetAutoFlush(stream, NORM_FLUSH_PASSIVE);
@ -95,7 +105,7 @@ int main(int argc, char* argv[])
int msgCount = 0; int msgCount = 0;
int recvCount = -1; // used to monitor reliable stream reception int recvCount = -1; // used to monitor reliable stream reception
int sendCount = 0; int sendCount = 0;
int sendMax = 200; int sendMax = 20;
NormEvent theEvent; NormEvent theEvent;
while (NormGetNextEvent(instance, &theEvent)) while (NormGetNextEvent(instance, &theEvent))
{ {
@ -105,7 +115,7 @@ int main(int argc, char* argv[])
// TRACE("NORM_TX_QUEUE_VACANCY ...\n"); // TRACE("NORM_TX_QUEUE_VACANCY ...\n");
case NORM_TX_QUEUE_EMPTY: case NORM_TX_QUEUE_EMPTY:
//TRACE("NORM_TX_QUEUE_EMPTY ...\n"); //TRACE("NORM_TX_QUEUE_EMPTY ...\n");
if (sendCount >= sendMax) break;
if (NORM_OBJECT_INVALID != stream) if (NORM_OBJECT_INVALID != stream)
{ {
// We loop here to keep stream buffer full .... // We loop here to keep stream buffer full ....
@ -134,6 +144,13 @@ int main(int argc, char* argv[])
NormStreamMarkEom(stream); NormStreamMarkEom(stream);
txLen = txIndex = 0; txLen = txIndex = 0;
sendCount++; sendCount++;
if (sendCount >= sendMax)
{
// Uncomment to gracefully shut down the stream
// after "sendMax" messages
//NormStreamClose(stream, true);
//keepWriting = false;
}
} }
} }
} }
@ -160,7 +177,7 @@ int main(int argc, char* argv[])
break; break;
case NORM_TX_OBJECT_PURGED: case NORM_TX_OBJECT_PURGED:
DMSG(3, "normTest: NORM_TX_OBJECT_PURGED event ...\n"); DMSG(2, "normTest: NORM_TX_OBJECT_PURGED event ...\n");
break; break;
case NORM_RX_OBJECT_NEW: case NORM_RX_OBJECT_NEW:
@ -186,8 +203,6 @@ int main(int argc, char* argv[])
if (!NormFileRename(theEvent.object, fileName)) if (!NormFileRename(theEvent.object, fileName))
TRACE("normTest: NormSetFileName(%s) error\n", fileName); TRACE("normTest: NormSetFileName(%s) error\n", fileName);
DMSG(3, "normTest: recv'd info for file: %s\n", fileName); DMSG(3, "normTest: recv'd info for file: %s\n", fileName);
} }
break; break;

View File

@ -32,6 +32,6 @@
#ifndef _NORM_VERSION #ifndef _NORM_VERSION
#define _NORM_VERSION #define _NORM_VERSION
#define VERSION "1.3b1" #define VERSION "1.3b2"
#endif // _NORM_VERSION #endif // _NORM_VERSION

Binary file not shown.

49
win32/Norm.sln Normal file
View File

@ -0,0 +1,49 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NormLib", "NormLib.vcproj", "{D7B0023C-8798-4918-8DA0-05C9054D70B9}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Protokit", "..\protolib\win32\Protokit.vcproj", "{50D1D52B-702A-49FE-B490-9104FC72598D}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "norm", "norm\norm.vcproj", "{6E1308A6-D40F-489E-A4F1-40D859380D64}"
ProjectSection(ProjectDependencies) = postProject
{50D1D52B-702A-49FE-B490-9104FC72598D} = {50D1D52B-702A-49FE-B490-9104FC72598D}
{D7B0023C-8798-4918-8DA0-05C9054D70B9} = {D7B0023C-8798-4918-8DA0-05C9054D70B9}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "normTest", "normTest.vcproj", "{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}"
ProjectSection(ProjectDependencies) = postProject
{50D1D52B-702A-49FE-B490-9104FC72598D} = {50D1D52B-702A-49FE-B490-9104FC72598D}
{D7B0023C-8798-4918-8DA0-05C9054D70B9} = {D7B0023C-8798-4918-8DA0-05C9054D70B9}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Debug.ActiveCfg = Debug|Win32
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Debug.Build.0 = Debug|Win32
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Release.ActiveCfg = Release|Win32
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Release.Build.0 = Release|Win32
{50D1D52B-702A-49FE-B490-9104FC72598D}.Debug.ActiveCfg = Debug|Win32
{50D1D52B-702A-49FE-B490-9104FC72598D}.Debug.Build.0 = Debug|Win32
{50D1D52B-702A-49FE-B490-9104FC72598D}.Release.ActiveCfg = Release|Win32
{50D1D52B-702A-49FE-B490-9104FC72598D}.Release.Build.0 = Release|Win32
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Debug.ActiveCfg = Debug|Win32
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Debug.Build.0 = Debug|Win32
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Release.ActiveCfg = Release|Win32
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Release.Build.0 = Release|Win32
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Debug.ActiveCfg = Debug|Win32
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Debug.Build.0 = Debug|Win32
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Release.ActiveCfg = Release|Win32
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

BIN
win32/Norm.suo Normal file

Binary file not shown.

327
win32/NormLib.vcproj Normal file
View File

@ -0,0 +1,327 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="NormLib"
ProjectGUID="{CEC5446E-BC6D-40B2-B496-78A211A9C1E6}"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\common,..\protolib\common,..\protolib\win32"
PreprocessorDefinitions="_DEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Debug/NormLib.pch"
AssemblerListingLocation=".\Debug/"
ObjectFile=".\Debug/"
ProgramDataBaseFileName=".\Debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile=".\Debug\NormLib.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\common,..\protolib\common,..\protolib\win32"
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB"
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Release/NormLib.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile=".\Release\NormLib.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\common\galois.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normApi.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normEncoder.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normFile.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normMessage.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normNode.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normObject.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normSegment.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
<File
RelativePath="..\common\normSession.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
AdditionalIncludeDirectories="..\win32"
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

230
win32/norm/norm.vcproj Normal file
View File

@ -0,0 +1,230 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="norm"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="0"
ImproveFloatingPointConsistency="TRUE"
AdditionalIncludeDirectories="..\..\common,..\..\protolib\common,..\..\protolib\win32"
PreprocessorDefinitions="_DEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_WINDOWS"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Debug/norm.pch"
AssemblerListingLocation=".\Debug/"
ObjectFile=".\Debug/"
ProgramDataBaseFileName=".\Debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
OutputFile=".\Debug/norm.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\Debug/norm.pdb"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\Debug/norm.tlb"
HeaderFileName=""/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/vmg"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\common,..\..\protolib\common,..\..\protolib\win32"
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_WINDOWS"
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Release/norm.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
BrowseInformation="1"
WarningLevel="3"
SuppressStartupBanner="TRUE"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
OutputFile=".\Release/norm.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
ProgramDatabaseFile=".\Release/norm.pdb"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="TRUE"
SuppressStartupBanner="TRUE"
TargetEnvironment="1"
TypeLibraryName=".\Release/norm.tlb"
HeaderFileName=""/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\..\common\normApp.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BrowseInformation="1"/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\common\normPostProcess.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BrowseInformation="1"/>
</FileConfiguration>
</File>
<File
RelativePath="..\win32PostProcess.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BrowseInformation="1"/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
</Filter>
<Filter
Name="Resource Files"
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -43,6 +43,7 @@ RSC=rc.exe
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\common" /I "..\protolib\common" /I "..\protolib\win32" /D "NDEBUG" /D "PROTO_DEBUG" /D "HAVE_IPV6" /D "HAVE_ASSERT" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "..\common" /I "..\protolib\common" /I "..\protolib\win32" /D "NDEBUG" /D "PROTO_DEBUG" /D "HAVE_IPV6" /D "HAVE_ASSERT" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# SUBTRACT CPP /Z<none>
# ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe

176
win32/normTest.vcproj Normal file
View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="normTest"
ProjectGUID="{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}"
SccProjectName=""
SccLocalPath="">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\Debug"
IntermediateDirectory=".\Debug"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\common,..\protolib\common,..\protolib\win32"
PreprocessorDefinitions="_DEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_CONSOLE"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Debug/normTest.pch"
AssemblerListingLocation=".\Debug/"
ObjectFile=".\Debug/"
ProgramDataBaseFileName=".\Debug/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="4"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
OutputFile=".\Debug/normTest.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\Debug/normTest.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
TypeLibraryName=".\Debug/normTest.tlb"
HeaderFileName=""/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\common,..\protolib\common,..\protolib\win32"
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_CONSOLE"
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="2"
PrecompiledHeaderFile=".\Release/normTest.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
WarningLevel="3"
SuppressStartupBanner="TRUE"
DebugInformationFormat="3"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
OutputFile=".\Release/normTest.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
ProgramDatabaseFile=".\Release/normTest.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
TypeLibraryName=".\Release/normTest.tlb"
HeaderFileName=""/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1033"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File
RelativePath="..\common\normTest.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl">
</Filter>
<Filter
Name="Resource Files"
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>