1 |
douglas |
104 |
/* ============================================================================ |
2 |
|
|
* Douglas Thrift's Web Contact License |
3 |
|
|
* |
4 |
|
|
* Copyright (C) 2002, Douglas Thrift. All Rights Reserved. |
5 |
|
|
* |
6 |
|
|
* Redistribution and use in source and binary forms, with or without |
7 |
|
|
* modification, are permitted provided that the following conditions are met: |
8 |
|
|
* |
9 |
|
|
* 1. Redistributions of source code must retain the above copyright notice, |
10 |
|
|
* this list of conditions and the following disclaimer. |
11 |
|
|
* |
12 |
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, |
13 |
|
|
* this list of conditions and the following disclaimer in the documentation |
14 |
|
|
* and/or other materials provided with the distribution. |
15 |
|
|
* |
16 |
|
|
* 3. The end-user documentation included with the redistribution, if any, must |
17 |
|
|
* include the following acknowledgment: |
18 |
|
|
* |
19 |
|
|
* "This product includes software developed by Douglas Thrift |
20 |
|
|
* (http://computers.douglasthrift.net/webcontact.html)." |
21 |
|
|
* |
22 |
|
|
* Alternately, this acknowledgment may appear in the software itself, if |
23 |
|
|
* and wherever such third-party acknowledgments normally appear. |
24 |
|
|
* |
25 |
|
|
* 4. The names "Douglas Thrift" and "Douglas Thrift's Web Contact" must not be |
26 |
|
|
* used to endorse or promote products derived from this software without |
27 |
|
|
* specific prior written permission. For written permission, please visit |
28 |
|
|
* http://www.douglasthrift.net/contact.html for contact information. |
29 |
|
|
* |
30 |
|
|
* 5. Products derived from this software may not be called "Douglas Thrift's |
31 |
|
|
* Web Contact", nor may "Douglas Thrift's Web Contact" appear in their |
32 |
|
|
* name, without prior written permission. |
33 |
|
|
* |
34 |
|
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
35 |
|
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
36 |
|
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
37 |
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
38 |
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
39 |
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, |
40 |
|
|
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
41 |
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
42 |
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
43 |
|
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
44 |
|
|
* ============================================================================ |
45 |
|
|
*/ |
46 |
|
|
// Windows XP FAQ Poll |
47 |
|
|
// |
48 |
|
|
// Douglas Thrift |
49 |
|
|
// |
50 |
|
|
// IMAPHandler.cpp |
51 |
|
|
|
52 |
|
|
#include "IMAPHandler.h" |
53 |
|
|
|
54 |
|
|
#ifdef _WIN32 |
55 |
|
|
#define PATH_SEPARATOR "\\" |
56 |
|
|
#define ENV_SEPARATOR ';' |
57 |
|
|
#else |
58 |
|
|
#define PATH_SEPARATOR "/" |
59 |
|
|
#define ENV_SEPARATOR ':' |
60 |
|
|
#endif |
61 |
|
|
|
62 |
|
|
IMAPHandler::IMAPHandler(const string& host, unsigned port) |
63 |
|
|
{ |
64 |
|
|
setJarPath(); |
65 |
|
|
|
66 |
|
|
options[0].optionString = jarPath; |
67 |
|
|
memset(&vm_args, 0, sizeof (vm_args)); |
68 |
|
|
vm_args.version = JNI_VERSION_1_2; |
69 |
|
|
vm_args.nOptions = 1; |
70 |
|
|
vm_args.options = options; |
71 |
|
|
|
72 |
|
|
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); |
73 |
|
|
|
74 |
|
|
if (status != JNI_ERR) |
75 |
|
|
{ |
76 |
|
|
cls = env->FindClass("IMAPHandler"); |
77 |
|
|
|
78 |
|
|
if (cls != 0) |
79 |
|
|
{ |
80 |
|
|
mid = env->GetMethodID(cls, "<init>", "(Ljava/lang/String;IZ)V"); |
81 |
|
|
|
82 |
|
|
if (mid != 0) |
83 |
|
|
{ |
84 |
|
|
jstring hostJ = env->NewStringUTF(host.c_str()); |
85 |
|
|
jint portJ = port; |
86 |
|
|
#ifdef _DEBUG |
87 |
|
|
jboolean debugJ = debug; |
88 |
|
|
#else |
89 |
|
|
jboolean debugJ = false; |
90 |
|
|
#endif |
91 |
|
|
|
92 |
|
|
obj = env->NewObject(cls, mid, hostJ, portJ, debugJ); |
93 |
|
|
} |
94 |
|
|
} |
95 |
|
|
} |
96 |
|
|
} |
97 |
|
|
|
98 |
|
|
IMAPHandler::~IMAPHandler() |
99 |
|
|
{ |
100 |
|
|
if (status != JNI_ERR) |
101 |
|
|
{ |
102 |
|
|
jvm->DestroyJavaVM(); |
103 |
|
|
} |
104 |
|
|
} |
105 |
|
|
|
106 |
|
|
bool IMAPHandler::successful() |
107 |
|
|
{ |
108 |
|
|
bool answer; |
109 |
|
|
|
110 |
|
|
if (cls != 0) |
111 |
|
|
{ |
112 |
|
|
mid = env->GetMethodID(cls, "successful", "()Z"); |
113 |
|
|
|
114 |
|
|
if (mid != 0) |
115 |
|
|
{ |
116 |
|
|
jboolean answerJ = env->CallBooleanMethod(obj, mid); |
117 |
|
|
|
118 |
|
|
answer = answerJ != 0; |
119 |
|
|
} |
120 |
|
|
} |
121 |
|
|
|
122 |
|
|
return answer; |
123 |
|
|
} |
124 |
|
|
|
125 |
|
|
void IMAPHandler::setJarPath() |
126 |
|
|
{ |
127 |
|
|
const string jarFile = "IMAPHandler.jar"; |
128 |
|
|
string jarFilePath = jarFile; |
129 |
|
|
|
130 |
|
|
ifstream fin(jarFilePath.c_str()); |
131 |
|
|
if (!fin.is_open()) |
132 |
|
|
{ |
133 |
|
|
unsigned end = program.rfind(PATH_SEPARATOR); |
134 |
|
|
if (end != string::npos) |
135 |
|
|
{ |
136 |
|
|
string path = program.substr(0, end); |
137 |
|
|
|
138 |
|
|
jarFilePath = path + PATH_SEPARATOR + jarFile; |
139 |
|
|
|
140 |
|
|
fin.open(jarFilePath.c_str()); |
141 |
|
|
if (!fin.is_open()) |
142 |
|
|
{ |
143 |
|
|
cerr << program << ": Could not find required file: " |
144 |
|
|
<< jarFile << "\n"; |
145 |
|
|
exit(1); |
146 |
|
|
} |
147 |
|
|
else |
148 |
|
|
{ |
149 |
|
|
fin.close(); |
150 |
|
|
} |
151 |
|
|
} |
152 |
|
|
else |
153 |
|
|
{ |
154 |
|
|
string envPath = getenv("PATH"); |
155 |
|
|
|
156 |
|
|
if (debug) cerr << "envPath = " << envPath << "\n"; |
157 |
|
|
|
158 |
|
|
unsigned begin = 0; |
159 |
|
|
do |
160 |
|
|
{ |
161 |
|
|
unsigned end = envPath.find(ENV_SEPARATOR, begin); |
162 |
|
|
string path = envPath.substr(begin, end); |
163 |
|
|
|
164 |
|
|
if (debug) cerr << "path = " << path << "\n"; |
165 |
|
|
|
166 |
|
|
jarFilePath = path + PATH_SEPARATOR + jarFile; |
167 |
|
|
|
168 |
|
|
fin.open(jarFilePath.c_str()); |
169 |
|
|
if (fin.is_open()) |
170 |
|
|
{ |
171 |
|
|
fin.close(); |
172 |
|
|
break; |
173 |
|
|
} |
174 |
|
|
|
175 |
|
|
begin = end != string::npos ? end + 1 : string::npos; |
176 |
|
|
} |
177 |
|
|
while (begin < envPath.length()); |
178 |
|
|
|
179 |
|
|
if (begin == string::npos) |
180 |
|
|
{ |
181 |
|
|
cerr << program << ": Could not find required file: " |
182 |
|
|
<< jarFile << "\n"; |
183 |
|
|
exit(1); |
184 |
|
|
} |
185 |
|
|
} |
186 |
|
|
} |
187 |
|
|
else |
188 |
|
|
{ |
189 |
|
|
fin.close(); |
190 |
|
|
} |
191 |
|
|
|
192 |
|
|
string jarPath = "-Djava.class.path=" + jarFilePath; |
193 |
|
|
|
194 |
|
|
this->jarPath = new char[jarPath.length()]; |
195 |
|
|
strcpy(this->jarPath, jarPath.c_str()); |
196 |
|
|
} |
197 |
|
|
|
198 |
|
|
string IMAPHandler::imap(char* imap) |
199 |
|
|
{ |
200 |
|
|
string result; |
201 |
|
|
|
202 |
|
|
if (cls != 0) |
203 |
|
|
{ |
204 |
|
|
mid = env->GetMethodID(cls, imap, "()Ljava/lang/String;"); |
205 |
|
|
|
206 |
|
|
if (mid != 0) |
207 |
|
|
{ |
208 |
|
|
jstring resultJ = (jstring)env->CallObjectMethod(obj, mid); |
209 |
|
|
|
210 |
|
|
const char* resultC = env->GetStringUTFChars(resultJ, 0); |
211 |
|
|
result = resultC; |
212 |
|
|
env->ReleaseStringUTFChars(resultJ, resultC); |
213 |
|
|
} |
214 |
|
|
} |
215 |
|
|
|
216 |
|
|
return result; |
217 |
|
|
} |
218 |
|
|
|
219 |
|
|
string IMAPHandler::imap(char* imap, const string& args) |
220 |
|
|
{ |
221 |
|
|
string result; |
222 |
|
|
|
223 |
|
|
if (cls != 0) |
224 |
|
|
{ |
225 |
|
|
mid = env->GetMethodID(cls, imap, |
226 |
|
|
"(Ljava/lang/String;)Ljava/lang/String;"); |
227 |
|
|
|
228 |
|
|
if (mid != 0) |
229 |
|
|
{ |
230 |
|
|
jstring argsJ = env->NewStringUTF(args.c_str()); |
231 |
|
|
|
232 |
|
|
jstring resultJ = (jstring)env->CallObjectMethod(obj, mid, argsJ); |
233 |
|
|
|
234 |
|
|
const char* resultC = env->GetStringUTFChars(resultJ, 0); |
235 |
|
|
result = resultC; |
236 |
|
|
env->ReleaseStringUTFChars(resultJ, resultC); |
237 |
|
|
} |
238 |
|
|
} |
239 |
|
|
|
240 |
|
|
return result; |
241 |
|
|
} |
242 |
|
|
|
243 |
|
|
string IMAPHandler::imap(char* imap, const string& args, const string& message) |
244 |
|
|
{ |
245 |
|
|
string result; |
246 |
|
|
|
247 |
|
|
if (cls != 0) |
248 |
|
|
{ |
249 |
|
|
mid = env->GetMethodID(cls, imap, |
250 |
|
|
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); |
251 |
|
|
|
252 |
|
|
if (mid != 0) |
253 |
|
|
{ |
254 |
|
|
jstring argsJ = env->NewStringUTF(args.c_str()); |
255 |
|
|
jstring messageJ = env->NewStringUTF(message.c_str()); |
256 |
|
|
|
257 |
|
|
jstring resultJ = (jstring)env->CallObjectMethod(obj, mid, argsJ, |
258 |
|
|
messageJ); |
259 |
|
|
|
260 |
|
|
const char* resultC = env->GetStringUTFChars(resultJ, 0); |
261 |
|
|
result = resultC; |
262 |
|
|
env->ReleaseStringUTFChars(resultJ, resultC); |
263 |
|
|
} |
264 |
|
|
} |
265 |
|
|
|
266 |
|
|
return result; |
267 |
|
|
} |