OSDN Git Service

暫定登録
[iptd/iPTd.git] / src / Raym / FileInputStream.cpp
1 //\r
2 //\r
3 //\r
4 \r
5 #define DBG_LEVEL 0\r
6 #include <Raym/Log.h>\r
7 #include <Raym/Raym.h>\r
8 \r
9 namespace Raym\r
10 {\r
11 \r
12 static const int TIMEOUT = 1000;\r
13 \r
14 FileInputStream::FileInputStream()\r
15 {\r
16     DebugLog2("FileInputStream::FileInputStream()");\r
17 \r
18     _handle = NULL;\r
19 }\r
20 \r
21 FileInputStream::~FileInputStream()\r
22 {\r
23     RELEASE(_handle);\r
24 \r
25     DebugLog2("FileInputStream::~FileInputStream()");\r
26 }\r
27 \r
28 FileInputStream *FileInputStream::fileInputStream(FileHandle *handle)\r
29 {\r
30     DebugLog2("FileInputStream::fileInputStream(handle)");\r
31 \r
32     FileInputStream *result = new FileInputStream();\r
33     result->initWithFileHandle(handle)->autorelease();\r
34     return result;\r
35 }\r
36 \r
37 FileInputStream *FileInputStream::initWithFileHandle(FileHandle *handle)\r
38 {\r
39     DebugLog2("FileInputStream::initWithFileHandle(handle)");\r
40 \r
41     _handle = handle;\r
42     _handle->retain();\r
43     return this;\r
44 }\r
45 \r
46 /*\r
47 bool FileInputStream::available()\r
48 {\r
49     DebugLog2("FileInputStream::available()");\r
50 \r
51     bool result = false;\r
52     if (_handle->isPipe())\r
53     {\r
54         DebugLog3("_handle is pipe.");\r
55         char buf[1024];\r
56         DWORD BytesRead = -1;\r
57         DWORD TotalBytesAvail = -1;\r
58         DWORD BytesLeftThisMessage = -1;\r
59         if (PeekNamedPipe(_handle->handle(), buf, sizeof(buf), &BytesRead, &TotalBytesAvail, &BytesLeftThisMessage))\r
60         {\r
61             DebugLog3("PeekNamedPipe() success: %d, %d, %d", BytesRead, TotalBytesAvail, BytesLeftThisMessage);\r
62             result = (TotalBytesAvail > 0);\r
63 \r
64             DWORD len;\r
65             memset(buf, 0x0, sizeof(buf));\r
66             ReadFile(_handle->handle(), buf, sizeof(buf) - 1, &len, NULL);\r
67             DebugLog3("kore: %s", buf);\r
68         }\r
69         else\r
70         {\r
71             DebugLog3("PeekNamedPipe() error: %d", GetLastError());\r
72         }\r
73     }\r
74     return result;\r
75 }\r
76 */\r
77 \r
78 String *FileInputStream::readLine()\r
79 {\r
80     DebugLog2("FileInputStream::readLine()");\r
81 \r
82     String *result = String::string();\r
83     if (_handle->isPipe())\r
84     {\r
85         int count = 0;\r
86         while (true)\r
87         {\r
88             // パイプを調べる\r
89             char buf[4096];\r
90             DWORD read = -1;\r
91             DWORD avail = -1;\r
92             if (!PeekNamedPipe(_handle->handle(), buf, sizeof(buf) - 1, &read, &avail, NULL))\r
93             {\r
94                 // 失敗した場合は終了\r
95                 DebugLog3("FileInputStream::readLine(): PeekNamedPipe() error.");\r
96                 result = NULL;\r
97                 break;\r
98             }\r
99 \r
100             // 読み込み可能データがあるか\r
101             if (avail == 0)\r
102             {\r
103                 // データが無い場合:最大 TIMEOUT[ms] まで待つ\r
104                 if (count++ >= TIMEOUT / 10)\r
105                 {\r
106                     DebugLog3("FileInputStream::readLine(): timed out.");\r
107                     result = NULL;\r
108                     break;\r
109                 }\r
110                 Sleep(10);\r
111             }\r
112             else\r
113             {\r
114                 // データが有る場合:\r
115 \r
116                 // 改行コードをチェック\r
117                 char *p = strstr(buf, "\r\n");\r
118                 if (p != NULL)\r
119                 {\r
120                     // CR+LF がある場合\r
121                     read = (DWORD)(p - buf + 2);\r
122                 }\r
123 \r
124                 DWORD len;\r
125                 if (!ReadFile(_handle->handle(), buf, read, &len, NULL))\r
126                 {\r
127                     // 失敗した場合は終了\r
128                     DebugLog3("FileInputStream::readLine(): ReadFile() error.");\r
129                     result = NULL;\r
130                     break;\r
131                 }\r
132                 buf[len] = '\0';\r
133 \r
134                 // 再度 改行コードをチェック\r
135                 p = strstr(buf, "\r\n");\r
136                 if (p != NULL)\r
137                 {\r
138                     *p = '\0';\r
139                 }\r
140 \r
141                 result = result->stringByAppendingString(buf);\r
142 \r
143                 if (p != NULL)\r
144                 {\r
145                     break;\r
146                 }\r
147             }\r
148         }\r
149     }\r
150 \r
151     return result;\r
152 }\r
153 \r
154 const char *FileInputStream::className()\r
155 {\r
156     return "FileInputStream";\r
157 }\r
158 \r
159 } // Raym\r