OSDN Git Service

initial files
[iptd/iPTd_R3.git] / src / net / InternetTextMessageHeader.cpp
1 //\r
2 // InternetTextMessageHeader.h\r
3 //\r
4 \r
5 #define DBG_LEVEL 0\r
6 #include <Raym/Log.h>\r
7 #include "net/InternetTextMessageHeader.h"\r
8 \r
9 using namespace Raym;\r
10 \r
11 namespace NET\r
12 {\r
13 \r
14 InternetTextMessageHeader::InternetTextMessageHeader()\r
15 {\r
16     _encoding = ASCIIStringEncoding;\r
17     _fields = NULL;\r
18     _data = NULL;\r
19 }\r
20 \r
21 InternetTextMessageHeader::~InternetTextMessageHeader()\r
22 {\r
23     RELEASE(_fields);\r
24     RELEASE(_data);\r
25 }\r
26 \r
27 InternetTextMessageHeader *InternetTextMessageHeader::alloc()\r
28 {\r
29     return new InternetTextMessageHeader();\r
30 }\r
31 \r
32 InternetTextMessageHeader *InternetTextMessageHeader::init()\r
33 {\r
34     RELEASE(_fields);\r
35     RELEASE(_data);\r
36     _fields = Dictionary::alloc()->initWithCapacity(0);\r
37     return this;\r
38 }\r
39 \r
40 InternetTextMessageHeader *InternetTextMessageHeader::initWithData(Data *data)\r
41 {\r
42     DebugLog2("%s()\n", __FUNCTION__);\r
43 \r
44     init();\r
45 \r
46     if (data != NULL)\r
47     {\r
48         _data = data->retain();\r
49 \r
50         char field[512];\r
51         const char *buffer = (const char *)data->bytes();\r
52 \r
53         int index = 0;\r
54         uint offset = 0;\r
55         while (offset < data->length())\r
56         {\r
57             field[index++] = buffer[offset++];\r
58             if ((field[index - 2] == '\r') && (field[index - 1] == '\n'))\r
59             {\r
60                 field[index - 2] = '\0';\r
61                 char *value = strchr(field, ':');\r
62                 if (value != NULL)\r
63                 {\r
64                     *value++ = '\0';\r
65                     while (*value == ' ')\r
66                     {\r
67                         ++value;\r
68                     }\r
69 \r
70                     DebugLog3("%s: %s", field, value);\r
71                     String *body = String::stringWithUTF8String(value);\r
72                     String *name = String::stringWithUTF8String(field);\r
73                     setFieldBodyWithName(body, name);\r
74                 }\r
75 \r
76                 index = 0;\r
77             }\r
78         }\r
79     }\r
80     return this;\r
81 /*\r
82         char *tmp = (char *)malloc([data length] + 1);\r
83         [data getBytes:tmp length:[data length]];\r
84         tmp[[data length]] = '\0';\r
85         String *headStr = [String stringWithCString:tmp encoding:_encoding];\r
86         if ([headStr rangeOfString:@"content-type" options:CaseInsensitiveSearch].location != NotFound)\r
87         {\r
88             if ([headStr rangeOfString:@"charset" options:CaseInsensitiveSearch].location != NotFound)\r
89             {\r
90                 if ([headStr rangeOfString:@"iso-2022-jp" options:CaseInsensitiveSearch].location != NotFound)\r
91                 {\r
92                     _encoding = ISO2022JPStringEncoding;\r
93                 }\r
94                 else if ([headStr rangeOfString:@"shift_jis" options:CaseInsensitiveSearch].location != NotFound)\r
95                 {\r
96                     _encoding = ShiftJISStringEncoding;\r
97                 }\r
98                 else if ([headStr rangeOfString:@"euc-jp" options:CaseInsensitiveSearch].location != NotFound)\r
99                 {\r
100                     _encoding = JapaneseEUCStringEncoding;\r
101                 }\r
102                 else if ([headStr rangeOfString:@"utf-8" options:CaseInsensitiveSearch].location != NotFound)\r
103                 {\r
104                     _encoding = UTF8StringEncoding;\r
105                 }\r
106             }\r
107         }\r
108 */\r
109 }\r
110 \r
111 InternetTextMessageHeader *InternetTextMessageHeader::initWithArray(Array *array)\r
112 {\r
113     /*\r
114     if ((self = [super init]) != nil)\r
115     {\r
116         _dictionary = [[MutableDictionary alloc] initWithCapacity:0];\r
117         _encoding = ASCIIStringEncoding;\r
118         for (int i = 0; i < [array count]; ++i)\r
119         {\r
120             String *line = [array objectAtIndex:i];\r
121             Range r = [line rangeOfString:@":"];\r
122             if (r.location != NotFound)\r
123             {\r
124                 String *fieldName = [line substringToIndex:r.location];\r
125                 String *fieldBody = [[line substringFromIndex:(r.location + 1)] stringByTrimmingCharactersInSet:[CharacterSet whitespaceAndNewlineCharacterSet]];\r
126                 [_dictionary setObject:fieldBody forKey:fieldName];\r
127             }\r
128         }\r
129     }\r
130     return self;\r
131     */\r
132     return this;\r
133 }\r
134 \r
135 InternetTextMessageHeader *InternetTextMessageHeader::initWithSocket(SOCKET sock)\r
136 {\r
137     DebugLog2("%s()\n", __FUNCTION__);\r
138 \r
139     char *tmp = "\r\n\r\n";\r
140 \r
141     int length = 0;\r
142     char buf[16384];\r
143 \r
144     while (length < sizeof(buf))\r
145     {\r
146         char c;\r
147         if (recv(sock, &c, 1, 0) == 1)\r
148         {\r
149             buf[length++] = c;\r
150             if (length >= 4)\r
151             {\r
152                 if (strncmp(&buf[length - 4], tmp, 4) == 0)\r
153                 {\r
154                     Data *data = Data::alloc()->initWithBytesAndLength(buf, length);\r
155                     initWithData(data);\r
156                     data->release();\r
157                     break;\r
158                 }\r
159             }\r
160         }\r
161         else\r
162         {\r
163             // EOF or error\r
164             break;\r
165         }\r
166     }\r
167     return this;\r
168 }\r
169 \r
170 /*\r
171 - (StringEncoding)encoding\r
172 {\r
173     return _encoding;\r
174 }\r
175 */\r
176 \r
177 InternetTextMessageHeader *InternetTextMessageHeader::retain()\r
178 {\r
179     Object::retain();\r
180     return this;\r
181 }\r
182 \r
183 InternetTextMessageHeader *InternetTextMessageHeader::autorelease()\r
184 {\r
185     Object::autorelease();\r
186     return this;\r
187 }\r
188 \r
189 Array *InternetTextMessageHeader::fieldNames()\r
190 {\r
191     return _fields->allKeys();\r
192 }\r
193 \r
194 String *InternetTextMessageHeader::fieldBodyForName(String *name)\r
195 {\r
196     return (String *)_fields->objectForKey(name);\r
197 }\r
198 \r
199 String *InternetTextMessageHeader::fieldBodyForName(const char *name)\r
200 {\r
201     return (String *)_fields->objectForKey(name);\r
202 }\r
203 \r
204 void InternetTextMessageHeader::setFieldBodyWithName(String *body, String *name)\r
205 {\r
206     _fields->setObject(body, name);\r
207     /*\r
208     if ([[name lowercaseString] isEqualToString:@"content-type"])\r
209     {\r
210         if ([body rangeOfString:@"charset" options:CaseInsensitiveSearch].location != NotFound)\r
211         {\r
212             if ([body rangeOfString:@"iso-2022-jp" options:CaseInsensitiveSearch].location != NotFound)\r
213             {\r
214                 _encoding = ISO2022JPStringEncoding;\r
215             }\r
216             else if ([body rangeOfString:@"shift_jis" options:CaseInsensitiveSearch].location != NotFound)\r
217             {\r
218                 _encoding = ShiftJISStringEncoding;\r
219             }\r
220             else if ([body rangeOfString:@"euc-jp" options:CaseInsensitiveSearch].location != NotFound)\r
221             {\r
222                 _encoding = JapaneseEUCStringEncoding;\r
223             }\r
224             else if ([body rangeOfString:@"utf-8" options:CaseInsensitiveSearch].location != NotFound)\r
225             {\r
226                 _encoding = UTF8StringEncoding;\r
227             }\r
228         }\r
229     }\r
230     */\r
231 }\r
232 \r
233 void InternetTextMessageHeader::setFieldBodyWithName(const char *body, String *name)\r
234 {\r
235     setFieldBodyWithName(String::stringWithUTF8String(body), name);\r
236 }\r
237 \r
238 void InternetTextMessageHeader::setFieldBodyWithName(String *body, const char *name)\r
239 {\r
240     setFieldBodyWithName(body, String::stringWithUTF8String(name));\r
241 }\r
242 \r
243 void InternetTextMessageHeader::setFieldBodyWithName(const char *body, const char *name)\r
244 {\r
245     setFieldBodyWithName(String::stringWithUTF8String(body), String::stringWithUTF8String(name));\r
246 }\r
247 \r
248 Data *InternetTextMessageHeader::data()\r
249 {\r
250     /*\r
251     MutableString *headerString = [MutableString stringWithCapacity:0];\r
252     Array *fieldNames = [_dictionary allKeys];\r
253 \r
254     // Content-type\r
255     for (int i = 0; i < [fieldNames count]; ++i)\r
256     {\r
257         String *fieldName = [fieldNames objectAtIndex:i];\r
258         if ([[fieldName lowercaseString] isEqualToString:@"content-type"])\r
259         {\r
260             [headerString appendFormat:@"Content-type: %@\r\n", [_dictionary objectForKey:fieldName]];\r
261             break;\r
262         }\r
263     }\r
264 \r
265     // other\r
266     for (int i = 0; i < [fieldNames count]; ++i)\r
267     {\r
268         String *fieldName = [fieldNames objectAtIndex:i];\r
269         String *lowercase = [fieldName lowercaseString];\r
270         if (![lowercase isEqualToString:@"content-type"])\r
271         {\r
272             [headerString appendFormat:@"%@: %@\r\n", fieldName, [_dictionary objectForKey:fieldName]];\r
273         }\r
274     }\r
275 \r
276     [headerString appendString:@"\r\n\r\n"];\r
277 \r
278     return [Data dataWithBytes:[headerString cStringUsingEncoding:_encoding] length:[headerString lengthOfBytesUsingEncoding:_encoding]];\r
279     */\r
280     return NULL;\r
281 }\r
282 \r
283 const char *InternetTextMessageHeader::className()\r
284 {\r
285     return "NET::InternetTextMessageHeader";\r
286 }\r
287 \r
288 } // NET\r