EventHelix.com: CASE Tools; Real-time and Embedded System Design; Object Oriented Design EventStudio 2.0: System Engineering CASE ToolEventStudio 2.5
Sequence diagram based system design and modeling
Home   What's New   EventStudio 2.5   Real-time Mantra   Thought Projects   Contact Us
Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

Protocol_Stack.cpp

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #include "Protocol_Stack.h"
00010 #include "Protocol_Layer.h"
00011 #include <assert.h>
00012 
00021 
00022 void Protocol_Stack::Handle_Transmit(Protocol_Packet *p_Packet)
00023 {
00024     if (m_p_Highest_Layer)
00025     {
00026         m_p_Highest_Layer->Transmit(p_Packet);
00027     }
00028 }
00029 
00039 
00040 void Protocol_Stack::Handle_Receive(Protocol_Packet *p_Packet)
00041 {
00042     if (m_p_Lowest_Layer)
00043     {
00044         m_p_Lowest_Layer->Handle_Receive(p_Packet);
00045     }
00046 }
00047 
00061 
00062 void Protocol_Stack::Add_Layer(Protocol_Layer *p_Layer, Placement placement, Protocol_Layer *p_Existing_Layer)
00063 {
00064     // Start with a clean slate. Initialize the upper and lower protocol
00065     // layers to NULL. The pointers will be suitably initialized after insertion.
00066 
00067     p_Layer->Set_Lower_Layer(NULL);
00068     p_Layer->Set_Upper_Layer(NULL);
00069 
00070     // Check if some other layer is already present in the protocol stack. 
00071     // The placement processing applies only if this is not the first layer 
00072     // being added to the stack.
00073     if (m_p_Highest_Layer)
00074     {
00075         // This is not the first layer
00076 
00077         switch (placement)
00078         {
00079         case TOP:   // Add the layer at the top
00080             assert(p_Existing_Layer == NULL);
00081             m_p_Highest_Layer->Set_Upper_Layer(p_Layer);
00082             p_Layer->Set_Lower_Layer(m_p_Highest_Layer);
00083             m_p_Highest_Layer = p_Layer;
00084             break;
00085 
00086         case ABOVE: // Place the layer above the existing layer
00087             assert(p_Existing_Layer);
00088 
00089             Protocol_Layer *p_Previous_Upper_Layer;
00090 
00091             // Linking up the new layer above the existing layer
00092             p_Previous_Upper_Layer = p_Existing_Layer->Get_Upper_Layer();
00093             p_Layer->Set_Upper_Layer(p_Previous_Upper_Layer);
00094             p_Layer->Set_Lower_Layer(p_Existing_Layer);
00095             p_Existing_Layer->Set_Upper_Layer(p_Layer);
00096 
00097             // Check if the existing layer was the highest layer
00098             if (p_Existing_Layer == m_p_Highest_Layer)
00099             {
00100                 // If it was, make the new layer the highest layer
00101                 m_p_Highest_Layer = p_Layer;
00102             }
00103             else
00104             {
00105                 // Change the pointer of the existing layer's upper layer
00106                 // to point to the newly inserted layer.
00107                 p_Previous_Upper_Layer->Set_Lower_Layer(p_Layer);
00108             }
00109             break;
00110 
00111         case BELOW:    // Place the layer below the existing layer
00112 
00113             assert(p_Existing_Layer);
00114             Protocol_Layer *p_Previous_Lower_Layer;
00115 
00116             // Linking up the new layer below the existing layer
00117             p_Previous_Lower_Layer = p_Existing_Layer->Get_Lower_Layer();
00118             p_Layer->Set_Upper_Layer(p_Existing_Layer);
00119             p_Layer->Set_Lower_Layer(p_Previous_Lower_Layer);
00120             p_Existing_Layer->Set_Lower_Layer(p_Layer);
00121 
00122             // Check if the existing layer was the lowest layer
00123             if (p_Existing_Layer == m_p_Lowest_Layer)
00124             {
00125                 // If it was, make the new layer the lowest layer
00126                 m_p_Lowest_Layer = p_Layer;
00127             }
00128             else
00129             {
00130                 // Change the pointer of the existing layer's lower layer
00131                 // to point to the newly inserted layer.
00132                 p_Previous_Lower_Layer->Set_Upper_Layer(p_Layer);
00133             }
00134             break;
00135 
00136         }
00137     }
00138     else  // The highest layer is NULL
00139     {
00140         // This means that this is the first layer in the protocol stack.
00141         assert(p_Existing_Layer == NULL);
00142         m_p_Highest_Layer = p_Layer;
00143         m_p_Lowest_Layer = p_Layer;
00144     }
00145 }
00146 
00150 
00151 void Protocol_Stack::Remove_Layer(Protocol_Layer *p_Layer)
00152 {
00153     // Check if the layer to be removed is the highest layer.
00154     if (p_Layer == m_p_Highest_Layer)
00155     {
00156         // Yes it is, so set the removed layer's lower layer as the highest layer
00157         // in the protocol stack.
00158         m_p_Highest_Layer = p_Layer->Get_Lower_Layer();
00159 
00160         // If this was not the only layer in the stack, set the
00161         // upper layer of this layer as NULL.
00162         if (m_p_Highest_Layer)
00163         {
00164             m_p_Highest_Layer->Set_Upper_Layer(NULL);
00165         }
00166     }
00167     else // Not the highest layer
00168     {
00169         // Stitch the upper layer to lower layer link after the layer is removed.
00170         (p_Layer->Get_Upper_Layer())->Set_Lower_Layer(p_Layer->Get_Lower_Layer());
00171     }
00172 
00173     // Check if the layer to be removed is the lowest layer.
00174     if (p_Layer == m_p_Lowest_Layer)
00175     {
00176         // Yes it is, so set the removed layer's upper layer as the lowest layer
00177         // in the protocol stack.
00178         m_p_Lowest_Layer = p_Layer->Get_Upper_Layer();
00179 
00180         // If this was not the only layer in the stack, set the
00181         // lower layer of this layer as NULL.
00182         if (m_p_Lowest_Layer)
00183         {
00184             m_p_Lowest_Layer->Set_Lower_Layer(NULL);
00185         }
00186     }
00187     else
00188     {
00189         // Stitch the lower layer to upper layer link after the layer is removed.
00190         (p_Layer->Get_Lower_Layer())->Set_Upper_Layer(p_Layer->Get_Upper_Layer());
00191     }
00192 
00193     // Set the upper and lower layer pointers of the removed layer as NULL.
00194     // This is a safety measure.
00195     p_Layer->Set_Lower_Layer(NULL);
00196     p_Layer->Set_Upper_Layer(NULL);
00197 }
00198 
00201 
00202 Protocol_Stack::Protocol_Stack()
00203 {
00204     m_p_Highest_Layer = NULL;
00205     m_p_Lowest_Layer = NULL;
00206 }

Generated on Sun Feb 13 21:30:17 2005 for Object Oriented Design Examples by doxygen 1.3.4
 Home   What's New   EventStudio 2.5   Real-time Mantra   Thought Projects   Contact Us
Copyright © 2000-2005 EventHelix.com Inc. All Rights Reserved.