The Assimilation Project
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cstringframe.c
Go to the documentation of this file.
1 
26 #include <string.h>
27 #include <projectcommon.h>
28 #include <frameset.h>
29 #include <cstringframe.h>
30 #include <frametypes.h>
31 #include <generic_tlv_min.h>
32 #include <tlvhelper.h>
33 
35 
50 FSTATIC gboolean _cstringframe_default_isvalid(const Frame *, gconstpointer, gconstpointer);
51 FSTATIC gchar* _cstringframe_toString(gconstpointer);
52 
57 
59 FSTATIC gboolean
61  gconstpointer tlvptr,
62  gconstpointer pktend)
63 {
64  gsize length;
65  const guint8* stringstart;
66  const guint8* endplace;
67  const guint8* expectedplace;
68 
69  (void)self;
70  if (tlvptr == NULL) {
71  if (self->value == NULL) {
72  return FALSE;
73  }
74  length = self->length;
75  stringstart = self->value;
76  }else{
77  length = get_generic_tlv_len(tlvptr, pktend);
78  stringstart = get_generic_tlv_value(tlvptr, pktend);
79  g_return_val_if_fail(NULL != tlvptr, FALSE);
80  g_return_val_if_fail(NULL != pktend, FALSE);
81  g_return_val_if_fail(length > 0, FALSE);
82  }
83 
84  endplace = stringstart + length;
85  expectedplace = endplace-1;
86  return expectedplace == memchr(stringstart, 0x00, length);
87 }
88 
89 FSTATIC
90 gchar*
91 _cstringframe_toString(gconstpointer obj)
92 {
93  const CstringFrame* self = CASTTOCONSTCLASS(CstringFrame, obj);
94  return g_strdup_printf("CstringFrame(%d, \"%s\")"
95  , self->baseclass.type, (gchar*)self->baseclass.value);
96 }
97 
98 
102 cstringframe_new(guint16 frame_type,
103  gsize framesize)
104 {
105  Frame* baseframe;
106 
108  if (framesize < sizeof(CstringFrame)){
109  framesize = sizeof(CstringFrame);
110  }
111 
112  baseframe = frame_new(frame_type, framesize);
113  if (framesize == sizeof(CstringFrame)) {
114  DEBUGMSG5("%s: Constructing New CstringFrame at 0x%p", __FUNCTION__, baseframe);
115  }
118  return NEWSUBCLASS(CstringFrame, baseframe);
119 
120 }
125 cstringframe_tlvconstructor(gconstpointer tlvstart,
126  gconstpointer pktend,
127  gpointer* ignorednewpkt,
128  gpointer* ignoredpktend)
129 {
130  guint16 frametype = get_generic_tlv_type(tlvstart, pktend);
131  guint16 framelength = get_generic_tlv_len(tlvstart, pktend);
132  const guint8* framevalue = get_generic_tlv_value(tlvstart, pktend);
133  CstringFrame * ret = cstringframe_new(frametype, 0);
134  Frame * fret = CASTTOCLASS(Frame, ret);
135 
136  (void)ignorednewpkt; (void)ignoredpktend;
137  g_return_val_if_fail(ret != NULL, NULL);
138 
139  ret->baseclass.length = framelength;
140  ret->baseclass.setvalue(fret, g_memdup(framevalue, framelength), framelength, frame_default_valuefinalize);
141  return fret;
142 }