v1.3b2
parent
cca3e58c8b
commit
9c3ea04ba8
|
|
@ -6,7 +6,7 @@
|
||||||
<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.2 (Linux)">
|
<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.2 (Linux)">
|
||||||
<META NAME="AUTHOR" CONTENT="Robert Adamson">
|
<META NAME="AUTHOR" CONTENT="Robert Adamson">
|
||||||
<META NAME="CREATED" CONTENT="20040824;15180000">
|
<META NAME="CREATED" CONTENT="20040824;15180000">
|
||||||
<META NAME="CHANGED" CONTENT="20050420;17075300">
|
<META NAME="CHANGED" CONTENT="20050427;11094100">
|
||||||
<META NAME="DESCRIPTION" CONTENT="NORM Object Functions 42
NORM Object Functions
NORM_OBJECT_STREAM
NORM Sender Functions 19
NORM Sender Functions
">
|
<META NAME="DESCRIPTION" CONTENT="NORM Object Functions 42
NORM Object Functions
NORM_OBJECT_STREAM
NORM Sender Functions 19
NORM Sender Functions
">
|
||||||
<META NAME="KEYWORDS" CONTENT="norm object value application function ">
|
<META NAME="KEYWORDS" CONTENT="norm object value application function ">
|
||||||
<STYLE>
|
<STYLE>
|
||||||
|
|
@ -70,7 +70,7 @@ Engineering Task Force RFC 3940.</P>
|
||||||
<P CLASS="western" STYLE="font-style: normal">The NORM protocol is
|
<P CLASS="western" STYLE="font-style: normal">The NORM protocol is
|
||||||
designed to provide end-to-end reliable transport of bulk data
|
designed to provide end-to-end reliable transport of bulk data
|
||||||
objects or streams over generic IP multicast routing and forwarding
|
objects or streams over generic IP multicast routing and forwarding
|
||||||
services. NORM uses a selective, negative acknowledgement (NACK)
|
services. NORM uses a selective, negative acknowledgment (NACK)
|
||||||
mechanism for transport reliability and offers additional protocol
|
mechanism for transport reliability and offers additional protocol
|
||||||
mechanisms to conduct reliable multicast sessions with limited "a
|
mechanisms to conduct reliable multicast sessions with limited "a
|
||||||
priori" coordination among senders and receivers. A congestion
|
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.
|
level transport protocols to utilize its service in different ways.
|
||||||
The protocol leverages the use of FEC-based repair and other proven
|
The protocol leverages the use of FEC-based repair and other proven
|
||||||
reliable multicast transport techniques in its design.</P>
|
reliable multicast transport techniques in its design.</P>
|
||||||
<H1 CLASS="western" ALIGN=CENTER STYLE="page-break-before: always">Contents</H1>
|
<H1 CLASS="western" ALIGN=CENTER STYLE="page-break-before: always">Table
|
||||||
|
of Contents</H1>
|
||||||
<DIV ID="Table of Contents1" DIR="LTR">
|
<DIV ID="Table of Contents1" DIR="LTR">
|
||||||
<P STYLE="margin-top: 0.25in; font-style: normal"><BR>
|
|
||||||
</P>
|
|
||||||
<P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>Overview</B></FONT></P>
|
<P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>Overview</B></FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
||||||
Initialization</B></FONT></P>
|
Initialization</B></FONT></P>
|
||||||
|
|
@ -96,101 +95,103 @@ reliable multicast transport techniques in its design.</P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
||||||
Data Transport</B></FONT></P>
|
Data Transport</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM
|
||||||
Data Transmission</FONT></P>
|
Data Transmission </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2>NORM
|
||||||
Data Reception</FONT></P>
|
Data Reception </FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
||||||
Event Notification</B></FONT></P>
|
Event Notification</B></FONT></P>
|
||||||
<P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>API
|
<P STYLE="margin-top: 0.25in; font-style: normal"><FONT FACE="Helvetica, sans-serif"><B>API
|
||||||
Reference</B></FONT></P>
|
Reference</B></FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
||||||
Variable Types and Constants</B></FONT></P>
|
Variable Types and Constants</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormInstanceHandle">NormInstanceHandle</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormInstanceHandle">NormInstanceHandle</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSessionHandle">NormSessionHandle</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSessionHandle">NormSessionHandle</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeHandle">NormNodeHandle</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeHandle">NormNodeHandle</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeId">NormNodeId</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeId">NormNodeId</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHandle">NormObjectHandle</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHandle">NormObjectHandle</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectType">NormObjectType</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectType">NormObjectType</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectTransportId">NormObjectTransportId</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectTransportId">NormObjectTransportId</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEventType">NormEventType</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEventType">NormEventType</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEvent">NormEvent</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormEvent">NormEvent</A> </FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>API
|
||||||
Initialization and Operation</B></FONT></P>
|
Initialization and Operation</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateInstance()">NormCreateInstance()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateInstance()">NormCreateInstance()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroyInstance()">NormDestroyInstance()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroyInstance()">NormDestroyInstance()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCacheDirectory()">NormSetCacheDirectory()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCacheDirectory()">NormSetCacheDirectory()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetNextEvent()">NormGetNextEvent()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetNextEvent()">NormGetNextEvent()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetDescriptor()">NormGetDescriptor()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetDescriptor()">NormGetDescriptor()</A> </FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>Session
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>Session
|
||||||
Creation and Control</B></FONT></P>
|
Creation and Control</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateSession()">NormCreateSession()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormCreateSession()">NormCreateSession()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroySession()">NormDestroySession()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDestroySession()">NormDestroySession()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetUserData()">NormSetUserData()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetUserData()">NormSetUserData()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetUserData()">NormGetUserData()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetUserData()">NormGetUserData()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetLocalNodeId()">NormGetLocalNodeId()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormGetLocalNodeId()">NormGetLocalNodeId()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxPort()">NormSetTxPort()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxPort()">NormSetTxPort()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetMulticastInterface()">NormSetMulticastInterface()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetMulticastInterface()">NormSetMulticastInterface()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTTL()">NormSetTTL()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTTL()">NormSetTTL()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTOS()">NormSetTOS()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTOS()">NormSetTOS()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetLoopback()">NormSetLoopback()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetLoopback()">NormSetLoopback()</A> </FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
||||||
Sender Functions</B></FONT></P>
|
Sender Functions</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartSender()">NormStartSender()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartSender()">NormStartSender()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopSender()">NormStopSender()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopSender()">NormStopSender()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRate()">NormSetTransmitRate()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRate()">NormSetTransmitRate()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxSocketBuffer()">NormSetTxSocketBuffer()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTxSocketBuffer()">NormSetTxSocketBuffer()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCongestionControl()">NormSetCongestionControl()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetCongestionControl()">NormSetCongestionControl()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRateBounds()">NormSetTransmitRateBounds()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetTransmitRateBounds()">NormSetTransmitRateBounds()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetAutoParity()">NormSetAutoParity()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetAutoParity()">NormSetAutoParity()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetGrttEstimate()">NormSetGrttEstimate()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetGrttEstimate()">NormSetGrttEstimate()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormAddAckingNode()">NormAddAckingNode()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormAddAckingNode()">NormAddAckingNode()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormRemoveAckingNode()">NormRemoveAckingNode()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormRemoveAckingNode()">NormRemoveAckingNode()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileEnqueue()">NormFileEnqueue()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileEnqueue()">NormFileEnqueue()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataEnqueue()">NormDataEnqueue()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataEnqueue()">NormDataEnqueue()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamOpen()">NormStreamOpen()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamOpen()">NormStreamOpen()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamClose()">NormStreamClose()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamClose()">NormStreamClose()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamWrite()">NormStreamWrite()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamFlush()">NormStreamFlush()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamFlush()">NormStreamFlush()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetAutoFlush()">NormStreamSetAutoFlush()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetAutoFlush()">NormStreamSetAutoFlush()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetPushEnable()">NormStreamSetPushEnable()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSetPushEnable()">NormStreamSetPushEnable()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamMarkEom()">NormStreamMarkEom()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamHasVacancy()">NormStreamHasVacancy()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetWatermark()">NormSetWatermark()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamMarkEom()">NormStreamMarkEom()</A> </FONT></P>
|
||||||
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetWatermark()">NormSetWatermark()</A> </FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
||||||
Receiver Functions</B></FONT></P>
|
Receiver Functions</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartReceiver()">NormStartReceiver()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStartReceiver()">NormStartReceiver()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopReceiver()">NormStopReceiver()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStopReceiver()">NormStopReceiver()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetRxSocketBuffer()">NormSetRxSocketBuffer()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetRxSocketBuffer()">NormSetRxSocketBuffer()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetSilentReceiver()">NormSetSilentReceiver()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetSilentReceiver()">NormSetSilentReceiver()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultUnicastNack()">NormSetDefaultUnicastNack()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultUnicastNack()">NormSetDefaultUnicastNack()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetUnicastNack()">NormNodeSetUnicastNack()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetUnicastNack()">NormNodeSetUnicastNack()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultNackingMode()">NormSetDefaultNackingMode()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultNackingMode()">NormSetDefaultNackingMode()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetNackingMode()">NormNodeSetNackingMode()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetNackingMode()">NormNodeSetNackingMode()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectSetNackingMode()">NormObjectSetNackingMode()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectSetNackingMode()">NormObjectSetNackingMode()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultRepairBoundary()">NormSetDefaultRepairBoundary()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormSetDefaultRepairBoundary()">NormSetDefaultRepairBoundary()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetRepairBoundary()">NormNodeSetRepairBoundary()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeSetRepairBoundary()">NormNodeSetRepairBoundary()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamRead()">NormStreamRead()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamRead()">NormStreamRead()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSeekMsgStart()">NormStreamSeekMsgStart()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamSeekMsgStart()">NormStreamSeekMsgStart()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamGetReadOffset()">NormStreamGetReadOffset()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormStreamGetReadOffset()">NormStreamGetReadOffset()</A> </FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
||||||
Object Functions</B></FONT></P>
|
Object Functions</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetType()">NormObjectGetType()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetType()">NormObjectGetType()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHasInfo()">NormObjectHasInfo()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectHasInfo()">NormObjectHasInfo()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfoLength()">NormObjectGetInfoLength()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfoLength()">NormObjectGetInfoLength()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfo()">NormObjectGetInfo()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetInfo()">NormObjectGetInfo()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSize()">NormObjectGetSize()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSize()">NormObjectGetSize()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectCancel()">NormObjectCancel()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectCancel()">NormObjectCancel()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRetain()">NormObjectRetain()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRetain()">NormObjectRetain()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRelease()">NormObjectRelease()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectRelease()">NormObjectRelease()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileGetName()">NormFileGetName()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileGetName()">NormFileGetName()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileRename()">NormFileRename()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormFileRename()">NormFileRename()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataAccessData()">NormDataAccessData()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataAccessData()">NormDataAccessData()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataDetachData()">NormDataDetachData()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormDataDetachData()">NormDataDetachData()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSender()">NormObjectGetSender()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormObjectGetSender()">NormObjectGetSender()</A> </FONT></P>
|
||||||
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
<P STYLE="margin-top: 0.17in; font-style: normal"><FONT SIZE=2><B>NORM
|
||||||
Node Functions</B></FONT></P>
|
Node Functions</B></FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeGetId()">NormNodeGetId()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeGetId()">NormNodeGetId()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRetain()">NormNodeRetain()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeGetAddress()">NormNodeGetAddress()</A> </FONT></P>
|
||||||
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRelease()">NormNodeRelease()</A></FONT></P>
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRetain()">NormNodeRetain()</A> </FONT></P>
|
||||||
|
<P STYLE="margin-left: 0.17in; margin-top: 0in; font-style: normal"><FONT SIZE=2><A HREF="#NormNodeRelease()">NormNodeRelease()</A> </FONT></P>
|
||||||
</DIV>
|
</DIV>
|
||||||
<H1 CLASS="western" STYLE="page-break-before: always">Overview</H1>
|
<H1 CLASS="western" STYLE="page-break-before: always">Overview</H1>
|
||||||
<P CLASS="western" STYLE="font-style: normal">The NORM API has been
|
<P CLASS="western" STYLE="font-style: normal">The NORM API has been
|
||||||
|
|
@ -1814,16 +1815,37 @@ limit.</P>
|
||||||
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
||||||
<normApi.h></FONT></FONT></P>
|
<normApi.h></FONT></FONT></P>
|
||||||
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>bool
|
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>bool
|
||||||
NormStreamClose(<A HREF="#NormObjectHandle">NormObjectHandle</A> streamHandle);</FONT></FONT></P>
|
NormStreamClose(<A HREF="#NormObjectHandle">NormObjectHandle</A>
|
||||||
|
streamHandle,<BR> bool graceful
|
||||||
|
= false);</FONT></FONT></P>
|
||||||
<H4 CLASS="western">Description</H4>
|
<H4 CLASS="western">Description</H4>
|
||||||
<P CLASS="western" STYLE="font-style: normal">This function halts
|
<P CLASS="western" STYLE="font-style: normal">This function halts
|
||||||
transfer of the stream specified by the <FONT FACE="Courier"><U>streamHandle</U></FONT>
|
transfer of the stream specified by the <FONT FACE="Courier"><U>streamHandle</U></FONT>
|
||||||
parameter and releases any resources used unless the associated
|
parameter and releases any resources used unless the associated
|
||||||
object has been explicitly retained by a call to <FONT FACE="Courier"><A HREF="#NormObjectRetain()">NormObjectRetain()</A></FONT>.
|
object has been explicitly retained by a call to <FONT FACE="Courier"><A HREF="#NormObjectRetain()">NormObjectRetain()</A></FONT>.
|
||||||
This function is equivalent to the <FONT FACE="Courier"><A HREF="#NormObjectCancel()">NormObjectCancel()</A></FONT>
|
No further calls to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT>
|
||||||
routine and may be used for sender or receiver streams. This
|
will be successful for the given <FONT FACE="Courier"><U>streamHandle</U></FONT>.
|
||||||
alternative function is simply provided to compliment the
|
The optional <FONT FACE="Courier"><U>graceful</U></FONT> parameter,
|
||||||
<FONT FACE="Courier"><A HREF="#NormStreamOpen()">NormStreamOpen()</A></FONT> call.</P>
|
when set to a value of <FONT FACE="Courier"><I>true</I></FONT>, may
|
||||||
|
be used by NORM senders to initiate "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>
|
<H4 CLASS="western">Return Values</H4>
|
||||||
<P CLASS="western" STYLE="font-style: normal">This function has no
|
<P CLASS="western" STYLE="font-style: normal">This function has no
|
||||||
return values.</P>
|
return values.</P>
|
||||||
|
|
@ -1979,9 +2001,11 @@ streamHandle<BR> &nbs
|
||||||
how the NORM API behaves when the application attempts to enqueue new
|
how the NORM API behaves when the application attempts to enqueue new
|
||||||
stream data for transmission when the associated stream's transmit
|
stream data for transmission when the associated stream's transmit
|
||||||
buffer is fully occupied with data pending original or repair
|
buffer is fully occupied with data pending original or repair
|
||||||
transmission. By default, a call to <FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT>
|
transmission. By default (<FONT FACE="Courier"><U>pushEnable</U></FONT>
|
||||||
will return a zero value under this condition, indicating it was
|
== <FONT FACE="Courier"><I>false</I></FONT>), a call to
|
||||||
unable to enqueue the new data. However, if <FONT FACE="Courier"><U>pushEnable</U></FONT>
|
<FONT FACE="Courier"><A HREF="#NormStreamWrite()">NormStreamWrite()</A></FONT> will return a zero
|
||||||
|
value under this condition, indicating it was unable to enqueue the
|
||||||
|
new data. However, if <FONT FACE="Courier"><U>pushEnable</U></FONT>
|
||||||
is set to <FONT FACE="Courier"><I>true</I></FONT> for a given
|
is set to <FONT FACE="Courier"><I>true</I></FONT> for a given
|
||||||
<FONT FACE="Courier"><U>streamHandle</U></FONT>, the NORM protocol
|
<FONT FACE="Courier"><U>streamHandle</U></FONT>, the NORM protocol
|
||||||
engine will discard the oldest buffered stream data (even if it is
|
engine will discard the oldest buffered stream data (even if it is
|
||||||
|
|
@ -1997,6 +2021,34 @@ current transmission rate and status of the reliable repair process.</P>
|
||||||
<H4 CLASS="western">Return Values</H4>
|
<H4 CLASS="western">Return Values</H4>
|
||||||
<P CLASS="western" STYLE="font-style: normal">This function has no
|
<P CLASS="western" STYLE="font-style: normal">This function has no
|
||||||
return values.</P>
|
return values.</P>
|
||||||
|
<H3 CLASS="functionheading-western"><A NAME="NormStreamHasVacancy()">NormStreamHasVacancy()</A></H3>
|
||||||
|
<H4 CLASS="western">Synopsis</H4>
|
||||||
|
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
||||||
|
<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>
|
<H3 CLASS="functionheading-western"><A NAME="NormStreamMarkEom()">NormStreamMarkEom()</A></H3>
|
||||||
<H4 CLASS="western">Synopsis</H4>
|
<H4 CLASS="western">Synopsis</H4>
|
||||||
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
||||||
|
|
@ -2482,14 +2534,18 @@ notifications might not be posted until the application can has read
|
||||||
all available data.</P>
|
all available data.</P>
|
||||||
<H4 CLASS="western">Return Values</H4>
|
<H4 CLASS="western">Return Values</H4>
|
||||||
<P CLASS="western" STYLE="font-style: normal">This function normally
|
<P CLASS="western" STYLE="font-style: normal">This function normally
|
||||||
returns a value of true. However, if a break in the integrity of the
|
returns a value of <FONT FACE="Courier"><I>true</I></FONT>. However,
|
||||||
reliable received stream occurs, a value of false is returned to
|
if a break in the integrity of the reliable received stream occurs
|
||||||
indicate the break. The application may continue to read from the
|
(or the stream has been ended by the sender), a value of <FONT FACE="Courier"><I>false</I></FONT>
|
||||||
stream as the NORM protocol will automatically "resync" to
|
is returned to indicate the break. Unless the stream has been ended
|
||||||
streams, even if network conditions are sufficiently poor that breaks
|
(and the receiver application will receive <FONT FACE="Courier"><I>NORM_RX_OBJECT_COMPLETED</I></FONT>
|
||||||
in reliability occur. If such a "break" and "resync"
|
notification for the stream in that case), the application may
|
||||||
occurs, the application may be able to leverage other NORM API calls
|
continue to read from the stream as the NORM protocol will
|
||||||
such as <FONT FACE="Courier"><A HREF="#NormStreamSeekMsgStart()">NormStreamSeekMsgStart()</A></FONT> or
|
automatically "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
|
<FONT FACE="Courier">NormStreamGetOffset()</FONT> if needed to
|
||||||
recover its alignment with received stream content. This depends
|
recover its alignment with received stream content. This depends
|
||||||
upon the nature of the application and its stream content.</P>
|
upon the nature of the application and its stream content.</P>
|
||||||
|
|
@ -2961,6 +3017,28 @@ specified <FONT FACE="Courier"><U>nodeHandle</U></FONT>. In the case
|
||||||
<FONT FACE="Courier"><U>nodeHandle</U></FONT> is equal to
|
<FONT FACE="Courier"><U>nodeHandle</U></FONT> is equal to
|
||||||
<FONT FACE="Courier"><I>NORM_NODE_INVALID</I></FONT>, the return
|
<FONT FACE="Courier"><I>NORM_NODE_INVALID</I></FONT>, the return
|
||||||
value will be <FONT FACE="Courier"><I>NORM_NODE_NONE</I></FONT>.</P>
|
value will be <FONT FACE="Courier"><I>NORM_NODE_NONE</I></FONT>.</P>
|
||||||
|
<H3 CLASS="functionheading-western"><A NAME="NormNodeGetAddress()">NormNodeGetAddress()</A></H3>
|
||||||
|
<H4 CLASS="western">Synopsis</H4>
|
||||||
|
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
||||||
|
<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>
|
<H3 CLASS="functionheading-western"><A NAME="NormNodeRetain()">NormNodeRetain()</A></H3>
|
||||||
<H4 CLASS="western">Synopsis</H4>
|
<H4 CLASS="western">Synopsis</H4>
|
||||||
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
<P STYLE="font-style: normal; page-break-after: avoid"><FONT FACE="Courier"><FONT SIZE=2>#include
|
||||||
|
|
|
||||||
Binary file not shown.
113
README.md
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"
|
AUTHORIZATION TO USE AND DISTRIBUTE
|
||||||
command-line application can be built which can send and receive
|
|
||||||
a set of files _or_ a stream piped to/from stdin/stdout. The command-
|
|
||||||
line options are not yet fully documented, but there is abbreviated "help"
|
|
||||||
available in the "norm" application. And many options are similar to the
|
|
||||||
preceding NRL MDP work (see http://mdp.pf.itd.nrl.navy.mil).
|
|
||||||
|
|
||||||
A _very_ preliminary user's guide for the "norm" demo app is now included.
|
By receiving this distribution, you have agreed to the following
|
||||||
See the file "NormUserGuide.pdf"
|
terms governing the use and redistribution of the prototype NRL
|
||||||
|
NORM software release written and developed by Brian Adamson and
|
||||||
|
Joe Macker:
|
||||||
|
|
||||||
A "normTest.cpp" program is now included which is a simple demonstration
|
Redistribution and use in source and binary forms, with or without
|
||||||
(and active test code) of the evolving NORM API. When the API is
|
modification, are permitted provided that:
|
||||||
further completed, I plan to provide a few different example applications
|
|
||||||
(file transfer, streaming, etc) which use the API.
|
|
||||||
|
|
||||||
The Win32 code is not yet as well-tested as the Unix version, but
|
(1) source code distributions retain this paragraph in its entirety,
|
||||||
might be OK at this point. I will do more Win32 testing when I get
|
|
||||||
caught up on the API development and documentation.
|
(2) distributions including binary code include this paragraph in
|
||||||
|
its entirety in the documentation or other materials provided
|
||||||
|
with the distribution, and
|
||||||
|
|
||||||
|
(3) all advertising materials mentioning features or use of this
|
||||||
|
software display the following acknowledgment:
|
||||||
|
|
||||||
|
"This product includes software written and developed
|
||||||
|
by Brian Adamson and Joe Macker of the Naval Research
|
||||||
|
Laboratory (NRL)."
|
||||||
|
|
||||||
|
The name of NRL, the name(s) of NRL employee(s), or any entity
|
||||||
|
of the United States Government may not be used to endorse or
|
||||||
|
promote products derived from this software, nor does the
|
||||||
|
inclusion of the NRL written and developed software directly or
|
||||||
|
indirectly suggest NRL or United States Government endorsement
|
||||||
|
of this product.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
This is a release of the NRL MDP source code. For most
|
||||||
|
purposes, the authors would prefer that the code not be
|
||||||
|
re-distributed so that users will obtain the latest (and most
|
||||||
|
debugged/improved) release from the official NORM web site:
|
||||||
|
|
||||||
|
<http://norm.pf.itd.nrl.navy.mil>
|
||||||
|
|
||||||
|
|
||||||
|
SOURCE CODE
|
||||||
|
===========
|
||||||
|
|
||||||
|
The following items can be build from this source code release:
|
||||||
|
|
||||||
|
1) libnorm.a - static NORM library for Unix platforms, or
|
||||||
|
|
||||||
|
Norm.lib - static NORM protocol library for Win32 platforms
|
||||||
|
|
||||||
|
(These libraries can be used by applications using the NORM API.
|
||||||
|
The file "normApi.h" provides function prototypes for NORM API
|
||||||
|
calls and the included "Norm Developer's Guide" provides a
|
||||||
|
reference manual for NORM application development using this
|
||||||
|
API. Additional tutorial material and API usage examples will
|
||||||
|
be provided as additional documentation in the future)
|
||||||
|
|
||||||
|
|
||||||
|
2) norm (or norm.exe (WIN32) - command-line "demo" application
|
||||||
|
built from "common/normApp.cpp"
|
||||||
|
|
||||||
|
(The included "Norm User's Guide" provides a rough overview
|
||||||
|
of how to use this demo app. This document requires some
|
||||||
|
updating to be accurate and complete. This demo application
|
||||||
|
is useful for file transfers (and streaming on Unix))
|
||||||
|
|
||||||
|
3) normTest (or normTest.exe (WIN32)) - very simple test application
|
||||||
|
|
||||||
|
(The "normTest" application (see "common/normTest.cpp") is really
|
||||||
|
just a simple playground for preliminary testing of the NORM
|
||||||
|
API and does not do anything useful. But it does provide
|
||||||
|
a very simple example of NORM API usage. More sophisticated
|
||||||
|
(and better-documented) examples of NORM API usage will be
|
||||||
|
provided in the future.
|
||||||
|
|
||||||
|
|
||||||
|
OTHER FILES:
|
||||||
|
============
|
||||||
|
|
||||||
|
NormDeveloperGuide.pdf - PDF version of NORM Developer's Guide
|
||||||
|
(nice for printing)
|
||||||
|
|
||||||
|
NormDeveloperGuide.html - HTML version of NORM Developer's Guide
|
||||||
|
with Hyperlinked content
|
||||||
|
(nice for browsing)
|
||||||
|
|
||||||
|
NormUserGuide.pdf - Guide to "norm" demo app usage
|
||||||
|
|
||||||
|
VERSION.TXT - NORM version history notes
|
||||||
|
|
||||||
|
README.TXT - this file
|
||||||
|
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
======
|
||||||
|
|
||||||
The NORM code depends upon the current "Protolib" release. The NORM
|
The NORM code depends upon the current "Protolib" release. The NORM
|
||||||
source code tarballs contain an appropriate release of "Protolib" as
|
source code tarballs contain an appropriate release of "Protolib" as
|
||||||
|
|
|
||||||
17
VERSION.TXT
17
VERSION.TXT
|
|
@ -1,5 +1,22 @@
|
||||||
NORM Version History
|
NORM Version History
|
||||||
|
|
||||||
|
Version 1.3b2
|
||||||
|
=============
|
||||||
|
- Added "graceful" stream shutdown option to
|
||||||
|
NORM API via the NormStreamClose() call.
|
||||||
|
- Embedded FLAG_STREAM_END flag in "payload_reserved"
|
||||||
|
field of NORM_DATA messages. This is beyond
|
||||||
|
the current RFC 3940 spec for NORM, but probably
|
||||||
|
something to push for addition to the next revision
|
||||||
|
of the spec.
|
||||||
|
- Embedded equivalent FLAG_MSG_START in "payload_reserved"
|
||||||
|
field of NORM_DATA messages. This allows message
|
||||||
|
boundary recovery for streams upon FEC decoding.
|
||||||
|
Again, this is "beyond" the current NORM spec, but
|
||||||
|
probably a good idea (Other stream control functions
|
||||||
|
might use this field as well)
|
||||||
|
- Added Visual Studio .NET project files
|
||||||
|
|
||||||
Version 1.3b1
|
Version 1.3b1
|
||||||
=============
|
=============
|
||||||
- Prevented pile-up of TX_QUEUE_VACANCY notifications
|
- Prevented pile-up of TX_QUEUE_VACANCY notifications
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,10 @@ void NormInstance::Notify(NormController::Event event,
|
||||||
class NormServerNode* server,
|
class NormServerNode* server,
|
||||||
class NormObject* object)
|
class NormObject* object)
|
||||||
{
|
{
|
||||||
|
// (TBD) set a limit on how many pending notifications
|
||||||
|
// we allow to queue up (it could be large and probably
|
||||||
|
// we could base it on how much memory space the pending
|
||||||
|
// notifications are allowed to consume.
|
||||||
Notification* n = notify_pool.RemoveHead();
|
Notification* n = notify_pool.RemoveHead();
|
||||||
if (!n)
|
if (!n)
|
||||||
{
|
{
|
||||||
|
|
@ -385,10 +389,25 @@ void NormInstance::PurgeObjectNotifications(NormObjectHandle objectHandle)
|
||||||
Notification* next = notify_queue.GetHead();
|
Notification* next = notify_queue.GetHead();
|
||||||
while (next)
|
while (next)
|
||||||
{
|
{
|
||||||
|
// TBD - return these to the pool?
|
||||||
if (objectHandle == next->event.object)
|
if (objectHandle == next->event.object)
|
||||||
|
{
|
||||||
|
switch (next->event.type)
|
||||||
|
{
|
||||||
|
case RX_OBJECT_COMPLETED:
|
||||||
|
case TX_OBJECT_PURGED:
|
||||||
|
case RX_OBJECT_ABORTED:
|
||||||
|
((NormObject*)(next->event.object))->Release();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
next->event.type = NORM_EVENT_INVALID;
|
next->event.type = NORM_EVENT_INVALID;
|
||||||
|
}
|
||||||
next = next->GetNext();
|
next = next->GetNext();
|
||||||
}
|
}
|
||||||
|
// (TBD) if we put these in the pool, should we check that the queue has been emptied
|
||||||
|
// and possible reset event/fd
|
||||||
} // end NormInstance::PurgeObjectNotifications()
|
} // end NormInstance::PurgeObjectNotifications()
|
||||||
|
|
||||||
// NormInstance::dispatcher MUST be suspended _before_ calling this
|
// NormInstance::dispatcher MUST be suspended _before_ calling this
|
||||||
|
|
@ -426,8 +445,8 @@ bool NormInstance::GetNextEvent(NormEvent* theEvent)
|
||||||
GetErrorString());
|
GetErrorString());
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
char byte;
|
char byte[32];
|
||||||
while (read(notify_fd[0], &byte, 1) > 0); // TBD - error check
|
while (read(notify_fd[0], byte, 32) > 0); // TBD - error check
|
||||||
#endif // if/else WIN32/UNIX
|
#endif // if/else WIN32/UNIX
|
||||||
}
|
}
|
||||||
switch (n->event.type)
|
switch (n->event.type)
|
||||||
|
|
@ -633,6 +652,7 @@ NormDescriptor NormGetDescriptor(NormInstanceHandle instanceHandle)
|
||||||
return NORM_DESCRIPTOR_INVALID;
|
return NORM_DESCRIPTOR_INVALID;
|
||||||
} // end NormGetDescriptor()
|
} // end NormGetDescriptor()
|
||||||
|
|
||||||
|
// (TBD) add a timeout option to this?
|
||||||
bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent)
|
bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent)
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
@ -721,7 +741,7 @@ const void* NormGetUserData(NormSessionHandle sessionHandle)
|
||||||
NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle)
|
NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle)
|
||||||
{
|
{
|
||||||
NormSession* session = (NormSession*)sessionHandle;
|
NormSession* session = (NormSession*)sessionHandle;
|
||||||
if (session)
|
if (NULL != session)
|
||||||
return session->LocalNodeId();
|
return session->LocalNodeId();
|
||||||
else
|
else
|
||||||
return NORM_NODE_NONE;
|
return NORM_NODE_NONE;
|
||||||
|
|
@ -731,7 +751,7 @@ void NormSetTxPort(NormSessionHandle sessionHandle,
|
||||||
unsigned short txPort)
|
unsigned short txPort)
|
||||||
{
|
{
|
||||||
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
|
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
|
||||||
if (instance)
|
if (NULL != instance)
|
||||||
{
|
{
|
||||||
if (instance->dispatcher.SuspendThread())
|
if (instance->dispatcher.SuspendThread())
|
||||||
{
|
{
|
||||||
|
|
@ -747,7 +767,7 @@ bool NormSetMulticastInterface(NormSessionHandle sessionHandle,
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
|
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
|
||||||
if (instance)
|
if (NULL != instance)
|
||||||
{
|
{
|
||||||
if (instance->dispatcher.SuspendThread())
|
if (instance->dispatcher.SuspendThread())
|
||||||
{
|
{
|
||||||
|
|
@ -765,7 +785,7 @@ bool NormSetTTL(NormSessionHandle sessionHandle,
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
|
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
|
||||||
if (instance)
|
if (NULL != instance)
|
||||||
{
|
{
|
||||||
if (instance->dispatcher.SuspendThread())
|
if (instance->dispatcher.SuspendThread())
|
||||||
{
|
{
|
||||||
|
|
@ -924,10 +944,13 @@ void NormSetAutoParity(NormSessionHandle sessionHandle, unsigned char autoParity
|
||||||
void NormSetGrttEstimate(NormSessionHandle sessionHandle,
|
void NormSetGrttEstimate(NormSessionHandle sessionHandle,
|
||||||
double grttEstimate)
|
double grttEstimate)
|
||||||
{
|
{
|
||||||
// (TBD) suspend instance if timer reschedule is
|
NormInstance* instance = NormInstance::GetInstanceFromSession(sessionHandle);
|
||||||
// added to ServerSetGrtt() method.
|
if (instance && instance->dispatcher.SuspendThread())
|
||||||
NormSession* session = (NormSession*)sessionHandle;
|
{
|
||||||
if (session) session->ServerSetGrtt(grttEstimate);
|
NormSession* session = (NormSession*)sessionHandle;
|
||||||
|
if (session) session->ServerSetGrtt(grttEstimate);
|
||||||
|
instance->dispatcher.ResumeThread();
|
||||||
|
}
|
||||||
} // end NormSetGrttEstimate()
|
} // end NormSetGrttEstimate()
|
||||||
|
|
||||||
bool NormAddAckingNode(NormSessionHandle sessionHandle,
|
bool NormAddAckingNode(NormSessionHandle sessionHandle,
|
||||||
|
|
@ -1017,9 +1040,26 @@ NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
|
||||||
return objectHandle;
|
return objectHandle;
|
||||||
} // end NormStreamOpen()
|
} // end NormStreamOpen()
|
||||||
|
|
||||||
void NormStreamClose(NormObjectHandle streamHandle)
|
void NormStreamClose(NormObjectHandle streamHandle, bool graceful)
|
||||||
{
|
{
|
||||||
NormObjectCancel(streamHandle);
|
NormStreamObject* stream =
|
||||||
|
static_cast<NormStreamObject*>((NormObject*)streamHandle);
|
||||||
|
if (NULL != stream)
|
||||||
|
{
|
||||||
|
if (graceful && (NULL == stream->GetServer()))
|
||||||
|
{
|
||||||
|
NormInstance* instance = NormInstance::GetInstanceFromObject(streamHandle);
|
||||||
|
if (instance && instance->dispatcher.SuspendThread())
|
||||||
|
{
|
||||||
|
stream->Close(true); // graceful stream closure
|
||||||
|
instance->dispatcher.ResumeThread();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NormObjectCancel(streamHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
} // end NormStreamClose()
|
} // end NormStreamClose()
|
||||||
|
|
||||||
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
|
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
|
||||||
|
|
@ -1075,6 +1115,20 @@ void NormStreamSetPushEnable(NormObjectHandle streamHandle, bool state)
|
||||||
if (stream) stream->SetPushMode(state);
|
if (stream) stream->SetPushMode(state);
|
||||||
} // end NormStreamSetPushEnable()
|
} // end NormStreamSetPushEnable()
|
||||||
|
|
||||||
|
bool NormStreamHasVacancy(NormObjectHandle streamHandle)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
NormInstance* instance = NormInstance::GetInstanceFromObject(streamHandle);
|
||||||
|
if (instance && instance->dispatcher.SuspendThread())
|
||||||
|
{
|
||||||
|
NormStreamObject* stream =
|
||||||
|
static_cast<NormStreamObject*>((NormObject*)streamHandle);
|
||||||
|
if (NULL != stream)
|
||||||
|
result = stream->HasVacancy();
|
||||||
|
instance->dispatcher.ResumeThread();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
} // end NormStreamHasVacancy()
|
||||||
|
|
||||||
void NormStreamMarkEom(NormObjectHandle streamHandle)
|
void NormStreamMarkEom(NormObjectHandle streamHandle)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -219,7 +219,7 @@ bool NormDataEnqueue(const char* dataPtr,
|
||||||
NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
|
NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
|
||||||
unsigned long bufferSize);
|
unsigned long bufferSize);
|
||||||
|
|
||||||
void NormStreamClose(NormObjectHandle streamHandle);
|
void NormStreamClose(NormObjectHandle streamHandle, bool graceful = false);
|
||||||
|
|
||||||
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
|
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
|
||||||
const char* buffer,
|
const char* buffer,
|
||||||
|
|
@ -235,6 +235,9 @@ void NormStreamSetAutoFlush(NormObjectHandle streamHandle,
|
||||||
void NormStreamSetPushEnable(NormObjectHandle streamHandle,
|
void NormStreamSetPushEnable(NormObjectHandle streamHandle,
|
||||||
bool pushEnable);
|
bool pushEnable);
|
||||||
|
|
||||||
|
|
||||||
|
bool NormStreamHasVacancy(NormObjectHandle streamHandle);
|
||||||
|
|
||||||
void NormStreamMarkEom(NormObjectHandle streamHandle);
|
void NormStreamMarkEom(NormObjectHandle streamHandle);
|
||||||
|
|
||||||
bool NormSetWatermark(NormSessionHandle sessionHandle,
|
bool NormSetWatermark(NormSessionHandle sessionHandle,
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,10 @@
|
||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h> // for "waitpid()"
|
#include <sys/wait.h> // for "waitpid()"
|
||||||
|
#else
|
||||||
|
#ifndef _WIN32_WCE
|
||||||
|
#include <io.h> // for _mktmp()
|
||||||
|
#endif // _WIN32-WCE
|
||||||
#endif // UNIX
|
#endif // UNIX
|
||||||
|
|
||||||
// Command-line application using Protolib EventDispatcher
|
// Command-line application using Protolib EventDispatcher
|
||||||
|
|
@ -319,7 +323,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
|
||||||
{
|
{
|
||||||
CmdType type = CommandType(cmd);
|
CmdType type = CommandType(cmd);
|
||||||
ASSERT(CMD_INVALID != type);
|
ASSERT(CMD_INVALID != type);
|
||||||
unsigned int len = strlen(cmd);
|
size_t len = strlen(cmd);
|
||||||
if ((CMD_ARG == type) && !val)
|
if ((CMD_ARG == type) && !val)
|
||||||
{
|
{
|
||||||
DMSG(0, "NormApp::OnCommand(%s) missing argument\n", cmd);
|
DMSG(0, "NormApp::OnCommand(%s) missing argument\n", cmd);
|
||||||
|
|
@ -339,7 +343,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
|
||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
buffer[0] = '\0';
|
buffer[0] = '\0';
|
||||||
if (cmd) strncpy(buffer, cmd, 8191);
|
if (cmd) strncpy(buffer, cmd, 8191);
|
||||||
unsigned int len = strlen(buffer);
|
size_t len = strlen(buffer);
|
||||||
len = (len > 8191) ? 8191 : len;
|
len = (len > 8191) ? 8191 : len;
|
||||||
if (val)
|
if (val)
|
||||||
{
|
{
|
||||||
|
|
@ -412,7 +416,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
|
||||||
}
|
}
|
||||||
else if (!strncmp("address", cmd, len))
|
else if (!strncmp("address", cmd, len))
|
||||||
{
|
{
|
||||||
unsigned int len = strlen(val);
|
size_t len = strlen(val);
|
||||||
if (address) delete address;
|
if (address) delete address;
|
||||||
if (!(address = new char[len+1]))
|
if (!(address = new char[len+1]))
|
||||||
{
|
{
|
||||||
|
|
@ -630,7 +634,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
|
||||||
}
|
}
|
||||||
else if (!strncmp("rxcachedir", cmd, len))
|
else if (!strncmp("rxcachedir", cmd, len))
|
||||||
{
|
{
|
||||||
unsigned int length = strlen(val);
|
size_t length = strlen(val);
|
||||||
// Make sure there is a trailing PROTO_PATH_DELIMITER
|
// Make sure there is a trailing PROTO_PATH_DELIMITER
|
||||||
if (PROTO_PATH_DELIMITER != val[length-1])
|
if (PROTO_PATH_DELIMITER != val[length-1])
|
||||||
length += 2;
|
length += 2;
|
||||||
|
|
@ -774,7 +778,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
|
||||||
}
|
}
|
||||||
else if (!strncmp("flush", cmd, len))
|
else if (!strncmp("flush", cmd, len))
|
||||||
{
|
{
|
||||||
int valLen = strlen(val);
|
size_t valLen = strlen(val);
|
||||||
if (!strncmp("none", val, valLen))
|
if (!strncmp("none", val, valLen))
|
||||||
msg_flush_mode = NormStreamObject::FLUSH_NONE;
|
msg_flush_mode = NormStreamObject::FLUSH_NONE;
|
||||||
else if (!strncmp("passive", val, valLen))
|
else if (!strncmp("passive", val, valLen))
|
||||||
|
|
@ -820,7 +824,7 @@ bool NormApp::OnCommand(const char* cmd, const char* val)
|
||||||
NormApp::CmdType NormApp::CommandType(const char* cmd)
|
NormApp::CmdType NormApp::CommandType(const char* cmd)
|
||||||
{
|
{
|
||||||
if (!cmd) return CMD_INVALID;
|
if (!cmd) return CMD_INVALID;
|
||||||
unsigned int len = strlen(cmd);
|
size_t len = strlen(cmd);
|
||||||
bool matched = false;
|
bool matched = false;
|
||||||
CmdType type = CMD_INVALID;
|
CmdType type = CMD_INVALID;
|
||||||
const char* const* nextCmd = cmd_list;
|
const char* const* nextCmd = cmd_list;
|
||||||
|
|
@ -947,7 +951,7 @@ void NormApp::OnInputReady()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
input_length = 0;
|
input_length = 0;
|
||||||
input_index += result;
|
input_index += (unsigned int)result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -1196,7 +1200,7 @@ void NormApp::Notify(NormController::Event event,
|
||||||
// Rename rx file using newly received info
|
// Rename rx file using newly received info
|
||||||
char fileName[PATH_MAX];
|
char fileName[PATH_MAX];
|
||||||
strncpy(fileName, rx_cache_path, PATH_MAX);
|
strncpy(fileName, rx_cache_path, PATH_MAX);
|
||||||
UINT16 pathLen = strlen(rx_cache_path);
|
UINT16 pathLen = (UINT16)strlen(rx_cache_path);
|
||||||
pathLen = MIN(pathLen, PATH_MAX);
|
pathLen = MIN(pathLen, PATH_MAX);
|
||||||
UINT16 len = object->GetInfoLength();
|
UINT16 len = object->GetInfoLength();
|
||||||
len = MIN(len, (PATH_MAX - pathLen));
|
len = MIN(len, (PATH_MAX - pathLen));
|
||||||
|
|
@ -1327,7 +1331,7 @@ void NormApp::Notify(NormController::Event event,
|
||||||
size_t result = fwrite(output_buffer+put, sizeof(char), writeLength-put, output);
|
size_t result = fwrite(output_buffer+put, sizeof(char), writeLength-put, output);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
put += result;
|
put += (unsigned int)result;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1413,9 +1417,9 @@ bool NormApp::OnIntervalTimeout(ProtoTimer& /*theTimer*/)
|
||||||
tx_repeat_clear = true;
|
tx_repeat_clear = true;
|
||||||
char pathName[PATH_MAX];
|
char pathName[PATH_MAX];
|
||||||
tx_file_list.GetCurrentBasePath(pathName);
|
tx_file_list.GetCurrentBasePath(pathName);
|
||||||
unsigned int len = strlen(pathName);
|
size_t len = strlen(pathName);
|
||||||
len = MIN(len, PATH_MAX);
|
len = MIN(len, PATH_MAX);
|
||||||
unsigned int maxLen = PATH_MAX - len;
|
size_t maxLen = PATH_MAX - len;
|
||||||
char* ptr = fileName + len;
|
char* ptr = fileName + len;
|
||||||
len = strlen(ptr);
|
len = strlen(ptr);
|
||||||
len = MIN(len, maxLen);
|
len = MIN(len, maxLen);
|
||||||
|
|
@ -1431,7 +1435,7 @@ bool NormApp::OnIntervalTimeout(ProtoTimer& /*theTimer*/)
|
||||||
char temp[PATH_MAX];
|
char temp[PATH_MAX];
|
||||||
strncpy(temp, fileNameInfo, len);
|
strncpy(temp, fileNameInfo, len);
|
||||||
temp[len] = '\0';
|
temp[len] = '\0';
|
||||||
if (!session->QueueTxFile(fileName, fileNameInfo, len))
|
if (!session->QueueTxFile(fileName, fileNameInfo, (UINT16)len))
|
||||||
{
|
{
|
||||||
DMSG(0, "NormApp::OnIntervalTimeout() Error queuing tx file: %s\n",
|
DMSG(0, "NormApp::OnIntervalTimeout() Error queuing tx file: %s\n",
|
||||||
fileName);
|
fileName);
|
||||||
|
|
|
||||||
|
|
@ -99,9 +99,9 @@ bool NormFile::Open(const char* thePath, int theFlags)
|
||||||
theFlags |= O_BINARY;
|
theFlags |= O_BINARY;
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
if (theFlags & O_RDONLY)
|
if (theFlags & O_RDONLY)
|
||||||
file_ptr = fopen(thePath, "r");
|
file_ptr = fopen(thePath, "rb");
|
||||||
else
|
else
|
||||||
file_ptr = fopen(thePath, "w+");
|
file_ptr = fopen(thePath, "w+b");
|
||||||
if (NULL != file_ptr)
|
if (NULL != file_ptr)
|
||||||
#else
|
#else
|
||||||
// Allow sharing of read-only files but not of files being written
|
// Allow sharing of read-only files but not of files being written
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
typedef fpos_t off_t;
|
//typedef fpos_t off_t;
|
||||||
|
typedef long off_t;
|
||||||
#else
|
#else
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif // if/else _WIN32_WCE
|
#endif // if/else _WIN32_WCE
|
||||||
|
|
@ -37,7 +38,8 @@ enum
|
||||||
O_TRUNC = 0x02,
|
O_TRUNC = 0x02,
|
||||||
O_RDONLY = 0x04,
|
O_RDONLY = 0x04,
|
||||||
O_WRONLY = 0x08,
|
O_WRONLY = 0x08,
|
||||||
O_RDWR = 0x10
|
O_RDWR = 0x10,
|
||||||
|
O_BINARY = 0x20
|
||||||
};
|
};
|
||||||
#endif // _WIN32_WCE
|
#endif // _WIN32_WCE
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,6 @@ bool NormMsg::InitFromBuffer(UINT16 msgLength)
|
||||||
default:
|
default:
|
||||||
DMSG(0, "NormMsg::InitFromBuffer() recv'd unkown cmd flavor:%d\n",
|
DMSG(0, "NormMsg::InitFromBuffer() recv'd unkown cmd flavor:%d\n",
|
||||||
((UINT8*)buffer)[NormCmdMsg::FLAVOR_OFFSET]);
|
((UINT8*)buffer)[NormCmdMsg::FLAVOR_OFFSET]);
|
||||||
ASSERT(0);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,8 @@
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
typedef fpos_t off_t;
|
//typedef fpos_t off_t;
|
||||||
|
typedef long off_t;
|
||||||
#else
|
#else
|
||||||
#include <sys/types.h> // for off_t
|
#include <sys/types.h> // for off_t
|
||||||
#endif // if/else _WIN32_WCE
|
#endif // if/else _WIN32_WCE
|
||||||
|
|
@ -361,7 +362,8 @@ class NormMsg
|
||||||
{
|
{
|
||||||
const UINT32* currentBuffer = ext.GetBuffer();
|
const UINT32* currentBuffer = ext.GetBuffer();
|
||||||
UINT16 nextOffset =
|
UINT16 nextOffset =
|
||||||
currentBuffer ? (currentBuffer - buffer + (ext.GetLength()/4)) : (header_length_base/4);
|
(UINT16)(currentBuffer ? (currentBuffer - buffer + (ext.GetLength()/4)) :
|
||||||
|
(header_length_base/4));
|
||||||
bool result = (nextOffset < (header_length/4));
|
bool result = (nextOffset < (header_length/4));
|
||||||
ext.AttachBuffer(result ? (buffer+nextOffset) : (UINT32*)NULL);
|
ext.AttachBuffer(result ? (buffer+nextOffset) : (UINT32*)NULL);
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -652,6 +654,25 @@ class NormDataMsg : public NormObjectMsg
|
||||||
// These routines are only applicable to messages containing NORM_OBJECT_STREAM content
|
// These routines are only applicable to messages containing NORM_OBJECT_STREAM content
|
||||||
// Some static helper routines for reading/writing embedded payload length/offsets
|
// Some static helper routines for reading/writing embedded payload length/offsets
|
||||||
static UINT16 GetStreamPayloadHeaderLength() {return (PAYLOAD_DATA_OFFSET);}
|
static UINT16 GetStreamPayloadHeaderLength() {return (PAYLOAD_DATA_OFFSET);}
|
||||||
|
|
||||||
|
enum PayloadFlag
|
||||||
|
{
|
||||||
|
FLAG_STREAM_END = 0x01,
|
||||||
|
FLAG_MSG_START = 0x04
|
||||||
|
};
|
||||||
|
static bool StreamPayloadFlagIsSet(const char* payload,
|
||||||
|
PayloadFlag flag)
|
||||||
|
{
|
||||||
|
return (0 != (flag & ((UINT8*)payload)[PAYLOAD_FLAGS_OFFSET]));
|
||||||
|
}
|
||||||
|
static void ResetStreamPayloadFlags(char* payload)
|
||||||
|
{
|
||||||
|
((UINT8*)payload)[PAYLOAD_FLAGS_OFFSET] = 0;
|
||||||
|
}
|
||||||
|
static void SetStreamPayloadFlag(char* payload, PayloadFlag flag)
|
||||||
|
{
|
||||||
|
((UINT8*)payload)[PAYLOAD_FLAGS_OFFSET] |= flag;
|
||||||
|
}
|
||||||
static void WriteStreamPayloadLength(char* payload, UINT16 len)
|
static void WriteStreamPayloadLength(char* payload, UINT16 len)
|
||||||
{
|
{
|
||||||
UINT16 temp16 = htons(len);
|
UINT16 temp16 = htons(len);
|
||||||
|
|
@ -674,6 +695,8 @@ class NormDataMsg : public NormObjectMsg
|
||||||
memcpy(&temp32, payload+PAYLOAD_OFFSET_OFFSET, 4);
|
memcpy(&temp32, payload+PAYLOAD_OFFSET_OFFSET, 4);
|
||||||
return (ntohl(temp32));
|
return (ntohl(temp32));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum
|
enum
|
||||||
|
|
@ -685,8 +708,9 @@ class NormDataMsg : public NormObjectMsg
|
||||||
};
|
};
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PAYLOAD_RESERVED_OFFSET = 0,
|
PAYLOAD_FLAGS_OFFSET = 0,
|
||||||
PAYLOAD_LENGTH_OFFSET = PAYLOAD_RESERVED_OFFSET+2,
|
PAYLOAD_RESERVED_OFFSET = PAYLOAD_FLAGS_OFFSET+1, // this is not in the NORM spec!
|
||||||
|
PAYLOAD_LENGTH_OFFSET = PAYLOAD_RESERVED_OFFSET+1,
|
||||||
PAYLOAD_OFFSET_OFFSET = PAYLOAD_LENGTH_OFFSET+2,
|
PAYLOAD_OFFSET_OFFSET = PAYLOAD_LENGTH_OFFSET+2,
|
||||||
PAYLOAD_DATA_OFFSET = PAYLOAD_OFFSET_OFFSET+4
|
PAYLOAD_DATA_OFFSET = PAYLOAD_OFFSET_OFFSET+4
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -316,7 +316,7 @@ bool NormObject::ActivateRepairs()
|
||||||
if (GetFirstRepair(nextId))
|
if (GetFirstRepair(nextId))
|
||||||
{
|
{
|
||||||
NormBlockId lastId;
|
NormBlockId lastId;
|
||||||
ASSERT(GetLastRepair(lastId));
|
GetLastRepair(lastId); // for debug output only
|
||||||
DMSG(6, "NormObject::ActivateRepairs() node>%lu obj>%hu activating blk>%lu->%lu block repairs ...\n",
|
DMSG(6, "NormObject::ActivateRepairs() node>%lu obj>%hu activating blk>%lu->%lu block repairs ...\n",
|
||||||
LocalNodeId(), (UINT16)transport_id, (UINT32)nextId, (UINT32)lastId);
|
LocalNodeId(), (UINT16)transport_id, (UINT32)nextId, (UINT32)lastId);
|
||||||
repairsActivated = true;
|
repairsActivated = true;
|
||||||
|
|
@ -869,7 +869,7 @@ bool NormObject::AppendRepairRequest(NormNackMsg& nack,
|
||||||
while (iterating || (0 != consecutiveCount))
|
while (iterating || (0 != consecutiveCount))
|
||||||
{
|
{
|
||||||
NormBlockId lastId;
|
NormBlockId lastId;
|
||||||
ASSERT(GetLastPending(lastId));
|
GetLastPending(lastId); // for debug output only
|
||||||
DMSG(6, "NormObject::AppendRepairRequest() node>%lu obj>%hu, blk>%lu->%lu (maxPending:%lu)\n",
|
DMSG(6, "NormObject::AppendRepairRequest() node>%lu obj>%hu, blk>%lu->%lu (maxPending:%lu)\n",
|
||||||
LocalNodeId(), (UINT16)transport_id,
|
LocalNodeId(), (UINT16)transport_id,
|
||||||
(UINT32)nextId, (UINT32)lastId, (UINT32)max_pending_block);
|
(UINT32)nextId, (UINT32)lastId, (UINT32)max_pending_block);
|
||||||
|
|
@ -1164,8 +1164,21 @@ void NormObject::HandleObjectMessage(const NormObjectMsg& msg,
|
||||||
if (isSourceSymbol)
|
if (isSourceSymbol)
|
||||||
{
|
{
|
||||||
block->DecrementErasureCount();
|
block->DecrementErasureCount();
|
||||||
if (WriteSegment(blockId, segmentId, data.GetPayload(),
|
// This bit of code makes sure that NORM Protocol Version 1
|
||||||
data.FlagIsSet(NormObjectMsg::FLAG_MSG_START)))
|
// use of FLAG_MSG_START is observed even when the equivalent (and better!)
|
||||||
|
// stream payload flag is not used.
|
||||||
|
if (IsStream())
|
||||||
|
{
|
||||||
|
if (data.FlagIsSet(NormObjectMsg::FLAG_MSG_START) &&
|
||||||
|
!NormDataMsg::StreamPayloadFlagIsSet(data.GetPayload(),
|
||||||
|
NormDataMsg::FLAG_MSG_START))
|
||||||
|
{
|
||||||
|
DMSG(0, "NormObject::HandleObjectMessage() setting missing FLAG_MSG_START\n");
|
||||||
|
NormDataMsg::SetStreamPayloadFlag((char*)data.GetPayload(), NormDataMsg::FLAG_MSG_START);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WriteSegment(blockId, segmentId, data.GetPayload()))
|
||||||
{
|
{
|
||||||
objectUpdated = true;
|
objectUpdated = true;
|
||||||
// For statistics only (TBD) #ifdef NORM_DEBUG
|
// For statistics only (TBD) #ifdef NORM_DEBUG
|
||||||
|
|
@ -1253,7 +1266,7 @@ void NormObject::HandleObjectMessage(const NormObjectMsg& msg,
|
||||||
NormSegmentId sid = server->GetErasureLoc(i);
|
NormSegmentId sid = server->GetErasureLoc(i);
|
||||||
if (sid < numData)
|
if (sid < numData)
|
||||||
{
|
{
|
||||||
if (WriteSegment(blockId, sid, block->GetSegment(sid), false))
|
if (WriteSegment(blockId, sid, block->GetSegment(sid)))
|
||||||
{
|
{
|
||||||
objectUpdated = true;
|
objectUpdated = true;
|
||||||
// For statistics only (TBD) #ifdef NORM_DEBUG
|
// For statistics only (TBD) #ifdef NORM_DEBUG
|
||||||
|
|
@ -1525,8 +1538,7 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg)
|
||||||
{
|
{
|
||||||
// Try to read data segment (Note "ReadSegment" copies in offset/length info also)
|
// Try to read data segment (Note "ReadSegment" copies in offset/length info also)
|
||||||
char* buffer = data->AccessPayload();
|
char* buffer = data->AccessPayload();
|
||||||
bool msgStart = false;
|
UINT16 payloadLength = ReadSegment(blockId, segmentId, buffer);
|
||||||
UINT16 payloadLength = ReadSegment(blockId, segmentId, buffer, &msgStart);
|
|
||||||
if (0 == payloadLength)
|
if (0 == payloadLength)
|
||||||
{
|
{
|
||||||
// (TBD) deal with read error
|
// (TBD) deal with read error
|
||||||
|
|
@ -1537,16 +1549,11 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg)
|
||||||
}
|
}
|
||||||
data->SetPayloadLength(payloadLength);
|
data->SetPayloadLength(payloadLength);
|
||||||
|
|
||||||
// Look for FLAG_MSG_START
|
// Set FLAG_MSG_START as appropriated for NORM Protocol Version 1 compatibility
|
||||||
if (msgStart)
|
if (IsStream())
|
||||||
{
|
{
|
||||||
data->SetFlag(NormObjectMsg::FLAG_MSG_START);
|
if (NormDataMsg::StreamPayloadFlagIsSet(buffer, NormDataMsg::FLAG_MSG_START))
|
||||||
//DMSG(0, "read start segment len:%hu\n", ntohs(*((UINT16*)(buffer+2))));
|
data->SetFlag(NormObjectMsg::FLAG_MSG_START);
|
||||||
//DMSG(0, " message len:%hu\n", ntohs(*((UINT16*)(buffer+8))));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//DMSG(0, "non-start segment read ...\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform incremental FEC encoding as needed
|
// Perform incremental FEC encoding as needed
|
||||||
|
|
@ -1826,8 +1833,7 @@ void NormFileObject::Close()
|
||||||
|
|
||||||
bool NormFileObject::WriteSegment(NormBlockId blockId,
|
bool NormFileObject::WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* buffer,
|
const char* buffer)
|
||||||
bool /*msgStart*/)
|
|
||||||
{
|
{
|
||||||
UINT16 len;
|
UINT16 len;
|
||||||
if (blockId == final_block_id)
|
if (blockId == final_block_id)
|
||||||
|
|
@ -1867,8 +1873,7 @@ bool NormFileObject::WriteSegment(NormBlockId blockId,
|
||||||
|
|
||||||
UINT16 NormFileObject::ReadSegment(NormBlockId blockId,
|
UINT16 NormFileObject::ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer)
|
||||||
bool* /*msgStart*/)
|
|
||||||
{
|
{
|
||||||
// Determine segment length from blockId::segmentId
|
// Determine segment length from blockId::segmentId
|
||||||
UINT16 len;
|
UINT16 len;
|
||||||
|
|
@ -2029,8 +2034,7 @@ void NormDataObject::Close()
|
||||||
|
|
||||||
bool NormDataObject::WriteSegment(NormBlockId blockId,
|
bool NormDataObject::WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* buffer,
|
const char* buffer)
|
||||||
bool /*msgStart*/)
|
|
||||||
{
|
{
|
||||||
if (NULL == data_ptr)
|
if (NULL == data_ptr)
|
||||||
{
|
{
|
||||||
|
|
@ -2075,8 +2079,7 @@ bool NormDataObject::WriteSegment(NormBlockId blockId,
|
||||||
|
|
||||||
UINT16 NormDataObject::ReadSegment(NormBlockId blockId,
|
UINT16 NormDataObject::ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer)
|
||||||
bool* /*msgStart*/)
|
|
||||||
{
|
{
|
||||||
if (NULL == data_ptr)
|
if (NULL == data_ptr)
|
||||||
{
|
{
|
||||||
|
|
@ -2191,15 +2194,29 @@ NormStreamObject::NormStreamObject(class NormSession& theSession,
|
||||||
const NormObjectId& objectId)
|
const NormObjectId& objectId)
|
||||||
: NormObject(STREAM, theSession, theServer, objectId),
|
: NormObject(STREAM, theSession, theServer, objectId),
|
||||||
stream_sync(false), sync_offset_valid(false),
|
stream_sync(false), sync_offset_valid(false),
|
||||||
|
write_vacancy(false), posted_tx_queue_vacancy(false),
|
||||||
|
read_init(true),
|
||||||
flush_pending(false), msg_start(true),
|
flush_pending(false), msg_start(true),
|
||||||
flush_mode(FLUSH_NONE), push_mode(false),
|
flush_mode(FLUSH_NONE), push_mode(false),
|
||||||
|
stream_closing(false),
|
||||||
block_pool_threshold(0)
|
block_pool_threshold(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NormStreamObject::~NormStreamObject()
|
NormStreamObject::~NormStreamObject()
|
||||||
{
|
{
|
||||||
Close();
|
Close();
|
||||||
|
tx_offset = write_offset = read_offset = 0;
|
||||||
|
NormBlock* b;
|
||||||
|
while ((b = stream_buffer.Find(stream_buffer.RangeLo())))
|
||||||
|
{
|
||||||
|
stream_buffer.Remove(b);
|
||||||
|
b->EmptyToPool(segment_pool);
|
||||||
|
block_pool.Put(b);
|
||||||
|
}
|
||||||
|
stream_buffer.Destroy();
|
||||||
|
segment_pool.Destroy();
|
||||||
|
block_pool.Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NormStreamObject::Open(UINT32 bufferSize,
|
bool NormStreamObject::Open(UINT32 bufferSize,
|
||||||
|
|
@ -2282,6 +2299,7 @@ bool NormStreamObject::Open(UINT32 bufferSize,
|
||||||
sync_offset_valid = false;
|
sync_offset_valid = false;
|
||||||
flush_pending = false;
|
flush_pending = false;
|
||||||
msg_start = true;
|
msg_start = true;
|
||||||
|
stream_closing = false;
|
||||||
return true;
|
return true;
|
||||||
} // end NormStreamObject::Open()
|
} // end NormStreamObject::Open()
|
||||||
|
|
||||||
|
|
@ -2298,20 +2316,20 @@ bool NormStreamObject::Accept(UINT32 bufferSize, bool doubleBuffer)
|
||||||
}
|
}
|
||||||
} // end NormStreamObject::Accept()
|
} // end NormStreamObject::Accept()
|
||||||
|
|
||||||
void NormStreamObject::Close()
|
void NormStreamObject::Close(bool graceful)
|
||||||
{
|
{
|
||||||
NormObject::Close();
|
if (graceful && (NULL == server))
|
||||||
tx_offset = write_offset = read_offset = 0;
|
|
||||||
NormBlock* b;
|
|
||||||
while ((b = stream_buffer.Find(stream_buffer.RangeLo())))
|
|
||||||
{
|
{
|
||||||
stream_buffer.Remove(b);
|
stream_closing = true;
|
||||||
b->EmptyToPool(segment_pool);
|
Terminate();
|
||||||
block_pool.Put(b);
|
//SetFlushMode(FLUSH_ACTIVE);
|
||||||
|
//Flush();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NormObject::Close();
|
||||||
|
write_vacancy = false;
|
||||||
}
|
}
|
||||||
stream_buffer.Destroy();
|
|
||||||
segment_pool.Destroy();
|
|
||||||
block_pool.Destroy();
|
|
||||||
} // end NormStreamObject::Close()
|
} // end NormStreamObject::Close()
|
||||||
|
|
||||||
bool NormStreamObject::LockBlocks(NormBlockId firstId, NormBlockId lastId)
|
bool NormStreamObject::LockBlocks(NormBlockId firstId, NormBlockId lastId)
|
||||||
|
|
@ -2451,8 +2469,7 @@ char* NormStreamObject::RetrieveSegment(NormBlockId blockId,
|
||||||
|
|
||||||
UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
|
UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer)
|
||||||
bool* msgStart)
|
|
||||||
{
|
{
|
||||||
// (TBD) compare blockId with stream_buffer.RangeLo() and stream_buffer.RangeHi()
|
// (TBD) compare blockId with stream_buffer.RangeLo() and stream_buffer.RangeHi()
|
||||||
NormBlock* block = stream_buffer.Find(blockId);
|
NormBlock* block = stream_buffer.Find(blockId);
|
||||||
|
|
@ -2479,7 +2496,7 @@ UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
|
||||||
if (offsetDelta > 0) tx_offset = segmentOffset;
|
if (offsetDelta > 0) tx_offset = segmentOffset;
|
||||||
|
|
||||||
// Only advertise vacancy if stream_buffer.RangeLo() is non-pending _and_
|
// Only advertise vacancy if stream_buffer.RangeLo() is non-pending _and_
|
||||||
// (write_offset - tx_offset) > streamBufferSize
|
// (write_offset - tx_offset) < streamBufferSize
|
||||||
if (!write_vacancy)
|
if (!write_vacancy)
|
||||||
{
|
{
|
||||||
offsetDelta = write_offset - tx_offset;
|
offsetDelta = write_offset - tx_offset;
|
||||||
|
|
@ -2498,24 +2515,21 @@ UINT16 NormStreamObject::ReadSegment(NormBlockId blockId,
|
||||||
|
|
||||||
UINT16 segmentLength = NormDataMsg::ReadStreamPayloadLength(segment);
|
UINT16 segmentLength = NormDataMsg::ReadStreamPayloadLength(segment);
|
||||||
ASSERT(segmentLength <= segment_size);
|
ASSERT(segmentLength <= segment_size);
|
||||||
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
|
|
||||||
UINT16 payloadLength = segmentLength+NormDataMsg::GetStreamPayloadHeaderLength();
|
UINT16 payloadLength = segmentLength+NormDataMsg::GetStreamPayloadHeaderLength();
|
||||||
#ifdef SIMULATE
|
#ifdef SIMULATE
|
||||||
|
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
|
||||||
payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX);
|
payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX);
|
||||||
UINT16 copyMax = MIN(payloadMax, payloadLength);
|
UINT16 copyMax = MIN(payloadMax, payloadLength);
|
||||||
memcpy(buffer, segment, copyMax);
|
memcpy(buffer, segment, copyMax);
|
||||||
#else
|
#else
|
||||||
memcpy(buffer, segment, payloadLength);
|
memcpy(buffer, segment, payloadLength);
|
||||||
#endif // SIMULATE
|
#endif // SIMULATE
|
||||||
if (msgStart)
|
|
||||||
*msgStart = (0 != (NormDataMsg::FLAG_MSG_START & segment[payloadMax]));
|
|
||||||
return payloadLength;
|
return payloadLength;
|
||||||
} // end NormStreamObject::ReadSegment()
|
} // end NormStreamObject::ReadSegment()
|
||||||
|
|
||||||
bool NormStreamObject::WriteSegment(NormBlockId blockId,
|
bool NormStreamObject::WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* segment,
|
const char* segment)
|
||||||
bool msgStart)
|
|
||||||
{
|
{
|
||||||
UINT32 segmentOffset = NormDataMsg::ReadStreamPayloadOffset(segment);
|
UINT32 segmentOffset = NormDataMsg::ReadStreamPayloadOffset(segment);
|
||||||
|
|
||||||
|
|
@ -2566,8 +2580,14 @@ bool NormStreamObject::WriteSegment(NormBlockId blockId,
|
||||||
read_index.block = block->GetId();
|
read_index.block = block->GetId();
|
||||||
block->GetFirstPending(read_index.segment);
|
block->GetFirstPending(read_index.segment);
|
||||||
NormBlock* tempBlock = block;
|
NormBlock* tempBlock = block;
|
||||||
UINT32 tempOffset = read_offset;
|
UINT32 tempOffset = read_offset;
|
||||||
session.Notify(NormController::RX_OBJECT_UPDATED, server, this);
|
// (TBD) uncomment the code so that only a single
|
||||||
|
// UPDATED notification is posted???
|
||||||
|
if (notify_on_update)
|
||||||
|
{
|
||||||
|
notify_on_update = false;
|
||||||
|
session.Notify(NormController::RX_OBJECT_UPDATED, server, this);
|
||||||
|
}
|
||||||
block = stream_buffer.Find(stream_buffer.RangeLo());
|
block = stream_buffer.Find(stream_buffer.RangeLo());
|
||||||
if (tempBlock == block)
|
if (tempBlock == block)
|
||||||
{
|
{
|
||||||
|
|
@ -2631,15 +2651,12 @@ bool NormStreamObject::WriteSegment(NormBlockId blockId,
|
||||||
char* s = segment_pool.Get();
|
char* s = segment_pool.Get();
|
||||||
ASSERT(s != NULL); // for now, this should always succeed
|
ASSERT(s != NULL); // for now, this should always succeed
|
||||||
UINT16 payloadLength = NormDataMsg::ReadStreamPayloadLength(segment) + NormDataMsg::GetStreamPayloadHeaderLength();
|
UINT16 payloadLength = NormDataMsg::ReadStreamPayloadLength(segment) + NormDataMsg::GetStreamPayloadHeaderLength();
|
||||||
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
|
|
||||||
#ifdef SIMULATE
|
#ifdef SIMULATE
|
||||||
|
UINT16 payloadMax = segment_size + NormDataMsg::GetStreamPayloadHeaderLength();
|
||||||
payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax);
|
payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax);
|
||||||
payloadLength = MIN(payloadMax, payloadLength);
|
payloadLength = MIN(payloadMax, payloadLength);
|
||||||
#endif // SIMULATE
|
#endif // SIMULATE
|
||||||
memcpy(s, segment, payloadLength);
|
memcpy(s, segment, payloadLength);
|
||||||
// Store "msgStart" info at end of payload space
|
|
||||||
s[payloadMax] = msgStart ? NormDataMsg::FLAG_MSG_START : 0;
|
|
||||||
|
|
||||||
block->AttachSegment(segmentId, s);
|
block->AttachSegment(segmentId, s);
|
||||||
block->SetPending(segmentId);
|
block->SetPending(segmentId);
|
||||||
ASSERT(block->GetSegment(segmentId) == s);
|
ASSERT(block->GetSegment(segmentId) == s);
|
||||||
|
|
@ -2690,10 +2707,16 @@ void NormStreamObject::Prune(NormBlockId blockId)
|
||||||
// Sequential (in order) read/write routines (TBD) Add a "Seek()" method
|
// Sequential (in order) read/write routines (TBD) Add a "Seek()" method
|
||||||
bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStart)
|
bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStart)
|
||||||
{
|
{
|
||||||
|
if (stream_closing)
|
||||||
|
{
|
||||||
|
DMSG(0, "NormStreamObject::Read() attempted to read from closed stream\n");
|
||||||
|
*buflen = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Retain();
|
||||||
SetNotifyOnUpdate(true); // reset notification when streams are read
|
SetNotifyOnUpdate(true); // reset notification when streams are read
|
||||||
unsigned int bytesRead = 0;
|
unsigned int bytesRead = 0;
|
||||||
unsigned int bytesToRead = *buflen;
|
unsigned int bytesToRead = *buflen;
|
||||||
//while (bytesToRead > 0)
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
NormBlock* block = stream_buffer.Find(read_index.block);
|
NormBlock* block = stream_buffer.Find(read_index.block);
|
||||||
|
|
@ -2703,6 +2726,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
*buflen = bytesRead;
|
*buflen = bytesRead;
|
||||||
if (bytesRead > 0)
|
if (bytesRead > 0)
|
||||||
{
|
{
|
||||||
|
Release();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -2720,6 +2744,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Release();
|
||||||
return findMsgStart ? false : true;
|
return findMsgStart ? false : true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2735,6 +2760,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
*buflen = bytesRead;
|
*buflen = bytesRead;
|
||||||
if (bytesRead > 0)
|
if (bytesRead > 0)
|
||||||
{
|
{
|
||||||
|
Release();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -2755,6 +2781,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Release();
|
||||||
return findMsgStart ? false : true;
|
return findMsgStart ? false : true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2769,12 +2796,13 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
LocalNodeId(), (UINT16)transport_id, (UINT32)read_index.block, read_index.segment, read_offset, segmentOffset);
|
LocalNodeId(), (UINT16)transport_id, (UINT32)read_index.block, read_index.segment, read_offset, segmentOffset);
|
||||||
read_offset = segmentOffset;
|
read_offset = segmentOffset;
|
||||||
*buflen = bytesRead;
|
*buflen = bytesRead;
|
||||||
|
Release();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 index = read_offset - segmentOffset;
|
UINT32 index = read_offset - segmentOffset;
|
||||||
UINT16 length = NormDataMsg::ReadStreamPayloadLength(segment);
|
UINT16 length = NormDataMsg::ReadStreamPayloadLength(segment);
|
||||||
if (index >= length)
|
if ((length > 0) && (index >= length))
|
||||||
{
|
{
|
||||||
DMSG(0, "NormStreamObject::Read() node>%lu obj>%hu blk>%lu seg>%hu mangled stream! index:%hu length:%hu "
|
DMSG(0, "NormStreamObject::Read() node>%lu obj>%hu blk>%lu seg>%hu mangled stream! index:%hu length:%hu "
|
||||||
"read_offset:%lu segmentOffset:%lu\n",
|
"read_offset:%lu segmentOffset:%lu\n",
|
||||||
|
|
@ -2782,6 +2810,7 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
read_offset = segmentOffset;
|
read_offset = segmentOffset;
|
||||||
*buflen = bytesRead;
|
*buflen = bytesRead;
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
Release();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2791,21 +2820,17 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
|
|
||||||
if (findMsgStart)
|
if (findMsgStart)
|
||||||
{
|
{
|
||||||
bool msgStart;
|
if ((0 != index) ||
|
||||||
if (0 != index)
|
!NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_MSG_START))
|
||||||
{
|
|
||||||
msgStart = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UINT16 payloadMax = segment_size+NormDataMsg::GetStreamPayloadHeaderLength();
|
|
||||||
#ifdef SIMULATE
|
|
||||||
payloadMax = MIN(payloadMax, SIM_PAYLOAD_MAX);
|
|
||||||
#endif // if/else SIMULATE
|
|
||||||
msgStart = (NormObjectMsg::FLAG_MSG_START == segment[payloadMax]);
|
|
||||||
}
|
|
||||||
if (!msgStart)
|
|
||||||
{
|
{
|
||||||
|
// make sure msg start searches don't miss stream end ...
|
||||||
|
if (NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_STREAM_END))
|
||||||
|
{
|
||||||
|
DMSG(4, "NormStreamObject::Read() stream ended by sender 1\n");
|
||||||
|
session.Notify(NormController::RX_OBJECT_COMPLETED, server, this);
|
||||||
|
stream_closing = true;
|
||||||
|
server->DeleteObject(this);
|
||||||
|
}
|
||||||
// Don't bother managing individual segments since
|
// Don't bother managing individual segments since
|
||||||
// stream buffers are exact multiples of block size!
|
// stream buffers are exact multiples of block size!
|
||||||
//block->DetachSegment(read_index.segment);
|
//block->DetachSegment(read_index.segment);
|
||||||
|
|
@ -2837,7 +2862,9 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
read_offset += count;
|
read_offset += count;
|
||||||
bytesToRead -= count;
|
bytesToRead -= count;
|
||||||
if (index >= length)
|
if (index >= length)
|
||||||
{
|
{
|
||||||
|
bool streamEnded =
|
||||||
|
NormDataMsg::StreamPayloadFlagIsSet(segment, NormDataMsg::FLAG_STREAM_END);
|
||||||
// Don't bother managing individual segments since
|
// Don't bother managing individual segments since
|
||||||
// stream buffers are multiples of block size!
|
// stream buffers are multiples of block size!
|
||||||
// block->DetachSegment(read_index.segment);
|
// block->DetachSegment(read_index.segment);
|
||||||
|
|
@ -2852,24 +2879,124 @@ bool NormStreamObject::Read(char* buffer, unsigned int* buflen, bool findMsgStar
|
||||||
read_index.segment = 0;
|
read_index.segment = 0;
|
||||||
Prune(read_index.block);
|
Prune(read_index.block);
|
||||||
}
|
}
|
||||||
|
if (streamEnded)
|
||||||
|
{
|
||||||
|
DMSG(4, "NormStreamObject::Read() stream ended by sender 2\n");
|
||||||
|
session.Notify(NormController::RX_OBJECT_COMPLETED, server, this);
|
||||||
|
stream_closing = true;
|
||||||
|
server->DeleteObject(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while (bytesToRead > 0); // end while (len > 0)
|
} while (bytesToRead > 0); // end while (len > 0)
|
||||||
*buflen = bytesRead;
|
*buflen = bytesRead;
|
||||||
|
Release();
|
||||||
return true;
|
return true;
|
||||||
} // end NormStreamObject::Read()
|
} // end NormStreamObject::Read()
|
||||||
|
|
||||||
|
|
||||||
|
void NormStreamObject::Terminate()
|
||||||
|
{
|
||||||
|
// If there's a pending buffer at our "write_index", mark it
|
||||||
|
// otherwise create a ZERO length segment to send
|
||||||
|
NormBlock* block = stream_buffer.Find(write_index.block);
|
||||||
|
if (!block)
|
||||||
|
{
|
||||||
|
if (!(block = block_pool.Get()))
|
||||||
|
{
|
||||||
|
block = stream_buffer.Find(stream_buffer.RangeLo());
|
||||||
|
ASSERT(block);
|
||||||
|
if (block->IsPending())
|
||||||
|
{
|
||||||
|
NormBlockId blockId = block->GetId();
|
||||||
|
pending_mask.Unset(blockId);
|
||||||
|
repair_mask.Unset(blockId);
|
||||||
|
NormBlock* b = FindBlock(blockId);
|
||||||
|
if (b)
|
||||||
|
{
|
||||||
|
block_buffer.Remove(b);
|
||||||
|
session.ServerPutFreeBlock(b);
|
||||||
|
}
|
||||||
|
if (!pending_mask.IsSet())
|
||||||
|
{
|
||||||
|
pending_mask.Set(write_index.block);
|
||||||
|
stream_next_id = write_index.block + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stream_buffer.Remove(block);
|
||||||
|
block->EmptyToPool(segment_pool);
|
||||||
|
}
|
||||||
|
block->SetId(write_index.block);
|
||||||
|
block->ClearPending();
|
||||||
|
bool success = stream_buffer.Insert(block);
|
||||||
|
ASSERT(success);
|
||||||
|
} // end if (!block)
|
||||||
|
char* segment = block->GetSegment(write_index.segment);
|
||||||
|
if (!segment)
|
||||||
|
{
|
||||||
|
if (!(segment = segment_pool.Get()))
|
||||||
|
{
|
||||||
|
NormBlock* b = stream_buffer.Find(stream_buffer.RangeLo());
|
||||||
|
ASSERT(b != block);
|
||||||
|
if (b->IsPending())
|
||||||
|
{
|
||||||
|
NormBlockId blockId = b->GetId();
|
||||||
|
pending_mask.Unset(blockId);
|
||||||
|
repair_mask.Unset(blockId);
|
||||||
|
NormBlock* c = FindBlock(blockId);
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
block_buffer.Remove(c);
|
||||||
|
session.ServerPutFreeBlock(c);
|
||||||
|
}
|
||||||
|
if (!pending_mask.IsSet())
|
||||||
|
{
|
||||||
|
pending_mask.Set(write_index.block);
|
||||||
|
stream_next_id = write_index.block + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stream_buffer.Remove(b);
|
||||||
|
b->EmptyToPool(segment_pool);
|
||||||
|
block_pool.Put(b);
|
||||||
|
segment = segment_pool.Get();
|
||||||
|
ASSERT(segment);
|
||||||
|
}
|
||||||
|
NormDataMsg::WriteStreamPayloadOffset(segment, write_offset);
|
||||||
|
NormDataMsg::WriteStreamPayloadLength(segment, 0);
|
||||||
|
block->AttachSegment(write_index.segment, segment);
|
||||||
|
} // end if (!segment)
|
||||||
|
UINT16 index = NormDataMsg::ReadStreamPayloadLength(segment);
|
||||||
|
if (0 == index) NormDataMsg::ResetStreamPayloadFlags(segment);
|
||||||
|
NormDataMsg::SetStreamPayloadFlag(segment, NormDataMsg::FLAG_STREAM_END);
|
||||||
|
block->SetPending(write_index.segment);
|
||||||
|
if (++write_index.segment >= ndata)
|
||||||
|
{
|
||||||
|
write_index.block++;
|
||||||
|
write_index.segment = 0;
|
||||||
|
}
|
||||||
|
flush_pending = true;
|
||||||
|
session.TouchServer();
|
||||||
|
} // end NormStreamObject::Terminate()
|
||||||
|
|
||||||
UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
|
UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
|
||||||
{
|
{
|
||||||
UINT32 nBytes = 0;
|
UINT32 nBytes = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
if (stream_closing)
|
||||||
|
{
|
||||||
|
if (0 != len)
|
||||||
|
{
|
||||||
|
DMSG(0, "NormStreamObject::Write() error: stream is closing\n");
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
INT32 deltaOffset = write_offset - tx_offset;
|
INT32 deltaOffset = write_offset - tx_offset;
|
||||||
ASSERT(deltaOffset >= 0);
|
ASSERT(deltaOffset >= 0);
|
||||||
if (deltaOffset >= (INT32)object_size.LSB())
|
if (deltaOffset >= (INT32)object_size.LSB())
|
||||||
{
|
{
|
||||||
write_vacancy = false;
|
write_vacancy = false;
|
||||||
DMSG(8, "NormStreamObject::Write() stream buffer full (1)\n", len, eom);
|
DMSG(4, "NormStreamObject::Write() stream buffer full (1)\n", len, eom);
|
||||||
if (!push_mode) break;
|
if (!push_mode) break;
|
||||||
}
|
}
|
||||||
NormBlock* block = stream_buffer.Find(write_index.block);
|
NormBlock* block = stream_buffer.Find(write_index.block);
|
||||||
|
|
@ -2913,7 +3040,7 @@ UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
|
||||||
bool success = stream_buffer.Insert(block);
|
bool success = stream_buffer.Insert(block);
|
||||||
ASSERT(success);
|
ASSERT(success);
|
||||||
|
|
||||||
}
|
} // end if (!block)
|
||||||
char* segment = block->GetSegment(write_index.segment);
|
char* segment = block->GetSegment(write_index.segment);
|
||||||
if (!segment)
|
if (!segment)
|
||||||
{
|
{
|
||||||
|
|
@ -2956,24 +3083,19 @@ UINT32 NormStreamObject::Write(const char* buffer, UINT32 len, bool eom)
|
||||||
NormDataMsg::WriteStreamPayloadOffset(segment, write_offset);
|
NormDataMsg::WriteStreamPayloadOffset(segment, write_offset);
|
||||||
NormDataMsg::WriteStreamPayloadLength(segment, 0);
|
NormDataMsg::WriteStreamPayloadLength(segment, 0);
|
||||||
block->AttachSegment(write_index.segment, segment);
|
block->AttachSegment(write_index.segment, segment);
|
||||||
}
|
} // end if (!segment)
|
||||||
|
|
||||||
UINT16 index = NormDataMsg::ReadStreamPayloadLength(segment);
|
UINT16 index = NormDataMsg::ReadStreamPayloadLength(segment);
|
||||||
|
|
||||||
if (0 == index)
|
if (0 == index)
|
||||||
{
|
{
|
||||||
char msgStartValue = 0;
|
NormDataMsg::ResetStreamPayloadFlags(segment);
|
||||||
if (msg_start && len)
|
if (msg_start && len)
|
||||||
{
|
{
|
||||||
ASSERT(0 == index);
|
ASSERT(0 == index);
|
||||||
msgStartValue = NormObjectMsg::FLAG_MSG_START;
|
NormDataMsg::SetStreamPayloadFlag(segment, NormDataMsg::FLAG_MSG_START);
|
||||||
msg_start = false;
|
msg_start = false;
|
||||||
}
|
}
|
||||||
UINT16 payloadMax = segment_size+NormDataMsg::GetStreamPayloadHeaderLength();
|
|
||||||
#ifdef SIMULATE
|
|
||||||
payloadMax = MIN(SIM_PAYLOAD_MAX, payloadMax);
|
|
||||||
#endif // SIMULATE
|
|
||||||
segment[payloadMax] = msgStartValue;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -3063,8 +3185,7 @@ bool NormSimObject::Open(UINT32 objectSize,
|
||||||
|
|
||||||
UINT16 NormSimObject::ReadSegment(NormBlockId blockId,
|
UINT16 NormSimObject::ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer)
|
||||||
bool* /*msgStart*/)
|
|
||||||
{
|
{
|
||||||
// Determine segment length
|
// Determine segment length
|
||||||
UINT16 len;
|
UINT16 len;
|
||||||
|
|
|
||||||
|
|
@ -86,12 +86,11 @@ class NormObject
|
||||||
|
|
||||||
virtual bool WriteSegment(NormBlockId blockId,
|
virtual bool WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* buffer,
|
const char* buffer) = 0;
|
||||||
bool msgStart) = 0;
|
|
||||||
virtual UINT16 ReadSegment(NormBlockId blockId,
|
virtual UINT16 ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer) = 0;
|
||||||
bool* msgStart = NULL) = 0;
|
|
||||||
|
|
||||||
virtual char* RetrieveSegment(NormBlockId blockId,
|
virtual char* RetrieveSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
|
|
@ -296,13 +295,12 @@ class NormFileObject : public NormObject
|
||||||
|
|
||||||
virtual bool WriteSegment(NormBlockId blockId,
|
virtual bool WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* buffer,
|
const char* buffer);
|
||||||
bool msgStart);
|
|
||||||
|
|
||||||
virtual UINT16 ReadSegment(NormBlockId blockId,
|
virtual UINT16 ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer);
|
||||||
bool* msgStart = NULL);
|
|
||||||
virtual char* RetrieveSegment(NormBlockId blockId,
|
virtual char* RetrieveSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
bool& tempRetrieval);
|
bool& tempRetrieval);
|
||||||
|
|
@ -341,13 +339,11 @@ class NormDataObject : public NormObject
|
||||||
|
|
||||||
virtual bool WriteSegment(NormBlockId blockId,
|
virtual bool WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* buffer,
|
const char* buffer);
|
||||||
bool msgStart);
|
|
||||||
|
|
||||||
virtual UINT16 ReadSegment(NormBlockId blockId,
|
virtual UINT16 ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer);
|
||||||
bool* msgStart = NULL);
|
|
||||||
|
|
||||||
virtual char* RetrieveSegment(NormBlockId blockId,
|
virtual char* RetrieveSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
|
|
@ -375,7 +371,7 @@ class NormStreamObject : public NormObject
|
||||||
bool doubleBuffer = false,
|
bool doubleBuffer = false,
|
||||||
const char* infoPtr = NULL,
|
const char* infoPtr = NULL,
|
||||||
UINT16 infoLen = 0);
|
UINT16 infoLen = 0);
|
||||||
void Close();
|
void Close(bool graceful = false);
|
||||||
bool Accept(UINT32 bufferSize, bool doubleBuffer = false);
|
bool Accept(UINT32 bufferSize, bool doubleBuffer = false);
|
||||||
|
|
||||||
enum FlushMode
|
enum FlushMode
|
||||||
|
|
@ -395,6 +391,11 @@ class NormStreamObject : public NormObject
|
||||||
SetFlushMode(oldFlushMode);
|
SetFlushMode(oldFlushMode);
|
||||||
}
|
}
|
||||||
void SetPushMode(bool state) {push_mode = state;}
|
void SetPushMode(bool state) {push_mode = state;}
|
||||||
|
|
||||||
|
bool IsClosing() {return stream_closing;}
|
||||||
|
bool HasVacancy()
|
||||||
|
{return (stream_closing ? false : write_vacancy);}
|
||||||
|
|
||||||
|
|
||||||
bool Read(char* buffer, unsigned int* buflen, bool findMsgStart = false);
|
bool Read(char* buffer, unsigned int* buflen, bool findMsgStart = false);
|
||||||
UINT32 Write(const char* buffer, UINT32 len, bool eom = false);
|
UINT32 Write(const char* buffer, UINT32 len, bool eom = false);
|
||||||
|
|
@ -412,12 +413,11 @@ class NormStreamObject : public NormObject
|
||||||
|
|
||||||
virtual bool WriteSegment(NormBlockId blockId,
|
virtual bool WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* buffer,
|
const char* buffer);
|
||||||
bool msgStart);
|
|
||||||
virtual UINT16 ReadSegment(NormBlockId blockId,
|
virtual UINT16 ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer);
|
||||||
bool* msgStart = NULL);
|
|
||||||
|
|
||||||
virtual char* RetrieveSegment(NormBlockId blockId,
|
virtual char* RetrieveSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
|
|
@ -453,7 +453,7 @@ class NormStreamObject : public NormObject
|
||||||
void ResetPostedTxQueueVacancy() {posted_tx_queue_vacancy = false;}
|
void ResetPostedTxQueueVacancy() {posted_tx_queue_vacancy = false;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void Terminate();
|
||||||
|
|
||||||
class Index
|
class Index
|
||||||
{
|
{
|
||||||
|
|
@ -484,6 +484,8 @@ class NormStreamObject : public NormObject
|
||||||
FlushMode flush_mode;
|
FlushMode flush_mode;
|
||||||
bool push_mode;
|
bool push_mode;
|
||||||
|
|
||||||
|
bool stream_closing;
|
||||||
|
|
||||||
// For threaded API purposes
|
// For threaded API purposes
|
||||||
UINT32 block_pool_threshold;
|
UINT32 block_pool_threshold;
|
||||||
}; // end class NormStreamObject
|
}; // end class NormStreamObject
|
||||||
|
|
@ -507,13 +509,11 @@ class NormSimObject : public NormObject
|
||||||
|
|
||||||
virtual bool WriteSegment(NormBlockId blockId,
|
virtual bool WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
const char* buffer,
|
const char* buffer) {return true;}
|
||||||
bool msgStart) {return true;}
|
|
||||||
|
|
||||||
virtual UINT16 ReadSegment(NormBlockId blockId,
|
virtual UINT16 ReadSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
char* buffer,
|
char* buffer);
|
||||||
bool* msgStart = NULL);
|
|
||||||
|
|
||||||
virtual char* RetrieveSegment(NormBlockId blockId,
|
virtual char* RetrieveSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
|
|
|
||||||
|
|
@ -24,10 +24,10 @@ void NormPostProcessor::GetCommand(char* buffer, unsigned int buflen)
|
||||||
while (buflen && (i < process_argc))
|
while (buflen && (i < process_argc))
|
||||||
{
|
{
|
||||||
strncpy(buffer, process_argv[i], buflen);
|
strncpy(buffer, process_argv[i], buflen);
|
||||||
unsigned int len = strlen(process_argv[i]);
|
size_t len = strlen(process_argv[i]);
|
||||||
if (len < buflen)
|
if (len < buflen)
|
||||||
{
|
{
|
||||||
buflen -= len;
|
buflen -= (unsigned int)len;
|
||||||
buffer += len;
|
buffer += len;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -102,7 +102,7 @@ bool NormPostProcessor::SetCommand(const char* cmd)
|
||||||
{
|
{
|
||||||
const char* argStart = ptr;
|
const char* argStart = ptr;
|
||||||
while (!isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
while (!isspace(*ptr) && ('\0' != *ptr)) ptr++;
|
||||||
unsigned int argLength = ptr - argStart;
|
unsigned int argLength = (unsigned int)(ptr - argStart);
|
||||||
char* arg;
|
char* arg;
|
||||||
if (!(arg = new char[argLength+1]))
|
if (!(arg = new char[argLength+1]))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -545,7 +545,7 @@ void NormSession::Serve()
|
||||||
else if (obj->IsStream())
|
else if (obj->IsStream())
|
||||||
{
|
{
|
||||||
// Is there room write to the stream
|
// Is there room write to the stream
|
||||||
|
// should we post TX_QUEUE_VACANCY here?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -554,7 +554,7 @@ void NormSession::Serve()
|
||||||
if (obj->IsStream())
|
if (obj->IsStream())
|
||||||
{
|
{
|
||||||
NormStreamObject* stream = static_cast<NormStreamObject*>(obj);
|
NormStreamObject* stream = static_cast<NormStreamObject*>(obj);
|
||||||
if (stream->IsFlushPending())
|
if (stream->IsFlushPending() || stream->IsClosing())
|
||||||
{
|
{
|
||||||
// Queue flush message
|
// Queue flush message
|
||||||
if (!flush_timer.IsActive())
|
if (!flush_timer.IsActive())
|
||||||
|
|
@ -567,6 +567,15 @@ void NormSession::Serve()
|
||||||
DMSG(6, "NormSession::Serve() node>%lu server flush complete ...\n",
|
DMSG(6, "NormSession::Serve() node>%lu server flush complete ...\n",
|
||||||
LocalNodeId());
|
LocalNodeId());
|
||||||
flush_count++;
|
flush_count++;
|
||||||
|
if (stream->IsClosing())
|
||||||
|
{
|
||||||
|
stream->Close();
|
||||||
|
stream->Retain();
|
||||||
|
Notify(NormController::TX_OBJECT_PURGED, (NormServerNode*)NULL, stream);
|
||||||
|
stream->Release();
|
||||||
|
DeleteTxObject(stream);
|
||||||
|
obj = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!posted_tx_queue_empty)
|
if (!posted_tx_queue_empty)
|
||||||
|
|
@ -784,7 +793,7 @@ void NormSession::ServerQueueFlush()
|
||||||
flush->SetFecSymbolId(segmentId);
|
flush->SetFecSymbolId(segmentId);
|
||||||
QueueMessage(flush);
|
QueueMessage(flush);
|
||||||
flush_count++;
|
flush_count++;
|
||||||
DMSG(0, "NormSession::ServerQueueFlush() node>%lu, flush queued (flush_count:%u)...\n",
|
DMSG(4, "NormSession::ServerQueueFlush() node>%lu, flush queued (flush_count:%u)...\n",
|
||||||
LocalNodeId(), flush_count);
|
LocalNodeId(), flush_count);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -1104,9 +1113,15 @@ void NormSession::TxSocketRecvHandler(ProtoSocket& /*theSocket*/,
|
||||||
msgLength,
|
msgLength,
|
||||||
msg.AccessAddress()))
|
msg.AccessAddress()))
|
||||||
{
|
{
|
||||||
msg.InitFromBuffer(msgLength);
|
if (msg.InitFromBuffer(msgLength))
|
||||||
HandleReceiveMessage(msg, true);
|
{
|
||||||
msgLength = NormMsg::MAX_SIZE;
|
HandleReceiveMessage(msg, true);
|
||||||
|
msgLength = NormMsg::MAX_SIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DMSG(0, "NormSession::TxSocketRecvHandler() warning: received bad message\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} // end NormSession::TxSocketRecvHandler()
|
} // end NormSession::TxSocketRecvHandler()
|
||||||
|
|
||||||
|
|
@ -1119,9 +1134,15 @@ void NormSession::RxSocketRecvHandler(ProtoSocket& /*theSocket*/,
|
||||||
msgLength,
|
msgLength,
|
||||||
msg.AccessAddress()))
|
msg.AccessAddress()))
|
||||||
{
|
{
|
||||||
msg.InitFromBuffer(msgLength);
|
if (msg.InitFromBuffer(msgLength))
|
||||||
HandleReceiveMessage(msg, false);
|
{
|
||||||
msgLength = NormMsg::MAX_SIZE;
|
HandleReceiveMessage(msg, false);
|
||||||
|
msgLength = NormMsg::MAX_SIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DMSG(0, "NormSession::RxSocketRecvHandler() warning: received bad message\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} // end NormSession::RxSocketRecvHandler()
|
} // end NormSession::RxSocketRecvHandler()
|
||||||
|
|
||||||
|
|
@ -1204,12 +1225,18 @@ void NormTrace(const struct timeval& currentTime,
|
||||||
(UINT16)data.GetObjectId(),
|
(UINT16)data.GetObjectId(),
|
||||||
(UINT32)data.GetFecBlockId(),
|
(UINT32)data.GetFecBlockId(),
|
||||||
(UINT16)data.GetFecSymbolId());
|
(UINT16)data.GetFecSymbolId());
|
||||||
if (data.IsData())
|
if (data.IsData() && data.IsStream())
|
||||||
{
|
{
|
||||||
UINT16 x;
|
if (NormDataMsg::StreamPayloadFlagIsSet(data.GetPayload(), NormDataMsg::FLAG_MSG_START))
|
||||||
memcpy(&x, data.GetPayloadData(), 2);
|
{
|
||||||
if (data.FlagIsSet(NormObjectMsg::FLAG_MSG_START))
|
// We usually use the first two bytes of "messages"
|
||||||
DMSG(0, "start byte>%hu ", ntohs(x));
|
// as a "message length" header
|
||||||
|
UINT16 x;
|
||||||
|
memcpy(&x, data.GetPayloadData(), 2);
|
||||||
|
DMSG(0, "start word>%hu ", ntohs(x));
|
||||||
|
}
|
||||||
|
if (NormDataMsg::StreamPayloadFlagIsSet(data.GetPayload(), NormDataMsg::FLAG_STREAM_END))
|
||||||
|
DMSG(0, "(stream end) ");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
////////////////////////////////////////////////////
|
|
||||||
// This is a test application for experimenting
|
// This is a test application for experimenting
|
||||||
// with the NORM API implementation during its
|
// with the NORM API implementation during its
|
||||||
// development. A better-documented and complete
|
// development. A better-documented and complete
|
||||||
|
|
@ -9,14 +8,19 @@
|
||||||
#include "protokit.h" // for protolib debug, stuff, etc
|
#include "protokit.h" // for protolib debug, stuff, etc
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h> // for srand()
|
||||||
|
|
||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
#include <unistd.h> // for "sleep()"
|
#include <unistd.h> // for "sleep()"
|
||||||
#endif // UNIX
|
#endif // UNIX
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
printf("normTest starting ...\n");
|
printf("normTest starting ...\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SetDebugLevel(2);
|
|
||||||
|
|
||||||
NormInstanceHandle instance = NormCreateInstance();
|
NormInstanceHandle instance = NormCreateInstance();
|
||||||
|
|
||||||
|
|
@ -32,14 +36,21 @@ int main(int argc, char* argv[])
|
||||||
"224.1.2.3",
|
"224.1.2.3",
|
||||||
6003,
|
6003,
|
||||||
NORM_NODE_ANY);
|
NORM_NODE_ANY);
|
||||||
// Uncomment to turn on debug NORM message tracing
|
|
||||||
//NormSetMessageTrace(session, true);
|
|
||||||
|
|
||||||
|
// NOTE: These are debugging routines available (not for normal app use)
|
||||||
|
SetDebugLevel(2);
|
||||||
|
// Uncomment to turn on debug NORM message tracing
|
||||||
|
NormSetMessageTrace(session, true);
|
||||||
|
// Uncomment to turn on some random packet loss
|
||||||
//NormSetTxLoss(session, 1.0); // 10% packet loss
|
//NormSetTxLoss(session, 1.0); // 10% packet loss
|
||||||
|
struct timeval currentTime;
|
||||||
|
ProtoSystemTime(currentTime);
|
||||||
|
// Uncomment to get different packet loss patterns from run to run
|
||||||
|
//srand(currentTime.tv_sec); // seed random number generator
|
||||||
|
|
||||||
NormSetGrttEstimate(session, 0.001); // 1 msec initial grtt
|
NormSetGrttEstimate(session, 0.001); // 1 msec initial grtt
|
||||||
|
|
||||||
NormSetTransmitRate(session, 80.0e+06); // in bits/second
|
NormSetTransmitRate(session, 60.0e+06); // in bits/second
|
||||||
|
|
||||||
NormSetDefaultRepairBoundary(session, NORM_BOUNDARY_BLOCK);
|
NormSetDefaultRepairBoundary(session, NORM_BOUNDARY_BLOCK);
|
||||||
|
|
||||||
|
|
@ -77,8 +88,7 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
// Uncomment this line to send a stream instead of the file
|
// Uncomment this line to send a stream instead of the file
|
||||||
stream = NormStreamOpen(session, 4096*1024);
|
stream = NormStreamOpen(session, 4096*1024);
|
||||||
|
|
||||||
|
|
||||||
// NORM_FLUSH_PASSIVE automatically flushes full writes to
|
// NORM_FLUSH_PASSIVE automatically flushes full writes to
|
||||||
// the stream.
|
// the stream.
|
||||||
NormStreamSetAutoFlush(stream, NORM_FLUSH_PASSIVE);
|
NormStreamSetAutoFlush(stream, NORM_FLUSH_PASSIVE);
|
||||||
|
|
@ -95,7 +105,7 @@ int main(int argc, char* argv[])
|
||||||
int msgCount = 0;
|
int msgCount = 0;
|
||||||
int recvCount = -1; // used to monitor reliable stream reception
|
int recvCount = -1; // used to monitor reliable stream reception
|
||||||
int sendCount = 0;
|
int sendCount = 0;
|
||||||
int sendMax = 200;
|
int sendMax = 20;
|
||||||
NormEvent theEvent;
|
NormEvent theEvent;
|
||||||
while (NormGetNextEvent(instance, &theEvent))
|
while (NormGetNextEvent(instance, &theEvent))
|
||||||
{
|
{
|
||||||
|
|
@ -105,7 +115,7 @@ int main(int argc, char* argv[])
|
||||||
// TRACE("NORM_TX_QUEUE_VACANCY ...\n");
|
// TRACE("NORM_TX_QUEUE_VACANCY ...\n");
|
||||||
case NORM_TX_QUEUE_EMPTY:
|
case NORM_TX_QUEUE_EMPTY:
|
||||||
//TRACE("NORM_TX_QUEUE_EMPTY ...\n");
|
//TRACE("NORM_TX_QUEUE_EMPTY ...\n");
|
||||||
|
if (sendCount >= sendMax) break;
|
||||||
if (NORM_OBJECT_INVALID != stream)
|
if (NORM_OBJECT_INVALID != stream)
|
||||||
{
|
{
|
||||||
// We loop here to keep stream buffer full ....
|
// We loop here to keep stream buffer full ....
|
||||||
|
|
@ -134,6 +144,13 @@ int main(int argc, char* argv[])
|
||||||
NormStreamMarkEom(stream);
|
NormStreamMarkEom(stream);
|
||||||
txLen = txIndex = 0;
|
txLen = txIndex = 0;
|
||||||
sendCount++;
|
sendCount++;
|
||||||
|
if (sendCount >= sendMax)
|
||||||
|
{
|
||||||
|
// Uncomment to gracefully shut down the stream
|
||||||
|
// after "sendMax" messages
|
||||||
|
//NormStreamClose(stream, true);
|
||||||
|
//keepWriting = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -160,7 +177,7 @@ int main(int argc, char* argv[])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NORM_TX_OBJECT_PURGED:
|
case NORM_TX_OBJECT_PURGED:
|
||||||
DMSG(3, "normTest: NORM_TX_OBJECT_PURGED event ...\n");
|
DMSG(2, "normTest: NORM_TX_OBJECT_PURGED event ...\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NORM_RX_OBJECT_NEW:
|
case NORM_RX_OBJECT_NEW:
|
||||||
|
|
@ -186,8 +203,6 @@ int main(int argc, char* argv[])
|
||||||
if (!NormFileRename(theEvent.object, fileName))
|
if (!NormFileRename(theEvent.object, fileName))
|
||||||
TRACE("normTest: NormSetFileName(%s) error\n", fileName);
|
TRACE("normTest: NormSetFileName(%s) error\n", fileName);
|
||||||
DMSG(3, "normTest: recv'd info for file: %s\n", fileName);
|
DMSG(3, "normTest: recv'd info for file: %s\n", fileName);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,6 @@
|
||||||
|
|
||||||
#ifndef _NORM_VERSION
|
#ifndef _NORM_VERSION
|
||||||
#define _NORM_VERSION
|
#define _NORM_VERSION
|
||||||
#define VERSION "1.3b1"
|
#define VERSION "1.3b2"
|
||||||
#endif // _NORM_VERSION
|
#endif // _NORM_VERSION
|
||||||
|
|
||||||
|
|
|
||||||
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 ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\common" /I "..\protolib\common" /I "..\protolib\win32" /D "NDEBUG" /D "PROTO_DEBUG" /D "HAVE_IPV6" /D "HAVE_ASSERT" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\common" /I "..\protolib\common" /I "..\protolib\win32" /D "NDEBUG" /D "PROTO_DEBUG" /D "HAVE_IPV6" /D "HAVE_ASSERT" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||||
|
# SUBTRACT CPP /Z<none>
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
|
|
|
||||||
|
|
@ -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