v1.3b2
parent
cca3e58c8b
commit
9c3ea04ba8
|
|
@ -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 "a
|
||||
priori" 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
|
||||
<normApi.h></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> bool 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 "graceful" 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 "FLAG_STREAM_END"
|
||||
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> &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
|
||||
<normApi.h></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
|
||||
"push mode" 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 "push
|
||||
mode" 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 "resync" to
|
||||
streams, even if network conditions are sufficiently poor that breaks
|
||||
in reliability occur. If such a "break" and "resync"
|
||||
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 "resync" to streams, even if network
|
||||
conditions are sufficiently poor that breaks in reliability occur.
|
||||
If such a "break" and "resync" 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
|
||||
<normApi.h></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
113
README.md
|
|
@ -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
|
||||
|
|
|
|||
17
VERSION.TXT
17
VERSION.TXT
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
NormSession* session = (NormSession*)sessionHandle;
|
||||
if (session) session->ServerSetGrtt(grttEstimate);
|
||||
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)
|
||||
{
|
||||
NormObjectCancel(streamHandle);
|
||||
NormStreamObject* stream =
|
||||
static_cast<NormStreamObject*>((NormObject*)streamHandle);
|
||||
if (NULL != stream)
|
||||
{
|
||||
if (graceful && (NULL == stream->GetServer()))
|
||||
{
|
||||
NormInstance* instance = NormInstance::GetInstanceFromObject(streamHandle);
|
||||
if (instance && instance->dispatcher.SuspendThread())
|
||||
{
|
||||
stream->Close(true); // graceful stream closure
|
||||
instance->dispatcher.ResumeThread();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NormObjectCancel(streamHandle);
|
||||
}
|
||||
}
|
||||
} // end NormStreamClose()
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -674,6 +695,8 @@ class NormDataMsg : public NormObjectMsg
|
|||
memcpy(&temp32, payload+PAYLOAD_OFFSET_OFFSET, 4);
|
||||
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
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
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");
|
||||
if (NormDataMsg::StreamPayloadFlagIsSet(buffer, NormDataMsg::FLAG_MSG_START))
|
||||
data->SetFlag(NormObjectMsg::FLAG_MSG_START);
|
||||
}
|
||||
|
||||
// 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,15 +2194,29 @@ 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)
|
||||
{
|
||||
}
|
||||
|
||||
NormStreamObject::~NormStreamObject()
|
||||
{
|
||||
Close();
|
||||
Close();
|
||||
tx_offset = write_offset = read_offset = 0;
|
||||
NormBlock* b;
|
||||
while ((b = stream_buffer.Find(stream_buffer.RangeLo())))
|
||||
{
|
||||
stream_buffer.Remove(b);
|
||||
b->EmptyToPool(segment_pool);
|
||||
block_pool.Put(b);
|
||||
}
|
||||
stream_buffer.Destroy();
|
||||
segment_pool.Destroy();
|
||||
block_pool.Destroy();
|
||||
}
|
||||
|
||||
bool NormStreamObject::Open(UINT32 bufferSize,
|
||||
|
|
@ -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
|
||||
#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);
|
||||
|
||||
|
|
@ -2566,8 +2580,14 @@ bool NormStreamObject::WriteSegment(NormBlockId blockId,
|
|||
read_index.block = block->GetId();
|
||||
block->GetFirstPending(read_index.segment);
|
||||
NormBlock* tempBlock = block;
|
||||
UINT32 tempOffset = read_offset;
|
||||
session.Notify(NormController::RX_OBJECT_UPDATED, server, this);
|
||||
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)
|
||||
{
|
||||
msgStart = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT16 payloadMax = segment_size+NormDataMsg::GetStreamPayloadHeaderLength();
|
||||
#ifdef SIMULATE
|
||||
payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX);
|
||||
#endif // if/else SIMULATE
|
||||
msgStart = (NormObjectMsg::FLAG_MSG_START == segment[payloadMax]);
|
||||
}
|
||||
if (!msgStart)
|
||||
if ((0 != index) ||
|
||||
!NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_MSG_START))
|
||||
{
|
||||
// make sure msg start searches don't miss stream end ...
|
||||
if (NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_STREAM_END))
|
||||
{
|
||||
DMSG(4, "NormStreamObject::Read() stream ended by sender 1\n");
|
||||
session.Notify(NormController::RX_OBJECT_COMPLETED, server, this);
|
||||
stream_closing = true;
|
||||
server->DeleteObject(this);
|
||||
}
|
||||
// Don't bother managing individual segments since
|
||||
// stream buffers are exact multiples of block size!
|
||||
//block->DetachSegment(read_index.segment);
|
||||
|
|
@ -2837,7 +2862,9 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
|||
read_offset += count;
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -395,6 +391,11 @@ class NormStreamObject : public NormObject
|
|||
SetFlushMode(oldFlushMode);
|
||||
}
|
||||
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,
|
||||
|
|
|
|||
|
|
@ -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]))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,9 +1113,15 @@ void NormSession::TxSocketRecvHandler(ProtoSocket& /*theSocket*/,
|
|||
msgLength,
|
||||
msg.AccessAddress()))
|
||||
{
|
||||
msg.InitFromBuffer(msgLength);
|
||||
HandleReceiveMessage(msg, true);
|
||||
msgLength = NormMsg::MAX_SIZE;
|
||||
if (msg.InitFromBuffer(msgLength))
|
||||
{
|
||||
HandleReceiveMessage(msg, true);
|
||||
msgLength = NormMsg::MAX_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DMSG(0, "NormSession::TxSocketRecvHandler() warning: received bad message\n");
|
||||
}
|
||||
}
|
||||
} // end NormSession::TxSocketRecvHandler()
|
||||
|
||||
|
|
@ -1119,9 +1134,15 @@ void NormSession::RxSocketRecvHandler(ProtoSocket& /*theSocket*/,
|
|||
msgLength,
|
||||
msg.AccessAddress()))
|
||||
{
|
||||
msg.InitFromBuffer(msgLength);
|
||||
HandleReceiveMessage(msg, false);
|
||||
msgLength = NormMsg::MAX_SIZE;
|
||||
if (msg.InitFromBuffer(msgLength))
|
||||
{
|
||||
HandleReceiveMessage(msg, false);
|
||||
msgLength = NormMsg::MAX_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DMSG(0, "NormSession::RxSocketRecvHandler() warning: received bad message\n");
|
||||
}
|
||||
}
|
||||
} // end NormSession::RxSocketRecvHandler()
|
||||
|
||||
|
|
@ -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())
|
||||
{
|
||||
UINT16 x;
|
||||
memcpy(&x, data.GetPayloadData(), 2);
|
||||
if (data.FlagIsSet(NormObjectMsg::FLAG_MSG_START))
|
||||
DMSG(0, "start byte>%hu ", ntohs(x));
|
||||
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);
|
||||
DMSG(0, "start word>%hu ", ntohs(x));
|
||||
}
|
||||
if (NormDataMsg::StreamPayloadFlagIsSet(data.GetPayload(), NormDataMsg::FLAG_STREAM_END))
|
||||
DMSG(0, "(stream end) ");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,14 +8,19 @@
|
|||
#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
|
||||
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);
|
||||
|
||||
|
|
@ -77,8 +88,7 @@ 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;
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,6 @@
|
|||
|
||||
#ifndef _NORM_VERSION
|
||||
#define _NORM_VERSION
|
||||
#define VERSION "1.3b1"
|
||||
#define VERSION "1.3b2"
|
||||
#endif // _NORM_VERSION
|
||||
|
||||
|
|
|
|||
BIN
win32/Norm.opt
BIN
win32/Norm.opt
Binary file not shown.
|
|
@ -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
|
||||
Binary file not shown.
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
Loading…
Reference in New Issue