⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stat.hpp

📁 学习sip协议的好工具
💻 HPP
字号:
/* *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * *  Authors : Benjamin GAUTHIER - 24 Mar 2004 *            Joseph BANINO *            Olivier JACQUES *            Richard GAYRAUD *            From Hewlett Packard Company. *            */#ifndef __STAT_H__#define __STAT_H__#define TIME_LENGTH 32#define DEFAULT_FILE_NAME (char*)"dumpFile"#define DEFAULT_EXTENSION (char*)".csv"#define MAX_REPARTITION_HEADER_LENGTH 1024#define MAX_REPARTITION_INFO_LENGTH   1024#define MAX_CHAR_BUFFER_SIZE          256#include <ctime> #include <sys/time.h> #include <iostream>#include <fstream>#include <stdio.h>using namespace std;/*__________________________________________________________________________              C S t a t    C L A S S__________________________________________________________________________*/  /**   * This class provides some means to compute and display statistics.   * This is a singleton class.   */class CStat {public:  /*    * This struct is used for repartition table   * border max is the max value allow for this range   * nbInThisBorder is the counter of value in this range   */  typedef struct _T_dynamicalRepartition  {    unsigned int  borderMax;    unsigned long nbInThisBorder;   } T_dynamicalRepartition;   /**   * Actions on counters   */  enum E_Action  {    E_CREATE_OUTGOING_CALL,    E_CREATE_INCOMING_CALL,    E_CALL_FAILED,     E_CALL_SUCCESSFULLY_ENDED,    E_RESET_PD_COUNTERS,    E_RESET_PL_COUNTERS,    E_ADD_CALL_DURATION,    E_ADD_RESPONSE_TIME_DURATION,    E_FAILED_CANNOT_SEND_MSG,    E_FAILED_MAX_UDP_RETRANS,    E_FAILED_UNEXPECTED_MSG,    E_FAILED_CALL_REJECTED,    E_FAILED_CMD_NOT_SENT,    E_FAILED_REGEXP_DOESNT_MATCH,    E_FAILED_REGEXP_HDR_NOT_FOUND,    E_OUT_OF_CALL_MSGS,    E_AUTO_ANSWERED  };  /**   * Counters management   */  enum E_CounterName  {  // Cumulative counters  CPT_C_IncomingCallCreated,  CPT_C_OutgoingCallCreated,  CPT_C_SuccessfulCall,  CPT_C_FailedCall,  CPT_C_CurrentCall,  CPT_C_NbOfCallUsedForAverageCallLength,  CPT_C_AverageCallLength,  CPT_C_NbOfCallUsedForAverageResponseTime,  CPT_C_AverageResponseTime,  CPT_C_FailedCallCannotSendMessage,  CPT_C_FailedCallMaxUdpRetrans,  CPT_C_FailedCallUnexpectedMessage,  CPT_C_FailedCallCallRejected,  CPT_C_FailedCallCmdNotSent,  CPT_C_FailedCallRegexpDoesntMatch,  CPT_C_FailedCallRegexpHdrNotFound,  CPT_C_OutOfCallMsgs,  CPT_C_AutoAnswered,  // Periodic Display counter  CPT_PD_IncomingCallCreated, // must be first (RESET_PD_COUNTER macro)  CPT_PD_OutgoingCallCreated,  CPT_PD_SuccessfulCall,  CPT_PD_FailedCall,  CPT_PD_NbOfCallUsedForAverageCallLength,  CPT_PD_AverageCallLength,  CPT_PD_NbOfCallUsedForAverageResponseTime,  CPT_PD_AverageResponseTime,  CPT_PD_FailedCallCannotSendMessage,  CPT_PD_FailedCallMaxUdpRetrans,  CPT_PD_FailedCallUnexpectedMessage,  CPT_PD_FailedCallCallRejected,  CPT_PD_FailedCallCmdNotSent,  CPT_PD_FailedCallRegexpDoesntMatch,  CPT_PD_FailedCallRegexpHdrNotFound,  CPT_PD_OutOfCallMsgs,  CPT_PD_AutoAnswered, // must be last (RESET_PD_COUNTER)  // Periodic logging counter  CPT_PL_IncomingCallCreated, // must be first (RESET_PL_COUNTER macro)  CPT_PL_OutgoingCallCreated,  CPT_PL_SuccessfulCall,  CPT_PL_FailedCall,  CPT_PL_NbOfCallUsedForAverageCallLength,  CPT_PL_AverageCallLength,  CPT_PL_NbOfCallUsedForAverageResponseTime,  CPT_PL_AverageResponseTime,  CPT_PL_FailedCallCannotSendMessage,  CPT_PL_FailedCallMaxUdpRetrans,  CPT_PL_FailedCallUnexpectedMessage,  CPT_PL_FailedCallCallRejected,  CPT_PL_FailedCallCmdNotSent,  CPT_PL_FailedCallRegexpDoesntMatch,  CPT_PL_FailedCallRegexpHdrNotFound,  CPT_PL_OutOfCallMsgs,  CPT_PL_AutoAnswered, // must be last (RESET_PL_COUNTER)  E_NB_COUNTER  };  /*  ** exported methods  */  /**   * Get the single instance of the class.   *   * Only one instance of CStat exists in the component. This   * instance is automatically created the first time the instance()   * method is called.   *   * @return the single instance of the CStat class.   */  static CStat* instance ();   /**   * Delete the single instance of the class.   *   * Only one instance of CStat exists in the component. This   * instance is deleted when the close method is called.   */  void close ();   /**   * ComputeStat Methods are used to modify counter value   * It's the main interface to update counter   *   * @return 0 if the action is known   *        -1 else   */  int computeStat (E_Action P_action);  int computeStat (E_Action P_action, unsigned long P_value);  /**   * GetStat Method is used to retrieve a counter value   *   * @return the counter value   **/  unsigned long  GetStat (E_CounterName P_counter);    /**   * formatTime.   *   * This method converts a struct timeval parameter into a printable string   * in the format given in parameter.   *   * @param P_tv.   * @return a pointer on a static string containing formated time   */  char* formatTime (struct timeval* P_tv);  /**   * setRepartitionCallLength    * - set the unsigned int table passed in parameter as the repartition table    *   for call length. This is done by calling the initRepartition methode on    *   the M_CallLengthRepartition variable.   * - set the char* list of int (must be separeted with coma as the    *   repartition table for call length   *   This is done by calling the createIntegerTable to transform the char*    *   list into unsigned int list. Then the initRepartition methode is    *   call with the created unsigned int list and the M_CallLengthRepartition    *   variable   *   * setRepartitionResponseTime   *   Same than setRepartitionCallLength with the variable   *  M_ResponseTimeRepartition variableinstead of M_CallLengthRepartition    *  variable   */  void setRepartitionCallLength   (unsigned int* repartition, int nombre);  void setRepartitionCallLength   (char * liste);  void setRepartitionResponseTime (unsigned int* repartition, int nombre);  void setRepartitionResponseTime (char * liste);  /* define the file name to use to dump statistic in file */  void setFileName                (char * name);  void setFileName                (char * name, char * extension);  /**   * Display data periodically updated on screen.   */  void displayData (FILE *f);  void displayStat(FILE *f);  void displayRepartition(FILE *f);  /**   * Dump data periodically in the file M_FileName   */  void dumpData ();  /**   * initialize the class variable member   */  int init();private:     /**    * Constructor.   *   * Made private because this is a singleton class.   */  CStat ();  /**    * Destructor.   *   * Made private because this is a singleton class.   */  ~CStat ();  static CStat*            M_instance;  unsigned long            M_counters[E_NB_COUNTER];  T_dynamicalRepartition*  M_ResponseTimeRepartition;  T_dynamicalRepartition*  M_CallLengthRepartition;  int                      M_SizeOfResponseTimeRepartition;  int                      M_SizeOfCallLengthRepartition;  struct timeval           M_startTime;  struct timeval           M_pdStartTime;  struct timeval           M_plStartTime;  bool                     M_headerAlreadyDisplayed;  char*                    M_fileName;  ofstream*                M_outputStream;  unsigned long long       M_C_sumCallLength;  unsigned long long       M_C_sumResponseTime;  unsigned long long       M_PD_sumCallLength;  unsigned long long       M_PD_sumResponseTime;  unsigned long long       M_PL_sumCallLength;  unsigned long long       M_PL_sumResponseTime;  /**   * initRepartition   * This methode is used to create the repartition table with a table of    * unsigned int the reparition is created like following, with Vi the given    * value in the table   * 0    <= x <  V1     * V1   <= x <  V2    *  ...   * Vn-1 <= x <  Vn   *         x >= Vn   * So the repartition table have the size n+1 if the given table has a size    * of n */  void  initRepartition(unsigned int* repartition, int nombre,                        T_dynamicalRepartition ** tabRepartition, int* nbTab);    /**   * createIntegerTable   * this method try to create a table of unsigned int with the list of char*    * passed in parameters   * if it succed, it's return true (1)   * else it's return false (0)   */  int  createIntegerTable(char * P_listeStr,                           unsigned int ** listeInteger,                           int * sizeOfList);  /**   * isWellFormed   * this method check if the char* passed in parameter in really a list of     * integer separated with comma.   * if yes, it's return true (1)   * else, it's return false (0)   */  int  isWellFormed(char * P_listeStr, int * nombre);  /**   * updateRepartition   * The methode look for the place to set the value passed in parameter   * Once found, the associeted counter is incremented   */  void  updateRepartition( T_dynamicalRepartition* tabRepart,                            int sizeOfTab,                            unsigned long value);  /**   * displayRepartition   * Display the repartition passed in parameter at the screen   */  void  displayRepartition(FILE *f,                           T_dynamicalRepartition * tabRepartition,                            int sizeOfTab);  /**   * sRepartitionHeader   * return a string with the range description of the given repartition   */  char* sRepartitionHeader(T_dynamicalRepartition * tabRepartition,                            int sizeOfTab,                           char* P_repartitionName);  /**   * sRepartitionInfo   * return a string with the number of value in the differente range of the    * given repartition   */  char* sRepartitionInfo(T_dynamicalRepartition * tabRepartition,                          int sizeOfTab);  /**   * UpdateAverageCounter   * This methode compute the real moyenne with the passed value on the given    * counter   */  void updateAverageCounter(E_CounterName P_AverageCounter,                             E_CounterName P_NbOfCallUsed,                            unsigned long long* P_sum,                             unsigned long P_value);  /**   * computeDiffTimeInMs.   *   * This method calculates elaped time in ms   *   * @param tf = final date   * @param ti = initial date   *    * @return number of ms between the 2 dates   */  long computeDiffTimeInMs (struct timeval* tf, struct timeval* ti);    /**   * msToHHMMSS.   *   * This converts an unsigned long containing a number of ms   * into a string expressing the same value in format HH:MM:SS.   *   * @param P_ms.   *    * @return a pointer on a static string containing formated time   */  char* msToHHMMSS (unsigned long P_ms);    /**   * msToHHMMSSmm.   *   * This converts an unsigned long containing a number of ms   * into a string expressing the same value in format HH:MM:SS:mmm.   *   * @param P_ms.   *    * @return a pointer on a static string containing formated time   */  char* msToHHMMSSmmm (unsigned long P_ms);    /**   * Effective C++   *   * To prevent public copy ctor usage: no implementation   */  CStat (const CStat&);    /**   * Effective C++   *   * To prevent public operator= usage: no implementation   */  CStat& operator=(const CStat&);};#endif // __STAT_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -