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="AUTHOR" CONTENT="Robert Adamson">
<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="KEYWORDS" CONTENT="norm object value application function ">
<STYLE>
@ -70,7 +70,7 @@ Engineering Task Force RFC 3940.</P>
<P CLASS="western" STYLE="font-style: normal">The NORM protocol is
designed to provide end-to-end reliable transport of bulk data
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
mechanisms to conduct reliable multicast sessions with limited &quot;a
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.
The protocol leverages the use of FEC-based repair and other proven
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">
<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.17in; font-style: normal"><FONT SIZE=2><B>API
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
Data Transport</B></FONT></P>
<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
Data Reception</FONT></P>
Data Reception </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
Event Notification</B></FONT></P>
<P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>API
Reference</B></FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
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="#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="#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="#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="#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="#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="#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="#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="#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="#NormEvent">NormEvent</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
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="#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="#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="#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="#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="#NormGetDescriptor()">NormGetDescriptor()</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>Session
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="#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="#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="#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="#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="#NormSetLoopback()">NormSetLoopback()</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="#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="#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="#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="#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-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
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="#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="#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="#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="#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="#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="#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="#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="#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="#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="#NormSetWatermark()">NormSetWatermark()</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="#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="#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="#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="#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="#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="#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="#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="#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="#NormStreamHasVacancy()">NormStreamHasVacancy()</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
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="#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="#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="#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="#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="#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="#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="#NormStreamGetReadOffset()">NormStreamGetReadOffset()</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="#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="#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="#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="#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="#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="#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-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
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="#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="#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="#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="#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="#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="#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="#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="#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="#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="#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="#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="#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="#NormObjectGetSender()">NormObjectGetSender()</A> </FONT></P>
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
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="#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>
<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="#NormNodeGetAddress()">NormNodeGetAddress()</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>
<H1 CLASS="western" STYLE="page-break-before: always">Overview</H1>
<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
&lt;normApi.h&gt;</FONT></FONT></P>
<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>
<P CLASS="western" STYLE="font-style: normal">This function halts
transfer of the stream specified by the <FONT FACE="Courier"><U>streamHandle</U></FONT>
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>.
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. This
alternative function is simply provided to compliment the
<FONT FACE="Courier"><A HREF="#NormStreamOpen()">NormStreamOpen()</A></FONT> call.</P>
No further calls to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT>
will be successful for the given <FONT FACE="Courier"><U>streamHandle</U></FONT>.
The optional <FONT FACE="Courier"><U>graceful</U></FONT> parameter,
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>
<P CLASS="western" STYLE="font-style: normal">This function has no
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
stream data for transmission when the associated stream's transmit
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>
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>
transmission. By default (<FONT FACE="Courier"><U>pushEnable</U></FONT>
== <FONT FACE="Courier"><I>false</I></FONT>), a call to
<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
<FONT FACE="Courier"><U>streamHandle</U></FONT>, the NORM protocol
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>
<P CLASS="western" STYLE="font-style: normal">This function has no
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>
<H4 CLASS="western">Synopsis</H4>
<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>
<H4 CLASS="western">Return Values</H4>
<P CLASS="western" STYLE="font-style: normal">This function normally
returns a value of true. However, if a break in the integrity of the
reliable received stream occurs, a value of false is returned to
indicate the break. The application may continue to read from the
stream as the NORM protocol will 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
returns a value of <FONT FACE="Courier"><I>true</I></FONT>. However,
if a break in the integrity of the reliable received stream occurs
(or the stream has been ended by the sender), a value of <FONT FACE="Courier"><I>false</I></FONT>
is returned to indicate the break. Unless the stream has been ended
(and the receiver application will receive <FONT FACE="Courier"><I>NORM_RX_OBJECT_COMPLETED</I></FONT>
notification for the stream in that case), the application may
continue to read from the stream as the NORM protocol will
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
recover its alignment with received stream content. This depends
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"><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="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>
<H4 CLASS="western">Synopsis</H4>
<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"
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).
AUTHORIZATION TO USE AND DISTRIBUTE
A _very_ preliminary user's guide for the "norm" demo app is now included.
See the file "NormUserGuide.pdf"
By receiving this distribution, you have agreed to the following
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
(and active test code) of the evolving NORM API. When the API is
further completed, I plan to provide a few different example applications
(file transfer, streaming, etc) which use the API.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that:
The Win32 code is not yet as well-tested as the Unix version, but
might be OK at this point. I will do more Win32 testing when I get
caught up on the API development and documentation.
(1) source code distributions retain this paragraph in its entirety,
(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
source code tarballs contain an appropriate release of "Protolib" as

View File

@ -1,5 +1,22 @@
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
=============
- Prevented pile-up of TX_QUEUE_VACANCY notifications

View File

@ -214,6 +214,10 @@ void NormInstance::Notify(NormController::Event event,
class NormServerNode* server,
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();
if (!n)
{
@ -385,10 +389,25 @@ void NormInstance::PurgeObjectNotifications(NormObjectHandle objectHandle)
Notification* next = notify_queue.GetHead();
while (next)
{
// TBD - return these to the pool?
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 = 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()
// NormInstance::dispatcher MUST be suspended _before_ calling this
@ -426,8 +445,8 @@ bool NormInstance::GetNextEvent(NormEvent* theEvent)
GetErrorString());
}
#else
char byte;
while (read(notify_fd[0], &byte, 1) > 0); // TBD - error check
char byte[32];
while (read(notify_fd[0], byte, 32) > 0); // TBD - error check
#endif // if/else WIN32/UNIX
}
switch (n->event.type)
@ -633,6 +652,7 @@ NormDescriptor NormGetDescriptor(NormInstanceHandle instanceHandle)
return NORM_DESCRIPTOR_INVALID;
} // end NormGetDescriptor()
// (TBD) add a timeout option to this?
bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent)
{
bool result = false;
@ -721,7 +741,7 @@ const void* NormGetUserData(NormSessionHandle sessionHandle)
NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle)
{
NormSession* session = (NormSession*)sessionHandle;
if (session)
if (NULL != session)
return session->LocalNodeId();
else
return NORM_NODE_NONE;
@ -731,7 +751,7 @@ void NormSetTxPort(NormSessionHandle sessionHandle,
unsigned short txPort)
{
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
if (instance)
if (NULL != instance)
{
if (instance->dispatcher.SuspendThread())
{
@ -747,7 +767,7 @@ bool NormSetMulticastInterface(NormSessionHandle sessionHandle,
{
bool result = false;
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
if (instance)
if (NULL != instance)
{
if (instance->dispatcher.SuspendThread())
{
@ -765,7 +785,7 @@ bool NormSetTTL(NormSessionHandle sessionHandle,
{
bool result = false;
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
if (instance)
if (NULL != instance)
{
if (instance->dispatcher.SuspendThread())
{
@ -924,10 +944,13 @@ void NormSetAutoParity(NormSessionHandle sessionHandle, unsigned char autoParity
void NormSetGrttEstimate(NormSessionHandle sessionHandle,
double grttEstimate)
{
// (TBD) suspend instance if timer reschedule is
// added to ServerSetGrtt() method.
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
if (instance && instance->dispatcher.SuspendThread())
{
NormSession* session = (NormSession*)sessionHandle;
if (session) session->ServerSetGrtt(grttEstimate);
instance->dispatcher.ResumeThread();
}
} // end NormSetGrttEstimate()
bool NormAddAckingNode(NormSessionHandle sessionHandle,
@ -1017,9 +1040,26 @@ NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
return objectHandle;
} // end NormStreamOpen()
void NormStreamClose(NormObjectHandle streamHandle)
void NormStreamClose(NormObjectHandle streamHandle, bool graceful)
{
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()
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
@ -1075,6 +1115,20 @@ void NormStreamSetPushEnable(NormObjectHandle streamHandle, bool state)
if (stream) stream->SetPushMode(state);
} // 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)
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,7 +11,8 @@
#ifdef _WIN32_WCE
#include <stdio.h>
typedef fpos_t off_t;
//typedef fpos_t off_t;
typedef long off_t;
#else
#include <sys/types.h> // for off_t
#endif // if/else _WIN32_WCE
@ -361,7 +362,8 @@ class NormMsg
{
const UINT32* currentBuffer = ext.GetBuffer();
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));
ext.AttachBuffer(result ? (buffer+nextOffset) : (UINT32*)NULL);
return result;
@ -652,6 +654,25 @@ class NormDataMsg : public NormObjectMsg
// These routines are only applicable to messages containing NORM_OBJECT_STREAM content
// Some static helper routines for reading/writing embedded payload length/offsets
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)
{
UINT16 temp16 = htons(len);
@ -675,6 +696,8 @@ class NormDataMsg : public NormObjectMsg
return (ntohl(temp32));
}
private:
enum
{
@ -685,8 +708,9 @@ class NormDataMsg : public NormObjectMsg
};
enum
{
PAYLOAD_RESERVED_OFFSET = 0,
PAYLOAD_LENGTH_OFFSET = PAYLOAD_RESERVED_OFFSET+2,
PAYLOAD_FLAGS_OFFSET = 0,
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_DATA_OFFSET = PAYLOAD_OFFSET_OFFSET+4
};

View File

@ -316,7 +316,7 @@ bool NormObject::ActivateRepairs()
if (GetFirstRepair(nextId))
{
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",
LocalNodeId(), (UINT16)transport_id, (UINT32)nextId, (UINT32)lastId);
repairsActivated = true;
@ -869,7 +869,7 @@ bool NormObject::AppendRepairRequest(NormNackMsg& nack,
while (iterating || (0 != consecutiveCount))
{
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",
LocalNodeId(), (UINT16)transport_id,
(UINT32)nextId, (UINT32)lastId, (UINT32)max_pending_block);
@ -1164,8 +1164,21 @@ void NormObject::HandleObjectMessage(const NormObjectMsg& msg,
if (isSourceSymbol)
{
block->DecrementErasureCount();
if (WriteSegment(blockId, segmentId, data.GetPayload(),
data.FlagIsSet(NormObjectMsg::FLAG_MSG_START)))
// This bit of code makes sure that NORM Protocol Version 1
// 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;
// For statistics only (TBD) #ifdef NORM_DEBUG
@ -1253,7 +1266,7 @@ void NormObject::HandleObjectMessage(const NormObjectMsg& msg,
NormSegmentId sid = server->GetErasureLoc(i);
if (sid < numData)
{
if (WriteSegment(blockId, sid, block->GetSegment(sid), false))
if (WriteSegment(blockId, sid, block->GetSegment(sid)))
{
objectUpdated = true;
// 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)
char* buffer = data->AccessPayload();
bool msgStart = false;
UINT16 payloadLength = ReadSegment(blockId, segmentId, buffer, &msgStart);
UINT16 payloadLength = ReadSegment(blockId, segmentId, buffer);
if (0 == payloadLength)
{
// (TBD) deal with read error
@ -1537,16 +1549,11 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg)
}
data->SetPayloadLength(payloadLength);
// Look for FLAG_MSG_START
if (msgStart)
// Set FLAG_MSG_START as appropriated for NORM Protocol Version 1 compatibility
if (IsStream())
{
if (NormDataMsg::StreamPayloadFlagIsSet(buffer, NormDataMsg::FLAG_MSG_START))
data->SetFlag(NormObjectMsg::FLAG_MSG_START);
//DMSG(0, "read start segment len:%hu\n", ntohs(*((UINT16*)(buffer+2))));
//DMSG(0, " message len:%hu\n", ntohs(*((UINT16*)(buffer+8))));
}
else
{
//DMSG(0, "non-start segment read ...\n");
}
// Perform incremental FEC encoding as needed
@ -1826,8 +1833,7 @@ void NormFileObject::Close()
bool NormFileObject::WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* buffer,
bool /*msgStart*/)
const char* buffer)
{
UINT16 len;
if (blockId == final_block_id)
@ -1867,8 +1873,7 @@ bool NormFileObject::WriteSegment(NormBlockId blockId,
UINT16 NormFileObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* /*msgStart*/)
char* buffer)
{
// Determine segment length from blockId::segmentId
UINT16 len;
@ -2029,8 +2034,7 @@ void NormDataObject::Close()
bool NormDataObject::WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* buffer,
bool /*msgStart*/)
const char* buffer)
{
if (NULL == data_ptr)
{
@ -2075,8 +2079,7 @@ bool NormDataObject::WriteSegment(NormBlockId blockId,
UINT16 NormDataObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* /*msgStart*/)
char* buffer)
{
if (NULL == data_ptr)
{
@ -2191,8 +2194,11 @@ NormStreamObject::NormStreamObject(class NormSession& theSession,
const NormObjectId& objectId)
: NormObject(STREAM, theSession, theServer, objectId),
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_mode(FLUSH_NONE), push_mode(false),
stream_closing(false),
block_pool_threshold(0)
{
}
@ -2200,6 +2206,17 @@ NormStreamObject::NormStreamObject(class NormSession& theSession,
NormStreamObject::~NormStreamObject()
{
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,
@ -2282,6 +2299,7 @@ bool NormStreamObject::Open(UINT32 bufferSize,
sync_offset_valid = false;
flush_pending = false;
msg_start = true;
stream_closing = false;
return true;
} // end NormStreamObject::Open()
@ -2298,20 +2316,20 @@ bool NormStreamObject::Accept(UINT32 bufferSize, bool doubleBuffer)
}
} // end NormStreamObject::Accept()
void NormStreamObject::Close()
void NormStreamObject::Close(bool graceful)
{
NormObject::Close();
tx_offset = write_offset = read_offset = 0;
NormBlock* b;
while ((b = stream_buffer.Find(stream_buffer.RangeLo())))
if (graceful && (NULL == server))
{
stream_buffer.Remove(b);
b->EmptyToPool(segment_pool);
block_pool.Put(b);
stream_closing = true;
Terminate();
//SetFlushMode(FLUSH_ACTIVE);
//Flush();
}
else
{
NormObject::Close();
write_vacancy = false;
}
stream_buffer.Destroy();
segment_pool.Destroy();
block_pool.Destroy();
} // end NormStreamObject::Close()
bool NormStreamObject::LockBlocks(NormBlockId firstId, NormBlockId lastId)
@ -2451,8 +2469,7 @@ char* NormStreamObject::RetrieveSegment(NormBlockId blockId,
UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* msgStart)
char* buffer)
{
// (TBD) compare blockId with stream_buffer.RangeLo() and stream_buffer.RangeHi()
NormBlock* block = stream_buffer.Find(blockId);
@ -2479,7 +2496,7 @@ UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
if (offsetDelta > 0) tx_offset = segmentOffset;
// Only advertise vacancy if stream_buffer.RangeLo() is non-pending _and_
// (write_offset - tx_offset) > streamBufferSize
// (write_offset - tx_offset) < streamBufferSize
if (!write_vacancy)
{
offsetDelta = write_offset - tx_offset;
@ -2498,24 +2515,21 @@ UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
UINT16 segmentLength = NormDataMsg::ReadStreamPayloadLength(segment);
ASSERT(segmentLength <= segment_size);
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
UINT16 payloadLength = segmentLength+NormDataMsg::GetStreamPayloadHeaderLength();
#ifdef SIMULATE
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX);
UINT16 copyMax = MIN(payloadMax, payloadLength);
memcpy(buffer, segment, copyMax);
#else
memcpy(buffer, segment, payloadLength);
#endif // SIMULATE
if (msgStart)
*msgStart = (0 != (NormDataMsg::FLAG_MSG_START & segment[payloadMax]));
return payloadLength;
} // end NormStreamObject::ReadSegment()
bool NormStreamObject::WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* segment,
bool msgStart)
const char* segment)
{
UINT32 segmentOffset = NormDataMsg::ReadStreamPayloadOffset(segment);
@ -2567,7 +2581,13 @@ bool NormStreamObject::WriteSegment(NormBlockId blockId,
block->GetFirstPending(read_index.segment);
NormBlock* tempBlock = block;
UINT32 tempOffset = read_offset;
// (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());
if (tempBlock == block)
{
@ -2631,15 +2651,12 @@ bool NormStreamObject::WriteSegment(NormBlockId blockId,
char* s = segment_pool.Get();
ASSERT(s != NULL); // for now, this should always succeed
UINT16 payloadLength = NormDataMsg::ReadStreamPayloadLength(segment) + NormDataMsg::GetStreamPayloadHeaderLength();
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
#ifdef SIMULATE
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax);
payloadLength = MIN(payloadMax, payloadLength);
#endif // SIMULATE
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->SetPending(segmentId);
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
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
unsigned int bytesRead = 0;
unsigned int bytesToRead = *buflen;
//while (bytesToRead > 0)
do
{
NormBlock* block = stream_buffer.Find(read_index.block);
@ -2703,6 +2726,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
*buflen = bytesRead;
if (bytesRead > 0)
{
Release();
return true;
}
else
@ -2720,6 +2744,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
}
else
{
Release();
return findMsgStart ? false : true;
}
}
@ -2735,6 +2760,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
*buflen = bytesRead;
if (bytesRead > 0)
{
Release();
return true;
}
else
@ -2755,6 +2781,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
}
else
{
Release();
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);
read_offset = segmentOffset;
*buflen = bytesRead;
Release();
return false;
}
UINT32 index = read_offset - segmentOffset;
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 "
"read_offset:%lu segmentOffset:%lu\n",
@ -2782,6 +2810,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
read_offset = segmentOffset;
*buflen = bytesRead;
ASSERT(0);
Release();
return false;
}
@ -2791,21 +2820,17 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
if (findMsgStart)
{
bool msgStart;
if (0 != index)
if ((0 != index) ||
!NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_MSG_START))
{
msgStart = false;
// 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);
}
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)
{
// Don't bother managing individual segments since
// stream buffers are exact multiples of block size!
//block->DetachSegment(read_index.segment);
@ -2838,6 +2863,8 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
bytesToRead -= count;
if (index >= length)
{
bool streamEnded =
NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_STREAM_END);
// Don't bother managing individual segments since
// stream buffers are multiples of block size!
// block->DetachSegment(read_index.segment);
@ -2852,24 +2879,124 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
read_index.segment = 0;
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)
*buflen = bytesRead;
Release();
return true;
} // 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 nBytes = 0;
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;
ASSERT(deltaOffset >= 0);
if (deltaOffset >= (INT32)object_size.LSB())
{
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;
}
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);
ASSERT(success);
}
} // end if (!block)
char* segment = block->GetSegment(write_index.segment);
if (!segment)
{
@ -2956,24 +3083,19 @@ UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
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)
{
char msgStartValue = 0;
NormDataMsg::ResetStreamPayloadFlags(segment);
if (msg_start && len)
{
ASSERT(0 == index);
msgStartValue = NormObjectMsg::FLAG_MSG_START;
NormDataMsg::SetStreamPayloadFlag(segment, NormDataMsg::FLAG_MSG_START);
msg_start = false;
}
UINT16 payloadMax = segment_size+NormDataMsg::GetStreamPayloadHeaderLength();
#ifdef SIMULATE
payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax);
#endif // SIMULATE
segment[payloadMax] = msgStartValue;
}
else
{
@ -3063,8 +3185,7 @@ bool NormSimObject::Open(UINT32 objectSize,
UINT16 NormSimObject::ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* /*msgStart*/)
char* buffer)
{
// Determine segment length
UINT16 len;

View File

@ -86,12 +86,11 @@ class NormObject
virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* buffer,
bool msgStart) = 0;
const char* buffer) = 0;
virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* msgStart = NULL) = 0;
char* buffer) = 0;
virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId,
@ -296,13 +295,12 @@ class NormFileObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* buffer,
bool msgStart);
const char* buffer);
virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* msgStart = NULL);
char* buffer);
virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId,
bool& tempRetrieval);
@ -341,13 +339,11 @@ class NormDataObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* buffer,
bool msgStart);
const char* buffer);
virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* msgStart = NULL);
char* buffer);
virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId,
@ -375,7 +371,7 @@ class NormStreamObject : public NormObject
bool doubleBuffer = false,
const char* infoPtr = NULL,
UINT16 infoLen = 0);
void Close();
void Close(bool graceful = false);
bool Accept(UINT32 bufferSize, bool doubleBuffer = false);
enum FlushMode
@ -396,6 +392,11 @@ class NormStreamObject : public NormObject
}
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);
UINT32 Write(const char* buffer, UINT32 len, bool eom = false);
@ -412,12 +413,11 @@ class NormStreamObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* buffer,
bool msgStart);
const char* buffer);
virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* msgStart = NULL);
char* buffer);
virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId,
@ -453,7 +453,7 @@ class NormStreamObject : public NormObject
void ResetPostedTxQueueVacancy() {posted_tx_queue_vacancy = false;}
private:
void Terminate();
class Index
{
@ -484,6 +484,8 @@ class NormStreamObject : public NormObject
FlushMode flush_mode;
bool push_mode;
bool stream_closing;
// For threaded API purposes
UINT32 block_pool_threshold;
}; // end class NormStreamObject
@ -507,13 +509,11 @@ class NormSimObject : public NormObject
virtual bool WriteSegment(NormBlockId blockId,
NormSegmentId segmentId,
const char* buffer,
bool msgStart) {return true;}
const char* buffer) {return true;}
virtual UINT16 ReadSegment(NormBlockId blockId,
NormSegmentId segmentId,
char* buffer,
bool* msgStart = NULL);
char* buffer);
virtual char* RetrieveSegment(NormBlockId blockId,
NormSegmentId segmentId,

View File

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

View File

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

View File

@ -1,4 +1,3 @@
////////////////////////////////////////////////////
// This is a test application for experimenting
// with the NORM API implementation during its
// development. A better-documented and complete
@ -9,6 +8,8 @@
#include "protokit.h" // for protolib debug, stuff, etc
#include <stdio.h>
#include <stdlib.h> // for srand()
#ifdef UNIX
#include <unistd.h> // for "sleep()"
#endif // UNIX
@ -16,7 +17,10 @@ int main(int argc, char* argv[])
{
printf("normTest starting ...\n");
SetDebugLevel(2);
NormInstanceHandle instance = NormCreateInstance();
@ -32,14 +36,21 @@ int main(int argc, char* argv[])
"224.1.2.3",
6003,
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
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
NormSetTransmitRate(session, 80.0e+06); // in bits/second
NormSetTransmitRate(session, 60.0e+06); // in bits/second
NormSetDefaultRepairBoundary(session, NORM_BOUNDARY_BLOCK);
@ -78,7 +89,6 @@ int main(int argc, char* argv[])
// Uncomment this line to send a stream instead of the file
stream = NormStreamOpen(session, 4096*1024);
// NORM_FLUSH_PASSIVE automatically flushes full writes to
// the stream.
NormStreamSetAutoFlush(stream, NORM_FLUSH_PASSIVE);
@ -95,7 +105,7 @@ int main(int argc, char* argv[])
int msgCount = 0;
int recvCount = -1; // used to monitor reliable stream reception
int sendCount = 0;
int sendMax = 200;
int sendMax = 20;
NormEvent theEvent;
while (NormGetNextEvent(instance, &theEvent))
{
@ -105,7 +115,7 @@ int main(int argc, char* argv[])
// TRACE("NORM_TX_QUEUE_VACANCY ...\n");
case NORM_TX_QUEUE_EMPTY:
//TRACE("NORM_TX_QUEUE_EMPTY ...\n");
if (sendCount >= sendMax) break;
if (NORM_OBJECT_INVALID != stream)
{
// We loop here to keep stream buffer full ....
@ -134,6 +144,13 @@ int main(int argc, char* argv[])
NormStreamMarkEom(stream);
txLen = txIndex = 0;
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;
case NORM_TX_OBJECT_PURGED:
DMSG(3, "normTest: NORM_TX_OBJECT_PURGED event ...\n");
DMSG(2, "normTest: NORM_TX_OBJECT_PURGED event ...\n");
break;
case NORM_RX_OBJECT_NEW:
@ -186,8 +203,6 @@ int main(int argc, char* argv[])
if (!NormFileRename(theEvent.object, fileName))
TRACE("normTest: NormSetFileName(%s) error\n", fileName);
DMSG(3, "normTest: recv'd info for file: %s\n", fileName);
}
break;

View File

@ -32,6 +32,6 @@
#ifndef _NORM_VERSION
#define _NORM_VERSION
#define VERSION "1.3b1"
#define VERSION "1.3b2"
#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 ""
# 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
# SUBTRACT CPP /Z<none>
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
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>