]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * DEBUG: section 16 Cache Manager API | |
3 | * | |
4 | */ | |
5 | ||
6 | #include "squid.h" | |
7 | #include "base/TextException.h" | |
8 | #include "ipc/TypedMsgHdr.h" | |
9 | #include "mgr/IntParam.h" | |
10 | #include "mgr/QueryParams.h" | |
11 | #include "mgr/StringParam.h" | |
12 | ||
13 | Mgr::QueryParam::Pointer | |
14 | Mgr::QueryParams::get(const String& name) const | |
15 | { | |
16 | Must(name.size() != 0); | |
17 | Params::const_iterator pos = find(name); | |
18 | return (pos == params.end() ? NULL : pos->second); | |
19 | } | |
20 | ||
21 | void | |
22 | Mgr::QueryParams::pack(Ipc::TypedMsgHdr& msg) const | |
23 | { | |
24 | msg.putInt(params.size()); | |
25 | for (Params::const_iterator iter = params.begin(); iter != params.end(); ++iter) { | |
26 | Must(iter->first.size() != 0); | |
27 | msg.putString(iter->first); | |
28 | Must(iter->second != NULL); | |
29 | iter->second->pack(msg); | |
30 | } | |
31 | } | |
32 | ||
33 | void | |
34 | Mgr::QueryParams::unpack(const Ipc::TypedMsgHdr& msg) | |
35 | { | |
36 | int count = msg.getInt(); | |
37 | Must(count >= 0); | |
38 | params.clear(); | |
39 | for ( ; count > 0; --count) { | |
40 | String name; | |
41 | msg.getString(name); | |
42 | Must(name.size() != 0); | |
43 | QueryParam::Type type; | |
44 | msg.getPod(type); | |
45 | QueryParam::Pointer value = CreateParam(type); | |
46 | value->unpackValue(msg); | |
47 | params.push_back(Param(name, value)); | |
48 | } | |
49 | } | |
50 | ||
51 | Mgr::QueryParams::Params::const_iterator | |
52 | Mgr::QueryParams::find(const String& name) const | |
53 | { | |
54 | Must(name.size() != 0); | |
55 | Params::const_iterator iter = params.begin(); | |
56 | for ( ; iter != params.end(); ++iter) { | |
57 | if (name.caseCmp(iter->first) == 0) | |
58 | break; | |
59 | } | |
60 | return iter; | |
61 | } | |
62 | ||
63 | bool | |
64 | Mgr::QueryParams::ParseParam(const String& paramStr, Param& param) | |
65 | { | |
66 | bool parsed = false; | |
67 | regmatch_t pmatch[3]; | |
68 | regex_t intExpr; | |
69 | regcomp(&intExpr, "^([a-z][a-z0-9_]*)=([0-9]+((,[0-9]+))*)$", REG_EXTENDED | REG_ICASE); | |
70 | regex_t stringExpr; | |
71 | regcomp(&stringExpr, "^([a-z][a-z0-9_]*)=([^&= ]+)$", REG_EXTENDED | REG_ICASE); | |
72 | if (regexec(&intExpr, paramStr.termedBuf(), 3, pmatch, 0) == 0) { | |
73 | param.first = paramStr.substr(pmatch[1].rm_so, pmatch[1].rm_eo); | |
74 | std::vector<int> array; | |
75 | int n = pmatch[2].rm_so; | |
76 | for (int i = n; i < pmatch[2].rm_eo; ++i) { | |
77 | if (paramStr[i] == ',') { | |
78 | array.push_back(atoi(paramStr.substr(n, i).termedBuf())); | |
79 | n = i + 1; | |
80 | } | |
81 | } | |
82 | if (n < pmatch[2].rm_eo) | |
83 | array.push_back(atoi(paramStr.substr(n, pmatch[2].rm_eo).termedBuf())); | |
84 | param.second = new IntParam(array); | |
85 | parsed = true; | |
86 | } else if (regexec(&stringExpr, paramStr.termedBuf(), 3, pmatch, 0) == 0) { | |
87 | param.first = paramStr.substr(pmatch[1].rm_so, pmatch[1].rm_eo); | |
88 | param.second = new StringParam(paramStr.substr(pmatch[2].rm_so, pmatch[2].rm_eo)); | |
89 | parsed = true; | |
90 | } | |
91 | regfree(&stringExpr); | |
92 | regfree(&intExpr); | |
93 | return parsed; | |
94 | } | |
95 | ||
96 | bool | |
97 | Mgr::QueryParams::Parse(const String& aParamsStr, QueryParams& aParams) | |
98 | { | |
99 | if (aParamsStr.size() != 0) { | |
100 | Param param; | |
101 | size_t n = 0; | |
102 | size_t len = aParamsStr.size(); | |
103 | for (size_t i = n; i < len; ++i) { | |
104 | if (aParamsStr[i] == '&') { | |
105 | if (!ParseParam(aParamsStr.substr(n, i), param)) | |
106 | return false; | |
107 | aParams.params.push_back(param); | |
108 | n = i + 1; | |
109 | } | |
110 | } | |
111 | if (n < len) { | |
112 | if (!ParseParam(aParamsStr.substr(n, len), param)) | |
113 | return false; | |
114 | aParams.params.push_back(param); | |
115 | } | |
116 | } | |
117 | return true; | |
118 | } | |
119 | ||
120 | Mgr::QueryParam::Pointer | |
121 | Mgr::QueryParams::CreateParam(QueryParam::Type aType) | |
122 | { | |
123 | switch (aType) { | |
124 | case QueryParam::ptInt: | |
125 | return new IntParam(); | |
126 | ||
127 | case QueryParam::ptString: | |
128 | return new StringParam(); | |
129 | ||
130 | default: | |
131 | throw TexcHere("unknown parameter type"); | |
132 | break; | |
133 | } | |
134 | return NULL; | |
135 | } |