1 
2 /* Web Polygraph       http://www.web-polygraph.org/
3  * Copyright 2003-2011 The Measurement Factory
4  * Licensed under the Apache License, Version 2.0 */
5 
6 #include "pgl/pgl.h"
7 
8 #include "xstd/String.h"
9 #include "pgl/PglRec.h"
10 #include "pgl/PglSizeSym.h"
11 #include "pgl/PglNumSym.h"
12 #include "pgl/PglIntSym.h"
13 #include "pgl/PglStringSym.h"
14 #include "pgl/PglArraySym.h"
15 #include "pgl/MimeSym.h"
16 #include "pgl/ObjLifeCycleSym.h"
17 #include "pgl/ContentSym.h"
18 #include "pgl/MimeHeaderSym.h"
19 #include "pgl/ClientBehaviorSym.h"
20 
21 
22 String ContentSym::TheType = "Content";
23 
24 static String strContentArr = "Content[]";
25 static String strCachable = "cachable";
26 static String strChecksum = "checksum";
27 static String strChoice_space = "choice_space";
28 static String strClient_behavior = "client_behavior";
29 static String strGenerator = "generator";
30 static String strContent_db = "content_db";
31 static String strEmbedded_obj_cnt = "embedded_obj_cnt";
32 static String strInfect_prob = "infect_prob";
33 static String strInject_object = "inject_object";
34 static String strInject_db = "inject_db";
35 static String strInject_gap = "inject_gap";
36 static String strInt_distr = "int_distr";
37 static String strKind = "kind";
38 static String strMay_contain = "may_contain";
39 static String strMime = "mime";
40 static String strObj_life_cycle = "obj_life_cycle";
41 static String strUnique = "unique";
42 static String strSize = "size";
43 static String strSize_distr = "size_distr";
44 static String strContainerContents = "container_contents";
45 static String strStringArr = "string[]";
46 static String strEncodings = "encodings";
47 static String strMimeHeaders = "mime_headers";
48 static String strMimeHeaderArr = "MimeHeader[]";
49 static String strDocumentRoot = "document_root";
50 
ContentSym()51 ContentSym::ContentSym(): RecSym(TheType, new PglRec) {
52 	theRec->bAdd(StringSym::TheType, strKind, 0);
53 	theRec->bAdd(MimeSym::TheType, strMime, new MimeSym);
54 	theRec->bAdd(strSize_distr, strSize, 0);
55 	theRec->bAdd(ObjLifeCycleSym::TheType, strObj_life_cycle, new ObjLifeCycleSym);
56 	theRec->bAdd(NumSym::TheType, strCachable, 0);
57 	theRec->bAdd(NumSym::TheType, strChecksum, 0);
58 	theRec->bAdd(NumSym::TheType, strUnique, 0);
59 	theRec->bAdd(strContentArr, strMay_contain, 0);
60 	theRec->bAdd(strInt_distr, strEmbedded_obj_cnt, 0);
61 	theRec->bAdd(IntSym::TheType, strChoice_space, 0);
62 	theRec->bAdd(ClientBehaviorSym::TheType, strClient_behavior, new ClientBehaviorSym);
63 	theRec->bAdd(StringSym::TheType, strGenerator, 0);
64 	theRec->bAdd(StringSym::TheType, strContent_db, 0);
65 	theRec->bAdd(StringSym::TheType, strInject_object, 0);
66 	theRec->bAdd(StringSym::TheType, strInject_db, 0);
67 	theRec->bAdd(NumSym::TheType, strInfect_prob, 0);
68 	theRec->bAdd(strSize_distr, strInject_gap, 0);
69 	theRec->bAdd(strStringArr, strEncodings, 0);
70 	theRec->bAdd(strMimeHeaderArr, strMimeHeaders, 0);
71 	theRec->bAdd(StringSym::TheType, strDocumentRoot, 0);
72 }
73 
ContentSym(const String & aType,PglRec * aRec)74 ContentSym::ContentSym(const String &aType, PglRec *aRec): RecSym(aType, aRec) {
75 }
76 
isA(const String & type) const77 bool ContentSym::isA(const String &type) const {
78 	return RecSym::isA(type) || type == TheType;
79 }
80 
dupe(const String & type) const81 SynSym *ContentSym::dupe(const String &type) const {
82 	if (isA(type))
83 		return new ContentSym(this->type(), theRec->clone());
84 	return RecSym::dupe(type);
85 }
86 
hasEmbed() const87 bool ContentSym::hasEmbed() const {
88 	SynSymTblItem *conti = 0;
89 	Assert(theRec->find(strMay_contain, conti));
90 	return conti->sym() != 0;
91 }
92 
kind() const93 String ContentSym::kind() const {
94 	return getString(strKind);
95 }
96 
mime() const97 MimeSym *ContentSym::mime() const {
98 	SynSymTblItem *mi = 0;
99 	Assert(theRec->find(strMime, mi));
100 	Assert(mi->sym());
101 	return &(MimeSym&)mi->sym()->cast(MimeSym::TheType);
102 }
103 
size() const104 RndDistr *ContentSym::size() const {
105 	return getDistr(strSize);
106 }
107 
objLifeCycle() const108 ObjLifeCycleSym *ContentSym::objLifeCycle() const {
109 	SynSymTblItem *olci = 0;
110 	Assert(theRec->find(strObj_life_cycle, olci));
111 	Assert(olci->sym());
112 	return &(ObjLifeCycleSym&)olci->sym()->cast(ObjLifeCycleSym::TheType);
113 }
114 
cachable(double & ratio) const115 bool ContentSym::cachable(double &ratio) const {
116 	return getDouble(strCachable, ratio);
117 }
118 
checksum(double & ratio) const119 bool ContentSym::checksum(double &ratio) const {
120 	return getDouble(strChecksum, ratio);
121 }
122 
unique(double & ratio) const123 bool ContentSym::unique(double &ratio) const {
124 	return getDouble(strUnique, ratio);
125 }
126 
contains(Array<ContentSym * > & ccfgs,RndDistr * & selector,Array<double> & cprobs) const127 bool ContentSym::contains(Array<ContentSym*> &ccfgs, RndDistr *&selector, Array<double> &cprobs) const {
128 	SynSymTblItem *conti = 0;
129 	Assert(theRec->find(strMay_contain, conti));
130 	if (!conti->sym())
131 		return false; // undefined
132 
133 	ArraySym &a = (ArraySym&)conti->sym()->cast(ArraySym::TheType);
134 	selector = a.makeSelector(strContainerContents);
135 	ccfgs.stretch(a.count());
136 	cprobs.stretch(a.count());
137 	a.copyProbs(cprobs);
138 	for (int i = 0; i < a.count(); ++i) {
139 		ContentSym *csym = &((ContentSym&)a[i]->cast(TheType));
140 		ccfgs.append(csym);
141 	}
142 
143 	return true;
144 }
145 
embedCount() const146 RndDistr *ContentSym::embedCount() const {
147 	return getDistr(strEmbedded_obj_cnt);
148 }
149 
choiceSpace(int & space) const150 bool ContentSym::choiceSpace(int &space) const {
151 	return getInt(strChoice_space, space);
152 }
153 
clientBehavior() const154 ClientBehaviorSym *ContentSym::clientBehavior() const {
155 	SynSymTblItem *mi = 0;
156 	Assert(theRec->find(strClient_behavior, mi));
157 	Assert(mi->sym());
158 	return &(ClientBehaviorSym&)mi->sym()->cast(ClientBehaviorSym::TheType);
159 }
160 
generator() const161 String ContentSym::generator() const {
162 	return getString(strGenerator);
163 }
164 
cdb() const165 String ContentSym::cdb() const {
166 	return getString(strContent_db);
167 }
168 
injectObject() const169 String ContentSym::injectObject() const {
170 	return getString(strInject_object);
171 }
172 
injectDb() const173 String ContentSym::injectDb() const {
174 	return getString(strInject_db);
175 }
176 
infectProb(double & prob) const177 bool ContentSym::infectProb(double &prob) const {
178 	return getDouble(strInfect_prob, prob);
179 }
180 
injectGap() const181 RndDistr *ContentSym::injectGap() const {
182 	return getDistr(strInject_gap);
183 }
184 
encodings(Array<String * > & codings) const185 bool ContentSym::encodings(Array<String*> &codings) const {
186 	return getStrings(strEncodings, codings);
187 }
188 
mimeHeaders() const189 const ArraySym *ContentSym::mimeHeaders() const {
190 	return getArraySym(strMimeHeaders);
191 }
192 
documentRoot() const193 String ContentSym::documentRoot() const {
194 	return getString(strDocumentRoot);
195 }
196