src/common/packet-printer.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 31 May 2007 11:03:42 +0200
changeset 798 f947deabe06e
parent 796 73d7e23c4d3e
child 799 3236b54a77a6
permissions -rw-r--r--
rework the PacketPrinter code
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2007 INRIA
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 * All rights reserved.
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 *
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License version 2 as
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 * published by the Free Software Foundation;
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 *
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 * GNU General Public License for more details.
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 *
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * along with this program; if not, write to the Free Software
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 *
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
 */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#ifndef PACKET_PRINTER_H
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#define PACKET_PRINTER_H
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include "ns3/callback.h"
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include "ns3/ptr.h"
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    26
#include "buffer.h"
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    27
#include <vector>
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
namespace ns3 {
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    31
class Chunk;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    32
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
class PacketPrinter 
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
{
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
public:
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    36
  struct FragmentInformation
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    37
  {
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    38
    uint32_t start;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    39
    uint32_t end;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    40
  };
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
   * \brief callback to print payload.
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
   *
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
   * Arguments: output stream, packet uid, size, fragment information
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
  typedef Callback<void,std::ostream &,uint32_t,uint32_t,struct PacketPrinter::FragmentInformation>
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
    PayloadPrinter;
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
   * \brief callback to print fragmented chunks.
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    51
   *
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
   * Arguments: output stream, packet uid, size, header/trailer name, fragment information
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
  typedef Callback<void,std::ostream &,uint32_t,uint32_t,std::string &,struct PacketPrinter::FragmentInformation>
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
    ChunkFragmentPrinter;
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
   * \brief callback to print chunks for which no specific callback was specified.
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
   *
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
   * Arguments: output stream, packet uid, size, header/trailer name, fragment information
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
  typedef Callback<void,std::ostream&,uint32_t,uint32_t,std::string&,struct PacketPrinter::FragmentInformation> 
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
    DefaultPrinter;
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    65
  PacketPrinter ();
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
   * Print the content of the packet forward.
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
  void PrintForward (void);
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
   * Print the content of the packet backward.
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
  void PrintBackward (void);
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
   * \param printer printer for payload
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
  void AddPayloadPrinter (PayloadPrinter printer);
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
   * \param printer printer for the specified chunk
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
   * \param fragmentPrinter printer for a fragment of the specified chunk
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
  template <typename T>
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
  void AddPrinter (Callback<void,std::ostream &,uint32_t,uint32_t,const T *> printer,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
		   ChunkFragmentPrinter fragmentPrinter);
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
  /**
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
   * \param printer printer for a chunk for which no callback was specified explicitely
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
   */
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
  void AddDefaultPrinter (DefaultPrinter printer);
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
  
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
private:
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
  friend class PacketHistory;
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    93
  struct Printer
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    94
  {
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    95
    uint32_t m_chunkUid;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    96
    Ptr<CallbackImplBase> m_printer;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    97
    Callback<void,std::ostream &,uint32_t,uint32_t,std::string &,struct PacketPrinter::FragmentInformation>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    98
      m_fragmentPrinter;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
    99
  };
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   100
  typedef void (*DoPrintCallback) (Ptr<CallbackImplBase>, Buffer::Iterator, std::ostream &,
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   101
                                   uint32_t, uint32_t);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   102
  typedef std::string (*DoGetNameCallback) (void);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   103
  typedef std::vector<struct PacketPrinter::Printer> PrinterList;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   104
  typedef std::vector<std::pair<DoPrintCallback,DoGetNameCallback> > RegisteredChunks;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   105
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
  static PacketPrinter GetDefault (void);
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   108
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
  template <typename T>
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   110
  static void DoPrint (Ptr<CallbackImplBase> callbackPrinter,
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   111
                       Buffer::Iterator i, 
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   112
                       std::ostream &os, 
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   113
                       uint32_t packetUid,
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   114
                       uint32_t size);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   115
  template <typename T>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   116
  static std::string DoGetName (void);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   117
  template <typename T>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   118
  static uint32_t GetUid (void);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   119
  template <typename T>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   120
  static uint32_t AllocateUid (void);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   121
  static RegisteredChunks *GetRegisteredChunks (void);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   122
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
  void PrintChunk (uint32_t uid, 
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   125
		   Buffer::Iterator i, 
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
		   std::ostream &os, 
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
		   uint32_t packetUid,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
		   uint32_t size);
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
  void PrintChunkFragment (uint32_t uid,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
			   std::ostream &os,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
			   uint32_t packetUid,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
			   uint32_t size,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
			   uint32_t fragmentStart,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
			   uint32_t fragmentEnd);
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
  void PrintPayload (std::ostream &os, uint32_t packetUid, uint32_t size,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
		     uint32_t fragmentStart, uint32_t fragmentEnd);
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   137
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   138
  static PacketPrinter m_defaultPacketPrinter;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   139
  PrinterList m_printerList;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   140
  PayloadPrinter m_payloadPrinter;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   141
  DefaultPrinter m_defaultPrinter;
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
  bool m_forward;
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
};
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
} // namespace ns3
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
namespace ns3 {
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
template <typename T>
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
void 
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   151
PacketPrinter::AddPrinter (Callback<void,std::ostream &, uint32_t, uint32_t, const T *> printer,
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
			   Callback<void,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
		            std::ostream &, 
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   154
		            uint32_t, 
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
                            uint32_t, 
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
                            std::string &,
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
		            struct PacketPrinter::FragmentInformation> fragmentPrinter)
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
{
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   159
  static uint32_t uid = PacketPrinter::GetUid<T> ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   160
  struct PacketPrinter::Printer p;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   161
  p.m_chunkUid = uid;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   162
  p.m_printer = printer.PeekImpl ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   163
  p.m_fragmentPrinter = fragmentPrinter;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   164
  m_printerList.push_back (p);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   165
}
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   166
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   167
template <typename T>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   168
void
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   169
PacketPrinter::DoPrint (Ptr<CallbackImplBase> printerCallback,
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   170
                        Buffer::Iterator i,
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   171
                        std::ostream &os, 
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   172
                        uint32_t packetUid,
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   173
                        uint32_t size)
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   174
{
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   175
  T chunk = T ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   176
  chunk.Deserialize (i);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   177
  Callback<void,std::ostream&,uint32_t,uint32_t,const T*> callback;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   178
  callback.Assign (printerCallback);
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   179
  callback (os, packetUid, size, &chunk);
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
}
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
798
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   182
template <typename T>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   183
std::string
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   184
PacketPrinter::DoGetName (void)
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   185
{
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   186
  T chunk = T ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   187
  return chunk.GetName ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   188
}
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   189
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   190
template <typename T>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   191
uint32_t 
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   192
PacketPrinter::GetUid (void)
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   193
{
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   194
  static uint32_t uid = PacketPrinter::AllocateUid<T> ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   195
  return uid;
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   196
}
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   197
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   198
template <typename T>
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   199
uint32_t
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   200
PacketPrinter::AllocateUid (void)
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   201
{
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   202
  RegisteredChunks *chunks = PacketPrinter::GetRegisteredChunks ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   203
  chunks->push_back (std::make_pair(&PacketPrinter::DoPrint<T>, 
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   204
                                    &PacketPrinter::DoGetName<T>));
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   205
  return chunks->size ();
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   206
}
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   207
f947deabe06e rework the PacketPrinter code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 796
diff changeset
   208
796
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
} // namespace ns3
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
73d7e23c4d3e try to design a packer printer class
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
#endif /* PACKET_PRINTER_H */