Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 #ifndef _HDR_UTILS_H_
00035 #define _HDR_UTILS_H_
00036 
00037 #include "ParseRules.h"
00038 #include "MIME.h"
00039 
00040 
00041 class HdrCsvIter
00042 {
00043 public:
00044   
00045   
00046 HdrCsvIter(const char s = ','):m_value_start(NULL),
00047     m_value_len(0), m_bytes_consumed(0), m_follow_dups(false),
00048     m_csv_start(NULL), m_csv_len(0), m_csv_end(NULL), m_csv_index(0), m_cur_field(NULL), m_separator(s) {
00049   }
00050   const char *get_first(MIMEField * m, int *len, bool follow_dups = true);
00051   const char *get_next(int *len);
00052   const char *get_current(int *len);
00053 
00054   const char *get_nth(MIMEField * m, int *len, int n, bool follow_dups = true);
00055   int count_values(MIMEField * field, bool follow_dups = true);
00056 
00057   int get_index();
00058 
00059   int get_first_int(MIMEField * m, int *valid = NULL);
00060   int get_next_int(int *valid = NULL);
00061 
00062 private:
00063   void find_csv();
00064 
00065   const char *m_value_start;
00066   int m_value_len;
00067   int m_bytes_consumed;
00068   bool m_follow_dups;
00069 
00070   
00071   
00072   
00073   
00074   
00075   
00076   
00077   
00078   
00079   
00080   
00081   
00082   const char *m_csv_start;
00083   int m_csv_len;
00084   const char *m_csv_end;
00085   int m_csv_index;
00086   MIMEField *m_cur_field;
00087 
00088   
00089   const char m_separator;
00090 
00091   void field_init(MIMEField * m);
00092 };
00093 
00094 inline void
00095 HdrCsvIter::field_init(MIMEField * m)
00096 {
00097   m_cur_field = m;
00098   m_value_start = m->m_ptr_value;
00099   m_value_len = m->m_len_value;
00100   m_csv_start = m_value_start;
00101 }
00102 
00103 inline const char *
00104 HdrCsvIter::get_first(MIMEField * m, int *len, bool follow_dups)
00105 {
00106 
00107   field_init(m);
00108 
00109   m_follow_dups = follow_dups;
00110 
00111   m_bytes_consumed = 0;
00112   m_csv_index = -1;
00113 
00114   if (m_csv_start) {
00115     find_csv();
00116   } else {
00117     m_csv_len = 0;
00118   }
00119 
00120   *len = m_csv_len;
00121   return m_csv_start;
00122 }
00123 
00124 
00125 inline const char *
00126 HdrCsvIter::get_next(int *len)
00127 {
00128 
00129 
00130   if (m_csv_start) {
00131     
00132     m_csv_start = m_csv_end + 1;
00133     find_csv();
00134   }
00135 
00136   *len = m_csv_len;
00137   return m_csv_start;
00138 }
00139 
00140 inline const char *
00141 HdrCsvIter::get_current(int *len)
00142 {
00143   *len = m_csv_len;
00144   return m_csv_start;
00145 }
00146 
00147 inline int
00148 HdrCsvIter::get_first_int(MIMEField * m, int *valid)
00149 {
00150   int len;
00151   const char *r = get_first(m, &len);
00152 
00153   if (r) {
00154     if (valid)
00155       *valid = 1;
00156     return ink_atoi(r, len);
00157   } else {
00158     if (valid)
00159       *valid = 0;
00160     return 0;
00161   }
00162 }
00163 
00164 inline int
00165 HdrCsvIter::get_next_int(int *valid)
00166 {
00167   int len;
00168   const char *r = get_next(&len);
00169 
00170   if (r) {
00171     if (valid)
00172       *valid = 1;
00173     return ink_atoi(r, len);
00174   } else {
00175     if (valid)
00176       *valid = 0;
00177     return 0;
00178   }
00179 }
00180 
00181 
00182 
00183 #endif