Compare commits

..

188 Commits

Author SHA1 Message Date
darin%netscape.com
62260249d7 no longer needed on branch
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94676 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 19:00:35 +00:00
darin%netscape.com
ef04ff435d fixed MANIFEST_IDL
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94675 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 18:59:16 +00:00
darin%netscape.com
3ee96f57b8 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94674 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 18:55:27 +00:00
darin%netscape.com
f26f30b4c5 replaced nsMemory::Clone with PL_strdup
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94672 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 18:44:36 +00:00
darin%netscape.com
ce3e6ddbf9 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94668 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 17:41:56 +00:00
darin%netscape.com
54d006d031 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94666 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 17:28:09 +00:00
darin%netscape.com
6d979a3f4b fixed memory leak
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94665 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 17:18:46 +00:00
darin%netscape.com
6795a88baf merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94664 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 17:17:32 +00:00
darin%netscape.com
8be0416d54 modified buffer sizes
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94606 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 07:47:32 +00:00
darin%netscape.com
93d7718522 backed buffer size down to 16k
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94605 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 07:44:04 +00:00
darin%netscape.com
e7457f6c5e fixing stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94601 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 07:19:50 +00:00
darin%netscape.com
3355b20538 minor touch ups
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94591 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 05:46:07 +00:00
darin%netscape.com
e38c0729b3 fixed minor stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94590 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 05:43:22 +00:00
darin%netscape.com
54e8ca8f3b fixed SSL proxy
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94589 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 05:43:00 +00:00
dougt%netscape.com
bf655521c6 Making branch build on the mac.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94569 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 03:01:58 +00:00
darin%netscape.com
4db19a052e fixes stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94568 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 02:39:09 +00:00
darin%netscape.com
80364fb1a4 ssl proxy
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94567 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-11 02:38:55 +00:00
darin%netscape.com
8f7941b6f1 fixed cache key bug
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94530 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 23:50:57 +00:00
darin%netscape.com
55e1ff9673 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94526 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 23:18:20 +00:00
darin%netscape.com
ab3135f787 make it compile
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94521 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 22:43:59 +00:00
darin%netscape.com
52c9c730d8 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94516 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 21:40:18 +00:00
darin%netscape.com
b3956fe708 removed printf's
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94515 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 21:16:41 +00:00
darin%netscape.com
63d68c34fd added additional logging
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94514 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 21:16:06 +00:00
darin%netscape.com
96a41c2c14 fixes bug
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94513 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 21:15:45 +00:00
darin%netscape.com
08fd9995e0 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94512 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 21:11:48 +00:00
dougt%netscape.com
2ca3743459 Updating nsWebshell to tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94496 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 16:59:51 +00:00
darin%netscape.com
8a48845120 trim off #ref portion if any from requestURI
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94435 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 01:52:21 +00:00
darin%netscape.com
bc09fdf610 whatever
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94434 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 01:48:30 +00:00
darin%netscape.com
802b66d97d minor touch ups
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94433 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 01:21:12 +00:00
darin%netscape.com
96083a1e49 whatever
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94432 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 01:18:26 +00:00
darin%netscape.com
31989208be added support for 100-continue
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94431 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 01:17:20 +00:00
darin%netscape.com
29d9b38fe8 make code more robust
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94430 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 00:32:42 +00:00
darin%netscape.com
a8f751a9d9 fixed stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94427 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-10 00:04:27 +00:00
darin%netscape.com
81066b3e6e added max-connections-per-server
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94426 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 23:51:59 +00:00
darin%netscape.com
e462d551cb fixed SetReferrer
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94425 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 23:40:13 +00:00
darin%netscape.com
09b30c7d5a merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94424 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 23:39:27 +00:00
darin%netscape.com
96b0c82bcf updated SetReferrer
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94423 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 23:38:43 +00:00
dougt%netscape.com
15ffdf8caa Making branch build on the mac.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94412 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 22:44:04 +00:00
darin%netscape.com
0262c5af7e added sync cache open
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94395 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 18:46:51 +00:00
darin%netscape.com
01ca73096c fixed for ssl proxy
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94394 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 18:39:22 +00:00
darin%netscape.com
dadf65501b fixed ssl proxy
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94393 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 18:39:00 +00:00
dougt%netscape.com
348ee07541 Removing unneeded proxy code from project
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94386 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 15:46:52 +00:00
dougt%netscape.com
dbe972baa8 Making compile on mac os.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94384 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 15:44:54 +00:00
darin%netscape.com
f5d02b707a new files
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94352 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 06:35:37 +00:00
darin%netscape.com
258f97e0cd merged in stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94314 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 02:13:34 +00:00
darin%netscape.com
95cdab9527 updated per gordon's OpenCacheEntry change
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94313 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 02:11:55 +00:00
darin%netscape.com
7a5dbad111 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94312 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 01:47:29 +00:00
darin%netscape.com
3e08b330b5 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94308 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 01:16:54 +00:00
darin%netscape.com
f058c57c79 fixed connection leakage
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94302 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-09 00:12:23 +00:00
darin%netscape.com
b8032d0c21 fixed Host header stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94288 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 22:31:53 +00:00
darin%netscape.com
4a6fc79ce2 random
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94287 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 22:30:07 +00:00
darin%netscape.com
0b5526cd2c merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94281 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 21:52:34 +00:00
dougt%netscape.com
03d7306f8b Making branch build on the mac.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94277 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 21:43:00 +00:00
darin%netscape.com
7ff9289c01 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94274 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 21:34:02 +00:00
darin%netscape.com
7fe1a07870 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94270 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 21:21:36 +00:00
darin%netscape.com
010c993ecc fixed a bug
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94266 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 20:41:28 +00:00
darin%netscape.com
17fbfd000c i18n touchups
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94256 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 19:48:14 +00:00
darin%netscape.com
cca34ca60b fixed bugs
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94253 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 19:31:34 +00:00
darin%netscape.com
45374a5c34 updated for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94251 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 19:25:13 +00:00
(no author)
17778cbb4a This commit was manufactured by cvs2svn to create branch
'HttpConnectionMagic_20010415_BRANCH'.

git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94247 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 18:02:51 +00:00
darin%netscape.com
b757903490 allow http buffers to grow
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94244 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 17:44:40 +00:00
darin%netscape.com
341c5930e6 found the magic reference
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94192 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 01:35:41 +00:00
darin%netscape.com
c8b278e410 updates
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94181 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 00:44:25 +00:00
darin%netscape.com
e3e7aaa151 minor changes
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94172 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-08 00:20:19 +00:00
darin%netscape.com
d1e31737be updated to new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94149 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-07 23:06:07 +00:00
darin%netscape.com
24ba71145e whatever
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94136 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-07 21:05:35 +00:00
darin%netscape.com
b3d65cb774 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94131 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-07 19:32:29 +00:00
darin%netscape.com
129ffc6314 added proxied transaction release
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94128 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-07 16:41:58 +00:00
darin%netscape.com
b52ef0d361 updating and fixing bugs
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94113 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-07 09:10:30 +00:00
darin%netscape.com
a409e246b6 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94103 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-07 06:55:46 +00:00
darin%netscape.com
343e849a97 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94102 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-07 06:48:25 +00:00
darin%netscape.com
76e256eaa3 minor touch up
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94092 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-06 20:45:28 +00:00
darin%netscape.com
a7fdcf52fa fixed bugs
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94091 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-06 20:43:14 +00:00
darin%netscape.com
cd099d2cbc 304 support
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94090 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-06 19:42:55 +00:00
darin%netscape.com
f7deb0fa0b fixed bugs
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94068 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-05 19:40:39 +00:00
darin%netscape.com
cd47bfdae2 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94064 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-05 18:24:34 +00:00
darin%netscape.com
f91fdf403e merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94063 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-05 18:02:16 +00:00
darin%netscape.com
09f6fd004d enabled caching
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94013 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-05 01:23:14 +00:00
darin%netscape.com
ea9dbc1fa2 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94012 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-05 01:16:51 +00:00
darin%netscape.com
cde877f50f initial cache support
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@94006 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-05 00:43:54 +00:00
darin%netscape.com
13aefaef6b merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93999 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-04 23:42:02 +00:00
(no author)
498945875e This commit was manufactured by cvs2svn to create branch
'HttpConnectionMagic_20010415_BRANCH'.

git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93949 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-04 20:45:21 +00:00
darin%netscape.com
2e0e94ae65 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93940 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-04 19:40:43 +00:00
darin%netscape.com
7b7422e29a added content decoding
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93848 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 21:49:59 +00:00
darin%netscape.com
d84a726e54 minor
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93841 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 21:16:47 +00:00
dougt%netscape.com
73880344b4 fixing cid
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93837 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 21:14:02 +00:00
dougt%netscape.com
1b45fe664e Updating to new interface change in nsIProxy
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93834 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 21:10:39 +00:00
dougt%netscape.com
2f6c90b945 Fixing up how proxy servers work.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93830 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 21:00:54 +00:00
darin%netscape.com
644337e67b removed stupid printf
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93828 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 20:50:49 +00:00
darin%netscape.com
22654d4d46 fixed a serious buffer overrun bug
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93827 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 20:50:06 +00:00
darin%netscape.com
34fba3d4c0 fixing stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93819 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 19:41:33 +00:00
darin%netscape.com
e693567a2e merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93817 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 19:12:38 +00:00
darin%netscape.com
1c256a65b9 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93816 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 18:39:14 +00:00
dougt%netscape.com
bfd50df9de Making compile
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93815 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 18:09:23 +00:00
darin%netscape.com
edd4b252cd merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93813 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 17:07:41 +00:00
darin%netscape.com
73ee7fdc9a merged with tip.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93812 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 16:50:59 +00:00
darin%netscape.com
96eeeb78af enabled socks
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93811 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 16:48:26 +00:00
darin%netscape.com
ea54c51a9d enabled ssl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93810 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 16:39:02 +00:00
darin%netscape.com
7dcb9cc71e moved script security manager onRedirect checks to here
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93809 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 16:35:41 +00:00
darin%netscape.com
aa97b1196f revised nsIHttpNotify
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93807 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 16:25:50 +00:00
darin%netscape.com
c85775f835 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93806 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 16:23:42 +00:00
darin%netscape.com
0c98acd0ca merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93804 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 16:06:00 +00:00
darin%netscape.com
e928f09133 files for basic auth
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93803 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 15:44:48 +00:00
darin%netscape.com
a392db3c90 auth is working
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93765 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 02:50:43 +00:00
darin%netscape.com
4bae98b66c fix opt compilation error
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93749 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 01:21:15 +00:00
darin%netscape.com
785b49036d merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93737 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 00:40:12 +00:00
darin%netscape.com
2596789db7 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93729 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 00:29:44 +00:00
darin%netscape.com
407bbe2241 merge with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93727 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-03 00:24:46 +00:00
(no author)
f35727b8ea This commit was manufactured by cvs2svn to create branch
'HttpConnectionMagic_20010415_BRANCH'.

git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93711 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-02 23:38:42 +00:00
darin%netscape.com
dccd3fea0e more auth work
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93655 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-02 18:34:51 +00:00
darin%netscape.com
75ece73a17 auth work
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93627 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-02 07:59:04 +00:00
darin%netscape.com
2ca018925a initial code for authentication in the new world
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93613 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-02 03:35:17 +00:00
darin%netscape.com
c913fbc495 fixed bugs
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93557 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-01 20:53:02 +00:00
darin%netscape.com
f3fef266f1 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93555 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-01 19:17:15 +00:00
darin%netscape.com
22764d875c working connection management!!
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93552 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-01 18:08:48 +00:00
darin%netscape.com
774f30876b whatever
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93549 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-01 17:21:08 +00:00
darin%netscape.com
700f64697f some progress on stability
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93546 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-01 16:31:09 +00:00
darin%netscape.com
48e663acf8 fixed some reference counting problems
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93505 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-01 02:11:09 +00:00
darin%netscape.com
52efc959be whatever
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93504 18797224-902f-48f8-a5cc-f745e15eee43
2001-05-01 01:30:30 +00:00
darin%netscape.com
5920a24815 various fixes
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93486 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-30 23:31:05 +00:00
darin%netscape.com
f67fb40d23 fix to remove authentication notifications from nsIHttpEventSink
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93470 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-30 18:06:13 +00:00
darin%netscape.com
bd8bea34a9 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93469 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-30 17:54:24 +00:00
darin%netscape.com
d3a97bdb9e fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93468 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-30 17:49:19 +00:00
darin%netscape.com
7b767f7ab5 basic support for http redirection
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93462 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-30 10:29:59 +00:00
darin%netscape.com
59a0933f9d added copyright headers, fixed a major memory/socket leak, made header
parsing more forgiving.


git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93460 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-30 09:13:09 +00:00
darin%netscape.com
8e96dfd851 updated for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93459 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-30 08:15:03 +00:00
darin%netscape.com
3d39ad60e2 fix for new http idl... make getAllResponseHeaders work.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93398 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 20:03:15 +00:00
darin%netscape.com
7381c52b0f fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93396 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 19:44:13 +00:00
darin%netscape.com
0cd86a0e53 made cookies work!
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93368 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 03:12:03 +00:00
darin%netscape.com
66cd209313 updates
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93365 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 02:53:18 +00:00
darin%netscape.com
9e5e3dc4f8 completed nsIHttpEventSink impl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93338 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 00:33:13 +00:00
darin%netscape.com
05af1518f0 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93336 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 00:27:56 +00:00
darin%netscape.com
faaeef8dd0 merge with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93335 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 00:21:01 +00:00
darin%netscape.com
91a290a394 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93332 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 00:11:30 +00:00
darin%netscape.com
6c53a6fa81 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93330 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-28 00:03:39 +00:00
darin%netscape.com
c30d3dc75c merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93327 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 23:51:02 +00:00
darin%netscape.com
0f93d336e4 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93324 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 23:31:14 +00:00
darin%netscape.com
e3451cffcc merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93320 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 23:15:54 +00:00
(no author)
c0a2d2872c This commit was manufactured by cvs2svn to create branch
'HttpConnectionMagic_20010415_BRANCH'.

git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93315 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 22:17:31 +00:00
darin%netscape.com
188591212e fixed chunked decoding!
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93283 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 19:35:27 +00:00
darin%netscape.com
12228ebdea make it compile on win32
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93281 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 19:01:39 +00:00
darin%netscape.com
5cccdcfb92 added null checks
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93279 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 18:48:56 +00:00
darin%netscape.com
1e12ea24d8 new chunked decoder magic
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93278 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 18:43:54 +00:00
darin%netscape.com
86bc259321 more changes for the branch
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93218 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-27 02:32:26 +00:00
darin%netscape.com
5f592da9ec fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93183 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 21:50:22 +00:00
darin%netscape.com
88e1476dcc fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93182 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 21:43:26 +00:00
darin%netscape.com
7401de36e0 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93166 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 19:01:32 +00:00
darin%netscape.com
fd3d77122b fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93160 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 18:44:02 +00:00
darin%netscape.com
b5e422c515 no need to set method to POST if setting upload stream.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93155 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 18:34:59 +00:00
darin%netscape.com
f8b07e1d79 no need to SetRequestMethod("POST") if calling SetUploadStream(...)
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93154 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 18:34:11 +00:00
darin%netscape.com
25b34db661 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93153 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 18:33:21 +00:00
darin%netscape.com
4ef5a05f6e fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93150 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 18:19:50 +00:00
darin%netscape.com
72467e9543 new progress api
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93149 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 18:09:41 +00:00
darin%netscape.com
5ad305a325 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93148 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 18:08:41 +00:00
darin%netscape.com
4ad5e810d4 today's changes ;-)
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93105 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 02:05:33 +00:00
darin%netscape.com
e9295b308b fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93104 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 02:04:41 +00:00
darin%netscape.com
e561e68462 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93101 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-26 00:39:32 +00:00
darin%netscape.com
ec68a17487 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93098 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 22:40:08 +00:00
darin%netscape.com
87d17ebb9b fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93097 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 22:33:36 +00:00
darin%netscape.com
c871441282 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93095 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 22:24:59 +00:00
darin%netscape.com
8e676fcec9 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93093 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 22:09:26 +00:00
darin%netscape.com
01902287ba fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93091 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 21:55:22 +00:00
darin%netscape.com
284de57c74 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93082 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 19:36:19 +00:00
darin%netscape.com
7defd5c982 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93081 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 19:10:31 +00:00
darin%netscape.com
196d5f01e3 fix for new http idl
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93080 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 18:53:29 +00:00
darin%netscape.com
e20d8aa5c0 updates
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93062 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 08:39:07 +00:00
darin%netscape.com
50504e342c adding httpstatus processing
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93061 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 08:00:27 +00:00
darin%netscape.com
b841b1c329 back to raw strings.. YES!
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93056 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 06:10:37 +00:00
darin%netscape.com
3c3b40c6a4 fixing stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93051 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 02:20:49 +00:00
(no author)
420c4bdd1e This commit was manufactured by cvs2svn to create branch
'HttpConnectionMagic_20010415_BRANCH'.

git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93049 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 02:04:57 +00:00
darin%netscape.com
32278d385e updates
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93047 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-25 01:24:44 +00:00
darin%netscape.com
c3af281416 fixing more stuff.
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@93001 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-24 18:38:45 +00:00
darin%netscape.com
aeff9e633b fixing stuff
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92991 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-24 07:53:01 +00:00
darin%netscape.com
29112c02e3 adding files
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92988 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-24 04:56:18 +00:00
darin%netscape.com
a80623ea05 updated
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92984 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-24 03:30:52 +00:00
darin%netscape.com
252b1505d4 merged with tip
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92960 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-23 23:03:43 +00:00
darin%netscape.com
9604b2c9e7 getting closer...
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92925 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-23 16:36:46 +00:00
darin%netscape.com
dee90d33b6 merging nsIPrompt changes
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92906 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-22 18:48:58 +00:00
darin%netscape.com
e45e176315 getting there...
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92903 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-22 18:21:59 +00:00
darin%netscape.com
8c6b501871 adding "Transfer-Encoding: chunked" support to new http
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92844 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 20:01:38 +00:00
darin%netscape.com
6ce46da402 make netwerk build
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92842 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 17:45:11 +00:00
darin%netscape.com
6a81aac1ee added test file for new http
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92840 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 16:46:42 +00:00
darin%netscape.com
efc73f0976 adding new http handler (in place of old one) to necko module
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92839 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 16:43:12 +00:00
darin%netscape.com
5438ed3f24 adding new source files
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92838 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 16:07:14 +00:00
darin%netscape.com
bc635e6b90 removing old source files
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92837 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 16:06:03 +00:00
darin%netscape.com
5b0ac3f43e adding new idl files
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92836 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 16:04:55 +00:00
darin%netscape.com
48541d57ac removing old idl files
git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92835 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 16:00:45 +00:00
(no author)
a7d10a1cd7 This commit was manufactured by cvs2svn to create branch
'HttpConnectionMagic_20010415_BRANCH'.

git-svn-id: svn://10.0.0.236/branches/HttpConnectionMagic_20010415_BRANCH@92819 18797224-902f-48f8-a5cc-f745e15eee43
2001-04-20 06:45:57 +00:00
710 changed files with 170406 additions and 13372 deletions

27
mozilla/content/build/gbdate.pl Executable file
View File

@@ -0,0 +1,27 @@
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
#
# XP way of doing the build date.
# 1998091509 = 1998, September, 15th, 9am local time zone
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
# localtime returns year minus 1900
$year = $year + 1900;
printf("#define PRODUCT_VERSION \"%04d%02d%02d\"\n", $year, 1+$mon, $mday);

View File

@@ -0,0 +1,90 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Alec Flett <alecf@netscape.com>
*/
#include "nsIServiceManager.h"
#include "nsICategoryManager.h"
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsXPIDLString.h"
#include "nsContentHTTPStartup.h"
#include "nsIHttpProtocolHandler.h"
#include "gbdate.h"
#define PRODUCT_NAME "Gecko"
NS_IMPL_ISUPPORTS1(nsContentHTTPStartup,nsIObserver)
nsresult
nsContentHTTPStartup::Observe( nsISupports *aSubject,
const PRUnichar *aTopic,
const PRUnichar *aData)
{
if (nsCRT::strcmp(aTopic, NS_HTTP_STARTUP_TOPIC) != 0)
return NS_OK;
nsresult rv = nsnull;
nsCOMPtr<nsIHttpProtocolHandler> http(do_QueryInterface(aSubject));
if (NS_FAILED(rv)) return rv;
rv = http->SetProduct(PRODUCT_NAME);
if (NS_FAILED(rv)) return rv;
rv = http->SetProductSub((char*) PRODUCT_VERSION);
if (NS_FAILED(rv)) return rv;
return NS_OK;
}
nsresult
nsContentHTTPStartup::RegisterHTTPStartup()
{
nsresult rv;
nsCOMPtr<nsICategoryManager>
catMan(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv));
if (NS_FAILED(rv)) return rv;
nsXPIDLCString previousEntry;
rv = catMan->AddCategoryEntry(NS_HTTP_STARTUP_CATEGORY,
"Content UserAgent Setter",
NS_CONTENTHTTPSTARTUP_CONTRACTID,
PR_TRUE, PR_TRUE,
getter_Copies(previousEntry));
return rv;
}
nsresult
nsContentHTTPStartup::UnregisterHTTPStartup()
{
nsresult rv;
nsCOMPtr<nsICategoryManager>
catMan(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv));
if (NS_FAILED(rv)) return rv;
return NS_OK;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,121 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef nsXMLDocument_h___
#define nsXMLDocument_h___
#include "nsMarkupDocument.h"
#include "nsIXMLDocument.h"
#include "nsIHTMLContentContainer.h"
#include "nsIInterfaceRequestor.h"
#include "nsIHttpEventSink.h"
class nsIParser;
class nsIDOMNode;
class nsICSSLoader;
class nsIURI;
class nsXMLDocument : public nsMarkupDocument,
public nsIXMLDocument,
public nsIHTMLContentContainer,
public nsIInterfaceRequestor,
public nsIHttpEventSink
{
public:
nsXMLDocument();
virtual ~nsXMLDocument();
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
NS_IMETHOD Reset(nsIChannel* aChannel, nsILoadGroup* aLoadGroup);
NS_IMETHOD GetContentType(nsAWritableString& aContentType) const;
NS_IMETHOD StartDocumentLoad(const char* aCommand,
nsIChannel* channel,
nsILoadGroup* aLoadGroup,
nsISupports* aContainer,
nsIStreamListener **aDocListener,
PRBool aReset = PR_TRUE);
NS_IMETHOD EndLoad();
NS_IMETHOD GetBaseTarget(nsAWritableString &aBaseTarget);
NS_IMETHOD SetBaseTarget(const nsAReadableString &aBaseTarget);
// nsIDOMNode interface
NS_IMETHOD CloneNode(PRBool aDeep, nsIDOMNode** aReturn);
// nsIDOMDocument interface
NS_IMETHOD GetDoctype(nsIDOMDocumentType** aDocumentType);
NS_IMETHOD CreateCDATASection(const nsAReadableString& aData, nsIDOMCDATASection** aReturn);
NS_IMETHOD CreateEntityReference(const nsAReadableString& aName, nsIDOMEntityReference** aReturn);
NS_IMETHOD CreateProcessingInstruction(const nsAReadableString& aTarget, const nsAReadableString& aData, nsIDOMProcessingInstruction** aReturn);
NS_IMETHOD CreateElement(const nsAReadableString& aTagName,
nsIDOMElement** aReturn);
NS_IMETHOD ImportNode(nsIDOMNode* aImportedNode,
PRBool aDeep,
nsIDOMNode** aReturn);
NS_IMETHOD CreateElementNS(const nsAReadableString& aNamespaceURI,
const nsAReadableString& aQualifiedName,
nsIDOMElement** aReturn);
NS_IMETHOD CreateAttributeNS(const nsAReadableString& aNamespaceURI,
const nsAReadableString& aQualifiedName,
nsIDOMAttr** aReturn);
NS_IMETHOD GetElementById(const nsAReadableString& aElementId,
nsIDOMElement** aReturn);
NS_IMETHOD Load(const nsAReadableString& aUrl);
// nsIXMLDocument interface
NS_IMETHOD SetDefaultStylesheets(nsIURI* aUrl);
NS_IMETHOD SetTitle(const PRUnichar *aTitle);
// nsIHTMLContentContainer
NS_IMETHOD GetAttributeStyleSheet(nsIHTMLStyleSheet** aResult);
NS_IMETHOD GetInlineStyleSheet(nsIHTMLCSSStyleSheet** aResult);
NS_IMETHOD GetCSSLoader(nsICSSLoader*& aLoader);
// nsIInterfaceRequestor
NS_IMETHOD GetInterface(const nsIID& aIID, void** aSink);
// nsIHTTPEventSink
NS_DECL_NSIHTTPEVENTSINK
protected:
virtual void InternalAddStyleSheet(nsIStyleSheet* aSheet); // subclass hook for sheet ordering
virtual void InternalInsertStyleSheetAt(nsIStyleSheet* aSheet, PRInt32 aIndex);
// For HTML elements in our content model
// XXX This is not clean, but is there a better way?
nsIHTMLStyleSheet* mAttrStyleSheet;
nsIHTMLCSSStyleSheet* mInlineStyleSheet;
nsString mBaseTarget;
nsIParser *mParser;
nsICSSLoader* mCSSLoader;
};
#endif // nsXMLDocument_h___

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,250 @@
/* -*- Mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifdef DEBUG_dp
#include <stdio.h>
#endif
#include "nsCookieService.h" /* don't remove -- needed for mac build */
#include "nsCookieHTTPNotify.h"
#include "nsIGenericFactory.h"
#include "nsIHttpChannel.h"
#include "nsCookie.h"
#include "nsIURL.h"
#include "nsCRT.h"
#include "nsXPIDLString.h"
#include "nsIServiceManager.h"
#include "nsINetModuleMgr.h"
#include "nsILoadGroup.h"
#include "nsICategoryManager.h"
#include "nsIHttpProtocolHandler.h" // for NS_HTTP_STARTUP_CATEGORY
#include "nsIInterfaceRequestor.h"
#include "nsIPrompt.h"
static NS_DEFINE_CID(kINetModuleMgrCID, NS_NETMODULEMGR_CID);
///////////////////////////////////
// nsISupports
NS_IMPL_ISUPPORTS2(nsCookieHTTPNotify, nsIHttpNotify, nsINetNotify);
///////////////////////////////////
// nsCookieHTTPNotify Implementation
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsCookieHTTPNotify, Init)
nsresult nsCookieHTTPNotify::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
{
return nsCookieHTTPNotifyConstructor(aOuter, aIID, aResult);
}
NS_METHOD nsCookieHTTPNotify::RegisterProc(nsIComponentManager *aCompMgr,
nsIFile *aPath,
const char *registryLocation,
const char *componentType,
const nsModuleComponentInfo *info)
{
// Register ourselves into the NS_CATEGORY_HTTP_STARTUP
nsresult rv;
nsCOMPtr<nsICategoryManager> catman = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
if (NS_FAILED(rv)) return rv;
nsXPIDLCString prevEntry;
rv = catman->AddCategoryEntry(NS_HTTP_STARTUP_CATEGORY, "Http Cookie Notify", NS_COOKIEHTTPNOTIFY_CONTRACTID,
PR_TRUE, PR_TRUE, getter_Copies(prevEntry));
return NS_OK;
}
NS_METHOD nsCookieHTTPNotify::UnregisterProc(nsIComponentManager *aCompMgr,
nsIFile *aPath,
const char *registryLocation,
const nsModuleComponentInfo *info)
{
nsresult rv;
nsCOMPtr<nsICategoryManager> catman = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
if (NS_FAILED(rv)) return rv;
nsXPIDLCString prevEntry;
rv = catman->DeleteCategoryEntry(NS_HTTP_STARTUP_CATEGORY, NS_COOKIEHTTPNOTIFY_CONTRACTID, PR_TRUE,
getter_Copies(prevEntry));
// Return value is not used from this function.
return NS_OK;
}
NS_IMETHODIMP
nsCookieHTTPNotify::Init()
{
// Register to handing http requests and responses
nsresult rv = NS_OK;
nsCOMPtr<nsINetModuleMgr> pNetModuleMgr = do_GetService(kINetModuleMgrCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = pNetModuleMgr->RegisterModule(NS_NETWORK_MODULE_MANAGER_HTTP_REQUEST_CONTRACTID,
(nsIHttpNotify *)this);
if (NS_FAILED(rv)) return rv;
rv = pNetModuleMgr->RegisterModule(NS_NETWORK_MODULE_MANAGER_HTTP_RESPONSE_CONTRACTID,
(nsIHttpNotify *)this);
return rv;
}
nsCookieHTTPNotify::nsCookieHTTPNotify()
{
NS_INIT_REFCNT();
mCookieService = nsnull;
#ifdef DEBUG_dp
printf("CookieHTTPNotify Created.\n");
#endif /* DEBUG_dp */
}
nsCookieHTTPNotify::~nsCookieHTTPNotify()
{
}
NS_IMETHODIMP
nsCookieHTTPNotify::SetupCookieService()
{
nsresult rv = NS_OK;
if (!mCookieService)
{
mCookieService = do_GetService(NS_COOKIESERVICE_CONTRACTID, &rv);
}
return rv;
}
///////////////////////////////////
// nsIHttpNotify
NS_IMETHODIMP
nsCookieHTTPNotify::OnModifyRequest(nsIHttpChannel *aHttpChannel)
{
nsresult rv;
// Preconditions
NS_ENSURE_ARG_POINTER(aHttpChannel);
// Get the url
nsCOMPtr<nsIURI> pURL;
rv = aHttpChannel->GetURI(getter_AddRefs(pURL));
if (NS_FAILED(rv)) return rv;
// Get the original url that the user either typed in or clicked on
nsCOMPtr<nsILoadGroup> pLoadGroup;
rv = aHttpChannel->GetLoadGroup(getter_AddRefs(pLoadGroup));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> pChannel;
if (pLoadGroup) {
nsCOMPtr<nsIRequest> pRequest;
rv = pLoadGroup->GetDefaultLoadRequest(getter_AddRefs(pRequest));
if (pRequest)
pChannel = do_QueryInterface(pRequest);
}
nsCOMPtr<nsIURI> pFirstURL;
if (pChannel) {
rv = pChannel->GetURI(getter_AddRefs(pFirstURL));
} else {
rv = aHttpChannel->GetURI(getter_AddRefs(pFirstURL));
}
if (NS_FAILED(rv)) return rv;
// Ensure that the cookie service exists
rv = SetupCookieService();
if (NS_FAILED(rv)) return rv;
char * cookie;
rv = mCookieService->GetCookieStringFromHttp(pURL, pFirstURL, &cookie);
if (NS_FAILED(rv)) return rv;
// Set the cookie into the request headers
if (cookie && *cookie)
rv = aHttpChannel->SetRequestHeader("Cookie", cookie);
nsMemory::Free((void *)cookie);
return rv;
}
NS_IMETHODIMP
nsCookieHTTPNotify::OnExamineResponse(nsIHttpChannel *aHttpChannel)
{
nsresult rv;
// Preconditions
NS_ENSURE_ARG_POINTER(aHttpChannel);
// Get the Cookie header
nsXPIDLCString cookieHeader;
rv = aHttpChannel->GetResponseHeader("Set-Cookie", getter_Copies(cookieHeader));
if (NS_FAILED(rv)) return rv;
if (!cookieHeader) return NS_OK; // not an error, there's just no header.
// Get the url
nsCOMPtr<nsIURI> pURL;
rv = aHttpChannel->GetURI(getter_AddRefs(pURL));
if (NS_FAILED(rv)) return rv;
// Get the original url that the user either typed in or clicked on
nsCOMPtr<nsILoadGroup> pLoadGroup;
rv = aHttpChannel->GetLoadGroup(getter_AddRefs(pLoadGroup));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> pChannel;
if (pLoadGroup) {
nsCOMPtr<nsIRequest> pRequest;
rv = pLoadGroup->GetDefaultLoadRequest(getter_AddRefs(pRequest));
if (NS_FAILED(rv)) return rv;
pChannel = do_QueryInterface(pRequest);
}
nsCOMPtr<nsIURI> pFirstURL;
if (pChannel) {
rv = pChannel->GetURI(getter_AddRefs(pFirstURL));
} else {
rv = aHttpChannel->GetURI(getter_AddRefs(pFirstURL));
}
if (NS_FAILED(rv)) return rv;
// Get the prompter
nsCOMPtr<nsIInterfaceRequestor> pInterfaces;
nsCOMPtr<nsIPrompt> pPrompter;
if (pChannel) {
pChannel->GetNotificationCallbacks(getter_AddRefs(pInterfaces));
} else {
aHttpChannel->GetNotificationCallbacks(getter_AddRefs(pInterfaces));
}
if (pInterfaces)
pInterfaces->GetInterface(NS_GET_IID(nsIPrompt), getter_AddRefs(pPrompter));
// Get the expires
nsXPIDLCString dateHeader;
rv = aHttpChannel->GetResponseHeader("Date", getter_Copies(dateHeader));
if (NS_FAILED(rv)) return rv;
// Ensure that we have the cookie service
rv = SetupCookieService();
if (NS_FAILED(rv)) return rv;
// Save the cookie
rv = mCookieService->SetCookieStringFromHttp(pURL, pFirstURL, pPrompter, cookieHeader, dateHeader);
return rv;
}

View File

@@ -0,0 +1,71 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef nsCookieHTTPNotify_h___
#define nsCookieHTTPNotify_h___
#include "nsIHttpNotify.h"
#include "nsICookieService.h"
#include "nsIComponentManager.h"
// {6BC1F522-1F45-11d3-8AD4-00105A1B8860}
#define NS_COOKIEHTTPNOTIFY_CID \
{ 0x6bc1f522, 0x1f45, 0x11d3, { 0x8a, 0xd4, 0x0, 0x10, 0x5a, 0x1b, 0x88, 0x60 } }
#define NS_COOKIEHTTPNOTIFY_CONTRACTID "@mozilla.org/cookie-notifier;1"
#define NS_COOKIEHTTPNOTIFY_CLASSNAME "Cookie Notifier"
struct nsModuleComponentInfo; // forward declaration
class nsCookieHTTPNotify : public nsIHttpNotify {
public:
// nsISupports
NS_DECL_ISUPPORTS
// Init method
NS_IMETHOD Init();
// nsIHttpNotify methods:
NS_DECL_NSIHTTPNOTIFY
// nsCookieHTTPNotify methods:
nsCookieHTTPNotify();
virtual ~nsCookieHTTPNotify();
static nsresult Create(nsISupports *aOuter, REFNSIID aIID, void **aResult);
static NS_METHOD RegisterProc(nsIComponentManager *aCompMgr,
nsIFile *aPath,
const char *registryLocation,
const char *componentType,
const nsModuleComponentInfo *info);
static NS_METHOD UnregisterProc(nsIComponentManager *aCompMgr,
nsIFile *aPath,
const char *registryLocation,
const nsModuleComponentInfo *info);
private:
nsCOMPtr<nsICookieService> mCookieService;
NS_IMETHOD SetupCookieService();
};
#endif /* nsCookieHTTPNotify_h___ */

View File

@@ -0,0 +1,43 @@
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
#
DEPTH = ../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = necko
LIBRARY_NAME = nkdatetm_s
REQUIRES = xpcom string
CPPSRCS = \
nsDateTimeHandler.cpp \
nsDateTimeChannel.cpp \
$(NULL)
# we don't want the shared lib, but we want to force the creation of a
# static lib.
override NO_SHARED_LIB=1
override NO_STATIC_LIB=
include $(topsrcdir)/config/rules.mk

View File

@@ -0,0 +1,327 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
// datetime implementation
#include "nsDateTimeChannel.h"
#include "nsIServiceManager.h"
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsXPIDLString.h"
#include "nsISocketTransportService.h"
#include "nsITransport.h"
#include "nsIProgressEventSink.h"
static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID);
// nsDateTimeChannel methods
nsDateTimeChannel::nsDateTimeChannel() {
NS_INIT_REFCNT();
mContentLength = -1;
mPort = -1;
}
nsDateTimeChannel::~nsDateTimeChannel() {
}
NS_IMPL_ISUPPORTS4(nsDateTimeChannel,
nsIChannel,
nsIRequest,
nsIStreamListener,
nsIRequestObserver)
nsresult
nsDateTimeChannel::Init(nsIURI* uri)
{
nsresult rv;
NS_ASSERTION(uri, "no uri");
mUrl = uri;
rv = mUrl->GetPort(&mPort);
if (NS_FAILED(rv) || mPort < 1)
mPort = DATETIME_PORT;
rv = mUrl->GetPath(getter_Copies(mHost));
if (NS_FAILED(rv)) return rv;
if (!*(const char *)mHost) return NS_ERROR_NOT_INITIALIZED;
return NS_OK;
}
NS_METHOD
nsDateTimeChannel::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult)
{
nsDateTimeChannel* dc = new nsDateTimeChannel();
if (dc == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(dc);
nsresult rv = dc->QueryInterface(aIID, aResult);
NS_RELEASE(dc);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIRequest methods:
NS_IMETHODIMP
nsDateTimeChannel::GetName(PRUnichar* *result)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::IsPending(PRBool *result)
{
NS_NOTREACHED("nsDateTimeChannel::IsPending");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetStatus(nsresult *status)
{
*status = NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::Cancel(nsresult status)
{
NS_ASSERTION(NS_FAILED(status), "shouldn't cancel with a success code");
NS_NOTREACHED("nsDateTimeChannel::Cancel");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::Suspend(void)
{
NS_NOTREACHED("nsDateTimeChannel::Suspend");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::Resume(void)
{
NS_NOTREACHED("nsDateTimeChannel::Resume");
return NS_ERROR_NOT_IMPLEMENTED;
}
////////////////////////////////////////////////////////////////////////////////
// nsIChannel methods:
NS_IMETHODIMP
nsDateTimeChannel::GetOriginalURI(nsIURI* *aURI)
{
*aURI = mOriginalURI ? mOriginalURI : mUrl;
NS_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetOriginalURI(nsIURI* aURI)
{
mOriginalURI = aURI;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetURI(nsIURI* *aURI)
{
*aURI = mUrl;
NS_IF_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::Open(nsIInputStream **_retval)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsITransport> transport;
rv = socketService->CreateTransport(mHost, mPort, nsnull, -1, 32, 32, getter_AddRefs(transport));
if (NS_FAILED(rv)) return rv;
transport->SetNotificationCallbacks(mCallbacks,
(mLoadFlags & LOAD_BACKGROUND));
return transport->OpenInputStream(0, -1, 0, _retval);
}
NS_IMETHODIMP
nsDateTimeChannel::AsyncOpen(nsIStreamListener *aListener, nsISupports *ctxt)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsITransport> transport;
rv = socketService->CreateTransport(mHost, mPort, nsnull, -1, 32, 32, getter_AddRefs(transport));
if (NS_FAILED(rv)) return rv;
transport->SetNotificationCallbacks(mCallbacks,
(mLoadFlags & LOAD_BACKGROUND));
mListener = aListener;
nsCOMPtr<nsIRequest> request;
return transport->AsyncRead(this, ctxt, 0, -1, 0, getter_AddRefs(request));
}
NS_IMETHODIMP
nsDateTimeChannel::GetLoadFlags(PRUint32 *aLoadFlags)
{
*aLoadFlags = mLoadFlags;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetLoadFlags(PRUint32 aLoadFlags)
{
mLoadFlags = aLoadFlags;
return NS_OK;
}
#define DATETIME_TYPE "text/plain"
NS_IMETHODIMP
nsDateTimeChannel::GetContentType(char* *aContentType) {
if (!aContentType) return NS_ERROR_NULL_POINTER;
*aContentType = nsCRT::strdup(DATETIME_TYPE);
if (!*aContentType) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetContentType(const char *aContentType)
{
//It doesn't make sense to set the content-type on this type
// of channel...
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsDateTimeChannel::GetContentLength(PRInt32 *aContentLength)
{
*aContentLength = mContentLength;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetContentLength(PRInt32 aContentLength)
{
NS_NOTREACHED("nsDateTimeChannel::SetContentLength");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
{
*aLoadGroup = mLoadGroup;
NS_IF_ADDREF(*aLoadGroup);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
{
if (mLoadGroup) // if we already had a load group remove ourselves...
(void)mLoadGroup->RemoveRequest(this, nsnull, NS_OK);
mLoadGroup = aLoadGroup;
if (mLoadGroup) {
return mLoadGroup->AddRequest(this, nsnull);
}
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetOwner(nsISupports* *aOwner)
{
*aOwner = mOwner.get();
NS_IF_ADDREF(*aOwner);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetOwner(nsISupports* aOwner)
{
mOwner = aOwner;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
{
*aNotificationCallbacks = mCallbacks.get();
NS_IF_ADDREF(*aNotificationCallbacks);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
{
mCallbacks = aNotificationCallbacks;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetSecurityInfo(nsISupports **sec)
{
NS_ENSURE_ARG_POINTER(sec);
*sec = nsnull;
return NS_OK;
}
// nsIRequestObserver methods
NS_IMETHODIMP
nsDateTimeChannel::OnStartRequest(nsIRequest *request, nsISupports *aContext) {
return mListener->OnStartRequest(this, aContext);
}
NS_IMETHODIMP
nsDateTimeChannel::OnStopRequest(nsIRequest *request, nsISupports* aContext,
nsresult aStatus) {
if (mLoadGroup) {
nsresult rv = mLoadGroup->RemoveRequest(this, nsnull, aStatus);
if (NS_FAILED(rv)) return rv;
}
return mListener->OnStopRequest(this, aContext, aStatus);
}
// nsIStreamListener method
NS_IMETHODIMP
nsDateTimeChannel::OnDataAvailable(nsIRequest *request, nsISupports* aContext,
nsIInputStream *aInputStream, PRUint32 aSourceOffset,
PRUint32 aLength) {
mContentLength = aLength;
return mListener->OnDataAvailable(this, aContext, aInputStream, aSourceOffset, aLength);
}

View File

@@ -0,0 +1,78 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
// A datetime channel retrieves date time information from
// RFC 867 compliant datetime servers. The date/time returned
// to the caller is of MIME type "text/plain".
#ifndef nsDateTimeChannel_h___
#define nsDateTimeChannel_h___
#include "nsString.h"
#include "nsILoadGroup.h"
#include "nsIInputStream.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "nsXPIDLString.h"
#include "nsIChannel.h"
#include "nsIURI.h"
#include "nsDateTimeHandler.h"
#include "nsIStreamListener.h"
class nsDateTimeChannel
: public nsIChannel,
public nsIStreamListener {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIREQUESTOBSERVER
// nsDateTimeChannel methods:
nsDateTimeChannel();
virtual ~nsDateTimeChannel();
// Define a Create method to be used with a factory:
static NS_METHOD
Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
nsresult Init(nsIURI* uri);
protected:
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI;
nsCOMPtr<nsIURI> mUrl;
nsCOMPtr<nsIStreamListener> mListener;
PRUint32 mLoadFlags;
nsCOMPtr<nsILoadGroup> mLoadGroup;
nsCString mContentType;
PRInt32 mContentLength;
nsCOMPtr<nsISupports> mOwner;
PRInt32 mPort;
nsXPIDLCString mHost;
};
#endif /* nsDateTimeChannel_h___ */

View File

@@ -0,0 +1,117 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nspr.h"
#include "nsDateTimeChannel.h"
#include "nsDateTimeHandler.h"
#include "nsIURL.h"
#include "nsCRT.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIInterfaceRequestor.h"
#include "nsIProgressEventSink.h"
#include "nsNetCID.h"
static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
////////////////////////////////////////////////////////////////////////////////
nsDateTimeHandler::nsDateTimeHandler() {
NS_INIT_REFCNT();
}
nsDateTimeHandler::~nsDateTimeHandler() {
}
NS_IMPL_ISUPPORTS1(nsDateTimeHandler, nsIProtocolHandler)
NS_METHOD
nsDateTimeHandler::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult) {
nsDateTimeHandler* ph = new nsDateTimeHandler();
if (ph == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(ph);
nsresult rv = ph->QueryInterface(aIID, aResult);
NS_RELEASE(ph);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIProtocolHandler methods:
NS_IMETHODIMP
nsDateTimeHandler::GetScheme(char* *result) {
*result = nsCRT::strdup("datetime");
if (!*result) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeHandler::GetDefaultPort(PRInt32 *result) {
*result = DATETIME_PORT;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeHandler::NewURI(const char *aSpec, nsIURI *aBaseURI,
nsIURI **result) {
nsresult rv;
// no concept of a relative datetime url
NS_ASSERTION(!aBaseURI, "base url passed into datetime protocol handler");
nsIURI* url;
rv = nsComponentManager::CreateInstance(kSimpleURICID, nsnull,
NS_GET_IID(nsIURI),
(void**)&url);
if (NS_FAILED(rv)) return rv;
rv = url->SetSpec((char*)aSpec);
if (NS_FAILED(rv)) {
NS_RELEASE(url);
return rv;
}
*result = url;
return rv;
}
NS_IMETHODIMP
nsDateTimeHandler::NewChannel(nsIURI* url, nsIChannel* *result)
{
nsresult rv;
nsDateTimeChannel* channel;
rv = nsDateTimeChannel::Create(nsnull, NS_GET_IID(nsIChannel), (void**)&channel);
if (NS_FAILED(rv)) return rv;
rv = channel->Init(url);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
*result = channel;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,51 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
// The datetime protocol handler creates "datetime" URIs of the form
// "datetime:RFC867Server".
#ifndef nsDateTimeHandler_h___
#define nsDateTimeHandler_h___
#include "nsIProtocolHandler.h"
#define DATETIME_PORT 13
// {AA27D2A0-B71B-11d3-A1A0-0050041CAF44}
#define NS_DATETIMEHANDLER_CID \
{ 0xaa27d2a0, 0xb71b, 0x11d3, { 0xa1, 0xa0, 0x0, 0x50, 0x4, 0x1c, 0xaf, 0x44 } }
class nsDateTimeHandler : public nsIProtocolHandler
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
// nsDateTimeHandler methods:
nsDateTimeHandler();
virtual ~nsDateTimeHandler();
// Define a Create method to be used with a factory:
static NS_METHOD Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
};
#endif /* nsDateTimeHandler_h___ */

View File

@@ -0,0 +1,34 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsIGenericFactory.h"
#include "nsDateTimeHandler.h"
static nsModuleComponentInfo gResComponents[] = {
{ "The DateTime Protocol Handler",
NS_DATETIMEHANDLER_CID,
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "datetime",
nsDateTimeHandler::Create
}
};
NS_IMPL_NSGETMODULE(datetime, gResComponents)

View File

@@ -0,0 +1,42 @@
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Brian Ryner.
# Portions created by Brian Ryner are Copyright (C) 2000 Brian Ryner.
# All Rights Reserved.
#
# Contributor(s):
# Brian Ryner <bryner@uiuc.edu>
DEPTH = ../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = necko
LIBRARY_NAME = nkfinger_s
REQUIRES = xpcom string mimetype
CPPSRCS = \
nsFingerHandler.cpp \
nsFingerChannel.cpp \
$(NULL)
# we don't want the shared lib, but we want to force the creation of a
# static lib.
override NO_SHARED_LIB=1
override NO_STATIC_LIB=
include $(topsrcdir)/config/rules.mk

View File

@@ -0,0 +1,427 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Brian Ryner.
* Portions created by Brian Ryner are Copyright (C) 2000 Brian Ryner.
* All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@uiuc.edu>
*/
// finger implementation
#include "nsFingerChannel.h"
#include "nsIServiceManager.h"
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsXPIDLString.h"
#include "nsISocketTransportService.h"
#include "nsIStringStream.h"
#include "nsMimeTypes.h"
#include "nsIStreamConverterService.h"
#include "nsITXTToHTMLConv.h"
#include "nsIProgressEventSink.h"
#include "nsNetUtil.h"
static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID);
static NS_DEFINE_CID(kStreamConverterServiceCID, NS_STREAMCONVERTERSERVICE_CID);
#define BUFFER_SEG_SIZE (4*1024)
#define BUFFER_MAX_SIZE (64*1024)
// nsFingerChannel methods
nsFingerChannel::nsFingerChannel()
: mContentLength(-1),
mActAsObserver(PR_TRUE),
mPort(-1),
mStatus(NS_OK)
{
NS_INIT_REFCNT();
}
nsFingerChannel::~nsFingerChannel() {
}
NS_IMPL_THREADSAFE_ISUPPORTS4(nsFingerChannel,
nsIChannel,
nsIRequest,
nsIStreamListener,
nsIRequestObserver)
nsresult
nsFingerChannel::Init(nsIURI* uri)
{
nsresult rv;
nsXPIDLCString autoBuffer;
NS_ASSERTION(uri, "no uri");
mUrl = uri;
// For security reasons, we do not allow the user to specify a
// non-default port for finger: URL's.
mPort = FINGER_PORT;
rv = mUrl->GetPath(getter_Copies(autoBuffer)); // autoBuffer = user@host
if (NS_FAILED(rv)) return rv;
// Now parse out the user and host
const char* buf = autoBuffer.get();
const char* pos = PL_strchr(buf, '@');
// Catch the case of just the host being given
if (!pos) {
mHost.Assign(buf);
} else {
mUser.Assign(buf,pos-buf);
mHost.Assign(pos+1); // ignore '@'
}
if (mHost.IsEmpty()) return NS_ERROR_NOT_INITIALIZED;
return NS_OK;
}
NS_METHOD
nsFingerChannel::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult)
{
nsFingerChannel* fc = new nsFingerChannel();
if (fc == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(fc);
nsresult rv = fc->QueryInterface(aIID, aResult);
NS_RELEASE(fc);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIRequest methods:
NS_IMETHODIMP
nsFingerChannel::GetName(PRUnichar* *result)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::IsPending(PRBool *result)
{
NS_NOTREACHED("nsFingerChannel::IsPending");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetStatus(nsresult *status)
{
*status = mStatus;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::Cancel(nsresult status)
{
NS_ASSERTION(NS_FAILED(status), "shouldn't cancel with a success code");
nsresult rv = NS_ERROR_FAILURE;
mStatus = status;
if (mTransportRequest) {
rv = mTransportRequest->Cancel(status);
}
return rv;
}
NS_IMETHODIMP
nsFingerChannel::Suspend(void)
{
NS_NOTREACHED("nsFingerChannel::Suspend");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::Resume(void)
{
NS_NOTREACHED("nsFingerChannel::Resume");
return NS_ERROR_NOT_IMPLEMENTED;
}
////////////////////////////////////////////////////////////////////////////////
// nsIChannel methods:
NS_IMETHODIMP
nsFingerChannel::GetOriginalURI(nsIURI* *aURI)
{
*aURI = mOriginalURI ? mOriginalURI : mUrl;
NS_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetOriginalURI(nsIURI* aURI)
{
mOriginalURI = aURI;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetURI(nsIURI* *aURI)
{
*aURI = mUrl;
NS_IF_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::Open(nsIInputStream **_retval)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = socketService->CreateTransport(mHost, mPort, nsnull, -1, BUFFER_SEG_SIZE,
BUFFER_MAX_SIZE, getter_AddRefs(mTransport));
if (NS_FAILED(rv)) return rv;
mTransport->SetNotificationCallbacks(mCallbacks,
(mLoadFlags & LOAD_BACKGROUND));
return mTransport->OpenInputStream(0, PRUint32(-1), 0, _retval);
}
NS_IMETHODIMP
nsFingerChannel::AsyncOpen(nsIStreamListener *aListener, nsISupports *ctxt)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = socketService->CreateTransport(mHost, mPort, nsnull, -1, BUFFER_SEG_SIZE,
BUFFER_MAX_SIZE, getter_AddRefs(mTransport));
if (NS_FAILED(rv)) return rv;
mTransport->SetNotificationCallbacks(mCallbacks,
(mLoadFlags & LOAD_BACKGROUND));
mListener = aListener;
mResponseContext = ctxt;
return SendRequest(mTransport);
}
NS_IMETHODIMP
nsFingerChannel::GetLoadFlags(PRUint32 *aLoadFlags)
{
*aLoadFlags = mLoadFlags;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetLoadFlags(PRUint32 aLoadFlags)
{
mLoadFlags = aLoadFlags;
return NS_OK;
}
#define FINGER_TYPE TEXT_HTML
NS_IMETHODIMP
nsFingerChannel::GetContentType(char* *aContentType) {
if (!aContentType) return NS_ERROR_NULL_POINTER;
*aContentType = nsCRT::strdup(FINGER_TYPE);
if (!*aContentType) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetContentType(const char *aContentType)
{
//It doesn't make sense to set the content-type on this type
// of channel...
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsFingerChannel::GetContentLength(PRInt32 *aContentLength)
{
*aContentLength = mContentLength;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetContentLength(PRInt32 aContentLength)
{
NS_NOTREACHED("nsFingerChannel::SetContentLength");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
{
*aLoadGroup = mLoadGroup;
NS_IF_ADDREF(*aLoadGroup);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
{
mLoadGroup = aLoadGroup;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetOwner(nsISupports* *aOwner)
{
*aOwner = mOwner.get();
NS_IF_ADDREF(*aOwner);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetOwner(nsISupports* aOwner)
{
mOwner = aOwner;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
{
*aNotificationCallbacks = mCallbacks.get();
NS_IF_ADDREF(*aNotificationCallbacks);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
{
mCallbacks = aNotificationCallbacks;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetSecurityInfo(nsISupports * *aSecurityInfo)
{
*aSecurityInfo = nsnull;
return NS_OK;
}
// nsIRequestObserver methods
NS_IMETHODIMP
nsFingerChannel::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) {
if (!mActAsObserver) {
// acting as a listener
return mListener->OnStartRequest(this, mResponseContext);
} else {
// we don't want to pass our AsyncWrite's OnStart through
// we just ignore this
return NS_OK;
}
}
NS_IMETHODIMP
nsFingerChannel::OnStopRequest(nsIRequest *aRequest, nsISupports* aContext,
nsresult aStatus)
{
nsresult rv = NS_OK;
if (NS_FAILED(aStatus) || !mActAsObserver) {
if (mLoadGroup) {
rv = mLoadGroup->RemoveRequest(this, nsnull, aStatus);
if (NS_FAILED(rv)) return rv;
}
rv = mListener->OnStopRequest(this, mResponseContext, aStatus);
mTransport = 0;
return rv;
} else {
// at this point we know the request has been sent.
// we're no longer acting as an observer.
mActAsObserver = PR_FALSE;
nsCOMPtr<nsIStreamListener> converterListener;
NS_WITH_SERVICE(nsIStreamConverterService, StreamConvService,
kStreamConverterServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsAutoString fromStr; fromStr.AssignWithConversion("text/plain");
nsAutoString toStr; toStr.AssignWithConversion("text/html");
rv = StreamConvService->AsyncConvertData(fromStr.GetUnicode(),
toStr.GetUnicode(), this, mResponseContext,
getter_AddRefs(converterListener));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsITXTToHTMLConv> converter(do_QueryInterface(converterListener));
if (converter) {
nsAutoString title; title.AssignWithConversion("Finger information for ");
nsXPIDLCString userHost;
rv = mUrl->GetPath(getter_Copies(userHost));
title.AppendWithConversion(userHost);
converter->SetTitle(title.GetUnicode());
converter->PreFormatHTML(PR_TRUE);
}
return mTransport->AsyncRead(converterListener, mResponseContext, 0, PRUint32(-1), 0,
getter_AddRefs(mTransportRequest));
}
}
// nsIStreamListener method
NS_IMETHODIMP
nsFingerChannel::OnDataAvailable(nsIRequest *aRequest, nsISupports* aContext,
nsIInputStream *aInputStream, PRUint32 aSourceOffset,
PRUint32 aLength) {
mContentLength = aLength;
return mListener->OnDataAvailable(this, mResponseContext, aInputStream, aSourceOffset, aLength);
}
nsresult
nsFingerChannel::SendRequest(nsITransport* aTransport) {
// The text to send should already be in mUser
nsresult rv = NS_OK;
nsCOMPtr<nsISupports> result;
nsCOMPtr<nsIInputStream> charstream;
nsCString requestBuffer(mUser);
if (mLoadGroup) {
mLoadGroup->AddRequest(this, nsnull);
}
requestBuffer.Append(CRLF);
mRequest = requestBuffer.ToNewCString();
rv = NS_NewCharInputStream(getter_AddRefs(result), mRequest);
if (NS_FAILED(rv)) return rv;
charstream = do_QueryInterface(result, &rv);
if (NS_FAILED(rv)) return rv;
rv = NS_AsyncWriteFromStream(getter_AddRefs(mTransportRequest),
aTransport, charstream,
0, requestBuffer.Length(), 0,
this, nsnull);
return rv;
}

View File

@@ -0,0 +1,88 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Brian Ryner.
* Portions created by Brian Ryner are Copyright (C) 2000 Brian Ryner.
* All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@uiuc.edu>
*/
#ifndef nsFingerChannel_h___
#define nsFingerChannel_h___
#include "nsString.h"
#include "nsILoadGroup.h"
#include "nsIInputStream.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "nsXPIDLString.h"
#include "nsIChannel.h"
#include "nsIURI.h"
#include "nsFingerHandler.h"
#include "nsIStreamListener.h"
#include "nsITransport.h"
class nsFingerChannel
: public nsIChannel,
public nsIStreamListener {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIREQUESTOBSERVER
// nsFingerChannel methods:
nsFingerChannel();
virtual ~nsFingerChannel();
// Define a Create method to be used with a factory:
static NS_METHOD
Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
nsresult Init(nsIURI* uri);
protected:
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI;
nsCOMPtr<nsIURI> mUrl;
nsCOMPtr<nsIStreamListener> mListener;
PRUint32 mLoadFlags;
nsCOMPtr<nsILoadGroup> mLoadGroup;
nsCString mContentType;
PRInt32 mContentLength;
nsCOMPtr<nsISupports> mOwner;
PRUint32 mBufferSegmentSize;
PRUint32 mBufferMaxSize;
PRBool mActAsObserver;
PRInt32 mPort;
nsCString mHost;
nsCString mUser;
nsXPIDLCString mRequest;
nsCOMPtr<nsISupports> mResponseContext;
nsCOMPtr<nsITransport> mTransport;
nsCOMPtr<nsIRequest> mTransportRequest;
nsresult mStatus;
protected:
nsresult SendRequest(nsITransport* aTransport);
};
#endif /* nsFingerChannel_h___ */

View File

@@ -0,0 +1,117 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Brian Ryner.
* Portions created by Brian Ryner are Copyright (C) 2000 Brian Ryner.
* All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@uiuc.edu>
*/
#include "nspr.h"
#include "nsFingerChannel.h"
#include "nsFingerHandler.h"
#include "nsIURL.h"
#include "nsCRT.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIInterfaceRequestor.h"
#include "nsIProgressEventSink.h"
#include "nsNetCID.h"
static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
////////////////////////////////////////////////////////////////////////////////
nsFingerHandler::nsFingerHandler() {
NS_INIT_REFCNT();
}
nsFingerHandler::~nsFingerHandler() {
}
NS_IMPL_ISUPPORTS1(nsFingerHandler, nsIProtocolHandler)
NS_METHOD
nsFingerHandler::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult) {
nsFingerHandler* ph = new nsFingerHandler();
if (ph == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(ph);
nsresult rv = ph->QueryInterface(aIID, aResult);
NS_RELEASE(ph);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIProtocolHandler methods:
NS_IMETHODIMP
nsFingerHandler::GetScheme(char* *result) {
*result = nsCRT::strdup("finger");
if (!*result) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsFingerHandler::GetDefaultPort(PRInt32 *result) {
*result = FINGER_PORT;
return NS_OK;
}
NS_IMETHODIMP
nsFingerHandler::NewURI(const char *aSpec, nsIURI *aBaseURI,
nsIURI **result) {
nsresult rv;
// no concept of a relative finger url
NS_ASSERTION(!aBaseURI, "base url passed into finger protocol handler");
nsIURI* url;
rv = nsComponentManager::CreateInstance(kSimpleURICID, nsnull,
NS_GET_IID(nsIURI),
(void**)&url);
if (NS_FAILED(rv)) return rv;
rv = url->SetSpec((char*)aSpec);
if (NS_FAILED(rv)) {
NS_RELEASE(url);
return rv;
}
*result = url;
return rv;
}
NS_IMETHODIMP
nsFingerHandler::NewChannel(nsIURI* url, nsIChannel* *result)
{
nsresult rv;
nsFingerChannel* channel;
rv = nsFingerChannel::Create(nsnull, NS_GET_IID(nsIChannel), (void**)&channel);
if (NS_FAILED(rv)) return rv;
rv = channel->Init(url);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
*result = channel;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,52 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Brian Ryner.
* Portions created by Brian Ryner are Copyright (C) 2000 Brian Ryner.
* All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@uiuc.edu>
*/
// The finger protocol handler creates "finger" URIs of the form
// "finger:user@host" or "finger:host".
#ifndef nsFingerHandler_h___
#define nsFingerHandler_h___
#include "nsIProtocolHandler.h"
#define FINGER_PORT 79
// {0x76d6d5d8-1dd2-11b2-b361-850ddf15ef07}
#define NS_FINGERHANDLER_CID \
{ 0x76d6d5d8, 0x1dd2, 0x11b2, \
{0xb3, 0x61, 0x85, 0x0d, 0xdf, 0x15, 0xef, 0x07} }
class nsFingerHandler : public nsIProtocolHandler
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
// nsFingerHandler methods:
nsFingerHandler();
virtual ~nsFingerHandler();
// Define a Create method to be used with a factory:
static NS_METHOD Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
};
#endif /* nsFingerHandler_h___ */

View File

@@ -0,0 +1,34 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Brian Ryner.
* Portions created by Brian Ryner are Copyright (C) 2000 Brian Ryner.
* All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@uiuc.edu>
*/
#include "nsIGenericFactory.h"
#include "nsFingerHandler.h"
static nsModuleComponentInfo gResComponents[] = {
{ "The Finger Protocol Handler",
NS_FINGERHANDLER_CID,
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "finger",
nsFingerHandler::Create
}
};
NS_IMPL_NSGETMODULE(finger, gResComponents)

View File

@@ -0,0 +1,180 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsISupports.idl"
interface nsIDOMDocument;
interface nsIDOMEventListener;
interface nsIHttpChannel;
[scriptable, uuid(b7215e70-4157-11d4-9a42-000064657374)]
interface nsIXMLHttpRequest : nsISupports {
/**
* Meant to be a script-only mechanism for setting a load event listener.
* The attribute is expected to be JavaScript function object. When
* the load event occurs, the function is invoked.
* This attribute should not be used from native code!!
*/
attribute nsISupports onload;
/**
* Meant to be a script-only mechanism for setting an error event listener.
* The attribute is expected to be JavaScript function object. When
* the error event occurs, the function is invoked.
* This attribute should not be used from native code!!
*/
attribute nsISupports onerror;
/**
* The HTTP request uses an HTTP channel in order to perform the
* request. This attribute represents the HTTP channel used
* for the request. NULL if the HTTP channel has not yet been
* created.
*/
readonly attribute nsIHttpChannel channel;
/**
* The response to the HTTP request is parsed as if it were a
* text/xml stream. This attributes represents the response as
* a DOM Document object. NULL if the request is unsuccessful or
* has not yet been sent.
*/
readonly attribute nsIDOMDocument responseXML;
/**
* The response to the HTTP request as text.
* NULL if the request is unsuccessful or
* has not yet been sent.
*/
readonly attribute wstring responseText;
/**
* The status of the response to the HTTP request.
*/
readonly attribute unsigned long status;
/**
* The string representing the status of the response to the
* HTTP request.
*/
readonly attribute string statusText;
/**
* If the HTTP request has been sent already, this method will
* abort the request.
*/
void abort();
/**
* Returns all of the HTTP response headers as a string string.
*
* @returns A string containing all of the response headers.
* NULL if the response has not yet been received.
*/
string getAllResponseHeaders();
/**
* Returns the text of the header with the specified name.
*
* @param header The name of the header to retrieve
* @returns A string containing the text of the header specified.
* NULL if the response has not yet been received or the
* header does not exist in the response.
*/
string getResponseHeader(in string header);
/**
* Native (non-script) method to initialize a request. Note that
* the HTTP request is not sent until the <code>send</code> method
* is invoked.
*
* @param method The HTTP method - either "POST" or "GET".
* @param url The URL to which to send the request.
* @param async Whether the request is synchronous or asynchronous
* i.e. whether send returns only after the response
* is received or if it returns immediately after
* sending the request. In the latter case, notification
* of completion is sent through the event listeners.
* @param user A username for authentication if necessary.
* @param password A password for authentication if necessary.
*/
[noscript] void openRequest(in string method,
in string url,
in boolean async,
in string user,
in string password);
/**
* Meant to be a script-only method for initializing a request.
* The parameters are similar to the ones detailed in the
* description of <code>openRequest</code>, but the last
* 3 are optional.
*
* @param method The HTTP method - either "POST" or "GET".
* @param url The URL to which to send the request.
* @param async (optional) Whether the request is synchronous or
* asynchronous i.e. whether send returns only after
* the response is received or if it returns immediately after
* sending the request. In the latter case, notification
* of completion is sent through the event listeners.
* The default value is true.
* @param user (optional) A username for authentication if necessary.
* The default value is the empty string
* @param password (optional) A password for authentication if necessary.
* The default value is the empty string
*/
void open(in string method, in string url);
/**
* Sends the HTTP request. If the request is asynchronous, returns
* immediately after sending the request. If it is synchronous
* returns only after the response has been received.
*
* @param body Either an instance of nsIDOMDocument, nsIInputStream
* or a string (nsISupportsWString in the native calling
* case). This is used to populate the body of the
* HTTP request if the HTTP request method is "POST".
* If the parameter is a nsIDOMDocument, it is serialized.
* If the parameter is a nsIInputStream, it is expected
* to contain the ContentType: and ContentLength: headers
* and trailing carriage-return/line-feed pairs.
*/
void send(in nsISupports body);
/**
* Sets a HTTP request header.
*
* @param header The name of the header to set in the request.
* @param value The body of the header.
*/
void setRequestHeader(in string header, in string value);
};
%{ C++
#define NS_XMLHTTPREQUEST_CID \
{ /* d164e770-4157-11d4-9a42-000064657374 */ \
0xd164e770, 0x4157, 0x11d4, \
{0x9a, 0x42, 0x00, 0x00, 0x64, 0x65, 0x73, 0x74} }
#define NS_XMLHTTPREQUEST_CONTRACTID \
"@mozilla.org/xmlextras/xmlhttprequest;1"
%}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,244 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef nsXMLHttpRequest_h__
#define nsXMLHttpRequest_h__
#define IMPLEMENT_SYNC_LOAD
#include "nsIXMLHttpRequest.h"
#include "nsISupportsUtils.h"
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsIDOMLoadListener.h"
#include "nsIDOMEventTarget.h"
#include "nsIDOMDocument.h"
#include "nsISecurityCheckedComponent.h"
#include "nsIURI.h"
#include "nsIHttpChannel.h"
#include "nsIDocument.h"
#include "nsIStreamListener.h"
#ifdef IMPLEMENT_SYNC_LOAD
#include "nsIWebBrowserChrome.h"
#endif
#include "nsWeakReference.h"
#include "nsISupportsArray.h"
#include "jsapi.h"
enum {
XML_HTTP_REQUEST_INITIALIZED,
XML_HTTP_REQUEST_OPENED,
XML_HTTP_REQUEST_SENT,
XML_HTTP_REQUEST_COMPLETED,
XML_HTTP_REQUEST_ABORTED
};
class nsXMLHttpRequest : public nsIXMLHttpRequest,
public nsIDOMLoadListener,
public nsIDOMEventTarget,
public nsISecurityCheckedComponent,
public nsIStreamListener,
public nsSupportsWeakReference
{
public:
nsXMLHttpRequest();
virtual ~nsXMLHttpRequest();
NS_DECL_ISUPPORTS
// nsIXMLHttpRequest
NS_DECL_NSIXMLHTTPREQUEST
// nsIDOMEventTarget
NS_DECL_NSIDOMEVENTTARGET
// nsIDOMEventListener
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
// nsIDOMLoadListener
NS_IMETHOD Load(nsIDOMEvent* aEvent);
NS_IMETHOD Unload(nsIDOMEvent* aEvent);
NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent);
// nsISecurityCheckedComponent
NS_DECL_NSISECURITYCHECKEDCOMPONENT
// nsIStreamListener
NS_DECL_NSISTREAMLISTENER
// nsIRequestObserver
NS_DECL_NSIREQUESTOBSERVER
protected:
nsresult MakeScriptEventListener(nsISupports* aObject,
nsIDOMEventListener** aListener);
void GetScriptEventListener(nsISupportsArray* aList,
nsIDOMEventListener** aListener);
PRBool StuffReturnValue(nsIDOMEventListener* aListener);
nsresult GetStreamForWString(const PRUnichar* aStr,
PRInt32 aLength,
nsIInputStream** aStream);
nsCOMPtr<nsISupports> mContext;
nsCOMPtr<nsIHttpChannel> mChannel;
nsCOMPtr<nsIRequest> mReadRequest;
nsCOMPtr<nsIDOMDocument> mDocument;
nsCOMPtr<nsIURI> mBaseURI;
nsCOMPtr<nsIDocument> mBaseDocument;
#ifdef IMPLEMENT_SYNC_LOAD
nsCOMPtr<nsIWebBrowserChrome> mChromeWindow;
#endif
nsCOMPtr<nsISupportsArray> mLoadEventListeners;
nsCOMPtr<nsISupportsArray> mErrorEventListeners;
nsresult DetectCharset(nsAWritableString& aCharset);
nsresult ConvertBodyToText(PRUnichar **aOutBuffer);
static NS_METHOD StreamReaderFunc(nsIInputStream* in,
void* closure,
const char* fromRawSegment,
PRUint32 toOffset,
PRUint32 count,
PRUint32 *writeCount);
// used to implement getAllResponseHeaders()
class nsHeaderVisitor : public nsIHttpHeaderVisitor {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIHTTPHEADERVISITOR
nsHeaderVisitor() { NS_INIT_ISUPPORTS(); }
virtual ~nsHeaderVisitor() {}
const nsACString &Headers() { return mHeaders; }
private:
nsCString mHeaders;
};
#if 1 // When nsCString::Append()/Length() works for strings that contain nulls, remove this buffer impl
class ResponseBodyBuffer {
public:
ResponseBodyBuffer()
: mBuffer(0),
mBufferSize(0),
mBufferFreeIndex(0),
mCanBeString(PR_FALSE),
mBufferChecked(PR_FALSE) {}
~ResponseBodyBuffer() { nsMemory::Free(mBuffer); }
void Truncate(void) {
nsMemory::Free(mBuffer);
mBuffer=nsnull;
mBufferSize=mBufferFreeIndex=0;
mCanBeString = PR_FALSE;
mBufferChecked = PR_FALSE;
}
nsresult Append(const char* aBuffer, PRUint32 aBufferLen) {
if (aBufferLen > (mBufferSize-mBufferFreeIndex)) {
PRUint32 newBufferSize = (mBufferSize > aBufferLen ? mBufferSize : aBufferLen)<<1;
char * newBuffer = NS_STATIC_CAST(char*,nsMemory::Realloc(mBuffer,newBufferSize));
if (!newBuffer) {
nsMemory::Free(mBuffer);
mBuffer = nsnull;
mBufferChecked = PR_FALSE;
mCanBeString = PR_FALSE;
return NS_ERROR_OUT_OF_MEMORY;
}
mBuffer = newBuffer;
mBufferSize = newBufferSize;
}
memcpy(&mBuffer[mBufferFreeIndex],aBuffer,aBufferLen);
mBufferFreeIndex += aBufferLen;
mBufferChecked = PR_FALSE;
mCanBeString = PR_FALSE;
return NS_OK;
}
const char * GetBuffer(void) { return mBuffer; }
PRUint32 GetBufferLength(void) { return mBufferFreeIndex; }
PRBool CanBeString(void) {
if (!mBufferFreeIndex)
return PR_TRUE; // Perhaps this is a bit questionable...
if (!mBufferChecked) {
mBufferChecked = PR_TRUE;
mCanBeString = PR_TRUE;
PRUint32 i;
for (i = 0; i < mBufferFreeIndex; i++) {
if (!mBuffer[i]) {
mCanBeString = PR_FALSE;
break;
}
}
}
return mCanBeString;
}
private:
char *mBuffer;
PRUint32 mBufferSize;
PRUint32 mBufferFreeIndex;
PRPackedBool mCanBeString;
PRPackedBool mBufferChecked;
};
ResponseBodyBuffer mResponseBody;
#else
nsCString mResponseBody;
#endif
nsCOMPtr<nsIStreamListener> mXMLParserStreamListener;
PRInt32 mStatus;
PRBool mAsync;
};
#define NS_IPRIVATEJSEVENTLISTENER_IID \
{ /* d47a6550-4327-11d4-9a45-000064657374 */ \
0xd47a6550, 0x4327, 0x11d4, \
{0x9a, 0x45, 0x00, 0x00, 0x64, 0x65, 0x73, 0x74} }
class nsIPrivateJSEventListener : public nsISupports {
public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IPRIVATEJSEVENTLISTENER_IID)
NS_IMETHOD GetFunctionObj(JSObject** aObj) = 0;
};
class nsXMLHttpRequestScriptListener : public nsIDOMEventListener,
public nsIPrivateJSEventListener
{
public:
nsXMLHttpRequestScriptListener(JSObject* aScopeObj, JSObject* aFunctionObj);
virtual ~nsXMLHttpRequestScriptListener();
NS_DECL_ISUPPORTS
// nsIDOMEventListener
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
// nsIPrivateJSEventListener
NS_IMETHOD GetFunctionObj(JSObject** aObj);
protected:
JSObject* mScopeObj;
JSObject* mFunctionObj;
};
#endif

View File

@@ -0,0 +1,907 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "libimg.h"
#include "nsImageNet.h"
#include "ilINetContext.h"
#include "ilIURL.h"
#include "ilINetReader.h"
#include "ilErrors.h"
#include "nsIStreamListener.h"
#include "nsIInputStream.h"
#include "nsIURL.h"
#include "nsILoadGroup.h"
#include "nsIChannel.h"
#include "nsCOMPtr.h"
#include "nsWeakPtr.h"
#include "prprf.h"
#include "nsITimer.h"
#include "nsVoidArray.h"
#include "nsString.h"
#include "prmem.h"
#include "plstr.h"
#include "nsNetUtil.h"
#include "nsCURILoader.h"
#include "nsIURIContentListener.h"
#include "nsIHttpChannel.h"
#include "nsIStreamConverterService.h"
#include "nsIPref.h"
static NS_DEFINE_CID(kStreamConvServiceCID, NS_STREAMCONVERTERSERVICE_CID);
static NS_DEFINE_IID(kIURLIID, NS_IURL_IID);
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
PRLogModuleInfo *image_net_context_async_log_module = NULL;
#define IMAGE_BUF_SIZE 4096
class ImageConsumer;
class ImageNetContextImpl : public ilINetContext {
public:
ImageNetContextImpl(ImgCachePolicy aReloadPolicy,
nsISupports * aLoadContext,
nsReconnectCB aReconnectCallback,
void* aReconnectArg);
virtual ~ImageNetContextImpl();
NS_DECL_ISUPPORTS
virtual ilINetContext* Clone();
virtual ImgCachePolicy GetReloadPolicy();
virtual ImgCachePolicy SetReloadPolicy(ImgCachePolicy ReloadPolicy);
virtual void AddReferer(ilIURL *aUrl);
virtual void Interrupt();
virtual ilIURL* CreateURL(const char *aUrl,
ImgCachePolicy aReloadMethod);
virtual PRBool IsLocalFileURL(char *aAddress);
#ifdef NU_CACHE
virtual PRBool IsURLInCache(ilIURL *aUrl);
#else /* NU_CACHE */
virtual PRBool IsURLInMemCache(ilIURL *aUrl);
virtual PRBool IsURLInDiskCache(ilIURL *aUrl);
#endif
virtual int GetURL (ilIURL * aUrl, ImgCachePolicy aLoadMethod,
ilINetReader *aReader, PRBool IsAnimationLoop);
virtual int GetContentLength(ilIURL * aURL);
nsresult RemoveRequest(ImageConsumer *aConsumer);
nsresult RequestDone(ImageConsumer *aConsumer, nsIRequest* request,
nsISupports* ctxt, nsresult status, const PRUnichar* aMsg);
nsVoidArray *mRequests; // WEAK references to |ImageConsumer|s
ImgCachePolicy mReloadPolicy;
nsWeakPtr mLoadContext;
nsReconnectCB mReconnectCallback;
void* mReconnectArg;
};
class ImageConsumer : public nsIStreamListener, public nsIURIContentListener, public nsIInterfaceRequestor
{
public:
NS_DECL_ISUPPORTS
ImageConsumer(ilIURL *aURL, ImageNetContextImpl *aContext);
// nsIRequestObserver methods:
NS_DECL_NSIREQUESTOBSERVER
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIURICONTENTLISTENER
NS_DECL_NSIINTERFACEREQUESTOR
void SetKeepPumpingData(nsIRequest* request, nsISupports* context) {
NS_ADDREF(request);
NS_IF_RELEASE(mRequest);
mRequest = request;
NS_IF_ADDREF(context);
NS_IF_RELEASE(mUserContext);
mUserContext = context;
}
void Interrupt();
static void KeepPumpingStream(nsITimer *aTimer, void *aClosure);
protected:
virtual ~ImageConsumer();
ilIURL *mURL;
PRBool mInterrupted;
ImageNetContextImpl *mContext;
nsIInputStream *mStream;
nsCOMPtr<nsITimer> mTimer;
PRBool mFirstRead;
char *mBuffer;
PRInt32 mStatus;
nsIRequest* mRequest;
nsISupports* mUserContext;
PRBool mIsMulti;
};
ImageConsumer::ImageConsumer(ilIURL *aURL, ImageNetContextImpl *aContext)
{
NS_INIT_REFCNT();
mURL = aURL;
NS_ADDREF(mURL);
mContext = aContext;
NS_ADDREF(mContext);
mInterrupted = PR_FALSE;
mFirstRead = PR_TRUE;
mStream = nsnull;
mBuffer = nsnull;
mStatus = 0;
mRequest = nsnull;
mUserContext = nsnull;
mIsMulti = PR_FALSE;
}
NS_IMPL_THREADSAFE_ADDREF(ImageConsumer)
NS_IMPL_THREADSAFE_RELEASE(ImageConsumer)
NS_INTERFACE_MAP_BEGIN(ImageConsumer)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURIContentListener)
NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
NS_INTERFACE_MAP_ENTRY(nsIURIContentListener)
NS_INTERFACE_MAP_END
NS_IMETHODIMP ImageConsumer::GetInterface(const nsIID & aIID, void * *aInstancePtr)
{
NS_ENSURE_ARG_POINTER(aInstancePtr);
return QueryInterface(aIID, aInstancePtr);
}
// nsIURIContentListener support
NS_IMETHODIMP
ImageConsumer::OnStartURIOpen(nsIURI* aURI,
const char* aWindowTarget, PRBool* aAbortOpen)
{
return NS_OK;
}
NS_IMETHODIMP
ImageConsumer::GetProtocolHandler(nsIURI *aURI, nsIProtocolHandler **aProtocolHandler)
{
*aProtocolHandler = nsnull;
return NS_OK;
}
NS_IMETHODIMP
ImageConsumer::GetParentContentListener(nsIURIContentListener** aParent)
{
*aParent = nsnull;
return NS_OK;
}
NS_IMETHODIMP
ImageConsumer::SetParentContentListener(nsIURIContentListener* aParent)
{
return NS_OK;
}
NS_IMETHODIMP
ImageConsumer::GetLoadCookie(nsISupports ** aLoadCookie)
{
nsCOMPtr<nsISupports> loadContext = do_QueryReferent(mContext->mLoadContext);
*aLoadCookie = loadContext;
NS_IF_ADDREF(*aLoadCookie);
return NS_OK;
}
NS_IMETHODIMP
ImageConsumer::SetLoadCookie(nsISupports * aLoadCookie)
{
return NS_OK;
}
NS_IMETHODIMP
ImageConsumer::IsPreferred(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
char ** aDesiredContentType,
PRBool * aCanHandleContent)
{
return CanHandleContent(aContentType, aCommand, aWindowTarget,
aDesiredContentType, aCanHandleContent);
}
NS_IMETHODIMP
ImageConsumer::CanHandleContent(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
char ** aDesiredContentType,
PRBool * aCanHandleContent)
{
// if we had a webshell or doc shell around, we'd pass this call
// through to it...but we don't =(
if (!nsCRT::strcasecmp(aContentType, "message/rfc822"))
*aDesiredContentType = nsCRT::strdup("application/vnd.mozilla.xul+xml");
// since we explicilty loaded the url, we always want to handle it!
*aCanHandleContent = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP
ImageConsumer::DoContent(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
nsIRequest * aOpenedChannel,
nsIStreamListener ** aContentHandler,
PRBool * aAbortProcess)
{
nsresult rv = NS_OK;
if (aAbortProcess)
*aAbortProcess = PR_FALSE;
nsAutoString contentType; contentType.AssignWithConversion(aContentType);
if (contentType.EqualsWithConversion("multipart/x-mixed-replace")
|| contentType.EqualsWithConversion("multipart/mixed")) {
// if we're getting multipart data, we have to convert it.
// so wedge the converter inbetween us and the consumer.
mIsMulti= PR_TRUE;
nsCOMPtr<nsIStreamConverterService> convServ = do_GetService(kStreamConvServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsAutoString astrix; astrix.AssignWithConversion("*/*");
return convServ->AsyncConvertData(contentType.GetUnicode(),
astrix.GetUnicode(),
NS_STATIC_CAST(nsIStreamListener*, this),
nsnull /*a context?*/, aContentHandler);
}
QueryInterface(NS_GET_IID(nsIStreamListener), (void **) aContentHandler);
return rv;
}
NS_IMETHODIMP
ImageConsumer::OnStartRequest(nsIRequest* aRequest, nsISupports* aContext)
{
nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest);
PRUint32 httpStatus;
if (mInterrupted) {
mStatus = MK_INTERRUPTED;
return NS_ERROR_ABORT;
}
mBuffer = (char *)PR_MALLOC(IMAGE_BUF_SIZE);
if (mBuffer == nsnull) {
mStatus = MK_IMAGE_LOSSAGE;
return NS_ERROR_ABORT;
}
nsCOMPtr<nsIHttpChannel> pHTTPCon(do_QueryInterface(channel));
if (pHTTPCon) {
pHTTPCon->GetResponseStatus(&httpStatus);
if (httpStatus == 404) {
mStatus = MK_IMAGE_LOSSAGE;
return NS_ERROR_ABORT;
}
}
ilINetReader *reader = mURL->GetReader(); //ptn test: nsCOMPtr??
/*nsresult err=*/ reader->FlushImgBuffer(); //flush current data in buffer before starting
nsresult rv = NS_OK;
char* aContentType = NULL;
rv = channel->GetContentType(&aContentType); //nsCRT alloc's str
if (NS_FAILED(rv)) {
if(aContentType){
nsCRT::free(aContentType);
}
aContentType = nsCRT::strdup("unknown");
}
if(nsCRT::strlen(aContentType) > 50){
//somethings wrong. mimetype string shouldn't be this big.
//protect us from the user.
nsCRT::free(aContentType);
aContentType = nsCRT::strdup("unknown");
}
if (reader->StreamCreated(mURL, aContentType) != PR_TRUE) {
mStatus = MK_IMAGE_LOSSAGE;
reader->StreamAbort(mStatus);
NS_RELEASE(reader);
nsCRT::free(aContentType);
return NS_ERROR_ABORT;
}
nsCRT::free(aContentType);
NS_RELEASE(reader);
return NS_OK;
}
#define IMAGE_BUF_SIZE 4096
NS_IMETHODIMP
ImageConsumer::OnDataAvailable(nsIRequest* request, nsISupports* aContext,
nsIInputStream *pIStream, PRUint32 offset, PRUint32 length)
{
PRUint32 max_read=0;
PRUint32 bytes_read = 0;
ilINetReader *reader = mURL->GetReader();
nsCOMPtr<nsIChannel> channel = do_QueryInterface(request);
if (mInterrupted || mStatus != 0) {
mStatus = MK_INTERRUPTED;
reader->StreamAbort(mStatus);
NS_RELEASE(reader);
return NS_ERROR_ABORT;
}
nsresult err = 0;
PRUint32 nb = 0;
char* uriStr = NULL;
nsCOMPtr<nsIURI> uri;
err = channel->GetURI(getter_AddRefs(uri));
if (NS_SUCCEEDED(err) && uri) {
err = uri->GetSpec(&uriStr);
if (NS_FAILED(err)){
/* if we can't get a file spec, it is bad, very bad.*/
mStatus = MK_INTERRUPTED;
reader->StreamAbort(mStatus);
NS_RELEASE(reader);
return NS_ERROR_ABORT;
}
}
do {
err = reader->WriteReady(&max_read); //max read is most decoder can handle
if(NS_FAILED(err)) //note length tells how much we already have.
break;
if(max_read < 0){
max_read = 128;
}
if (max_read > (length - bytes_read)) {
max_read = length - bytes_read;
}
if (max_read > IMAGE_BUF_SIZE) {
max_read = IMAGE_BUF_SIZE;
}
// make sure there's enough data available to decode the image.
// put test into WriteReady
if (mFirstRead && length < 4)
break;
err = pIStream->Read(mBuffer,
max_read, &nb);
if (err == NS_BASE_STREAM_WOULD_BLOCK) {
NS_ASSERTION(nb == 0, "Data will be lost.");
err = NS_OK;
break;
}
if (NS_FAILED(err) || nb == 0) {
NS_ASSERTION(nb == 0, "Data will be lost.");
break;
}
bytes_read += nb;
if (mFirstRead == PR_TRUE) {
err = reader->FirstWrite((const unsigned char *)mBuffer, nb, uriStr);
mFirstRead = PR_FALSE; //? move after err chk?
/*
* If FirstWrite(...) fails then the image type
* cannot be determined and the il_container
* stream functions have not been initialized!
*/
if (NS_FAILED(err)) {
mStatus = MK_IMAGE_LOSSAGE;
mInterrupted = PR_TRUE;
if(uriStr)
nsCRT::free(uriStr);
NS_RELEASE(reader);
return NS_ERROR_ABORT;
}
}
err = reader->Write((const unsigned char *)mBuffer, (int32)nb);
if(NS_FAILED(err)){
mStatus = MK_IMAGE_LOSSAGE;
mInterrupted = PR_TRUE;
if(uriStr)
nsCRT::free(uriStr);
NS_RELEASE(reader);
return NS_ERROR_ABORT;
}
} while(bytes_read < length);
if (uriStr) {
nsCRT::free(uriStr);
}
if (NS_FAILED(err)) {
mStatus = MK_IMAGE_LOSSAGE;
mInterrupted = PR_TRUE;
}
if (bytes_read < length) {
// If we haven't emptied the stream, hold onto it, because
// we will need to read from it subsequently and we don't
// know if we'll get a OnDataAvailable call again.
//
// Addref the new stream before releasing the old one,
// in case it is the same stream!
NS_ADDREF(pIStream);
NS_IF_RELEASE(mStream);
mStream = pIStream;
} else {
NS_IF_RELEASE(mStream);
}
NS_RELEASE(reader);
return NS_OK;
}
void
ImageConsumer::KeepPumpingStream(nsITimer *aTimer, void *aClosure)
{
ImageConsumer *consumer = (ImageConsumer *)aClosure;
consumer->OnStopRequest(consumer->mRequest, consumer->mUserContext,
NS_BINDING_SUCCEEDED);
}
NS_IMETHODIMP
ImageConsumer::OnStopRequest(nsIRequest* request, nsISupports* aContext, nsresult status)
{
if (mTimer) {
mTimer->Cancel();
mTimer = nsnull;
}
if (NS_BINDING_SUCCEEDED != status) {
mStatus = MK_INTERRUPTED;
}
// Since we're still holding on to the stream, there's still data
// that needs to be read. So, pump the stream ourselves.
if((mStream != nsnull) && (status == NS_BINDING_SUCCEEDED)) {
PRUint32 str_length;
nsresult err = mStream->Available(&str_length);
if (NS_SUCCEEDED(err)) {
NS_ASSERTION((str_length > 0), "No data left in the stream!");
err = OnDataAvailable(request, aContext, mStream, 0, str_length); // XXX fix offset
if (NS_SUCCEEDED(err)) {
// If we still have the stream, there's still data to be
// pumped, so we set a timer to call us back again.
if (mStream) {
SetKeepPumpingData(request, aContext);
nsresult rv;
mTimer = do_CreateInstance("@mozilla.org/timer;1", &rv);
if (NS_FAILED(rv) ||
(NS_OK != mTimer->Init(ImageConsumer::KeepPumpingStream, this, 0))) {
mStatus = MK_IMAGE_LOSSAGE;
NS_RELEASE(mStream);
}
else {
return NS_OK;
}
}
}
else {
mStatus = MK_IMAGE_LOSSAGE;
NS_IF_RELEASE(mStream);
}
}
else {
mStatus = MK_IMAGE_LOSSAGE;
NS_IF_RELEASE(mStream);
}
}
ilINetReader *reader = mURL->GetReader();
if (0 != mStatus) {
reader->StreamAbort(mStatus);
}
else {
reader->StreamComplete(mIsMulti);
}
if(mIsMulti)
mFirstRead = PR_TRUE; //reset to read new frame
reader->NetRequestDone(mURL, mStatus);
NS_RELEASE(reader);
return mContext->RequestDone(this, request, aContext, status, nsnull);
}
void
ImageConsumer::Interrupt()
{
mInterrupted = PR_TRUE;
}
ImageConsumer::~ImageConsumer()
{
if (mTimer) {
mTimer->Cancel();
mTimer = nsnull;
}
if (mContext) {
nsresult res = mContext->RemoveRequest(this);
if (NS_SUCCEEDED(res)) {
// The load was canceled.
mStatus = MK_INTERRUPTED;
if (mURL) {
nsCOMPtr<ilINetReader> reader( dont_AddRef( mURL->GetReader() ) );
reader->StreamAbort(mStatus);
reader->NetRequestDone(mURL, mStatus);
}
}
NS_RELEASE(mContext);
}
NS_IF_RELEASE(mURL);
NS_IF_RELEASE(mStream);
if (mBuffer != nsnull) {
PR_DELETE(mBuffer);
}
NS_IF_RELEASE(mRequest);
NS_IF_RELEASE(mUserContext);
}
ImageNetContextImpl::ImageNetContextImpl(ImgCachePolicy aReloadPolicy,
nsISupports * aLoadContext,
nsReconnectCB aReconnectCallback,
void* aReconnectArg)
{
NS_INIT_REFCNT();
mRequests = nsnull;
mLoadContext = getter_AddRefs(NS_GetWeakReference(aLoadContext));
mReloadPolicy = aReloadPolicy;
mReconnectCallback = aReconnectCallback;
mReconnectArg = aReconnectArg;
}
ImageNetContextImpl::~ImageNetContextImpl()
{
delete mRequests;
}
NS_IMPL_THREADSAFE_ISUPPORTS1(ImageNetContextImpl, ilINetContext)
ilINetContext*
ImageNetContextImpl::Clone()
{
ilINetContext *cx;
nsCOMPtr<nsISupports> loadContext = do_QueryReferent(mLoadContext);
//mReconnectArg is ImageGroup. If GetURL is triggered
//by timer for animation, ImageGroup may have been unloaded
//before timer kicks off.
//mReconnectCallback=nsnull; mReconnectArg=nsnull;
if (NS_NewImageNetContext(&cx, loadContext, mReconnectCallback, mReconnectArg) == NS_OK)
{
return cx;
}
else {
return nsnull;
}
}
ImgCachePolicy
ImageNetContextImpl::GetReloadPolicy()
{
return mReloadPolicy;
}
ImgCachePolicy
ImageNetContextImpl::SetReloadPolicy(ImgCachePolicy reloadpolicy)
{
mReloadPolicy=reloadpolicy;
return mReloadPolicy;
}
void
ImageNetContextImpl::AddReferer(ilIURL *aUrl)
{
}
void
ImageNetContextImpl::Interrupt()
{
if (mRequests != nsnull) {
int i, count = mRequests->Count();
for (i=0; i < count; i++) {
ImageConsumer *ic = (ImageConsumer *)mRequests->ElementAt(i);
ic->Interrupt();
}
}
}
ilIURL*
ImageNetContextImpl::CreateURL(const char *aURL,
ImgCachePolicy aReloadMethod)
{
ilIURL *url;
nsCOMPtr<nsISupports> loadContext (do_QueryReferent(mLoadContext));
nsCOMPtr<nsILoadGroup> group (do_GetInterface(loadContext));
if (NS_NewImageURL(&url, aURL, group) == NS_OK)
{
return url;
}
else {
return nsnull;
}
}
PRBool
ImageNetContextImpl::IsLocalFileURL(char *aAddress)
{
if (PL_strncasecmp(aAddress, "file:", 5) == 0) {
return PR_TRUE;
}
else {
return PR_FALSE;
}
}
#ifdef NU_CACHE
PRBool
ImageNetContextImpl::IsURLInCache(ilIURL *aUrl)
{
return PR_TRUE;
}
#else /* NU_CACHE */
PRBool
ImageNetContextImpl::IsURLInMemCache(ilIURL *aUrl)
{
return PR_FALSE;
}
PRBool
ImageNetContextImpl::IsURLInDiskCache(ilIURL *aUrl)
{
return PR_TRUE;
}
#endif /* NU_CACHE */
int
ImageNetContextImpl::GetContentLength (ilIURL * aURL)
{
return -1;
}
int
ImageNetContextImpl::GetURL (ilIURL * aURL,
ImgCachePolicy aLoadMethod,
ilINetReader *aReader,
PRBool IsAnimationLoop)
{
NS_PRECONDITION(nsnull != aURL, "null URL");
NS_PRECONDITION(nsnull != aReader, "null reader");
if (aURL == nsnull || aReader == nsnull) {
return -1;
}
if (mRequests == nsnull) {
mRequests = new nsVoidArray();
if (mRequests == nsnull) {
// XXX Should still call exit function
return -1;
}
}
int ret;
nsresult rv;
nsCOMPtr<nsIURI> nsurl = do_QueryInterface(aURL, &rv);
if (NS_FAILED(rv)) return 0;
aURL->SetReader(aReader);
SetReloadPolicy(aLoadMethod);
// Find previously created ImageConsumer if possible
ImageConsumer *ic = new ImageConsumer(aURL, this);
if (ic == nsnull)
return -1;
NS_ADDREF(ic);
// See if a reconnect is being done...(XXX: hack!)
if (mReconnectCallback == nsnull
|| !(*mReconnectCallback)(mReconnectArg, ic)) {
// first, create a channel for the protocol....
nsCOMPtr<nsIChannel> channel;
nsCOMPtr<nsISupports> loadContext (do_QueryReferent(mLoadContext));
nsCOMPtr<nsILoadGroup> group (do_GetInterface(loadContext));
nsCOMPtr<nsIInterfaceRequestor> sink(do_QueryInterface(loadContext));
nsLoadFlags flags=0;
if(IsAnimationLoop)
flags |= nsIRequest::LOAD_FROM_CACHE;
rv = NS_OpenURI(getter_AddRefs(channel), nsurl, nsnull, group, sink, flags);
if (NS_FAILED(rv)) goto error;
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel);
if (httpChannel)
{
// Get the defloadRequest from the loadgroup-
nsCOMPtr<nsIRequest> defLoadRequest;
if (NS_SUCCEEDED(group->GetDefaultLoadRequest(
getter_AddRefs(defLoadRequest))) && defLoadRequest)
{
nsCOMPtr<nsIChannel> reqchannel = do_QueryInterface(defLoadRequest);
// Get the referrer from the loadchannel-
nsCOMPtr<nsIURI> referrer;
if (NS_SUCCEEDED(reqchannel->GetURI(getter_AddRefs(referrer))))
{
// Set the referrer-
httpChannel->SetReferrer(referrer, nsIHttpChannel::REFERRER_INLINES);
}
}
}
rv = channel->GetLoadFlags(&flags);
if (NS_FAILED(rv)) goto error;
if (aURL->GetBackgroundLoad())
flags |= nsIRequest::LOAD_BACKGROUND;
(void)channel->SetLoadFlags(flags);
nsCOMPtr<nsISupports> window (do_QueryInterface(NS_STATIC_CAST(nsIStreamListener *, ic)));
// let's try uri dispatching...
nsCOMPtr<nsIURILoader> pURILoader (do_GetService(NS_URI_LOADER_CONTRACTID, &rv));
if (NS_SUCCEEDED(rv))
{
nsURILoadCommand loadCmd = nsIURILoader::viewNormal;
PRBool bIsBackground = aURL->GetBackgroundLoad();
if (bIsBackground) {
loadCmd = nsIURILoader::viewNormalBackground;
}
rv = pURILoader->OpenURI(channel, loadCmd, nsnull /* window target */,
window);
}
// rv = channel->AsyncOpen(ic, nsnull);
if (NS_FAILED(rv)) goto error;
}
ret = mRequests->AppendElement((void *)ic) ? 0 : -1;
NS_RELEASE(ic); // if nothing else is holding onto it, it will remove
// itself from mRequests
return ret;
error:
NS_RELEASE(ic);
return -1;
}
nsresult
ImageNetContextImpl::RemoveRequest(ImageConsumer *aConsumer)
{
nsresult rv = NS_OK;
if (mRequests) {
rv = mRequests->RemoveElement((void *)aConsumer)?NS_OK:NS_ERROR_FAILURE;
}
return rv;
}
nsresult
ImageNetContextImpl::RequestDone(ImageConsumer *aConsumer, nsIRequest* request,
nsISupports* ctxt, nsresult status, const PRUnichar* aMsg)
{
RemoveRequest(aConsumer);
/// if (mLoadGroup)
/// return mLoadGroup->RemoveChannel(channel, ctxt, status, aMsg);
/// else
return NS_OK;
}
extern "C" NS_GFX_(nsresult)
NS_NewImageNetContext(ilINetContext **aInstancePtrResult,
nsISupports * aLoadContext,
nsReconnectCB aReconnectCallback,
void* aReconnectArg)
{
PRUint32 necko_attribs;
ImgCachePolicy imglib_attribs = USE_IMG_CACHE;
nsLoadFlags defchan_attribs = nsIRequest::LOAD_NORMAL;
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
if (nsnull == aInstancePtrResult) {
return NS_ERROR_NULL_POINTER;
}
if(aLoadContext){
nsCOMPtr<nsILoadGroup> group (do_GetInterface(aLoadContext));
/*nsresult rv = */group->GetLoadFlags(&necko_attribs);
/*
Need code to check freshness of necko cache.
*/
nsCOMPtr<nsIRequest> defLoadRequest;
nsCOMPtr<nsIChannel> channel;
if (NS_SUCCEEDED(group->GetDefaultLoadRequest(
getter_AddRefs(defLoadRequest))) && defLoadRequest)
{
channel = do_QueryInterface(defLoadRequest);
if (channel) channel->GetLoadFlags(&defchan_attribs);
}
#if defined( DEBUG )
if (image_net_context_async_log_module == NULL) {
image_net_context_async_log_module = PR_NewLogModule("IMAGENETCTXASYNC");
}
#endif
if((nsIRequest::VALIDATE_ALWAYS & defchan_attribs)||
(nsIRequest::INHIBIT_PERSISTENT_CACHING & defchan_attribs)||
(nsIRequest::LOAD_BYPASS_CACHE & defchan_attribs)) {
imglib_attribs = DONT_USE_IMG_CACHE;
#if defined( DEBUG )
PR_LOG(image_net_context_async_log_module, 1, ("ImageNetContextAsync: NS_NewImageNetContext: DONT_USE_IMAGE_CACHE\n"));
#endif
}
}
ilINetContext *cx = new ImageNetContextImpl( imglib_attribs,
aLoadContext,
aReconnectCallback,
aReconnectArg);
if (cx == nsnull) {
return NS_ERROR_OUT_OF_MEMORY;
}
return cx->QueryInterface(NS_GET_IID(ilINetContext), (void **) aInstancePtrResult);
}

View File

@@ -0,0 +1,106 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
//#define DONT_INFORM_WEBSHELL
#include "nsIServiceManager.h"
#include "nsIDocumentLoader.h"
#include "nsIWebShellServices.h"
#include "nsIContentViewerContainer.h"
#include "nsCURILoader.h"
#include "nsObserverBase.h"
#include "nsIParser.h"
#include "nsString.h"
#include "nsIDocShell.h"
#include "nsIHttpChannel.h"
#include "nsXPIDLString.h"
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kDocLoaderServiceCID, NS_DOCUMENTLOADER_SERVICE_CID);
static NS_DEFINE_IID(kIDocumentLoaderIID, NS_IDOCUMENTLOADER_IID);
static NS_DEFINE_IID(kIWebShellServicesIID, NS_IWEB_SHELL_SERVICES_IID);
//-------------------------------------------------------------------------
NS_IMETHODIMP nsObserverBase::NotifyWebShell(
nsISupports* aParserBundle, const char* charset, nsCharsetSource source)
{
nsresult rv = NS_OK;
nsCOMPtr<nsISupportsParserBundle> bundle=do_QueryInterface(aParserBundle);
if (bundle) {
nsresult res = NS_OK;
// XXX - Make sure not to reload POST data to prevent bugs such as 27006
nsAutoString theChannelKey;
theChannelKey.AssignWithConversion("channel");
nsCOMPtr<nsIChannel> channel=nsnull;
res=bundle->GetDataFromBundle(theChannelKey,getter_AddRefs(channel));
if(NS_SUCCEEDED(res)) {
nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(channel,&res));
if(NS_SUCCEEDED(res)) {
nsXPIDLCString method;
httpChannel->GetRequestMethod(getter_Copies(method));
if(method) {
if(!PL_strcasecmp(method, "POST"))
return NS_OK;
}
}
}
nsAutoString theDocShellKey;
theDocShellKey.AssignWithConversion("docshell"); // Key to find docshell from the bundle.
nsCOMPtr<nsIDocShell> docshell=nsnull;
res=bundle->GetDataFromBundle(theDocShellKey,getter_AddRefs(docshell));
if(NS_SUCCEEDED(res)) {
nsCOMPtr<nsIWebShellServices> wss=nsnull;
wss=do_QueryInterface(docshell,&res); // Query webshell service through docshell.
if(NS_SUCCEEDED(res)) {
#ifndef DONT_INFORM_WEBSHELL
// ask the webshellservice to load the URL
if(NS_FAILED( res = wss->SetRendering(PR_FALSE) ))
rv=res;
// XXX nisheeth, uncomment the following two line to see the reent problem
else if(NS_FAILED(res = wss->StopDocumentLoad())){
rv = wss->SetRendering(PR_TRUE); // turn on the rendering so at least we will see something.
}
else if(NS_FAILED(res = wss->ReloadDocument(charset, source))) {
rv = wss->SetRendering(PR_TRUE); // turn on the rendering so at least we will see something.
}
else
rv = NS_ERROR_HTMLPARSER_STOPPARSING; // We're reloading a new document...stop loading the current.
#endif
}
}
}
return rv;
}

27
mozilla/layout/build/gbdate.pl Executable file
View File

@@ -0,0 +1,27 @@
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
#
# XP way of doing the build date.
# 1998091509 = 1998, September, 15th, 9am local time zone
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
# localtime returns year minus 1900
$year = $year + 1900;
printf("#define PRODUCT_VERSION \"%04d%02d%02d\"\n", $year, 1+$mon, $mday);

View File

@@ -0,0 +1,90 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Alec Flett <alecf@netscape.com>
*/
#include "nsIServiceManager.h"
#include "nsICategoryManager.h"
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsXPIDLString.h"
#include "nsContentHTTPStartup.h"
#include "nsIHttpProtocolHandler.h"
#include "gbdate.h"
#define PRODUCT_NAME "Gecko"
NS_IMPL_ISUPPORTS1(nsContentHTTPStartup,nsIObserver)
nsresult
nsContentHTTPStartup::Observe( nsISupports *aSubject,
const PRUnichar *aTopic,
const PRUnichar *aData)
{
if (nsCRT::strcmp(aTopic, NS_HTTP_STARTUP_TOPIC) != 0)
return NS_OK;
nsresult rv = nsnull;
nsCOMPtr<nsIHttpProtocolHandler> http(do_QueryInterface(aSubject));
if (NS_FAILED(rv)) return rv;
rv = http->SetProduct(PRODUCT_NAME);
if (NS_FAILED(rv)) return rv;
rv = http->SetProductSub((char*) PRODUCT_VERSION);
if (NS_FAILED(rv)) return rv;
return NS_OK;
}
nsresult
nsContentHTTPStartup::RegisterHTTPStartup()
{
nsresult rv;
nsCOMPtr<nsICategoryManager>
catMan(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv));
if (NS_FAILED(rv)) return rv;
nsXPIDLCString previousEntry;
rv = catMan->AddCategoryEntry(NS_HTTP_STARTUP_CATEGORY,
"Content UserAgent Setter",
NS_CONTENTHTTPSTARTUP_CONTRACTID,
PR_TRUE, PR_TRUE,
getter_Copies(previousEntry));
return rv;
}
nsresult
nsContentHTTPStartup::UnregisterHTTPStartup()
{
nsresult rv;
nsCOMPtr<nsICategoryManager>
catMan(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv));
if (NS_FAILED(rv)) return rv;
return NS_OK;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,864 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Pierre Phaneuf <pp@ludusdesign.com>
*/
#include "msgCore.h" // for pre-compiled headers
#include "nsCOMPtr.h"
#include <stdio.h>
#include "nscore.h"
#include "nsIFactory.h"
#include "nsISupports.h"
#include "comi18n.h"
#include "prmem.h"
#include "plstr.h"
#include "nsIPref.h"
#include "nsRepository.h"
#include "nsIURI.h"
#include "nsString.h"
#include "nsAbSyncPostEngine.h"
#include "nsIIOService.h"
#include "nsIChannel.h"
#include "nsNetUtil.h"
#include "nsMimeTypes.h"
#include "nsIHttpChannel.h"
#include "nsTextFormatter.h"
#include "nsICookieService.h"
#include "nsIAbSync.h"
#include "nsAbSyncCID.h"
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
static NS_DEFINE_CID(kCookieServiceCID, NS_COOKIESERVICE_CID);
static NS_DEFINE_CID(kCAbSyncMojoCID, NS_AB_SYNC_MOJO_CID);
static NS_DEFINE_CID(kAbSync, NS_ABSYNC_SERVICE_CID);
/*
* This function will be used by the factory to generate an
* object class object....
*/
NS_METHOD
nsAbSyncPostEngine::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
{
if (aOuter)
return NS_ERROR_NO_AGGREGATION;
nsAbSyncPostEngine *ph = new nsAbSyncPostEngine();
if (ph == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
return ph->QueryInterface(aIID, aResult);
}
NS_IMPL_ADDREF(nsAbSyncPostEngine)
NS_IMPL_RELEASE(nsAbSyncPostEngine)
NS_INTERFACE_MAP_BEGIN(nsAbSyncPostEngine)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURIContentListener)
NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
NS_INTERFACE_MAP_ENTRY(nsIURIContentListener)
NS_INTERFACE_MAP_ENTRY(nsIAbSyncPostEngine)
NS_INTERFACE_MAP_END
/*
* Inherited methods for nsMimeConverter
*/
nsAbSyncPostEngine::nsAbSyncPostEngine()
{
/* the following macro is used to initialize the ref counting data */
NS_INIT_REFCNT();
// Init member variables...
mTotalWritten = 0;
mStillRunning = PR_TRUE;
mContentType = nsnull;
mCharset = nsnull;
mListenerArray = nsnull;
mListenerArrayCount = 0;
mPostEngineState = nsIAbSyncPostEngineState::nsIAbSyncPostIdle;
mTransactionID = 0;
mMessageSize = 0;
mAuthenticationRunning = PR_TRUE;
mCookie = nsnull;
mUser = nsnull;
mSyncProtocolRequest = nsnull;
mSyncProtocolRequestPrefix = nsnull;
mChannel = nsnull;
mMojoSyncSpec = nsnull;
}
nsAbSyncPostEngine::~nsAbSyncPostEngine()
{
mStillRunning = PR_FALSE;
PR_FREEIF(mContentType);
PR_FREEIF(mCharset);
PR_FREEIF(mSyncProtocolRequest);
PR_FREEIF(mSyncProtocolRequestPrefix);
PR_FREEIF(mCookie);
PR_FREEIF(mUser);
PR_FREEIF(mMojoSyncSpec);
DeleteListeners();
}
PRInt32 Base64Decode_int(const char *in_str, unsigned char *out_str,
PRUint32& decoded_len);
/* ==================================================================
* Base64Encode
*
* Returns number of bytes that were encoded.
*
* >0 -> OK
* -1 -> BAD (output buffer not big enough).
*
* ==================================================================
*/
PRInt32 Base64Encode(const unsigned char *in_str, PRInt32 in_len, char *out_str,
PRInt32 out_len)
{
static unsigned char base64[] =
{
/* 0 1 2 3 4 5 6 7 */
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', /* 0 */
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', /* 1 */
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', /* 2 */
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', /* 3 */
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 4 */
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', /* 5 */
'w', 'x', 'y', 'z', '0', '1', '2', '3', /* 6 */
'4', '5', '6', '7', '8', '9', '+', '/' /* 7 */
};
PRInt32 curr_out_len = 0;
PRInt32 i = 0;
unsigned char a, b, c;
out_str[0] = '\0';
if (in_len > 0)
{
while (i < in_len)
{
a = in_str[i];
b = (i + 1 >= in_len) ? 0 : in_str[i + 1];
c = (i + 2 >= in_len) ? 0 : in_str[i + 2];
if (i + 2 < in_len)
{
out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
out_str[curr_out_len++] = (base64[((a << 4) & 0x30)
+ ((b >> 4) & 0xf)]);
out_str[curr_out_len++] = (base64[((b << 2) & 0x3c)
+ ((c >> 6) & 0x3)]);
out_str[curr_out_len++] = (base64[c & 0x3F]);
}
else if (i + 1 < in_len)
{
out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
out_str[curr_out_len++] = (base64[((a << 4) & 0x30)
+ ((b >> 4) & 0xf)]);
out_str[curr_out_len++] = (base64[((b << 2) & 0x3c)
+ ((c >> 6) & 0x3)]);
out_str[curr_out_len++] = '=';
}
else
{
out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);
out_str[curr_out_len++] = (base64[((a << 4) & 0x30)
+ ((b >> 4) & 0xf)]);
out_str[curr_out_len++] = '=';
out_str[curr_out_len++] = '=';
}
i += 3;
if((curr_out_len + 4) > out_len)
{
return(-1);
}
}
out_str[curr_out_len] = '\0';
}
return curr_out_len;
}
/*
* This routine decodes base64 string to a buffer.
* Populates 'out_str' with b64 decoded data.
*
* Returns number of bytes that were decoded.
* >0 -> OK
* -1 -> BAD (output buffer not big enough).
*/
PRInt32 Base64Decode(const char *in_str, unsigned char *out_str,
PRUint32* decoded_len)
{
return Base64Decode_int(in_str, out_str, *decoded_len);
}
PRInt32 Base64Decode_int(const char *in_str, unsigned char *out_str,
PRUint32& decoded_len)
{
PRInt32 in_len = strlen (/*(char *)*/ in_str);
PRInt32 ii = 0;
PRInt32 a = 0;
char ch;
PRInt32 b1 = 0;
long b4 = 0;
PRInt32 nn = 0;
/* Decode remainder of base 64 string */
while (ii < in_len)
{
ch = in_str[ii++];
if (ch >= 'A' && ch <= 'Z') b1 = (ch - 'A');
else if (ch >= 'a' && ch <= 'z') b1 = 26 + (ch - 'a');
else if (ch >= '0' && ch <= '9') b1 = 52 + (ch - '0');
else if (ch == '+') b1 = 62;
else if (ch == '/') b1 = 63;
else if (ch == '\r' || ch == '\n') continue;
else
{
if (ch == '=')
{
if (nn == 3)
{
if ((a + 2) > (PRInt32) decoded_len)
return (-1); /* Bail. Buffer overflow */
b4 = (b4 << 6);
out_str[a++] = (char) (0xff & (b4 >> 16));
out_str[a++] = (char) (0xff & (b4 >> 8));
}
else if (nn == 2)
{
if ((a + 1) > (PRInt32) decoded_len)
{
return (-1); /* Bail. Buffer overflow */
}
b4 = (b4 << 12);
out_str[a++] = (char) (0xff & (b4 >> 16));
}
}
break;
}
b4 = (b4 << 6) | (long) b1;
nn++;
if (nn == 4)
{
if ((a + 3) > (PRInt32) decoded_len)
{
return (-1); /* Bail. Buffer overflow */
}
out_str[a++] = (char) (0xff & (b4 >> 16));
out_str[a++] = (char) (0xff & (b4 >> 8));
out_str[a++] = (char) (0xff & (b4));
nn = 0;
}
}
out_str[a] = '\0';
decoded_len = a;
return (a);
}
NS_IMETHODIMP nsAbSyncPostEngine::GetInterface(const nsIID & aIID, void * *aInstancePtr)
{
NS_ENSURE_ARG_POINTER(aInstancePtr);
return QueryInterface(aIID, aInstancePtr);
}
// nsIURIContentListener support
NS_IMETHODIMP
nsAbSyncPostEngine::OnStartURIOpen(nsIURI* aURI,
const char* aWindowTarget, PRBool* aAbortOpen)
{
return NS_OK;
}
NS_IMETHODIMP
nsAbSyncPostEngine::GetProtocolHandler(nsIURI *aURI, nsIProtocolHandler **aProtocolHandler)
{
*aProtocolHandler = nsnull;
return NS_OK;
}
NS_IMETHODIMP
nsAbSyncPostEngine::IsPreferred(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
char ** aDesiredContentType,
PRBool * aCanHandleContent)
{
return CanHandleContent(aContentType, aCommand, aWindowTarget, aDesiredContentType,
aCanHandleContent);
}
NS_IMETHODIMP
nsAbSyncPostEngine::CanHandleContent(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
char ** aDesiredContentType,
PRBool * aCanHandleContent)
{
if (nsCRT::strcasecmp(aContentType, MESSAGE_RFC822) == 0)
*aDesiredContentType = nsCRT::strdup("text/html");
// since we explicilty loaded the url, we always want to handle it!
*aCanHandleContent = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP
nsAbSyncPostEngine::DoContent(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
nsIRequest *request,
nsIStreamListener ** aContentHandler,
PRBool * aAbortProcess)
{
nsresult rv = NS_OK;
if (aAbortProcess)
*aAbortProcess = PR_FALSE;
QueryInterface(NS_GET_IID(nsIStreamListener), (void **) aContentHandler);
return rv;
}
NS_IMETHODIMP
nsAbSyncPostEngine::GetParentContentListener(nsIURIContentListener** aParent)
{
*aParent = nsnull;
return NS_OK;
}
NS_IMETHODIMP
nsAbSyncPostEngine::SetParentContentListener(nsIURIContentListener* aParent)
{
return NS_OK;
}
NS_IMETHODIMP
nsAbSyncPostEngine::GetLoadCookie(nsISupports ** aLoadCookie)
{
*aLoadCookie = mLoadCookie;
NS_IF_ADDREF(*aLoadCookie);
return NS_OK;
}
NS_IMETHODIMP
nsAbSyncPostEngine::SetLoadCookie(nsISupports * aLoadCookie)
{
mLoadCookie = aLoadCookie;
return NS_OK;
}
nsresult
nsAbSyncPostEngine::StillRunning(PRBool *running)
{
*running = mStillRunning;
return NS_OK;
}
// Methods for nsIStreamListener...
nsresult
nsAbSyncPostEngine::OnDataAvailable(nsIRequest *request, nsISupports * ctxt, nsIInputStream *aIStream,
PRUint32 sourceOffset, PRUint32 aLength)
{
PRUint32 readLen = aLength;
char *buf = (char *)PR_Malloc(aLength);
if (!buf)
return NS_ERROR_OUT_OF_MEMORY; /* we couldn't allocate the object */
// read the data from the input stram...
nsresult rv = aIStream->Read(buf, aLength, &readLen);
if (NS_FAILED(rv)) return rv;
// write to the protocol response buffer...
mProtocolResponse.Append(NS_ConvertASCIItoUCS2(buf, readLen));
PR_FREEIF(buf);
mTotalWritten += readLen;
if (!mAuthenticationRunning)
NotifyListenersOnProgress(mTransactionID, mTotalWritten, 0);
return NS_OK;
}
// Methods for nsIRequestObserver
nsresult
nsAbSyncPostEngine::OnStartRequest(nsIRequest *request, nsISupports *ctxt)
{
if (mAuthenticationRunning)
NotifyListenersOnStartAuthOperation();
else
NotifyListenersOnStartSending(mTransactionID, mMessageSize);
return NS_OK;
}
nsresult
nsAbSyncPostEngine::OnStopRequest(nsIRequest *request, nsISupports * /* ctxt */, nsresult aStatus)
{
#ifdef NS_DEBUG_rhp
printf("nsAbSyncPostEngine::OnStopRequest()\n");
#endif
char *tProtResponse = nsnull;
//
// Now complete the stream!
//
mStillRunning = PR_FALSE;
// Check the content type!
nsCOMPtr<nsIChannel> channel = do_QueryInterface(request);
if (channel)
{
char *contentType = nsnull;
char *charset = nsnull;
if (NS_SUCCEEDED(channel->GetContentType(&contentType)) && contentType)
{
if (PL_strcasecmp(contentType, UNKNOWN_CONTENT_TYPE))
{
mContentType = contentType;
}
}
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel);
if (httpChannel)
{
if (NS_SUCCEEDED(httpChannel->GetCharset(&charset)) && charset)
{
mCharset = charset;
}
}
}
// set the state...
mPostEngineState = nsIAbSyncPostEngineState::nsIAbSyncPostIdle;
if (mAuthenticationRunning)
{
nsresult rv;
if (mSyncMojo)
rv = mSyncMojo->GetAbSyncMojoResults(&mUser, &mCookie, &mMojoSyncSpec, &mMojoSyncPort);
if (NS_SUCCEEDED(rv))
{
// Before we really get started...lets let sync know who is doing this...
NS_WITH_SERVICE(nsIAbSync, sync, kAbSync, &rv);
if (NS_SUCCEEDED(rv) || sync)
sync->SetAbSyncUser(mUser);
// Base64 encode then url encode it...
//
char tUser[256] = "";
if (Base64Encode((unsigned char *)mUser, nsCRT::strlen(mUser), tUser, sizeof(tUser)) < 0)
{
rv = NS_ERROR_FAILURE;
NotifyListenersOnStopAuthOperation(rv, tProtResponse);
NotifyListenersOnStopSending(mTransactionID, rv, nsnull);
}
else
{
char *tUser2 = nsEscape(tUser, url_Path);
if (!tUser2)
{
rv = NS_ERROR_FAILURE;
NotifyListenersOnStopAuthOperation(rv, tProtResponse);
NotifyListenersOnStopSending(mTransactionID, rv, nsnull);
}
else
{
mSyncProtocolRequestPrefix = PR_smprintf("cn=%s&cc=%s&", tUser2, mCookie);
PR_FREEIF(tUser2);
NotifyListenersOnStopAuthOperation(aStatus, tProtResponse);
KickTheSyncOperation();
}
}
// RICHIE - Special here to show the server we are hitting!
// RICHIE - REMOVE THIS BEFORE SHIPPING!!!!
#ifdef DEBUG
PRUnichar *msgValue = nsnull;
msgValue = nsTextFormatter::smprintf(nsString(NS_ConvertASCIItoUCS2("Server: %s - port %d")).GetUnicode(),
mMojoSyncSpec, mMojoSyncPort);
NotifyListenersOnStatus(mTransactionID, msgValue);
PR_FREEIF(msgValue);
// RICHIE
#endif
}
else
{
NotifyListenersOnStopAuthOperation(rv, tProtResponse);
NotifyListenersOnStopSending(mTransactionID, rv, nsnull);
}
mSyncMojo = nsnull;
}
else
{
tProtResponse = mProtocolResponse.ToNewCString();
NotifyListenersOnStopSending(mTransactionID, aStatus, tProtResponse);
}
PR_FREEIF(tProtResponse);
// Time to return...
return NS_OK;
}
/* void AddSyncListener (in nsIAbSyncPostListener aListener); */
NS_IMETHODIMP nsAbSyncPostEngine::AddPostListener(nsIAbSyncPostListener *aListener)
{
if ( (mListenerArrayCount > 0) || mListenerArray )
{
++mListenerArrayCount;
mListenerArray = (nsIAbSyncPostListener **)
PR_Realloc(*mListenerArray, sizeof(nsIAbSyncPostListener *) * mListenerArrayCount);
if (!mListenerArray)
return NS_ERROR_OUT_OF_MEMORY;
else
{
mListenerArray[mListenerArrayCount - 1] = aListener;
return NS_OK;
}
}
else
{
mListenerArrayCount = 1;
mListenerArray = (nsIAbSyncPostListener **) PR_Malloc(sizeof(nsIAbSyncPostListener *) * mListenerArrayCount);
if (!mListenerArray)
return NS_ERROR_OUT_OF_MEMORY;
nsCRT::memset(mListenerArray, 0, (sizeof(nsIAbSyncPostListener *) * mListenerArrayCount));
mListenerArray[0] = aListener;
NS_ADDREF(mListenerArray[0]);
return NS_OK;
}
}
/* void RemoveSyncListener (in nsIAbSyncPostListener aListener); */
NS_IMETHODIMP nsAbSyncPostEngine::RemovePostListener(nsIAbSyncPostListener *aListener)
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
if (mListenerArray[i] == aListener)
{
NS_RELEASE(mListenerArray[i]);
mListenerArray[i] = nsnull;
return NS_OK;
}
return NS_ERROR_INVALID_ARG;
}
nsresult
nsAbSyncPostEngine::DeleteListeners()
{
if ( (mListenerArray) && (*mListenerArray) )
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
{
NS_RELEASE(mListenerArray[i]);
}
PR_FREEIF(mListenerArray);
}
mListenerArrayCount = 0;
return NS_OK;
}
nsresult
nsAbSyncPostEngine::NotifyListenersOnStartAuthOperation(void)
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
if (mListenerArray[i] != nsnull)
mListenerArray[i]->OnStartAuthOperation();
return NS_OK;
}
nsresult
nsAbSyncPostEngine::NotifyListenersOnStopAuthOperation(nsresult aStatus, const char *aCookie)
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
if (mListenerArray[i] != nsnull)
mListenerArray[i]->OnStopAuthOperation(aStatus, nsnull, aCookie);
return NS_OK;
}
nsresult
nsAbSyncPostEngine::NotifyListenersOnStartSending(PRInt32 aTransactionID, PRUint32 aMsgSize)
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
if (mListenerArray[i] != nsnull)
mListenerArray[i]->OnStartOperation(aTransactionID, aMsgSize);
return NS_OK;
}
nsresult
nsAbSyncPostEngine::NotifyListenersOnProgress(PRInt32 aTransactionID, PRUint32 aProgress, PRUint32 aProgressMax)
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
if (mListenerArray[i] != nsnull)
mListenerArray[i]->OnProgress(aTransactionID, aProgress, aProgressMax);
return NS_OK;
}
nsresult
nsAbSyncPostEngine::NotifyListenersOnStatus(PRInt32 aTransactionID, PRUnichar *aMsg)
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
if (mListenerArray[i] != nsnull)
mListenerArray[i]->OnStatus(aTransactionID, aMsg);
return NS_OK;
}
nsresult
nsAbSyncPostEngine::NotifyListenersOnStopSending(PRInt32 aTransactionID, nsresult aStatus,
char *aProtocolResponse)
{
PRInt32 i;
for (i=0; i<mListenerArrayCount; i++)
if (mListenerArray[i] != nsnull)
mListenerArray[i]->OnStopOperation(aTransactionID, aStatus, nsnull, aProtocolResponse);
return NS_OK;
}
// Utility to create a nsIURI object...
extern "C" nsresult
nsEngineNewURI(nsIURI** aInstancePtrResult, const char *aSpec, nsIURI *aBase)
{
nsresult res;
if (nsnull == aInstancePtrResult)
return NS_ERROR_NULL_POINTER;
NS_WITH_SERVICE(nsIIOService, pService, kIOServiceCID, &res);
if (NS_FAILED(res))
return NS_ERROR_FACTORY_NOT_REGISTERED;
return pService->NewURI(aSpec, aBase, aInstancePtrResult);
}
nsresult
nsAbSyncPostEngine::FireURLRequest(nsIURI *aURL, const char *postData)
{
nsresult rv;
nsCOMPtr<nsIInputStream> postStream;
if (!postData)
return NS_ERROR_INVALID_ARG;
NS_ENSURE_SUCCESS(NS_OpenURI(getter_AddRefs(mChannel), aURL, nsnull), NS_ERROR_FAILURE);
// Tag the post stream onto the channel...but never seemed to work...so putting it
// directly on the URL spec
//
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(mChannel);
if (!httpChannel)
return NS_ERROR_FAILURE;
if (NS_SUCCEEDED(rv = NS_NewPostDataStream(getter_AddRefs(postStream), PR_FALSE, postData, 0)))
httpChannel->SetUploadStream(postStream);
httpChannel->AsyncOpen(this, nsnull);
return NS_OK;
}
/* PRInt32 GetCurrentState (); */
NS_IMETHODIMP nsAbSyncPostEngine::GetCurrentState(PRInt32 *_retval)
{
*_retval = mPostEngineState;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// This is the implementation of the actual post driver.
//
////////////////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP nsAbSyncPostEngine::BuildMojoString(nsIDocShell *aRootDocShell, char **aID)
{
nsresult rv;
if (!aID)
return NS_ERROR_FAILURE;
// Now, get the COMPtr to the Mojo!
if (!mSyncMojo)
{
rv = nsComponentManager::CreateInstance(kCAbSyncMojoCID, NULL, NS_GET_IID(nsIAbSyncMojo), getter_AddRefs(mSyncMojo));
if ( NS_FAILED(rv) || (!mSyncMojo) )
return NS_ERROR_FAILURE;
}
rv = mSyncMojo->BuildMojoString(aRootDocShell, aID);
return rv;
}
NS_IMETHODIMP nsAbSyncPostEngine::SendAbRequest(const char *aSpec, PRInt32 aPort, const char *aProtocolRequest, PRInt32 aTransactionID,
nsIDocShell *aDocShell, const char *aUser)
{
nsresult rv;
char *mojoUser = nsnull;
char *mojoSnack = nsnull;
// Only try if we are not currently busy!
if (mPostEngineState != nsIAbSyncPostEngineState::nsIAbSyncPostIdle)
return NS_ERROR_FAILURE;
// Now, get the COMPtr to the Mojo!
if (!mSyncMojo)
{
rv = nsComponentManager::CreateInstance(kCAbSyncMojoCID, NULL, NS_GET_IID(nsIAbSyncMojo), getter_AddRefs(mSyncMojo));
if ( NS_FAILED(rv) || (!mSyncMojo) )
return NS_ERROR_FAILURE;
}
if (aUser)
mUser = nsCRT::strdup(aUser);
if (NS_FAILED(mSyncMojo->StartAbSyncMojo(this, aDocShell, mUser)))
return NS_ERROR_FAILURE;
// Set transaction ID and save/init Sync info...
mTransactionID = aTransactionID;
// Init stuff we need....
mSyncProtocolRequest = nsCRT::strdup(aProtocolRequest);
mProtocolResponse = NS_ConvertASCIItoUCS2("");
mTotalWritten = 0;
// The first thing we need to do is authentication so do it!
mAuthenticationRunning = PR_TRUE;
mPostEngineState = nsIAbSyncPostEngineState::nsIAbSyncAuthenticationRunning;
return NS_OK;
}
NS_IMETHODIMP
nsAbSyncPostEngine::KickTheSyncOperation(void)
{
nsresult rv;
nsIURI *workURI = nsnull;
char *protString = nsnull;
// The first thing we need to do is authentication so do it!
mAuthenticationRunning = PR_FALSE;
mProtocolResponse = NS_ConvertASCIItoUCS2("");
mPostEngineState = nsIAbSyncPostEngineState::nsIAbSyncPostRunning;
char *postHeader = "Content-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\nCookie: %s\r\n\r\n%s";
protString = PR_smprintf("%s%s", mSyncProtocolRequestPrefix, mSyncProtocolRequest);
if (protString)
mMessageSize = nsCRT::strlen(protString);
else
mMessageSize = 0;
char *tCommand = PR_smprintf(postHeader, mMessageSize, mCookie, protString);
PR_FREEIF(protString);
#ifdef DEBUG_rhp
printf("COMMAND = %s\n", tCommand);
#endif
if (!tCommand)
{
rv = NS_ERROR_OUT_OF_MEMORY; // we couldn't allocate the string
goto GetOuttaHere;
}
rv = nsEngineNewURI(&workURI, mMojoSyncSpec, nsnull);
if (NS_FAILED(rv) || (!workURI))
{
rv = NS_ERROR_FAILURE; // we couldn't allocate the string
goto GetOuttaHere;
}
if (mMojoSyncPort > 0)
workURI->SetPort(mMojoSyncPort);
rv = FireURLRequest(workURI, tCommand);
if (NS_SUCCEEDED(rv))
NotifyListenersOnStartSending(mTransactionID, mMessageSize);
GetOuttaHere:
NS_IF_RELEASE(workURI);
PR_FREEIF(tCommand);
mPostEngineState = nsIAbSyncPostEngineState::nsIAbSyncPostRunning;
return rv;
}
NS_IMETHODIMP
nsAbSyncPostEngine::CancelAbSync()
{
nsresult rv = NS_ERROR_FAILURE;
if (mSyncMojo)
{
rv = mSyncMojo->CancelTheMojo();
}
else if (mChannel)
{
rv = mChannel->Cancel(NS_BINDING_ABORTED);
}
return rv;
}
NS_IMETHODIMP
nsAbSyncPostEngine::GetMojoUserAndSnack(char **aMojoUser, char **aMojoSnack)
{
if ( (!mUser) || (!mCookie) )
return NS_ERROR_FAILURE;
*aMojoUser = nsCRT::strdup(mUser);
*aMojoSnack = nsCRT::strdup(mCookie);
if ( (!*aMojoUser) || (!*aMojoSnack) )
return NS_ERROR_FAILURE;
else
return NS_OK;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,453 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Pierre Phaneuf <pp@ludusdesign.com>
*/
#include "nsURLFetcher.h"
#include "msgCore.h" // for pre-compiled headers
#include "nsCOMPtr.h"
#include <stdio.h>
#include "nscore.h"
#include "nsIFactory.h"
#include "nsISupports.h"
#include "comi18n.h"
#include "prmem.h"
#include "plstr.h"
#include "nsRepository.h"
#include "nsString.h"
#include "nsIIOService.h"
#include "nsIChannel.h"
#include "nsNetUtil.h"
#include "nsMimeTypes.h"
#include "nsIHttpChannel.h"
#include "nsIWebProgress.h"
#include "nsMsgAttachmentHandler.h"
#include "nsMsgSend.h"
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
NS_IMPL_ISUPPORTS7(nsURLFetcher, nsIURLFetcher, nsIStreamListener, nsIURIContentListener, nsIInterfaceRequestor, nsIWebProgressListener, nsIHttpEventSink, nsISupportsWeakReference)
/*
* Inherited methods for nsMimeConverter
*/
nsURLFetcher::nsURLFetcher()
{
#if defined(DEBUG_ducarroz)
printf("CREATE nsURLFetcher: %x\n", this);
#endif
/* the following macro is used to initialize the ref counting data */
NS_INIT_REFCNT();
// Init member variables...
mOutStream = nsnull;
mTotalWritten = 0;
mStillRunning = PR_TRUE;
mCallback = nsnull;
mContentType = nsnull;
mCharset = nsnull;
mOnStopRequestProcessed = PR_FALSE;
mRedirection = PR_FALSE;
}
nsURLFetcher::~nsURLFetcher()
{
#if defined(DEBUG_ducarroz)
printf("DISPOSE nsURLFetcher: %x\n", this);
#endif
mStillRunning = PR_FALSE;
PR_FREEIF(mContentType);
PR_FREEIF(mCharset);
// Remove the DocShell as a listener of the old WebProgress...
if (mLoadCookie)
{
nsCOMPtr<nsIWebProgress> webProgress(do_QueryInterface(mLoadCookie));
if (webProgress)
webProgress->RemoveProgressListener(this);
}
}
NS_IMETHODIMP nsURLFetcher::GetInterface(const nsIID & aIID, void * *aInstancePtr)
{
NS_ENSURE_ARG_POINTER(aInstancePtr);
return QueryInterface(aIID, aInstancePtr);
}
// nsIURIContentListener support
NS_IMETHODIMP
nsURLFetcher::OnStartURIOpen(nsIURI* aURI,
const char* aWindowTarget, PRBool* aAbortOpen)
{
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::GetProtocolHandler(nsIURI *aURI, nsIProtocolHandler **aProtocolHandler)
{
*aProtocolHandler = nsnull;
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::IsPreferred(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
char ** aDesiredContentType,
PRBool * aCanHandleContent)
{
return CanHandleContent(aContentType, aCommand, aWindowTarget, aDesiredContentType,
aCanHandleContent);
}
NS_IMETHODIMP
nsURLFetcher::CanHandleContent(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
char ** aDesiredContentType,
PRBool * aCanHandleContent)
{
if (nsCRT::strcasecmp(aContentType, MESSAGE_RFC822) == 0)
*aDesiredContentType = nsCRT::strdup("text/html");
// since we explicilty loaded the url, we always want to handle it!
*aCanHandleContent = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::DoContent(const char * aContentType,
nsURILoadCommand aCommand,
const char * aWindowTarget,
nsIRequest *request,
nsIStreamListener ** aContentHandler,
PRBool * aAbortProcess)
{
nsresult rv = NS_OK;
if (aAbortProcess)
*aAbortProcess = PR_FALSE;
QueryInterface(NS_GET_IID(nsIStreamListener), (void **) aContentHandler);
return rv;
}
NS_IMETHODIMP
nsURLFetcher::GetParentContentListener(nsIURIContentListener** aParent)
{
*aParent = nsnull;
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::SetParentContentListener(nsIURIContentListener* aParent)
{
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::GetLoadCookie(nsISupports ** aLoadCookie)
{
*aLoadCookie = mLoadCookie;
NS_IF_ADDREF(*aLoadCookie);
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::SetLoadCookie(nsISupports * aLoadCookie)
{
// Remove the DocShell as a listener of the old WebProgress...
if (mLoadCookie)
{
nsCOMPtr<nsIWebProgress> webProgress(do_QueryInterface(mLoadCookie));
if (webProgress)
webProgress->RemoveProgressListener(this);
}
mLoadCookie = aLoadCookie;
// Add the DocShell as a listener to the new WebProgress...
if (mLoadCookie)
{
nsCOMPtr<nsIWebProgress> webProgress(do_QueryInterface(mLoadCookie));
if (webProgress)
webProgress->AddProgressListener(this);
}
return NS_OK;
}
nsresult
nsURLFetcher::StillRunning(PRBool *running)
{
*running = mStillRunning;
return NS_OK;
}
// Methods for nsIStreamListener...
nsresult
nsURLFetcher::OnDataAvailable(nsIRequest *request, nsISupports * ctxt, nsIInputStream *aIStream,
PRUint32 sourceOffset, PRUint32 aLength)
{
PRUint32 readLen = aLength;
PRUint32 wroteIt;
if (!mOutStream)
return NS_ERROR_INVALID_ARG;
char *buf = (char *)PR_Malloc(aLength);
if (!buf)
return NS_ERROR_OUT_OF_MEMORY; /* we couldn't allocate the object */
// read the data from the input stram...
nsresult rv = aIStream->Read(buf, aLength, &readLen);
if (NS_FAILED(rv)) return rv;
// write to the output file...
wroteIt = mOutStream->write(buf, readLen);
PR_FREEIF(buf);
if (wroteIt != readLen)
return NS_ERROR_FAILURE;
else
{
mTotalWritten += wroteIt;
return NS_OK;
}
}
// Methods for nsIStreamObserver
nsresult
nsURLFetcher::OnStartRequest(nsIRequest *request, nsISupports *ctxt)
{
mRedirection = PR_FALSE; // start a new request, reset mRedirection
nsMsgAttachmentHandler *attachmentHdl = (nsMsgAttachmentHandler *)mTagData;
if (attachmentHdl)
{
nsCOMPtr<nsIMsgSend> sendPtr;
attachmentHdl->GetMimeDeliveryState(getter_AddRefs(sendPtr));
if (sendPtr)
{
nsCOMPtr<nsIMsgProgress> progress;
sendPtr->GetProgress(getter_AddRefs(progress));
if (progress)
{
PRBool cancel = PR_FALSE;
progress->GetProcessCanceledByUser(&cancel);
if (cancel)
return request->Cancel(NS_ERROR_ABORT);
}
}
attachmentHdl->mRequest = request;
}
return NS_OK;
}
nsresult
nsURLFetcher::OnStopRequest(nsIRequest *request, nsISupports * /* ctxt */, nsresult aStatus)
{
#if defined(DEBUG_ducarroz)
printf("nsURLFetcher::OnStopRequest()\n");
#endif
// it's possible we could get in here from the channel calling us with an OnStopRequest and from our
// onStatusChange method (in the case of an error). So we should protect against this to make sure we
// don't process the on stop request twice...
if (mOnStopRequestProcessed) return NS_OK;
mOnStopRequestProcessed = PR_TRUE;
nsMsgAttachmentHandler *attachmentHdl = (nsMsgAttachmentHandler *)mTagData;
if (attachmentHdl)
attachmentHdl->mRequest = nsnull;
//
// Now complete the stream!
//
mStillRunning = PR_FALSE;
// First close the output stream...
if (mOutStream)
{
mOutStream->close();
mOutStream = nsnull;
}
// Check the content type!
char *contentType = nsnull;
char *charset = nsnull;
nsCOMPtr<nsIChannel> aChannel = do_QueryInterface(request);
if(!aChannel) return NS_ERROR_FAILURE;
if (NS_SUCCEEDED(aChannel->GetContentType(&contentType)) && contentType)
{
if (PL_strcasecmp(contentType, UNKNOWN_CONTENT_TYPE))
{
mContentType = contentType;
}
}
nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aChannel);
if (httpChannel)
{
if (NS_SUCCEEDED(httpChannel->GetCharset(&charset)) && charset)
{
mCharset = charset;
}
}
// Now if there is a callback, we need to call it...
if (mCallback)
mCallback (aStatus, mContentType, mCharset, mTotalWritten, nsnull, mTagData);
// Time to return...
return NS_OK;
}
nsresult
nsURLFetcher::Initialize(nsOutputFileStream *fOut,
nsAttachSaveCompletionCallback cb,
void *tagData)
{
if (!fOut)
return NS_ERROR_INVALID_ARG;
if (!fOut->is_open())
return NS_ERROR_FAILURE;
mOutStream = fOut;
mCallback = cb; //JFD: Please, no more callback, use a listener...
mTagData = tagData; //JFD: TODO, WE SHOULD USE A NSCOMPTR to hold this stuff!!!
return NS_OK;
}
nsresult
nsURLFetcher::FireURLRequest(nsIURI *aURL, nsOutputFileStream *fOut,
nsAttachSaveCompletionCallback cb, void *tagData)
{
nsresult rv;
if ( (!aURL) || (!fOut) )
{
return NS_ERROR_INVALID_ARG;
}
if (!fOut->is_open())
{
return NS_ERROR_FAILURE;
}
// we're about to fire a new url request so make sure the on stop request flag is cleared...
mOnStopRequestProcessed = PR_FALSE;
// let's try uri dispatching...
nsCOMPtr<nsIURILoader> pURILoader (do_GetService(NS_URI_LOADER_CONTRACTID));
NS_ENSURE_TRUE(pURILoader, NS_ERROR_FAILURE);
nsCOMPtr<nsISupports> cntListener (do_QueryInterface(NS_STATIC_CAST(nsIStreamListener *, this)));
nsCOMPtr<nsIChannel> channel;
nsCOMPtr<nsILoadGroup> loadGroup;
pURILoader->GetLoadGroupForContext(cntListener, getter_AddRefs(loadGroup));
NS_ENSURE_SUCCESS(NS_OpenURI(getter_AddRefs(channel), aURL, nsnull, loadGroup, this), NS_ERROR_FAILURE);
rv = pURILoader->OpenURI(channel, nsIURILoader::viewNormal, nsnull /* window target */,
cntListener);
mOutStream = fOut;
mCallback = cb;
mTagData = tagData;
return NS_OK;
}
// web progress listener implementation
NS_IMETHODIMP
nsURLFetcher::OnProgressChange(nsIWebProgress *aProgress, nsIRequest *aRequest,
PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress,
PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress)
{
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::OnStateChange(nsIWebProgress *aProgress, nsIRequest *aRequest,
PRInt32 aStateFlags, nsresult aStatus)
{
// all we care about is the case where an error occurred (as in we were unable to locate the
// the url....
if (NS_FAILED(aStatus))
{
//... but we must ignore abort message caused by a redirection!
if (aStatus == NS_BINDING_ABORTED && mRedirection)
return NS_OK;
OnStopRequest(aRequest, nsnull, aStatus);
}
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::OnLocationChange(nsIWebProgress* aWebProgress,
nsIRequest* aRequest,
nsIURI *aURI)
{
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::OnStatusChange(nsIWebProgress* aWebProgress,
nsIRequest* aRequest,
nsresult aStatus,
const PRUnichar* aMessage)
{
return NS_OK;
}
NS_IMETHODIMP
nsURLFetcher::OnSecurityChange(nsIWebProgress *aWebProgress,
nsIRequest *aRequest,
PRInt32 state)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsURLFetcher::OnRedirect(nsIHttpChannel *aOldChannel, nsIChannel *aNewChannel)
{
mRedirection = PR_TRUE;
return NS_OK;
}

View File

@@ -0,0 +1,88 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef nsURLFetcher_h_
#define nsURLFetcher_h_
#include "nsIURLFetcher.h"
#include "nsCOMPtr.h"
#include "nsIInputStream.h"
#include "nsIStreamListener.h"
#include "nsIInterfaceRequestor.h"
#include "nsCURILoader.h"
#include "nsIURIContentListener.h"
#include "nsIWebProgressListener.h"
#include "nsIHttpEventSink.h"
#include "nsWeakReference.h"
class nsURLFetcher : public nsIURLFetcher,
public nsIStreamListener,
public nsIURIContentListener,
public nsIInterfaceRequestor,
public nsIWebProgressListener,
public nsIHttpEventSink,
public nsSupportsWeakReference
{
public:
nsURLFetcher();
virtual ~nsURLFetcher();
/* this macro defines QueryInterface, AddRef and Release for this class */
NS_DECL_ISUPPORTS
// Methods for nsIURLFetcher
NS_DECL_NSIURLFETCHER
// Methods for nsIStreamListener
NS_DECL_NSISTREAMLISTENER
// Methods for nsIRequestObserver
NS_DECL_NSIREQUESTOBSERVER
// Methods for nsIURICOntentListener
NS_DECL_NSIURICONTENTLISTENER
// Methods for nsIInterfaceRequestor
NS_DECL_NSIINTERFACEREQUESTOR
// Methods for nsIWebProgressListener
NS_DECL_NSIWEBPROGRESSLISTENER
// Methods for nsIHttpEventSink
NS_DECL_NSIHTTPEVENTSINK
private:
nsOutputFileStream *mOutStream; // the output file stream
PRBool mStillRunning; // Are we still running?
PRInt32 mTotalWritten; // Size counter variable
char *mContentType; // The content type retrieved from the server
char *mCharset; // The charset retrieved from the server
void *mTagData; // Tag data for callback...
nsAttachSaveCompletionCallback mCallback; // Callback to call once the file is saved...
nsCOMPtr<nsISupports> mLoadCookie; // load cookie used by the uri loader when we fetch the url
PRBool mOnStopRequestProcessed; // used to prevent calling OnStopRequest multiple times
PRBool mRedirection; // Set when we get a redirection, should ignore stop message.
};
#endif /* nsURLFetcher_h_ */

View File

@@ -1,28 +0,0 @@
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 2001 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Srilatha Moturi <srilatha@netscape.com>
# Krishna Mohan Khandrika <kkhandrika@netscape.com>
#
DEPTH=..\..
DIRS=mapihook resources mapiDll
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,54 +0,0 @@
; ***** BEGIN LICENSE BLOCK *****
; Version: MPL 1.1/GPL 2.0/LGPL 2.1
;
; The contents of this file are subject to the Mozilla Public License Version
; 1.1 (the "License"); you may not use this file except in compliance with
; the License. You may obtain a copy of the License at
; http://www.mozilla.org/MPL/
;
; Software distributed under the License is distributed on an "AS IS" basis,
; WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
; for the specific language governing rights and limitations under the
; License.
;
; The Original Code is Mozilla.
;
; The Initial Developer of the Original Code is
; Netscape Communications Corp.
; Portions created by the Initial Developer are Copyright (C) 2001
; the Initial Developer. All Rights Reserved.
;
; Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
;
; Alternatively, the contents of this file may be used under the terms of
; either the GNU General Public License Version 2 or later (the "GPL"), or
; the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
; in which case the provisions of the GPL or the LGPL are applicable instead
; of those above. If you wish to allow use of your version of this file only
; under the terms of either the GPL or the LGPL, and not to allow others to
; use your version of this file under the terms of the MPL, indicate your
; decision by deleting the provisions above and replace them with the notice
; and other provisions required by the GPL or the LGPL. If you do not delete
; the provisions above, a recipient may use your version of this file under
; the terms of any one of the MPL, the GPL or the LGPL.
;
; ***** END LICENSE BLOCK *****
LIBRARY mozMapi32.dll
DESCRIPTION 'Mozilla Simple MAPI Support'
EXPORTS
MAPILogon
MAPILogoff
MAPISendMail
MAPISendDocuments
MAPIFindNext
MAPIReadMail
MAPISaveMail
MAPIDeleteMail
MAPIAddress
MAPIDetails
MAPIResolveName
MAPIFreeBuffer
GetMapiDllVersion

View File

@@ -1,335 +0,0 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla
*
* The Initial Developer of the Original Code is
* Netscape Communications Corp.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
* Contributor(s): Rajiv Dayal (rdayal@netscape.com)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include <windows.h>
#include <tchar.h>
#include <assert.h>
#include <mapidefs.h>
#include <mapi.h>
#include "msgMapi.h"
#include "msgMapiMain.h"
#define MAX_RECIPS 100
#define MAX_FILES 100
const CLSID CLSID_nsMapiImp = {0x29f458be, 0x8866, 0x11d5,
{0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}};
const IID IID_nsIMapi = {0x6EDCD38E,0x8861,0x11d5,
{0xA3,0xDD,0x00,0xB0,0xD0,0xF3,0xBA,0xA7}};
DWORD tId = 0;
BOOL WINAPI DllMain(HINSTANCE aInstance, DWORD aReason, LPVOID aReserved)
{
switch (aReason)
{
case DLL_PROCESS_ATTACH : tId = TlsAlloc();
if (tId == 0xFFFFFFFF)
return FALSE;
break;
case DLL_PROCESS_DETACH : TlsFree(tId);
break;
}
return TRUE;
}
BOOL InitMozillaReference(nsIMapi **aRetValue)
{
// Check wehther this thread has a valid Interface
// by looking into thread-specific-data variable
*aRetValue = (nsIMapi *)TlsGetValue(tId);
// Check whether the pointer actually resolves to
// a valid method call; otherwise mozilla is not running
if ((*aRetValue) && (*aRetValue)->IsValid() == S_OK)
return TRUE;
HRESULT hRes = CoInitialize(NULL);
hRes = ::CoCreateInstance(CLSID_nsMapiImp, NULL, CLSCTX_LOCAL_SERVER,
IID_nsIMapi, (LPVOID *)aRetValue);
if (hRes == S_OK && (*aRetValue)->Initialize() == S_OK)
if (TlsSetValue(tId, (LPVOID)(*aRetValue)))
return TRUE;
// Either CoCreate or TlsSetValue failed; so return FALSE
if ((*aRetValue))
(*aRetValue)->Release();
::CoUninitialize();
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////
// The MAPILogon function begins a Simple MAPI session, loading the default message ////
// store and address book providers ////
////////////////////////////////////////////////////////////////////////////////////////
ULONG FAR PASCAL MAPILogon(ULONG aUIParam, LPTSTR aProfileName,
LPTSTR aPassword, FLAGS aFlags,
ULONG aReserved, LPLHANDLE aSession)
{
HRESULT hr = 0;
ULONG nSessionId = 0;
nsIMapi *pNsMapi = NULL;
if (!InitMozillaReference(&pNsMapi))
return MAPI_E_FAILURE;
if (!(aFlags & MAPI_UNICODE))
{
// Need to convert the parameters to Unicode.
char *pUserName = (char *) aProfileName;
char *pPassWord = (char *) aPassword;
TCHAR ProfileName[MAX_NAME_LEN] = {0};
TCHAR PassWord[MAX_PW_LEN] = {0};
if (pUserName != NULL)
{
if (!MultiByteToWideChar(CP_ACP, 0, pUserName, -1, ProfileName,
MAX_NAME_LEN))
return MAPI_E_FAILURE;
}
if (pPassWord != NULL)
{
if (!MultiByteToWideChar(CP_ACP, 0, pPassWord, -1, PassWord,
MAX_NAME_LEN))
return MAPI_E_FAILURE;
}
hr = pNsMapi->Login(aUIParam, ProfileName, PassWord, aFlags,
&nSessionId);
}
else
hr = pNsMapi->Login(aUIParam, aProfileName, aPassword,
aFlags, &nSessionId);
if (hr == S_OK)
(*aSession) = (LHANDLE) nSessionId;
else
return nSessionId;
return SUCCESS_SUCCESS;
}
ULONG FAR PASCAL MAPILogoff (LHANDLE aSession, ULONG aUIParam,
FLAGS aFlags, ULONG aReserved)
{
nsIMapi *pNsMapi = (nsIMapi *)TlsGetValue(tId);
if (pNsMapi != NULL)
{
if (pNsMapi->Logoff((ULONG) aSession) == S_OK)
pNsMapi->Release();
pNsMapi = NULL;
}
TlsSetValue(tId, NULL);
::CoUninitialize();
return SUCCESS_SUCCESS;
}
ULONG FAR PASCAL MAPISendMail (LHANDLE lhSession, ULONG ulUIParam, lpnsMapiMessage lpMessage,
FLAGS flFlags, ULONG ulReserved )
{
HRESULT hr = 0;
BOOL bTempSession = FALSE ;
nsIMapi *pNsMapi = NULL;
if (!InitMozillaReference(&pNsMapi))
return MAPI_E_FAILURE;
if (lpMessage->nRecipCount > MAX_RECIPS)
return MAPI_E_TOO_MANY_RECIPIENTS ;
if (lpMessage->nFileCount > MAX_FILES)
return MAPI_E_TOO_MANY_FILES ;
if ( (!(flFlags & MAPI_DIALOG)) && (lpMessage->lpRecips == NULL) )
return MAPI_E_UNKNOWN_RECIPIENT ;
if (!lhSession || pNsMapi->IsValidSession(lhSession) != S_OK)
{
FLAGS LoginFlag ;
if ( (flFlags & MAPI_LOGON_UI) && (flFlags & MAPI_NEW_SESSION) )
LoginFlag = MAPI_LOGON_UI | MAPI_NEW_SESSION ;
else if (flFlags & MAPI_LOGON_UI)
LoginFlag = MAPI_LOGON_UI ;
hr = MAPILogon (ulUIParam, (LPTSTR) NULL, (LPTSTR) NULL, LoginFlag, 0, &lhSession) ;
if (hr != SUCCESS_SUCCESS)
return MAPI_E_LOGIN_FAILURE ;
bTempSession = TRUE ;
}
// we need to deal with null data passed in by MAPI clients, specially when MAPI_DIALOG is set.
// The MS COM type lib code generated by MIDL for the MS COM interfaces checks for these parameters
// to be non null, although null is a valid value for them here.
nsMapiRecipDesc * lpRecips ;
nsMapiFileDesc * lpFiles ;
nsMapiMessage Message ;
memset (&Message, 0, sizeof (nsMapiMessage) ) ;
nsMapiRecipDesc Recipient ;
memset (&Recipient, 0, sizeof (nsMapiRecipDesc) );
nsMapiFileDesc Files ;
memset (&Files, 0, sizeof (nsMapiFileDesc) ) ;
if(!lpMessage)
{
lpMessage = &Message ;
}
if(!lpMessage->lpRecips)
{
lpRecips = &Recipient ;
}
else
lpRecips = lpMessage->lpRecips ;
if(!lpMessage->lpFiles)
{
lpFiles = &Files ;
}
else
lpFiles = lpMessage->lpFiles ;
hr = pNsMapi->SendMail (lhSession, lpMessage,
(short) lpMessage->nRecipCount, lpRecips,
(short) lpMessage->nFileCount, lpFiles,
flFlags, ulReserved);
if (bTempSession)
MAPILogoff (lhSession, ulUIParam, 0,0) ;
// we are seeing a problem when using Word, although we return success from the MAPI support
// MS COM interface in mozilla, we are getting this error here. This is a temporary hack !!
if (hr == 0x800703e6)
return SUCCESS_SUCCESS;
return hr ;
}
ULONG FAR PASCAL MAPISendDocuments(ULONG ulUIParam, LPTSTR lpszDelimChar, LPTSTR lpszFilePaths,
LPTSTR lpszFileNames, ULONG ulReserved)
{
LHANDLE lhSession ;
nsIMapi *pNsMapi = NULL;
if (!InitMozillaReference(&pNsMapi))
return MAPI_E_FAILURE;
unsigned long result = MAPILogon (ulUIParam, (LPTSTR) NULL, (LPTSTR) NULL, MAPI_LOGON_UI, 0, &lhSession) ;
if (result != SUCCESS_SUCCESS)
return MAPI_E_LOGIN_FAILURE ;
HRESULT hr;
hr = pNsMapi->SendDocuments(lhSession, (LPTSTR) lpszDelimChar, (LPTSTR) lpszFilePaths,
(LPTSTR) lpszFileNames, ulReserved) ;
MAPILogoff (lhSession, ulUIParam, 0,0) ;
return hr ;
}
ULONG FAR PASCAL MAPIFindNext(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageType,
LPTSTR lpszSeedMessageID, FLAGS flFlags, ULONG ulReserved,
LPTSTR lpszMessageID)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL MAPIReadMail(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageID,
FLAGS flFlags, ULONG ulReserved, lpMapiMessage FAR *lppMessage)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL MAPISaveMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage,
FLAGS flFlags, ULONG ulReserved, LPTSTR lpszMessageID)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL MAPIDeleteMail(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageID,
FLAGS flFlags, ULONG ulReserved)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL MAPIAddress(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszCaption,
ULONG nEditFields, LPTSTR lpszLabels, ULONG nRecips,
lpMapiRecipDesc lpRecips, FLAGS flFlags,
ULONG ulReserved, LPULONG lpnNewRecips,
lpMapiRecipDesc FAR *lppNewRecips)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL MAPIDetails(LHANDLE lhSession, ULONG ulUIParam, lpMapiRecipDesc lpRecip,
FLAGS flFlags, ULONG ulReserved)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL MAPIResolveName(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszName,
FLAGS flFlags, ULONG ulReserved, lpMapiRecipDesc FAR *lppRecip)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL MAPIFreeBuffer(LPVOID pv)
{
return MAPI_E_FAILURE;
}
ULONG FAR PASCAL GetMapiDllVersion()
{
return 94;
}

View File

@@ -1,61 +0,0 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Mozilla.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corp.
# Portions created by the Initial Developer are Copyright (C) 2001
# the Initial Developer. All Rights Reserved.
#
# Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH=..\..\..
MODULE = mozMapi32
EXPORT_LIBRARY = $(MODULE)
LIBRARY_NAME = $(MODULE)
DEFFILE = Mapi32.def
REQUIRES = MapiProxy \
msgMapi \
xpcom \
string \
$(NULL)
include <$(DEPTH)\config\config.mak>
###############################################################
LCFLAGS=-DUNICODE -D_UNICODE
OBJS= .\$(OBJDIR)\MapiDll.obj
WIN_LIBS= ole32.lib
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,64 +0,0 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Krishna Mohan Khandrika <kkhandrika@netscape.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
/**
* This interface provides support for registering Mozilla as a COM component
* for extending the use of Mail/News through Simple MAPI.
*
*/
[noscript, uuid(8967fed2-c8bb-11d5-a3e9-00b0d0f3baa7)]
interface nsIMapiSupport : nsISupports {
/** Initiates MAPI support
*/
void initializeMAPISupport();
/** Shuts down the MAPI support
*/
void shutdownMAPISupport();
};
%{C++
#define NS_IMAPISUPPORT_CONTRACTID "@mozilla.org/mapisupport;1"
#define NS_IMAPISUPPORT_CLASSNAME "Mozilla MAPI Support"
%}

View File

@@ -1,174 +0,0 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla
*
* The Initial Developer of the Original Code is
* Netscape Communications Corp.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsComPtr.h"
#include "nsMapiSupport.h"
#include "nsISupports.h"
#include "nsMapiRegistry.h"
#include "nsIGenericFactory.h"
#include "nsIObserverService.h"
#include "nsIAppStartupNotifier.h"
#include "nsIServiceManager.h"
#include "nsIComponentManager.h"
#include "nsICategoryManager.h"
const CLSID CLSID_nsMapiImp = {0x29f458be, 0x8866, 0x11d5, \
{0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}};
/** Implementation of the nsIMapiSupport interface.
* Use standard implementation of nsISupports stuff.
*/
NS_IMPL_THREADSAFE_ISUPPORTS2(nsMapiSupport, nsIMapiSupport, nsIObserver);
static NS_METHOD nsMapiRegistrationProc(nsIComponentManager *aCompMgr,
nsIFile *aPath, const char *registryLocation, const char *componentType,
const nsModuleComponentInfo *info)
{
nsresult rv;
nsCOMPtr<nsICategoryManager> categoryManager(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv));
if (NS_SUCCEEDED(rv))
rv = categoryManager->AddCategoryEntry(APPSTARTUP_CATEGORY, "Mapi Support",
"service," NS_IMAPISUPPORT_CONTRACTID, PR_TRUE, PR_TRUE, nsnull);
return rv;
}
NS_IMETHODIMP
nsMapiSupport::Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *aData)
{
if (!nsCRT::strcmp(aTopic, "profile-after-change"))
return InitializeMAPISupport();
if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID))
return ShutdownMAPISupport();
nsresult rv;
nsCOMPtr<nsIObserverService> observerService(do_GetService("@mozilla.org/observer-service;1", &rv));
if (NS_FAILED(rv)) return rv;
rv = observerService->AddObserver(this,"profile-after-change", PR_FALSE);
if (NS_FAILED(rv)) return rv;
rv = observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE);
return rv;
}
nsMapiSupport::nsMapiSupport()
: m_dwRegister(0),
m_nsMapiFactory(nsnull)
{
NS_INIT_ISUPPORTS();
}
nsMapiSupport::~nsMapiSupport()
{
}
NS_IMETHODIMP
nsMapiSupport::InitializeMAPISupport()
{
::CoInitialize(nsnull);
if (m_nsMapiFactory == nsnull) // No Registering if already done. Sanity Check!!
{
m_nsMapiFactory = new nsMapiFactory();
if (m_nsMapiFactory != nsnull)
{
HRESULT hr = ::CoRegisterClassObject(CLSID_nsMapiImp, \
m_nsMapiFactory, \
CLSCTX_LOCAL_SERVER, \
REGCLS_MULTIPLEUSE, \
&m_dwRegister);
if (FAILED(hr))
{
m_nsMapiFactory->Release() ;
m_nsMapiFactory = nsnull;
return NS_ERROR_FAILURE;
}
}
}
return NS_OK;
}
NS_IMETHODIMP
nsMapiSupport::ShutdownMAPISupport()
{
if (m_dwRegister != 0)
::CoRevokeClassObject(m_dwRegister);
if (m_nsMapiFactory != nsnull)
{
m_nsMapiFactory->Release();
m_nsMapiFactory = nsnull;
}
::CoUninitialize();
return NS_OK;
}
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMapiRegistry);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMapiSupport);
// The list of components we register
static nsModuleComponentInfo components[] =
{
{
NS_IMAPIREGISTRY_CLASSNAME,
NS_IMAPIREGISTRY_CID,
NS_IMAPIREGISTRY_CONTRACTID,
nsMapiRegistryConstructor
},
{
NS_IMAPISUPPORT_CLASSNAME,
NS_IMAPISUPPORT_CID,
NS_IMAPISUPPORT_CONTRACTID,
nsMapiSupportConstructor,
nsMapiRegistrationProc,
nsnull
}
};
NS_IMPL_NSGETMODULE(msgMapiModule, components);

View File

@@ -1,67 +0,0 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla
*
* The Initial Developer of the Original Code is
# Netscape Communications Corp.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef NS_MAPI_SUPPORT_H_
#define NS_MAPI_SUPPORT_H_
#include <nsIObserver.h>
#include <nsIMapiSupport.h>
#include "msgMapiFactory.h"
#define NS_IMAPISUPPORT_CID \
{0x8967fed2, 0xc8bb, 0x11d5, \
{ 0xa3, 0xe9, 0x00, 0xb0, 0xd0, 0xf3, 0xba, 0xa7 }}
class nsMapiSupport : public nsIMapiSupport, public nsIObserver
{
public :
nsMapiSupport();
~nsMapiSupport();
// Declare all interface methods we must implement.
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
NS_DECL_NSIMAPISUPPORT
private :
DWORD m_dwRegister;
nsMapiFactory *m_nsMapiFactory;
};
#endif // NS_MAPI_SUPPORT_H_

View File

@@ -1,64 +0,0 @@
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
#
DEPTH=..\..\..
MODULE=mapiguts
################################################################################
## exports
#EXPORTS =
################################################################################
## library
LIBNAME = .\$(OBJDIR)\mapiguts
!ifdef MOZ_STATIC_COMPONENT_LIBS
LIB = $(LIBNAME).lib
!else
DLL = $(LIBNAME).dll
!endif
DEFINES= -NS_DEBUG
OBJS= \
.\$(OBJDIR)\mapihook.obj \
.\$(OBJDIR)\mapimail.obj \
$(NULL)
LLIBS= \
$(LLIBS) \
$(LIBNSPR) \
$(DIST)\lib\xppref32.lib \
$(DIST)\lib\xpcom.lib \
$(DIST)\lib\mapiutils_s.lib \
$(NULL)
include <$(DEPTH)\config\rules.mak>
!ifdef MOZ_STATIC_COMPONENT_LIBS
install:: $(LIb)
$(MAKE_INSTALL) $(LIBNAME).$(LIB_SUFFIX) $(DIST)\bin\components
!else
install:: $(DLL)
$(MAKE_INSTALL) $(LIBNAME).$(DLL_SUFFIX) $(DIST)\bin\components
!endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,48 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef _MAPI_HOOK_H_
#define _MAPI_HOOK_H_
#include <structs.h> // for MWContext
//
// This is the entry point to the MAPI session manager that lives
// inside of Communicator.
//
LONG ProcessNetscapeMAPIHook(WPARAM wParam, LPARAM lParam);
#endif // _MAPI_HOOK_H_

View File

@@ -1,853 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// More MAPI Hooks for Communicator
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include "windows.h"
#include "template.h"
#include "msgcom.h"
#include "wfemsg.h"
#include "compstd.h"
#include "compbar.h"
#include "compmisc.h"
#include "compfrm.h"
#include "prefapi.h"
#include "intl_csi.h"
#include "dlghtmrp.h"
#include "dlghtmmq.h"
// rhp - was breaking the optimized build!
//#include "edt.h"
//#include "edview.h"
//#include "postal.h"
//#include "apiaddr.h"
//#include "mailmisc.h"
extern "C" {
#include "xpgetstr.h"
extern int MK_MSG_MSG_COMPOSITION;
};
#include "mapimail.h"
#include "nscpmapi.h"
#include "mailpriv.h"
#include "nsstrseq.h"
MWContext
*GetUsableContext(void)
{
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
ASSERT(pFrame != NULL);
if (pFrame == NULL)
{
return(NULL);
}
// Now return the context...
return((MWContext *) pFrame->GetMainContext());
}
//
// This function will create a composition window and either do
// a blind send or pop up the compose window for the user to
// complete the operation
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoFullMAPIMailOperation(MAPISendMailType *sendMailPtr,
const char *pInitialText,
BOOL winShowFlag)
{
CGenericDoc *pDocument;
LPSTR subject;
NSstringSeq mailInfoSeq;
DWORD stringCount = 6;
DWORD i;
CString csDefault;
// Get a context to use for this call...
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
{
return(MAPI_E_FAILURE);
}
// Don't allow a compose window to be created if the user hasn't
// specified an email address
const char *real_addr = FE_UsersMailAddress();
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
{
return(MAPI_E_FAILURE);
}
//
// Now, we must build the fields object...
//
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
subject = NSStrSeqGet(mailInfoSeq, 0);
// We should give it a subject to preven the prompt from coming
// up...
if ((!subject) || !(*subject))
{
csDefault.LoadString(IDS_COMPOSE_DEFAULTNOSUBJECT);
subject = csDefault.GetBuffer(2);
}
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
char toString[1024] = "";
char ccString[1024] = "";
char bccString[1024] = "";
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
{
LPSTR ptr;
UCHAR tempString[256];
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
// figure which type of address this is?
if (addrType == MAPI_CC)
ptr = ccString;
else if (addrType == MAPI_BCC)
ptr = bccString;
else
ptr = toString;
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
{
emailPtr += 5;
}
// Now build the temp string to tack on in the format
// "Rich Pizzarro" <rhp@netscape.com>
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
// add a comma if not the first one
if (ptr[0] != '\0')
lstrcat(ptr, ",");
// tack on string!
lstrcat(ptr, (LPSTR) tempString);
}
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
MSG_CompositionFields *fields =
MSG_CreateCompositionFields(real_addr, real_addr,
toString,
ccString,
bccString,
"", "", "",
"", subject, "",
"", "", "",
"",
bEncrypt,
bSign);
if (!fields)
{
return(MAPI_E_FAILURE);
}
// RICHIE
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
// int16 win_csid = INTL_GetCSIWinCSID(csi);
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
if ( !pDocument )
{
return(MAPI_E_FAILURE);
}
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
if ( !pContext )
{
return(MAPI_E_FAILURE);
}
MSG_CompositionPaneCallbacks Callbacks;
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
int16 doccsid;
MWContext *context = pContext->GetContext();
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
// This needs to be set TRUE if using the old non-HTML text frame
// to prevent dropping dragged URLs
pContext->m_bDragging = !pCompose->UseHtml();
if (!pCompose->UseHtml())
{
pCompose->SetMsgPane(
MSG_CreateCompositionPane(pContext->GetContext(),
context,
g_MsgPrefs.m_pMsgPrefs,
fields,
WFE_MSGGetMaster())
);
}
ASSERT(pCompose->GetMsgPane());
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
pCompose->UpdateAttachmentInfo();
// Pass doccsid info to new context for MailToWin conversion
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
pCompose->DisplayHeaders(NULL);
CComposeBar * pBar = pCompose->GetComposeBar();
ASSERT(pBar);
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
if (!pIAddressList->IsCreated())
{
pBar->CreateAddressingBlock();
}
// rhp - Deal with addressing the brute force way! This is a
// "fix" for bad behavior when creating these windows and not
// showing them on the desktop.
if (!winShowFlag) // Hack to fix the window not being mapped
{
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
}
// Always do plain text composition!
pCompose->CompleteComposeInitialization();
// Do this so we don't get popups on "empty" messages
if ( (!pInitialText) || (!(*pInitialText)) )
pInitialText = " ";
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
if (pBody)
{
FE_InsertMessageCompositionText(context,pBody,TRUE);
}
//
// Now set the message as being edited!
//
pCompose->SetModified(TRUE);
//
// Finally deal with the attachments...
//
if (sendMailPtr->MSG_nFileCount > 0)
{
// Send this puppy when done with the attachments...
if (!winShowFlag)
{
pCompose->SetMAPISendMode(MAPI_SEND);
}
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
sizeof(MSG_AttachmentData));
if (!pAttach)
{
return(MAPI_E_INSUFFICIENT_MEMORY);
}
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
sizeof(MSG_AttachmentData));
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
CString cs;
// Create URL from filename...
WFE_ConvertFile2Url(cs,
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
pAttach[i].url = XP_STRDUP(cs);
// Now also include the "display" name...
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
}
// Set the list!
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
// Now free everything...
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
if (pAttach[i].url)
XP_FREE(pAttach[i].url);
if (pAttach[i].real_name)
XP_FREE(pAttach[i].real_name);
}
XP_FREE(pAttach);
}
//
// Now, if we were supposed to do the blind send...do it, otherwise,
// just popup the window...
//
if (winShowFlag)
{
// Post message to compose window to set the initial focus.
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
}
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
{
pCompose->PostMessage(WM_COMMAND, IDM_SEND);
}
return(SUCCESS_SUCCESS);
}
//
// This function will create a composition window and just attach
// the attachments of interest and pop up the window...
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoPartialMAPIMailOperation(MAPISendDocumentsType *sendDocPtr)
{
CGenericDoc *pDocument;
// Get a context to use for this call...
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
{
return(MAPI_E_FAILURE);
}
// Don't allow a compose window to be created if the user hasn't
// specified an email address
const char *real_addr = FE_UsersMailAddress();
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
{
return(MAPI_E_FAILURE);
}
//
// Now, build the fields object w/o much info...
//
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
MSG_CompositionFields *fields =
MSG_CreateCompositionFields(real_addr, real_addr, NULL,
"", "",
"", "", "",
"", "", "",
"", "", "",
"",
bEncrypt,
bSign);
if (!fields)
{
return(MAPI_E_FAILURE);
}
// RICHIE - INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
// int16 win_csid = INTL_GetCSIWinCSID(csi);
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*RICHIE win_csid,*/ TRUE);
if ( !pDocument )
{
// cleanup fields object
MSG_DestroyCompositionFields(fields);
return(MAPI_E_FAILURE);
}
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
if ( !pContext )
{
return(MAPI_E_FAILURE);
}
MSG_CompositionPaneCallbacks Callbacks;
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
MWContext *context = pContext->GetContext();
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
pCompose->SetComposeStuff(context,fields); // squirl away stuff for post-create
// This needs to be set TRUE if using the old non-HTML text frame
// to prevent dropping dragged URLs
pContext->m_bDragging = !pCompose->UseHtml();
if (!pCompose->UseHtml())
{
pCompose->SetMsgPane(MSG_CreateCompositionPane(
pContext->GetContext(),
context,
g_MsgPrefs.m_pMsgPrefs, fields,
WFE_MSGGetMaster()));
}
ASSERT(pCompose->GetMsgPane());
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
pCompose->UpdateAttachmentInfo();
// Pass doccsid info to new context for MailToWin conversion
/***
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(pOldContext));
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
(doccsid ? doccsid : INTL_DefaultDocCharSetID(pOldContext)));
****/
pCompose->DisplayHeaders(NULL);
CComposeBar * pBar = pCompose->GetComposeBar();
ASSERT(pBar);
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
if (!pIAddressList->IsCreated())
{
pBar->CreateAddressingBlock();
}
// Always do plain text composition!
pCompose->CompleteComposeInitialization();
//
// Finally deal with the attachments...
//
NSstringSeq mailInfoSeq = (NSstringSeq) &(sendDocPtr->dataBuf[0]);
DWORD stringCount = 0;
DWORD i;
TRACE("MAPI: ProcessMAPISendDocuments() # of Attachments = [%d]\n", sendDocPtr->nFileCount);
if (sendDocPtr->nFileCount > 0)
{
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
XP_CALLOC((sendDocPtr->nFileCount + 1),
sizeof(MSG_AttachmentData));
if (!pAttach)
{
return(MAPI_E_INSUFFICIENT_MEMORY);
}
memset(pAttach, 0, (sendDocPtr->nFileCount + 1) *
sizeof(MSG_AttachmentData));
for (i=0; i<sendDocPtr->nFileCount; i++)
{
CString cs;
// Create URL from filename...
WFE_ConvertFile2Url(cs,
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
pAttach[i].url = XP_STRDUP(cs);
// Now also include the "display" name...
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
}
// Set the list!
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
// Now free everything...
for (i=0; i<sendDocPtr->nFileCount; i++)
{
if (pAttach[i].url)
XP_FREE(pAttach[i].url);
if (pAttach[i].real_name)
XP_FREE(pAttach[i].real_name);
}
XP_FREE(pAttach);
}
//
// Now some checking for ... well I'm not sure...
//
if (MSG_GetAttachmentList(pCompose->GetMsgPane()))
pCompose->SetModified(TRUE);
else
pCompose->SetModified(FALSE);
// Post message to compose window to set the initial focus.
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
//
// Now, just popup the window...
//
pCompose->ShowWindow(TRUE);
// return pCompose->GetMsgPane(); rhp - used to return the MsgPane
return(SUCCESS_SUCCESS);
}
static void _GetMailCallback(HWND hwnd, MSG_Pane *pane, void *closure)
{
if (pane != NULL)
{
ShowWindow(hwnd, SW_HIDE);
MSG_Command( pane, MSG_GetNewMail, NULL, 0 );
}
}
static void _GetMailDoneCallback(HWND hwnd, MSG_Pane *pane, void *closure)
{
for(CGenericFrame * f = theApp.m_pFrameList; f; f = f->m_pNext)
f->PostMessage(WM_COMMAND, (WPARAM) ID_DONEGETTINGMAIL, (LPARAM) 0);
}
//
// This will fire off a "get mail in background operation" in an
// async. fashion.
//
extern "C" void
MAPIGetNewMessagesInBackground(void)
{
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
// rhp - we should not hit the net if we are offline!
if (NET_IsOffline())
return;
if (!pFrame)
return;
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
return;
TRACE("MAPI: DOWNLOAD MAIL IN BACKGROUND\n");
new CProgressDialog(
pFrame->GetFrameWnd(),
NULL,
_GetMailCallback, NULL, NULL,
_GetMailDoneCallback);
}
//
// This function will save a message into the Communicator "Drafts"
// folder with no UI showing.
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoMAPISaveMailOperation(MAPISendMailType *sendMailPtr,
const char *pInitialText)
{
CGenericDoc *pDocument;
LPSTR subject;
NSstringSeq mailInfoSeq;
DWORD stringCount = 6;
DWORD i;
BOOL winShowFlag = FALSE;
// Get a context to use for this call...
MWContext *pOldContext = GetUsableContext();
if (!pOldContext)
{
return(MAPI_E_FAILURE);
}
// Don't allow a compose window to be created if the user hasn't
// specified an email address
const char *real_addr = FE_UsersMailAddress();
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
{
return(MAPI_E_FAILURE);
}
//
// Now, we must build the fields object...
//
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
subject = NSStrSeqGet(mailInfoSeq, 0);
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
char toString[1024] = "";
char ccString[1024] = "";
char bccString[1024] = "";
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
{
LPSTR ptr;
UCHAR tempString[256];
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
// figure which type of address this is?
if (addrType == MAPI_CC)
ptr = ccString;
else if (addrType == MAPI_BCC)
ptr = bccString;
else
ptr = toString;
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
if ( (!emailPtr) && (!namePtr))
{
return(MAPI_E_INVALID_RECIPS);
}
if (!emailPtr)
emailPtr = namePtr;
char *tptr = strchr(emailPtr, ':');
if (tptr != NULL)
{
if ( (*tptr != '\0') && (*(tptr+1) != '\0') )
{
emailPtr = (tptr + 1);
}
}
/**
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
{
emailPtr += 5;
}
**/
// Now build the temp string to tack on in the format
// "Rich Pizzarro" <rhp@netscape.com>
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
// add a comma if not the first one
if (ptr[0] != '\0')
lstrcat(ptr, ",");
// tack on string!
lstrcat(ptr, (LPSTR) tempString);
}
BOOL bEncrypt = FALSE;
BOOL bSign = FALSE;
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
MSG_CompositionFields *fields =
MSG_CreateCompositionFields(real_addr, real_addr,
toString,
ccString,
bccString,
"", "", "",
"", subject, "",
"", "", "",
"",
bEncrypt,
bSign);
if (!fields)
{
return(MAPI_E_FAILURE);
}
// RICHIE
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
// int16 win_csid = INTL_GetCSIWinCSID(csi);
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
if ( !pDocument )
{
return(MAPI_E_FAILURE);
}
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
if ( !pContext )
{
return(MAPI_E_FAILURE);
}
MSG_CompositionPaneCallbacks Callbacks;
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
int16 doccsid;
MWContext *context = pContext->GetContext();
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
// This needs to be set TRUE if using the old non-HTML text frame
// to prevent dropping dragged URLs
pContext->m_bDragging = !pCompose->UseHtml();
if (!pCompose->UseHtml())
{
pCompose->SetMsgPane(
MSG_CreateCompositionPane(pContext->GetContext(),
context,
g_MsgPrefs.m_pMsgPrefs,
fields,
WFE_MSGGetMaster())
);
}
ASSERT(pCompose->GetMsgPane());
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
pCompose->UpdateAttachmentInfo();
// Pass doccsid info to new context for MailToWin conversion
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
pCompose->DisplayHeaders(NULL);
CComposeBar * pBar = pCompose->GetComposeBar();
ASSERT(pBar);
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
if (!pIAddressList->IsCreated())
{
pBar->CreateAddressingBlock();
}
// rhp - Deal with addressing the brute force way! This is a
// "fix" for bad behavior when creating these windows and not
// showing them on the desktop.
if (!winShowFlag) // Hack to fix the window not being mapped
{
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
}
// Always do plain text composition!
pCompose->CompleteComposeInitialization();
// Do this so we don't get popups on "empty" messages
if ( (!pInitialText) || (!(*pInitialText)) )
pInitialText = " ";
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
if (pBody)
{
FE_InsertMessageCompositionText(context,pBody,TRUE);
}
//
// Now set the message as being edited!
//
pCompose->SetModified(TRUE);
//
// Finally deal with the attachments...
//
if (sendMailPtr->MSG_nFileCount > 0)
{
// Send this puppy when done with the attachments...
if (!winShowFlag)
{
pCompose->SetMAPISendMode(MAPI_SAVE);
}
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
sizeof(MSG_AttachmentData));
if (!pAttach)
{
return(MAPI_E_INSUFFICIENT_MEMORY);
}
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
sizeof(MSG_AttachmentData));
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
CString cs;
// Create URL from filename...
WFE_ConvertFile2Url(cs,
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
pAttach[i].url = XP_STRDUP(cs);
// Now also include the "display" name...
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
}
// Set the list!
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
// Now free everything...
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
{
if (pAttach[i].url)
XP_FREE(pAttach[i].url);
if (pAttach[i].real_name)
XP_FREE(pAttach[i].real_name);
}
XP_FREE(pAttach);
}
//
// Now, if we were supposed to do the blind send...do it, otherwise,
// just popup the window...
//
if (winShowFlag)
{
// Post message to compose window to set the initial focus.
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
}
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
{
pCompose->PostMessage(WM_COMMAND, IDM_SAVEASDRAFT);
}
return(SUCCESS_SUCCESS);
}

View File

@@ -1,89 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef _MAPI_MAIL_H_
#define _MAPI_MAIL_H_
#include "nscpmapi.h"
#include <structs.h> // for MWContext
//extern "C" {
//
// This function will create a composition window and either do
// a blind send or pop up the compose window for the user to
// complete the operation
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoFullMAPIMailOperation(MAPISendMailType *sendMailPtr,
const char *pInitialText,
BOOL winShowFlag);
//
// This function will create a composition window and just attach
// the attachments of interest and pop up the window...
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoPartialMAPIMailOperation(MAPISendDocumentsType *sendDocPtr);
//
// This function will save a message into the Communicator "Drafts"
// folder with no UI showing.
//
// Return: appropriate MAPI return code...
//
//
extern "C" LONG
DoMAPISaveMailOperation(MAPISendMailType *sendMailPtr,
const char *pInitialText);
//
// This will fire off a "get mail in background operation" in an
// async. fashion.
//
extern "C" void
MAPIGetNewMessagesInBackground(void);
// } // extern "C"
#endif // _MAPI_MAIL_H_

View File

@@ -1,173 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// smem.cpp - This deals with all shared memory functions needed for
// the MAPI component of Communicator
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include <windows.h>
#include <windowsx.h>
#include "mapismem.h"
#ifndef ZeroMemory
#include <memory.h>
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
#endif // ZeroMemory
//
// *create new* shared memory chunk
// once this is created, use the pointer
// to the segment to to store data
// e.g.:
// lpString = "string for communicator";
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
//
CSharedMem *
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory)
{
#ifdef WIN32
BOOL bExistedBefore;
CSharedMem *pData;
LPCTSTR szObjectName = memName;
DWORD dwSize = sizeof(CSharedMem) + memSize;
*hSharedMemory = CreateFileMapping(
(HANDLE)0xFFFFFFFF,0,PAGE_READWRITE,0,dwSize,szObjectName);
if(*hSharedMemory == 0)
{
return NULL;
}
bExistedBefore = (GetLastError() == ERROR_ALREADY_EXISTS);
if(bExistedBefore)
{
return NULL;
}
pData = (CSharedMem *)MapViewOfFile(
*hSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if(pData == NULL)
{
return NULL;
}
ZeroMemory(pData, dwSize);
pData->m_dwSize = memSize;
return pData;
#else
CSharedMem *sMemChunk = NULL;
DWORD dwSize = memSize = (sizeof(CSharedMem) + memSize);
if (sMemChunk != NULL)
return(sMemChunk);
sMemChunk = (CSharedMem *) GlobalAllocPtr(GMEM_MOVEABLE, dwSize);
ZeroMemory(sMemChunk, (size_t) dwSize);
sMemChunk->m_dwSize = dwSize; // Missing in Communicator code!
return(sMemChunk);
#endif // WIN32
}
//
// *open existing* shared memory chunk
// once you have the pointer to the new segment
// use this pointer to access data, e.g.:
//
CSharedMem *
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory)
{
#ifdef WIN32
CSharedMem *pData;
DWORD dwSize;
LPCTSTR szObjectName = memName;
*hSharedMemory = OpenFileMapping(
FILE_MAP_WRITE,FALSE,szObjectName);
if(*hSharedMemory == 0)
{
return NULL;
}
pData = (CSharedMem *)MapViewOfFile(
*hSharedMemory,FILE_MAP_ALL_ACCESS,0,0,0);
if(pData == NULL)
{
return NULL;
}
dwSize = pData->m_dwSize;
return pData;
#else
return(NULL); // In Win16, this is really meaningless...
#endif
}
//
// to close shared memory segment
//
void
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory)
{
#ifdef WIN32
if(pData != 0)
{
UnmapViewOfFile(pData);
pData = 0;
}
if(hSharedMemory != 0)
{
CloseHandle(hSharedMemory);
hSharedMemory = 0;
}
#else
if (pData != NULL)
{
GlobalFreePtr(pData);
pData = NULL;
}
#endif // WIN32
}

View File

@@ -1,116 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef __SMEM_HPP__
#define __SMEM_HPP__
//
// Need this for Win16 since it is an undocumented message
//
#ifndef WIN32
#define WM_COPYDATA 0x004A
/*
* lParam of WM_COPYDATA message points to...
*/
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
LPVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
# ifndef LPCTSTR
# define LPCTSTR LPCSTR
# endif
#endif // ifndef WIN32
// The following structure will be stored in the shared memory
// and will be used to pass data back and forth
#pragma pack(4)
typedef struct
{
DWORD m_dwSize; // size of the shared memory block
BYTE m_buf[1]; // this is the buffer of memory to be used
} CSharedMem;
#pragma pack(4)
// ******************************************************
// Public routines...
// ******************************************************
//
//
// *create new* shared memory chunk
// once this is created, use the pointer
// to the segment to to store data
// e.g.:
// lpString = "string for communicator";
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
// pData->m_dwBytesUsed = lstrlen(lpString) + 1; // count '\0'
//
CSharedMem *
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory);
//
// *open existing* shared memory chunk
// once you have the pointer to the new segment
// use this pointer to access data, e.g.:
//
// This will return the pointer to the memory chunk as well as
// fill out the hSharedMemory argument that is needed for subsequent
// operations.
//
// if(pData->m_dwBytesUsed > 0)
// {
// // use pData->m_buf here
// }
//
CSharedMem *
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory);
//
// You must pass in the pointer to the memory chunk as well as
// the hSharedMemory HANDLE to close shared memory segment
//
void
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory);
#endif // __SMEM_HPP__

View File

@@ -1,230 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// This is a string sequence handling routine to take complex
// structures and merge them into a chunk of memory.
//
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <windowsx.h>
#include "nsstrseq.h"
#ifndef NULL
#define NULL '\0'
#endif
#define MARKER '\377'
//
// Delete an existing string sequence
//
void NSStrSeqDelete(NSstringSeq seq)
{
if (seq != NULL)
free(seq);
seq = NULL;
}
//
// Allocate a new sequence, copying the given strings into it.
//
NSstringSeq NSStrSeqNew(LPSTR strings[])
{
int size;
if (!strings)
{
return NULL;
}
{
int i;
for (i=0,size=0; strings[i]; i++)
{
size+=strlen(strings[i])+1;
switch (strings[i][0])
{
// Need to pad "" or anything starting with 255
// to allow for multiple blank strings in a row
case 0:
case MARKER:
size++;
break;
default:
break;
}
}
}
{
NSstringSeq s=(NSstringSeq)malloc(size+1);
if (!s)
{ return NULL;}
{
int i,offset;
for (i=0,offset=0; strings[i]; i++)
{
switch (strings[i][0])
{
// Need to pad "" or anything starting with 255
case 0:
case MARKER:
s[offset++]=MARKER;
break;
default:
break;
}
strcpy(s+offset,strings[i]);
offset+=strlen(strings[i])+1;
}
s[offset]=0;
}
return s;
}
}
//
// Get the # of bytes required for the sequence
//
LONG NSStrSeqSize(NSstringSeq seq)
{
const char* s;
if (!seq)
{
return -1;
}
for (s=seq+1; ((*s) || (*(s-1))); s++)
;
// At this point, s points to the second 0
// of the double 0 at the end
return (s-seq)+1;
}
//
// Get the # of strings in the sequence
//
LONG NSStrSeqNumStrs(NSstringSeq seq)
{
const char* s;
int N;
if (!seq)
{
return -1;
}
for (s=seq+1,N=0; ((*s) || (*(s-1))); s++)
{
if (!(*s))
N++;
}
return N;
}
static LPSTR correct(LPSTR s)
{
if (s[0]==MARKER)
return s+1;
else // Anup , 4/96
return s;
}
//
// Extract the index'th string in the sequence
//
LPSTR NSStrSeqGet(NSstringSeq seq, LONG index)
{
char* s;
int N;
if (!seq)
{
return NULL;
}
if (index<0)
{
return NULL;
}
if (!index)
return correct(seq);
for (s=seq+1,N=0; ((*s) || (*(s-1))) && (N<index); s++)
{
if (!(*s))
N++;
}
if (N==index)
return correct(s);
return NULL;
}
LPSTR * NSStrSeqGetAll(NSstringSeq seq)
{
LONG N=NSStrSeqNumStrs(seq);
if (N<0)
return NULL;
{
char** res=(char**)malloc( (size_t) ((N+1)*sizeof(char*)) );
int i;
if (!res)
{
return NULL;
}
for (i=0; i<N; i++)
res[i]=NSStrSeqGet(seq,i);
res[N]=NULL;
return res;
}
}

View File

@@ -1,68 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef __SEQUENCES_OF_STRINGS_H_
#define __SEQUENCES_OF_STRINGS_H
typedef LPSTR NSstringSeq;
#ifdef __cplusplus
extern "C"
{
#endif
void NSStrSeqDelete(NSstringSeq seq);
NSstringSeq NSStrSeqNew(LPSTR strings[]);
// Get the # of bytes required for the sequence
LONG NSStrSeqSize(NSstringSeq seq);
// Get the # of strings in the sequence
LONG NSStrSeqNumStrs(NSstringSeq seq);
// Extract the index'th string in the sequence
LPSTR NSStrSeqGet(NSstringSeq seq, LONG index);
// Build an array of all the strings in the sequence
LPSTR *NSStrSeqGetAll(NSstringSeq seq);
#ifdef __cplusplus
}
#endif
#endif // __sequences_of_strings_h_

View File

@@ -1,100 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// DLLMain to get a handle on an hInstance
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
#include <windows.h>
//
// global variables
//
HINSTANCE hInstance;
//
// DLL entry
//
#ifdef WIN32
/****************************************************************************
FUNCTION: DllMain(HANDLE, DWORD, LPVOID)
PURPOSE: DllMain is called by Windows when
the DLL is initialized, Thread Attached, and other times.
Refer to SDK documentation, as to the different ways this
may be called.
The DllMain function should perform additional initialization
tasks required by the DLL. In this example, no initialization
tasks are required. DllMain should return a value of 1 if
the initialization is successful.
*******************************************************************************/
BOOL APIENTRY DllMain(HANDLE hInstLocal, DWORD ul_reason_being_called, LPVOID lpReserved)
{
hInstance = (HINSTANCE)hInstLocal;
if (hInstance != NULL)
return 1;
else
return 0;
}
#else // WIN16
//--------------------------------------------------------------------
// LibMain( hInstance, wDataSegment, wHeapSize, lpszCmdLine ) : WORD
//
// hInstance library instance handle
// wDataSegment library data segment
// wHeapSize default heap size
// lpszCmdLine command line arguments
//
//--------------------------------------------------------------------
int CALLBACK LibMain(HINSTANCE hInstLocal, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine)
{
hInstance = hInstLocal;
/* return result 1 = success; 0 = fail */
if (hInstance != NULL)
return 1;
else
return 0;
}
#endif // WIN16

View File

@@ -1,70 +0,0 @@
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
#
DEPTH=..\..\..
MODULE=mapi32
################################################################################
## exports
#EXPORTS =
################################################################################
## library
LIBNAME = .\$(OBJDIR)\mapi32
DEFINES= -NS_DEBUG
DEFFILE=MAPI32.def
!ifdef MOZ_STATIC_COMPONENT_LIBS
LIB = $(LIBNAME).lib
!else
DLL = $(LIBNAME).dll
!endif
OBJS= \
.\$(OBJDIR)\maindll.obj \
.\$(OBJDIR)\mapi32.obj \
.\$(OBJDIR)\mapiipc.obj \
.\$(OBJDIR)\mapimem.obj \
.\$(OBJDIR)\mapiutl.obj \
.\$(OBJDIR)\smem.obj \
.\$(OBJDIR)\trace.obj \
.\$(OBJDIR)\xpapi.obj \
$(NULL)
LLIBS= \
$(LLIBS) \
$(LIBNSPR) \
$(DIST)\lib\xppref32.lib \
$(DIST)\lib\xpcom.lib \
$(DIST)\lib\mapiutils_s.lib \
$(NULL)
include <$(DEPTH)\config\rules.mak>
!ifdef MOZ_STATIC_COMPONENT_LIBS
install:: $(LIB)
$(MAKE_INSTALL) $(LIBNAME).$(LIB_SUFFIX) $(DIST)\bin\components
!else
install:: $(DLL)
$(MAKE_INSTALL) $(LIBNAME).$(DLL_SUFFIX) $(DIST)\bin\components
!endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,14 +0,0 @@
EXPORTS
MAPILogon
MAPILogoff
MAPISendMail
MAPISendDocuments
MAPIFreeBuffer
MAPIFindNext
MAPIReadMail
MAPISaveMail
MAPIDeleteMail
MAPIAddress
MAPIDetails
MAPIResolveName
MAPIGetNetscapeVersion

View File

@@ -1,146 +0,0 @@
// Insert copyright and license here 1997
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
ID_DIALOG_MAPI DIALOGEX 0, 0, 186, 111
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW
CAPTION "Netscape MAPI Support"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,41,95,50,14
PUSHBUTTON "Cancel",IDCANCEL,104,95,50,14
GROUPBOX "Diagnostic Information",IDC_STATIC,2,2,182,91
CTEXT "This window will contain MAPI relative\ninformation for Netscape Communicator",
IDC_STATIC,11,14,159,30
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
ID_DIALOG_MAPI, DIALOG
BEGIN
LEFTMARGIN, 2
RIGHTMARGIN, 184
TOPMARGIN, 2
BOTTOMMARGIN, 109
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 5,0,0,1
PRODUCTVERSION 5,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Simple MAPI DLL\0"
VALUE "CompanyName", "Netscape Communications Corporation\0"
VALUE "FileDescription", "mapi32\0"
VALUE "FileVersion", "5, 0, 0, 1\0"
VALUE "InternalName", "mapi32\0"
VALUE "LegalCopyright", "Copyright © 1997\0"
VALUE "LegalTrademarks", "Netscape and Netscape Navigator are registered trademarks of Netscape Communications Corporation.\0"
VALUE "OriginalFilename", "mapi32.dll\0"
VALUE "ProductName", "Netscape Communications Simple MAPI\0"
VALUE "ProductVersion", "5, 0, 0, 1\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // !_MAC
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -1,249 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// MAPI IPC Routines
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include <windows.h>
#include <windowsx.h>
#include <nscpmapi.h> // Should live in Communicator
#include "resource.h"
#include "mapiipc.h"
#include "mapismem.h"
#include "trace.h"
#ifndef WIN32
#include <string.h>
#endif
//
// Necessary variables...
//
static LONG instanceCount = 0;
HWND hWndMAPI = NULL;
char szClassName[] = "NetscapeMAPIClient";
char szWindowName[] = "NetscapeMAPI";
//
// External declares...
//
extern HINSTANCE hInstance;
void
ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
{
switch (id)
{
case IDOK:
case IDCANCEL:
{
ShowWindow(hWnd, SW_HIDE);
}
default:
;
}
}
BOOL CALLBACK LOADDS
MyDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch (wMsg)
{
case WM_INITDIALOG:
{
hWndMAPI = hWndMain;
}
break;
case WM_CLOSE:
// DestroyWindow(hWndMain);
break;
case WM_DESTROY:
hWndMain = NULL;
break;
case WM_COMMAND:
HANDLE_WM_COMMAND(hWndMAPI, wParam, lParam, ProcessCommand);
break;
default:
return FALSE;
}
return TRUE;
}
BOOL
InitInstance(HINSTANCE hInstance)
{
//
// Create a main window for this application instance.
//
/* RICHIE - TRY SOME CHANGES!!!
hWndMAPI = CreateDialog((HINSTANCE) hInstance,
MAKEINTRESOURCE(ID_DIALOG_QAHOOK),
(HWND) NULL, (DLGPROC) MyDlgProc);
******/
hWndMAPI = CreateWindow(
szClassName, // pointer to registered class name
szWindowName, // pointer to window name
WS_CHILD, // window style
-10, // horizontal position of window
-10, // vertical position of window
1, // window width
1, // window height
GetDesktopWindow(), // handle to parent or owner window
NULL, // handle to menu or child-window identifier
hInstance, // handle to application instance
NULL // pointer to window-creation data
);
if (!hWndMAPI)
return FALSE;
else
return TRUE;
}
BOOL
InitApp(void)
{
#ifdef WIN32
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = DefDlgProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ID_ICON_APP));
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
if(!RegisterClass(&wc))
return FALSE;
#endif
return TRUE;
} // end InitApp
BOOL
InitDLL(void)
{
if (hWndMAPI != NULL)
return TRUE;
if (!InitApp())
{
return FALSE;
}
if (!InitInstance(hInstance))
{
return FALSE;
}
// ShowWindow(hWndMAPI, SW_SHOW); Just for jollies
return(TRUE);
}
//*************************************************************
//* Calls exposed for rest of DLL...
//*************************************************************
//
// Purpose: Open the API
// Return: 1 on success
// 0 on failure
//
DWORD nsMAPI_OpenAPI(void)
{
if (instanceCount > 0)
{
return(1);
}
++instanceCount;
return(1);
}
//
// Purpose: Close the API
//
void nsMAPI_CloseAPI(void)
{
--instanceCount;
if (instanceCount <= 0)
{
instanceCount = 0;
}
return;
}
//
// Send the actual request to Communicator
//
LRESULT
SendMAPIRequest(HWND hWnd,
DWORD mapiRequestID,
MAPIIPCType *ipcInfo)
{
LRESULT returnVal = 0;
COPYDATASTRUCT cds;
if (!InitDLL())
{
return 0;
}
cds.dwData = mapiRequestID;
cds.cbData = sizeof(MAPIIPCType);
cds.lpData = ipcInfo;
// Make the call into Communicator
returnVal = SendMessage(hWnd, WM_COPYDATA, (WPARAM) hWndMAPI, (LPARAM) &cds);
// Now kill the window...
DestroyWindow(hWndMAPI);
hWndMAPI = NULL;
UnregisterClass(szClassName, hInstance);
return returnVal;
}

View File

@@ -1,63 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef __MAPIIPC_HPP__
#define __MAPIIPC_HPP__
#include "port.h"
#include <nscpmapi.h>
//********************************************************
// Open and close functions for API
//********************************************************
// Open the API
// Return: 1 on success, 0 on failure
//
DWORD nsMAPI_OpenAPI(void);
//
// Purpose: Close the API
//
void nsMAPI_CloseAPI(void);
//
// Send the actual request to Communicator
//
LRESULT SendMAPIRequest(HWND hWnd,
DWORD mapiRequestID,
MAPIIPCType *ipcInfo);
#endif // __MAPIIPC_HPP__

View File

@@ -1,363 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// mem.cpp
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
// This implements various memory management functions for use with
// MAPI features of Communicator
//
#include <windows.h>
#include <memory.h>
#include <malloc.h>
#include "mapimem.h"
#include <nscpmapi.h> // lives in communicator winfe
#include "nsstrseq.h"
#include "trace.h"
#include "mapiutl.h"
#include "xpapi.h"
LPSTR
CheckNullString(LPSTR inStr)
{
static UCHAR str[1];
str[0] = '\0';
if (inStr == NULL)
return((LPSTR)str);
else
return(inStr);
}
void
FreeMAPIFile(lpMapiFileDesc pv)
{
if (!pv)
return;
if (pv->lpszPathName != NULL)
free(pv->lpszPathName);
if (pv->lpszFileName != NULL)
free(pv->lpszFileName);
}
void
FreeMAPIMessage(lpMapiMessage pv)
{
ULONG i;
if (!pv)
return;
if (pv->lpszSubject != NULL)
free(pv->lpszSubject);
if (pv->lpszNoteText)
free(pv->lpszNoteText);
if (pv->lpszMessageType)
free(pv->lpszMessageType);
if (pv->lpszDateReceived)
free(pv->lpszDateReceived);
if (pv->lpszConversationID)
free(pv->lpszConversationID);
if (pv->lpOriginator)
FreeMAPIRecipient(pv->lpOriginator);
for (i=0; i<pv->nRecipCount; i++)
{
if (&(pv->lpRecips[i]) != NULL)
{
FreeMAPIRecipient(&(pv->lpRecips[i]));
}
}
if (pv->lpRecips != NULL)
{
free(pv->lpRecips);
}
for (i=0; i<pv->nFileCount; i++)
{
if (&(pv->lpFiles[i]) != NULL)
{
FreeMAPIFile(&(pv->lpFiles[i]));
}
}
if (pv->lpFiles != NULL)
{
free(pv->lpFiles);
}
free(pv);
pv = NULL;
}
void
FreeMAPIRecipient(lpMapiRecipDesc pv)
{
if (!pv)
return;
if (pv->lpszName != NULL)
free(pv->lpszName);
if (pv->lpszAddress != NULL)
free(pv->lpszAddress);
if (pv->lpEntryID != NULL)
free(pv->lpEntryID);
}
//
// This routine will take an lpMapiMessage structure and "flatten" it into
// one contiguous chunk of memory that can be easily passed around. After this
// is done, "extract" routines will be written to get complicated string routines
// out of the chunk of memory at the end.
//
LPVOID
FlattenMAPIMessageStructure(lpMapiMessage msg, DWORD *totalSize)
{
MAPISendMailType *mailPtr;
LPSTR *strArray;
DWORD strCount = 0;
DWORD currentString = 0;
DWORD arrayBufSize = 0;
DWORD i;
*totalSize = 0;
if (!msg)
return(NULL);
//
// Allocate the initial structure to hold all of the mail info.
//
*totalSize = sizeof(MAPISendMailType);
mailPtr = (MAPISendMailType *) malloc(sizeof(MAPISendMailType));
if (!mailPtr)
return(NULL);
memset(mailPtr, 0, sizeof(MAPISendMailType));
//
// First, assign all of the easy numeric values...
//
mailPtr->MSG_flFlags = msg->flFlags; // unread,return receipt
mailPtr->MSG_nRecipCount = msg->nRecipCount; // Number of recipients
mailPtr->MSG_nFileCount = msg->nFileCount; // # of file attachments
if (msg->lpOriginator != NULL)
{
mailPtr->MSG_ORIG_ulRecipClass = msg->lpOriginator->ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
}
//
// Now, figure out how many string pointers we need...
//
strCount = 4; // These are the 4 KNOWN strings up front for a message
strCount += 2; // This is for the originator name and address
strCount += msg->nRecipCount * 3; // Name, address & class (cc, bcc) for each recipient
strCount += msg->nFileCount * 2; // filename and display name for each attachment
//
// Now allocate a new string sequence...add one entry for NULL at the end
//
arrayBufSize = sizeof(LPSTR) * (strCount + 1);
#ifdef WIN16 // Check for max mem allocation...
if ((sizeof(MAPISendMailType) + arrayBufSize) > 64000)
{
free(mailPtr);
return NULL;
}
#endif
//
// Allocate a buffer for the string pointers and if this fails,
// cleanup and return.
//
strArray = (LPSTR *)malloc( (size_t) arrayBufSize);
if (!strArray)
{
free(mailPtr);
return NULL;
}
memset(strArray, 0, (size_t) arrayBufSize); // Set the array to NULL
strArray[currentString++] = CheckNullString(msg->lpszSubject); // Message Subject
strArray[currentString++] = CheckNullString(msg->lpszNoteText); // Message Text
strArray[currentString++] = CheckNullString(msg->lpszDateReceived); // in YYYY/MM/DD HH:MM format
strArray[currentString++] = CheckNullString(msg->lpszConversationID); // conversation thread ID
if (msg->lpOriginator)
{
strArray[currentString++] = CheckNullString(msg->lpOriginator[0].lpszName);
strArray[currentString++] = CheckNullString(msg->lpOriginator[0].lpszAddress);
}
else
{
strArray[currentString++] = CheckNullString(NULL);
strArray[currentString++] = CheckNullString(NULL);
}
//
// Assign pointers for the Name and address of each recipient
//
LPSTR toString = "1";
LPSTR ccString = "2";
LPSTR bccString = "3";
for (i=0; i<msg->nRecipCount; i++)
{
// rhp - need message class
if (msg->lpRecips[i].ulRecipClass == MAPI_BCC)
strArray[currentString++] = CheckNullString(bccString);
else if (msg->lpRecips[i].ulRecipClass == MAPI_CC)
strArray[currentString++] = CheckNullString(ccString);
else
strArray[currentString++] = CheckNullString(toString);
strArray[currentString++] = CheckNullString(msg->lpRecips[i].lpszName);
strArray[currentString++] = CheckNullString(msg->lpRecips[i].lpszAddress);
}
BYTE szNewFileName[_MAX_PATH];
for (i=0; i<msg->nFileCount; i++)
{
char *namePtr;
// have to copy/create temp files here of office won't work...
if (
(msg->lpFiles[i].lpszFileName != NULL) &&
(*msg->lpFiles[i].lpszFileName != '\0')
)
{
namePtr = (char *)msg->lpFiles[i].lpszFileName;
}
else
{
namePtr = (char *)msg->lpFiles[i].lpszPathName;
}
if (GetTempMailNameWithExtension((char *)szNewFileName, namePtr) == 0)
{
free(strArray);
free(mailPtr);
return NULL;
}
if (!XP_CopyFile((char *)msg->lpFiles[i].lpszPathName, (char *)szNewFileName, TRUE))
{
free(strArray);
free(mailPtr);
return NULL;
}
strArray[currentString++] = CheckNullString((char *)szNewFileName);
strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszFileName);
AddTempFile((LPSTR) szNewFileName);
// strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszPathName);
// strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszFileName);
}
if (currentString != strCount)
{
TRACE("MAPI PROBLEM!!!!!! FlattenMAPIMessageStructure() currentString != strCount\n");
}
strArray[strCount] = NULL; // terminate at the end
NSstringSeq strSeq = NSStrSeqNew(strArray);
if (!strSeq)
{
free(strArray);
free(mailPtr);
return NULL;
}
//
// Now we need to copy the structure into a big, contiguous chunk of memory
//
LONG totalArraySize = NSStrSeqSize(strSeq);
LONG totalMemSize = sizeof(MAPISendMailType) + totalArraySize;
#ifdef WIN16
if (totalMemSize > 64000)
{
free(strArray);
NSStrSeqDelete(strSeq);
free(mailPtr);
return NULL;
}
#endif
MAPISendMailType *newMailPtr = (MAPISendMailType *)malloc((size_t)totalMemSize);
if (!newMailPtr)
{
free(strArray);
NSStrSeqDelete(strSeq);
free(mailPtr);
return NULL;
}
memset(newMailPtr, 0, (size_t) totalMemSize);
//
// Finally do the copy...
//
memcpy(newMailPtr, mailPtr, sizeof(MAPISendMailType));
memcpy(newMailPtr->dataBuf, strSeq, (size_t) totalArraySize);
*totalSize = totalMemSize;
//
// Cleanup and scram...
//
if (strArray)
free(strArray);
if (strSeq)
NSStrSeqDelete(strSeq);
if (mailPtr)
free(mailPtr);
return(newMailPtr);
}

View File

@@ -1,76 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef __MY_MEM_HPP__
#define __MY_MEM_HPP__
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
#include <mapi.h>
#endif
//
// Needed for turning NULL's into ""'s for string sequence routines...
//
LPSTR CheckNullString(LPSTR inStr);
//
// Memory allocation functions...
//
//
// This will free an lpMapiMessage structure allocated by this DLL
//
void FreeMAPIMessage(lpMapiMessage pv);
//
// This will free an lpMapiRecipDesc structure allocated by this DLL
//
void FreeMAPIRecipient(lpMapiRecipDesc pv);
//
// Frees a mapi file object...
//
void FreeMAPIFile(lpMapiFileDesc pv);
//
// This routine will take an lpMapiMessage structure and "flatten" it into
// one contiguous chunk of memory that can be easily passed around.
//
LPVOID FlattenMAPIMessageStructure(lpMapiMessage msg, DWORD *totalSize);
#endif // __MY_MEM_HPP__

View File

@@ -1,899 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// Various utils needed for the MAPI functions
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include <windows.h>
#include <time.h>
#include <sys/stat.h>
#include <io.h>
#include "xpapi.h"
#include "trace.h"
#include "mapiipc.h"
#include "mapiutl.h"
//
// Global variables
//
BOOL gLoggingEnabled = FALSE;
void
SetLoggingEnabled(BOOL val)
{
gLoggingEnabled = val;
}
// Log File
void
LogString(LPCSTR pStr1)
{
// Off of the declaration line...
LPCSTR pStr2 = NULL;
BOOL useStr1 = TRUE;
if (gLoggingEnabled)
{
char tempPath[_MAX_PATH] = "";
if (getenv("TEMP"))
{
lstrcpy((LPSTR) tempPath, getenv("TEMP")); // environmental variable
}
int len = lstrlen(tempPath);
if ((len > 1) && tempPath[len - 1] != '\\')
{
lstrcat(tempPath, "\\");
}
lstrcat(tempPath, szMapiLog);
HFILE hFile = _lopen(tempPath, OF_WRITE);
if (hFile == HFILE_ERROR)
{
hFile = _lcreat(tempPath, 0);
}
if (hFile != HFILE_ERROR)
{
_llseek(hFile, 0, SEEK_END); // seek to the end of the file
LPCSTR pTemp = useStr1 ? pStr1 : pStr2;
_lwrite(hFile, pTemp, lstrlen(pTemp));
_lclose(hFile);
}
}
}
//
// Find Communicator and return an HWND, if not, start Communicator,
// then find an HWND
//
HWND
GetCommunicatorIPCWindow(void)
{
HWND hWnd = NULL;
DWORD timeCount = 0;
BOOL launchTry = FALSE;
//
// This will wait for 10 seconds before giving up and failing
//
while ((hWnd == NULL) && (timeCount < 20))
{
if ((hWnd = FindWindow("AfxFrameOrView", NULL)) && !FindWindow("aHiddenFrameClass", NULL))
return(hWnd);
else if ((hWnd = FindWindow("aHiddenFrameClass", NULL)))
return(hWnd);
if (!launchTry)
{
char szPath[_MAX_PATH] = "";
DWORD nMAPIERROR;
if ((nMAPIERROR = XP_GetInstallLocation(szPath, _MAX_PATH)) != SUCCESS_SUCCESS)
{
return(NULL);
}
WORD nReturn = XP_CallProcess(szPath, " -MAPICLIENT");
launchTry = TRUE;
}
//
// Pause for 1/2 a second and try to connect again...
//
#ifdef WIN32
Sleep(500);
#else
Yield();
#endif
timeCount++;
}
return(hWnd);
}
void
BuildMemName(LPSTR name, ULONG winSeed)
{
static DWORD id = 0;
if (id == 0)
{
// Seed the random-number generator with current time so that
// the numbers will be different every time we run.
srand( (unsigned)time( NULL ) );
id = rand();
}
wsprintf(name, "MAPI_IPC_SMEM-%d", (winSeed + id++));
TRACE("Shared Memory Name = [%s]\n", name);
}
DWORD
ValidateFile(LPCSTR szFile)
{
struct _stat buf;
int result;
result = _stat( szFile, &buf );
if (result != 0)
return(1);
if (!(buf.st_mode & S_IREAD))
return(2);
return(0);
}
//
// return of zero is ok
// 1 = MAPI_E_ATTACHMENT_NOT_FOUND
// 2 = MAPI_E_ATTACHMENT_OPEN_FAILURE
//
DWORD
SanityCheckAttachmentFiles(lpMapiMessage lpMessage)
{
ULONG i;
DWORD rc;
for (i=0; i<lpMessage->nFileCount; i++)
{
if ((rc = ValidateFile(lpMessage->lpFiles[i].lpszPathName)) != 0)
{
return(rc);
}
}
return(0);
}
DWORD
GetFileCount(LPSTR pFiles, LPSTR delimChar)
{
DWORD count = 1;
if ((!pFiles) || (!*pFiles))
return(0);
for (DWORD i=0; i<strlen(pFiles); i++)
{
if (pFiles[i] == delimChar[0])
{
++count;
}
}
return(count);
}
//
// Extract a filename from a string
// Return TRUE if file found, else FALSE
//
BOOL
ExtractFile(LPSTR pFiles, LPSTR delimChar, DWORD fIndex, LPSTR fName)
{
LPSTR ptr = pFiles;
DWORD loc;
DWORD count = 0;
if ((!pFiles) || (!*pFiles))
return(0);
// Get to the fIndex'th entry
for (loc=0; loc<strlen(pFiles); loc++)
{
if (count == fIndex)
break;
if (pFiles[loc] == delimChar[0])
count++;
}
if (loc >= strlen(pFiles)) // Got to the end of string!
return(FALSE);
lstrcpy(fName, (LPSTR)pFiles + loc);
//
// Truncate at 2nd delimiter
//
for (DWORD i=0; i<strlen(fName); i++)
{
if (fName[i] == delimChar[0])
{
fName[i] = '\0';
break;
}
}
return(TRUE);
}
ULONG
GetFileSize(LPSTR fName)
{
struct _stat buf;
int result;
result = _stat( fName, &buf );
if (result != 0)
return(0);
return(buf.st_size);
}
LPVOID
LoadBlobToMemory(LPSTR fName)
{
UCHAR *ptr = NULL;
ULONG bufSize = GetFileSize(fName);
if (bufSize == 0)
{
_unlink(fName);
return(NULL);
}
ptr = (UCHAR *)malloc( (size_t) bufSize);
if (!ptr)
{
_unlink(fName);
return(NULL);
}
HFILE hFile = _lopen(fName, OF_READ);
if (hFile == HFILE_ERROR)
{
_unlink(fName);
free(ptr);
return(NULL);
}
UINT numRead = _lread(hFile, ptr, (size_t) bufSize);
_lclose(hFile);
if (numRead != bufSize)
{
_unlink(fName);
free(ptr);
return(NULL);
}
_unlink(fName);
return(ptr);
}
LONG
WriteMemoryBufferToDisk(LPSTR fName, LONG bufSize, LPSTR buf)
{
if (!buf)
{
return(-1);
}
HFILE hFile = _lcreat(fName, 0);
if (hFile == HFILE_ERROR)
{
return(-1);
}
LONG writeCount = _lwrite(hFile, buf, (size_t) bufSize);
_lclose(hFile);
if (writeCount != bufSize)
{
_unlink(fName);
return(-1);
}
return(0);
}
LPSTR
GetTheTempDirectoryOnTheSystem(void)
{
static UCHAR retPath[_MAX_PATH];
if (getenv("TEMP"))
{
lstrcpy((LPSTR) retPath, getenv("TEMP")); // environmental variable
}
else if (getenv("TMP"))
{
lstrcpy((LPSTR) retPath, getenv("TMP")); // How about this environmental variable?
}
else
{
GetWindowsDirectory((LPSTR) retPath, sizeof(retPath));
}
return((LPSTR) &(retPath[0]));
}
#ifdef WIN16
int WINAPI EXPORT ISGetTempFileName(LPCSTR a_pDummyPath, LPCSTR a_pPrefix, UINT a_uUnique, LPSTR a_pResultName)
{
#ifdef GetTempFileName // we need the real thing comming up next...
#undef GetTempFileName
#endif
return GetTempFileName(0, a_pPrefix, a_uUnique, a_pResultName);
}
#endif
LONG
GetTempAttachmentName(LPSTR fName)
{
UINT res;
static UINT uUnique = 1;
if (!fName)
return(-1);
LPSTR szTempPath = GetTheTempDirectoryOnTheSystem();
TRYAGAIN:
#ifdef WIN32
res = GetTempFileName(szTempPath, "MAPI", uUnique++, fName);
#else
res = ISGetTempFileName(szTempPath, "MAPI", uUnique++, fName);
#endif
if (ValidateFile(fName) != 1)
{
if (uUnique < 32000)
{
goto TRYAGAIN;
}
else
{
return(-1);
}
}
return 0;
}
// RICHIE - strip all of the HTML stuff out of the message...
int
CheckForInlineHTML(char *noteBody, DWORD len, DWORD *curPos, char *newBody, DWORD *realLen)
{
LPSTR tags[] = {"&nbsp;", "&lt;", "&amp;", NULL};
UCHAR tagsSubst[] = {' ', '<', '&', NULL};
int x = 0;
while (tags[x])
{
// should we check for first tag
if ( (*curPos+strlen(tags[x])) < len)
{
if (strncmp(tags[x], noteBody, strlen(tags[x])) == 0)
{
*curPos += strlen(tags[x]) - 1;
newBody[*realLen] = tagsSubst[x];
*realLen += 1;
return(-1);
}
}
++x;
}
return(0);
}
//
// RICHIE - This is also temporary fix for now...
//
LPSTR
StripSignedMessage(LPSTR noteText, DWORD totalCR)
{
char *newBuf;
LPSTR startTag = "<HTML>";
LPSTR endTag = "/HTML>";
DWORD i;
DWORD realLen = 0;
DWORD startPos = 0;
DWORD len = strlen(noteText);;
// create a new buffer...
newBuf = (char *) malloc((size_t)(len + totalCR));
if (!newBuf)
return(noteText);
newBuf[0] = '\0';
// First, find the start of the HTML for the message...
for (i=0; i<len; i++)
{
// should we check for first tag
if ( (i+strlen(startTag)) < len)
{
if (strncmp(startTag, (noteText + i), strlen(startTag)) == 0)
{
startPos = i + strlen(startTag);
break;
}
}
}
// Didn't find any HTML start tag
if (i == len)
return(noteText);
BOOL inHTML = FALSE;
BOOL firstChar = FALSE;
for (i=startPos; i<len; i++)
{
char *ptr = (noteText + i);
if ( ((*ptr == 0x0D) || (*ptr == 0x20)) && (!firstChar) )
continue;
else
firstChar = TRUE;
// First, check for the end /HTML> tag
if ( (i+strlen(endTag)) < len)
{
if (strncmp(endTag, ptr, strlen(endTag)) == 0)
{
break;
}
}
// If we are in HTML, check for a ">"...
if (inHTML)
{
if (*ptr == '>')
{
inHTML = FALSE;
}
continue;
}
// Check for NEW HTML...
if (*ptr == '<')
{
inHTML = TRUE;
continue;
}
if (CheckForInlineHTML(ptr, len, &i, newBuf, &realLen))
continue;
newBuf[realLen++] = *ptr;
// Tack on a line feed if we hit a CR...
if ( *ptr == 0x0D )
{
newBuf[realLen++] = 0x0A;
}
}
// terminate the buffer - reallocate and move on...
newBuf[realLen++] = '\0';
newBuf = (LPSTR) realloc(newBuf, (size_t) realLen);
// check if the realloc worked and if so, free old memory and
// return...if not, just return the original buffer
if (!newBuf)
{
return(noteText);
}
else
{
free(noteText);
return(newBuf);
}
}
//
// RICHIE - this is a temporary fix for now to get rid of
// html stuff within the text of a message - if there was a
// valid noteText buffer coming into this call, we need to
// free it on the way out.
//
LPSTR
StripHTML(LPSTR noteText)
{
char *newBuf;
LPSTR signTag = "This is a cryptographically signed message in MIME format.";
LPSTR mimeTag = "This is a multi-part message in MIME format.";
DWORD i;
DWORD realLen = 0;
DWORD totalCR = 0;
// do sanity checking...
if ((!noteText) || (!(*noteText)))
return(noteText);
// more sanity checking...
DWORD len = strlen(noteText) + 1;
if (len <= 0)
return(noteText);
// Get the number of CR's in this message and add room for
// the LF's
for (i=0; i<len; i++)
{
if ( (*(noteText + i)) == 0x0D )
++totalCR;
}
// This is a check for a signed message in the start of a message
// check for sign line...
if ( strlen(signTag) < len)
{
if (
(strncmp(signTag, noteText, strlen(signTag)) == 0) ||
(strncmp(mimeTag, noteText, strlen(mimeTag)) == 0)
)
{
return( StripSignedMessage(noteText, totalCR) );
}
}
// create a new buffer...
newBuf = (char *) malloc((size_t)(len + totalCR));
if (!newBuf)
return(noteText);
newBuf[0] = '\0';
BOOL firstChar = FALSE;
// Now do the translation for the body of the note...
for (i=0; i<len; i++)
{
char *ptr = (noteText + i);
if ( ((*ptr == 0x0D) || (*ptr == 0x20)) && (!firstChar) )
continue;
else
firstChar = TRUE;
if (CheckForInlineHTML(ptr, len, &i, newBuf, &realLen))
continue;
newBuf[realLen++] = *ptr;
if ( *ptr == 0x0D )
{
newBuf[realLen++] = 0x0A;
}
}
// terminate the buffer - reallocate and move on...
newBuf[realLen++] = '\0';
newBuf = (LPSTR) realloc(newBuf, (size_t) realLen);
// check if the realloc worked and if so, free old memory and
// return...if not, just return the original buffer
if (!newBuf)
{
return(noteText);
}
else
{
free(noteText);
return(newBuf);
}
}
#ifdef WIN16
void
GetWin16TempName(LPSTR realFileName, LPSTR tempPath,
LPSTR szTempFileName, UINT uUnique)
{
char *dotPtr = strrchr(realFileName, '.');
if (dotPtr != NULL)
{
*dotPtr = '\0';
}
int nameLen = lstrlen(realFileName);
if (dotPtr != NULL)
{
*dotPtr = '.';
}
if (nameLen <= 7)
{
wsprintf(szTempFileName, "%s\\%d%s", tempPath, uUnique, realFileName);
}
else
{
wsprintf(szTempFileName, "%s\\%d%s", tempPath, uUnique, (realFileName + 1));
}
}
#endif
#define MAXTRY 9999 // How many times do we try..
UINT
GetTempMailNameWithExtension(LPSTR szTempFileName,
LPSTR origName)
{
UINT res = 1;
UINT uUnique = 0;
char *szTempPath = GetTheTempDirectoryOnTheSystem();
char *tmpPtr;
char *realFileName = NULL;
if ( (origName != NULL) && (*origName != '\0') )
{
tmpPtr = origName;
}
else
{
tmpPtr = szTempFileName;
}
realFileName = strrchr(tmpPtr, '\\');
if (!realFileName)
realFileName = tmpPtr;
else
realFileName++;
TRYAGAIN:
#ifdef WIN32
if (uUnique == 0)
{
wsprintf(szTempFileName, "%s\\%s", szTempPath, realFileName);
}
else
{
wsprintf(szTempFileName, "%s\\%d_%s",
szTempPath, uUnique, realFileName);
}
#else // WIN16
if ( (uUnique == 0) && (strlen(realFileName) <= 12) )
{
wsprintf(szTempFileName, "%s\\%s", szTempPath, realFileName);
}
else
{
if (uUnique < 10)
{
GetWin16TempName(realFileName, szTempPath, szTempFileName, uUnique);
}
else
{
res = ISGetTempFileName(szTempPath, "ns", uUnique++, szTempFileName);
}
// Now add the correct extension...
char *origExt = strrchr(realFileName, '.');
if (origExt != NULL)
{
char *tmpExt = strrchr(szTempFileName, '.');
if (tmpExt != NULL)
{
origExt++;
tmpExt++;
while ( ((tmpExt) && (origExt)) && (*origExt != '\0') )
{
*tmpExt = *origExt;
tmpExt++;
origExt++;
}
*tmpExt = '\0';
}
}
}
#endif
if ( (ValidateFile(szTempFileName) != 1) && (uUnique < MAXTRY) )
{
uUnique++;
if (uUnique >= MAXTRY)
return(1);
goto TRYAGAIN;
}
return res;
}
#define kMaxTempFiles 10
#define kMaxListLength (10 * _MAX_PATH)
void GetTempFiles(LPSTR pBuf, int lenBuf)
{
if (!GetConfigInfoStr(szMapiSection, szTempFiles, pBuf, lenBuf, HKEY_ROOT))
{
*pBuf = 0;
}
}
void WriteTempFiles(LPSTR pBuf)
{
SetConfigInfoStr(szMapiSection, szTempFiles, pBuf, HKEY_ROOT);
}
void AddTempFile(LPCSTR pFileName)
{
if ( (!pFileName) || (pFileName[0] == '\0') )
return;
char *files = (char *)malloc(kMaxListLength);
if (!files)
return;
GetTempFiles(files, kMaxListLength);
if ((lstrlen(files) + lstrlen(pFileName) + 2) >= kMaxListLength)
{
free(files);
return;
}
if (lstrlen(files) != 0)
{
lstrcat(files, ";");
}
lstrcat(files, pFileName);
WriteTempFiles(files);
free(files);
}
void DeleteFirstTempFile(LPSTR pFiles)
{
if (!*pFiles)
return;
LPSTR pTemp = strchr(pFiles, ';');
if (pTemp)
{
*pTemp = 0;
}
//#ifndef _DEBUG
_unlink(pFiles);
//#endif
if (pTemp)
{
memmove(pFiles, pTemp + 1, lstrlen(pTemp + 1) + 1);
}
else
{
*pFiles = 0;
}
}
void
RemoveAllTempFiles(void)
{
char *files = (char *)malloc(kMaxListLength);
if (!files)
return;
GetTempFiles(files, kMaxListLength);
while (*files)
{
DeleteFirstTempFile(files);
}
WriteTempFiles(files);
free(files);
}
void CheckAgeTempFiles(void)
{
char *files = (char *)malloc(kMaxListLength);
if (!files)
return;
GetTempFiles(files, kMaxListLength);
int i = 0;
LPSTR pTemp = files;
while (TRUE)
{
pTemp = strchr(pTemp, ';');
if (!pTemp)
break;
++pTemp;
++i;
}
if (i >= 10)
{
DeleteFirstTempFile(files);
WriteTempFiles(files);
}
free(files);
}
void
CleanupMAPITempFiles(void)
{
if (Is_16_OR_32_BIT_CommunitorRunning() == 0)
{
RemoveAllTempFiles(); // if Communicator not running, clean up all the temp files
}
else
{
CheckAgeTempFiles();
}
}
void *
CleanMalloc(size_t mallocSize)
{
void *ptr = malloc(mallocSize);
if (!ptr)
return(NULL);
memset(ptr, 0, mallocSize);
return(ptr);
}
void
SafeFree(void *ptr)
{
if (!ptr)
return;
free(ptr);
ptr = NULL;
}

View File

@@ -1,89 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef __UTILS_
#define __UTILS_
#ifdef __cplusplus
extern "C"
{
#endif
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
#include <mapi.h>
#endif
//
// Utility functions...
//
void SetLoggingEnabled(BOOL val); // Set a logging enabled flag
void LogString(LPCSTR pStr1); // Log a string to a file...
void BuildMemName(LPSTR name, ULONG winSeed); // Shared memory name
HWND GetCommunicatorIPCWindow(void); // Get the IPC window we will use...
DWORD SanityCheckAttachmentFiles(lpMapiMessage lpMessage); // Check attachments
DWORD ValidateFile(LPCSTR szFile); // Is this a valid file - 0=Yes 1 = NOT_FOUND 2 = OPEN_FAILURE
DWORD GetFileCount(LPSTR pFiles, LPSTR delimChar); // Get File count from string of file1;file2, etc..
BOOL ExtractFile(LPSTR pFiles, LPSTR delimChar, DWORD fIndex, LPSTR fName); // Extract a filename from a string
LPVOID LoadBlobToMemory(LPSTR fName); // Load the blob into memory!
LONG GetTempAttachmentName(LPSTR fName); // Get a temp file name and put it in fName
UINT GetTempMailNameWithExtension(LPSTR szTempFileName, LPSTR origName);
void CleanupMAPITempFiles(void);
void AddTempFile(LPCSTR pFileName);
void *CleanMalloc(size_t mallocSize);
void SafeFree(void *ptr);
//
// RICHIE - this is a temporary fix for now to get rid of
// html stuff within the text of a message - if there was a
// valid noteText buffer coming into this call, we need to
// free it on the way out.
//
LPSTR StripHTML(LPSTR noteText);
//
// Write a buffer to disk
// Return 0 on success -1 on failure
//
LONG WriteMemoryBufferToDisk(LPSTR fName, LONG bufSize, LPSTR buf);
#ifdef __cplusplus
}
#endif
#endif // __UTILS_

View File

@@ -1,303 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
#ifndef PORT_H
#define PORT_H
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************\
* *
* PORT.H *
* *
* Win16/Win32 portability stuff *
* *
* A.Sokolsky *
* 3.10.94 distilled into this header *
* *
\*****************************************************************/
/*
* calling conventions
*/
#include <assert.h>
#ifndef CDECL
#define CDECL __cdecl
#endif // CDECL
#ifndef PASCAL
#define PASCAL __pascal
#endif // PASCAL
#ifdef FASTCALL
#error FASTCALL defined
#endif // FASTCALL
#ifdef NDEBUG
#define FASTCALL __fastcall
#else
#define FASTCALL PASCAL
#endif // NDEBUG
#ifndef HWND2DWORD
# ifdef WIN32
# define HWND2DWORD(X_hWnd) ( (DWORD)(X_hWnd) )
# else // WIN16
# define HWND2DWORD(X_hWnd) ( (DWORD)MAKELONG(((WORD)(X_hWnd)), 0) )
# endif
#endif // HWND2DWORD
/*
* WIN16 - WIN32 compatibility stuff
*/
#ifdef WIN32
# define DLLEXPORT __declspec( dllexport )
# define EXPORT
# define LOADDS
# define HUGE
# ifndef FAR
# define FAR
# endif // FAR
# ifndef NEAR
# define NEAR
# endif // NEAR
# ifdef UNICODE
# define SIZEOF(x) (sizeof(x)/sizeof(WCHAR))
# else
# define SIZEOF(x) sizeof(x)
# endif
#else // !WIN32 == WIN16
# define DLLEXPORT
# define EXPORT __export
# define LOADDS __loadds
# define HUGE __huge
# ifndef FAR
# define FAR __far
# define NEAR __near
# endif // FAR
# define CONST const
# define SIZEOF(x) sizeof(x)
# define CHAR char
# define TCHAR char
# define WCHAR char
# ifndef LPTSTR
# define LPTSTR LPSTR
# endif
# ifndef LPCTSTR
# define LPCTSTR LPCSTR
# endif
# define UNREFERENCED_PARAMETER(x) x;
# ifndef TEXT
# define TEXT(x) x
# endif
# define GetWindowTextW GetWindowText
# define lstrcpyW lstrcpy
# define BN_DBLCLK BN_DOUBLECLICKED // ~~MRJ needed for custom control.
// ~~MRJ begin Win95 backward compat section
# define LPWSTR LPSTR
# define LPCWSTR LPCSTR
// button check state for WIN16
#ifndef BST_UNCHECKED
#define BST_UNCHECKED 0x0000
#endif
#ifndef BST_CHECKED
#define BST_CHECKED 0x0001
#endif
#ifndef WIN95_COMPAT
# define WIN95_COMPAT
#endif
// ~~MRJ end Win95 compat section.
// critical section API stubs
typedef DWORD CRITICAL_SECTION;
typedef CRITICAL_SECTION FAR * LPCRITICAL_SECTION;
#ifdef __cplusplus
inline void InitializeCriticalSection(LPCRITICAL_SECTION lpSection) {}
inline void DeleteCriticalSection(LPCRITICAL_SECTION lpSection) {}
inline void EnterCriticalSection(LPCRITICAL_SECTION lpSection) {}
inline void LeaveCriticalSection(LPCRITICAL_SECTION lpSection) {}
#endif // __cplusplus
// Added for nssock16 ---Neeti
#ifndef ZeroMemory
#include <memory.h>
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
#endif // ZeroMemory
#endif // WIN16
/*
* unix - windows compatibility stuff
*/
typedef DWORD u_int32;
typedef WORD u_int16;
typedef BYTE u_int8;
#ifdef WIN32
typedef short int Bool16;
#else // WIN16
typedef BOOL Bool16;
#endif // WIN16
/*
* Cross Platform Compatibility
*/
#ifndef UNALIGNED
# ifdef _M_ALPHA
# define UNALIGNED __unaligned
# else // !_M_ALPHA
# define UNALIGNED
# endif // !_M_ALPHA
#endif // UNALIGNED
//
// RICHIE - for the Alpha port
//
#ifdef _M_ALPHA
# undef pascal
# undef PASCAL
# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
# define pascal __stdcall
# define PASCAL __stdcall
# else
# define PASCAL
# endif
#endif
/*
* Useful Types
*/
typedef char HUGE *HPSTR;
typedef const char HUGE *HPCSTR;
typedef unsigned char HUGE *HPBYTE;
typedef WORD HUGE *HPWORD;
typedef UINT FAR *LPUINT;
typedef BOOL (CALLBACK *USERABORTPROC)();
typedef BOOL (CALLBACK *PROGRESSPROC)(UINT uPos, UINT uRange);
typedef int INT; // ~~MRJ a function needed this defined.
typedef MINMAXINFO FAR *LPMINMAXINFO; // ~~MRJ
//
// stuff missing from windows.h
//
#ifndef MAKEWORD
#define MAKEWORD(low, high) ((WORD)(((BYTE)(low)) | (((WORD)((BYTE)(high))) << 8)))
#endif // MAKEWORD
#ifdef WIN32
# ifndef hmemcpy
# define hmemcpy memcpy
# endif // !defined(hmemcpy)
# define _fmemset memset
# include <malloc.h>
#ifdef __cplusplus
inline BOOL IsGDIObject(HGDIOBJ hObj) { return (hObj != 0); }
inline void *_halloc(long num, unsigned int size) { return malloc(num * size); }
inline void _hfree( void *memblock ) { free(memblock); }
/*
inline BOOL IsInstance(HINSTANCE hInst) {
# ifdef WIN32
return (hInst != 0);
# else // WIN16
return (hInst > HINSTANCE_ERROR);
# endif
}
*/
#endif // __cplusplus
WINUSERAPI HANDLE WINAPI LoadImageA(HINSTANCE, LPCSTR, UINT, int, int, UINT);
#endif // WIN32
#ifdef __cplusplus
inline BOOL IsInstance(HINSTANCE hInst) {
# ifdef WIN32
return (hInst != 0);
# else // WIN16
return (hInst > HINSTANCE_ERROR);
# endif
}
inline void SetWindowSmallIcon(HINSTANCE hInst, HWND hWnd, UINT uIconResourceId) {
#ifdef WIN32
# ifndef WM_SETICON
# define WM_SETICON 0x0080
# endif // WM_SETICON
# ifndef IMAGE_ICON
# define IMAGE_ICON 1
# endif
assert(IsWindow(hWnd));
HICON hIcon = (HICON)LoadImageA(hInst, MAKEINTRESOURCE(uIconResourceId), IMAGE_ICON,
16, 16, 0);
if(NULL != hIcon) {
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
} else {
HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(uIconResourceId));
assert(hIcon != 0);
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
}
#endif // WIN32
}
#endif // __cplusplus
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* PORT_H */

View File

@@ -1,54 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by mapi32.rc
//
#define ID_DIALOG_QAHOOK 101
#define ID_DIALOG_MAPI 101
#define ID_ICON_APP 102
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -1,172 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// smem.cpp - This deals with all shared memory functions needed for
// the MAPI component of Communicator
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include <windows.h>
#include <windowsx.h>
#include "mapismem.h"
#ifndef ZeroMemory
#include <memory.h>
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
#endif // ZeroMemory
//
// *create new* shared memory chunk
// once this is created, use the pointer
// to the segment to to store data
// e.g.:
// lpString = "string for communicator";
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
//
CSharedMem *
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory)
{
#ifdef WIN32
BOOL bExistedBefore;
CSharedMem *pData;
LPCTSTR szObjectName = memName;
DWORD dwSize = sizeof(CSharedMem) + memSize;
*hSharedMemory = CreateFileMapping(
(HANDLE)0xFFFFFFFF,0,PAGE_READWRITE,0,dwSize,szObjectName);
if(*hSharedMemory == 0)
{
return NULL;
}
bExistedBefore = (GetLastError() == ERROR_ALREADY_EXISTS);
if(bExistedBefore)
{
return NULL;
}
pData = (CSharedMem *)MapViewOfFile(
*hSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if(pData == NULL)
{
return NULL;
}
ZeroMemory(pData, dwSize);
pData->m_dwSize = memSize;
return pData;
#else
CSharedMem *sMemChunk = NULL;
DWORD dwSize = memSize = (sizeof(CSharedMem) + memSize);
if (sMemChunk != NULL)
return(sMemChunk);
sMemChunk = (CSharedMem *) GlobalAllocPtr(GMEM_MOVEABLE, dwSize);
ZeroMemory(sMemChunk, (size_t) dwSize);
sMemChunk->m_dwSize = dwSize; // Missing in Communicator code!
return(sMemChunk);
#endif // WIN32
}
//
// *open existing* shared memory chunk
// once you have the pointer to the new segment
// use this pointer to access data, e.g.:
//
CSharedMem *
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory)
{
#ifdef WIN32
CSharedMem *pData;
DWORD dwSize;
LPCTSTR szObjectName = memName;
*hSharedMemory = OpenFileMapping(
PAGE_READWRITE,FALSE,szObjectName);
if(*hSharedMemory == 0)
{
return NULL;
}
pData = (CSharedMem *)MapViewOfFile(
*hSharedMemory,FILE_MAP_ALL_ACCESS,0,0,0);
if(pData == NULL)
{
return NULL;
}
dwSize = pData->m_dwSize;
return pData;
#else
return(NULL); // In Win16, this is really meaningless...
#endif
}
//
// to close shared memory segment
//
void
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory)
{
#ifdef WIN32
if(pData != 0)
{
UnmapViewOfFile(pData);
pData = 0;
}
if(hSharedMemory != 0)
{
CloseHandle(hSharedMemory);
hSharedMemory = 0;
}
#else
if (pData != NULL)
{
GlobalFreePtr(pData);
pData = NULL;
}
#endif // WIN32
}

View File

@@ -1,68 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include <windows.h>
#include <stdio.h>
#include <stdarg.h>
#include <tchar.h>
#include "trace.h"
#ifdef _DEBUG
#ifndef WIN16
void CDECL AfxTrace(LPCTSTR lpszFormat, ...)
#else
void CDECL AfxTrace(LPCSTR lpszFormat, ...)
#endif
{
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vstprintf(szBuffer, lpszFormat, args);
va_end(args);
OutputDebugString(szBuffer);
return;
}
BOOL AfxAssertFailedLine(LPCSTR lpszFileName, int nLine)
{
return TRUE;
}
#endif

View File

@@ -1,81 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include <windows.h>
#ifdef _DEBUG
BOOL AfxAssertFailedLine(LPCSTR lpszFileName, int nLine);
#ifndef WIN16
void CDECL AfxTrace(LPCTSTR lpszFormat, ...);
#else
void CDECL AfxTrace(LPCSTR lpszFormat, ...);
#endif
#define TRACE ::AfxTrace
#define THIS_FILE __FILE__
#define ASSERT(f) \
do \
{ \
if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
AfxDebugBreak(); \
} while (0) \
#define VERIFY(f) ASSERT(f)
#define TRACE_FN(name) LogFn __logFn(name)
class LogFn
{
public:
LogFn(LPCSTR pFnName) {m_pFnName = pFnName; TRACE("--%s: In--\n", pFnName);}
~LogFn() {TRACE("--%s: Out--\n", m_pFnName);}
private:
LPCSTR m_pFnName;
};
#else
// NDEBUG
#define ASSERT(f) ((void)0)
#define VERIFY(f) ((void)(f))
#define ASSERT_VALID(pOb) ((void)0)
#define DEBUG_ONLY(f) ((void)0)
#ifdef WIN32
inline void CDECL AfxTrace(LPCTSTR, ...) { }
#else
inline void CDECL AfxTrace(LPCSTR, ...) { }
#endif
#define TRACE 1 ? (void)0 : ::AfxTrace
#define TRACE_FN(name)
#endif // _DEBUG

View File

@@ -1,347 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// XPAPI.CPP
// API implementation file for mapi16.dll and mapi32.dll
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#include <windows.h>
#include <stdio.h>
#include <stdarg.h>
#include "xpapi.h"
#include "mapiutl.h"
WORD LOAD_DS XP_CallProcess(LPCSTR pPath, LPCSTR pCmdLine)
{
WORD wReturn = 0;
#ifndef WIN16
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
if (wReturn = CreateProcess(pPath, (LPTSTR)pCmdLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP, NULL, NULL, &startupInfo, &processInfo))
{
WaitForInputIdle(processInfo.hProcess, 120000);
}
#else
// char szMsg[80];
char szExecute[512];
lstrcpy(szExecute, pPath);
lstrcat(szExecute, " ");
lstrcat(szExecute, pCmdLine);
wReturn = WinExec(szExecute,SW_SHOW);
if (wReturn < 32)
{
wReturn = 0;
}
#endif
return wReturn;
}
HKEY LOAD_DS RegOpenParent(LPCSTR pSection, HKEY hRootKey, REGSAM access)
{
HKEY hKey;
#ifndef WIN16
if (RegOpenKeyEx(hRootKey, pSection, 0, access, &hKey) != ERROR_SUCCESS)
{
return(NULL);
}
#else
if (RegOpenKey(hRootKey, pSection, &hKey) != ERROR_SUCCESS)
{
return(NULL);
}
#endif
return(hKey);
}
HKEY LOAD_DS RegCreateParent(LPCSTR pSection, HKEY hMasterKey)
{
HKEY hKey;
if (RegCreateKey(hMasterKey, pSection, &hKey) != ERROR_SUCCESS)
{
return(NULL);
}
return(hKey);
}
BOOL LOAD_DS GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey)
{
HKEY hKey;
hKey = RegOpenParent(pSection, hMasterKey, KEY_QUERY_VALUE);
if (!hKey)
{
return(FALSE);
}
DWORD len = (DWORD)lenBuf;
#ifndef WIN16
BOOL retVal = (RegQueryValueEx(hKey, pKey, NULL, NULL, (LPBYTE)pBuf, &len) == ERROR_SUCCESS);
#else
BOOL retVal = (RegQueryValue(hKey, pKey, pBuf, (long far*)&len) == ERROR_SUCCESS);
#endif
RegCloseKey(hKey);
return(retVal);
}
BOOL LOAD_DS GetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, DWORD* pVal, HKEY hMasterKey)
{
HKEY hKey;
hKey = RegOpenParent(pSection, hMasterKey, KEY_QUERY_VALUE);
if (!hKey)
{
return(FALSE);
}
DWORD len = sizeof(DWORD);
#ifndef WIN16
BOOL retVal = (RegQueryValueEx(hKey, pKey, NULL, NULL, (LPBYTE)pVal, &len) == ERROR_SUCCESS);
#else
BOOL retVal = (RegQueryValue(hKey, pKey, (char far*)pVal, (long far*)&len) == ERROR_SUCCESS);
#endif
RegCloseKey(hKey);
return(retVal);
}
BOOL LOAD_DS SetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pStr, HKEY hMasterKey)
{
HKEY hKey;
hKey = RegCreateParent(pSection, hMasterKey);
if (!hKey)
{
return(FALSE);
}
#ifndef WIN16
BOOL retVal = (RegSetValueEx(hKey, pKey, 0, REG_SZ, (LPBYTE)pStr, lstrlen(pStr) + 1) == ERROR_SUCCESS);
#else
BOOL retVal = (RegSetValue(hKey, pKey, REG_SZ, pStr, lstrlen(pStr) + 1) == ERROR_SUCCESS);
#endif
RegCloseKey(hKey);
return(retVal);
}
BOOL LOAD_DS XP_GetInstallDirectory(LPCSTR pcurVersionSection, LPCSTR pInstallDirKey, LPSTR path, UINT nSize, HKEY hKey)
{
#ifdef WIN32
if (!GetConfigInfoStr(pcurVersionSection, pInstallDirKey, path, nSize, hKey))
{
return FALSE;
}
else
{
return TRUE;
}
#else
if ( 0 < GetPrivateProfileString(pcurVersionSection, pInstallDirKey,"ERROR", path, nSize, szNetscapeINI))
{
return TRUE;
}
else
{
return FALSE;
}
#endif
}
BOOL LOAD_DS XP_GetVersionInfoString(LPCSTR pNavigatorSection, LPCSTR pCurrentVersionKey, LPSTR pcurVersionStr, UINT nSize, HKEY hKey)
{
#ifdef WIN32
if (!GetConfigInfoStr(pNavigatorSection, pCurrentVersionKey, pcurVersionStr, nSize, HKEY_LOCAL_MACHINE))
{
return FALSE;
}
else
{
return TRUE;
}
#else
if ( 0 < GetPrivateProfileString(pNavigatorSection, pCurrentVersionKey,"ERROR", pcurVersionStr, nSize, szNetscapeINI))
{
return TRUE;
}
else
{
return FALSE;
}
#endif
}
DWORD LOAD_DS XP_GetInstallLocation(LPSTR pPath, UINT nSize)
{
char curVersionStr[256];
char curVersionSection[256];
if (!pPath)
return MAPI_E_LOGON_FAILURE;
#ifdef WIN32
if (!XP_GetVersionInfoString(szNavigatorSection, szCurrentVersionKey, curVersionStr,
sizeof(curVersionStr), HKEY_LOCAL_MACHINE))
{
return (MAPI_E_LOGON_FAILURE);
}
wsprintf(curVersionSection, szNavigatorCurVersionSection, curVersionStr);
if (!XP_GetInstallDirectory(curVersionSection, szInstallDirKey, pPath,
nSize, HKEY_LOCAL_MACHINE))
{
return (MAPI_E_ACCESS_DENIED);
}
lstrcat(pPath, "\\");
lstrcat(pPath, "Program\\netscape.exe");
return SUCCESS_SUCCESS;
#else
if (32 == Is_16_OR_32_BIT_CommunitorRunning())
{
if (!GetConfigInfoStr("snews\\shell\\open", "command", curVersionStr, sizeof(curVersionStr), HKEY_CLASSES_ROOT))
{
return (MAPI_E_ACCESS_DENIED);
}
else
{
char *pFind = strstr(curVersionStr,"-h");
if (pFind)
{
*pFind=0;
lstrcpy(pPath,curVersionStr);
}
else
{
return (MAPI_E_ACCESS_DENIED);
}
}
return SUCCESS_SUCCESS;
}
else //setup up to start navstart since we are a sixteen bit DLL.
{
if (!XP_GetVersionInfoString(szNavigatorSection, szCurrentVersionKey, curVersionStr, sizeof(curVersionStr), HKEY_LOCAL_MACHINE))
{
return (MAPI_E_LOGON_FAILURE);
}
wsprintf(curVersionSection, szNavigatorCurVersionSection, curVersionStr);
if (!XP_GetInstallDirectory(curVersionSection, szInstallDirKey, pPath,nSize, HKEY_LOCAL_MACHINE))
{
return (MAPI_E_ACCESS_DENIED);
}
lstrcat(pPath, "\\");
lstrcat(pPath, "NAVSTART.EXE");
return SUCCESS_SUCCESS;
}
#endif
}
int LOAD_DS Is_16_OR_32_BIT_CommunitorRunning()
{
if (FindWindow("AfxFrameOrView", NULL) && !FindWindow("aHiddenFrameClass", NULL))
return(16);
else if (FindWindow("aHiddenFrameClass", NULL))
return(32);
else
return 0;
}
// size of buffer to use for copying files.
#define COPYBUFSIZE 1024
#ifdef WIN16
BOOL Win16CopyFile(LPCSTR a_Src, LPCSTR a_Dest, BOOL a_bOverwrite)
{
OFSTRUCT ofSrc, ofDest;
HFILE hSrc, hDest;
BOOL bResult;
ofDest.cBytes = ofSrc.cBytes = sizeof(OFSTRUCT);
hDest = OpenFile(a_Dest, &ofDest, OF_EXIST);
if (hDest != HFILE_ERROR && !a_bOverwrite)
bResult = FALSE; // file exists but caller doesn't want file overwritten
else { // file either doesn't exist, or caller wants it overwritten.
hSrc = OpenFile(a_Src, &ofSrc, OF_READ);
hDest = OpenFile(a_Dest, &ofDest, OF_WRITE | OF_CREATE);
if (hSrc != HFILE_ERROR && hDest != HFILE_ERROR) {
unsigned char buf[COPYBUFSIZE];
UINT bufsize = COPYBUFSIZE;
UINT bytesread;
bResult = TRUE;
while (0 != (bytesread = _lread(hSrc, (LPVOID)buf, bufsize))) {
if ((bytesread == HFILE_ERROR) || // check for read error...
// and write error
(bytesread != _lwrite(hDest, (LPVOID)buf, bytesread))) {
bResult = FALSE; // could be out of diskspace
break;
}
}
}
else
bResult = FALSE;
if (hSrc != HFILE_ERROR)
_lclose(hSrc);
if (hDest != HFILE_ERROR)
_lclose(hDest);
}
return bResult;
}
#endif // WIN16
BOOL LOAD_DS
XP_CopyFile(LPCSTR lpExistingFile, LPCSTR lpNewFile, BOOL bFailifExist)
{
#ifdef WIN32
return CopyFile(lpExistingFile, lpNewFile, bFailifExist);
#else
return Win16CopyFile(lpExistingFile, lpNewFile, TRUE);
#endif
}

View File

@@ -1,138 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// Various routines for MAPI functions.
// Written by: Rich Pizzarro (rhp@netscape.com)
// November 1997
//
#ifndef __XPAPI_H
#define __XPAPI_H
#ifdef WIN16
#include <string.h>
#include <direct.h>
#include <shellapi.h>
#include <stdlib.h>
#else
#include <winreg.h>
#endif
#ifdef WIN16
extern "C" {
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
#include <mapi.h>
#endif
}
#else
//#include <mapi.h>
#endif
#ifdef WIN32
#define MAPI_IMPLEMENT(param) param PASCAL
#define LOAD_DS
#else
#define LOAD_DS __loadds
#define MAPI_IMPLEMENT(param) extern "C" param FAR PASCAL
#endif
#ifdef WIN16
#define _MAX_PATH 260 /* max. length of full pathname*/
#define MAPI_E_LOGON_FAILURE 3
#define MAPI_E_ACCESS_DENIED 6
#define INVALID_HANDLE_VALUE (HANDLE)-1
#define KEY_QUERY_VALUE 0x0001
#define HKEY_LOCAL_MACHINE ((HKEY)0x80000002)
#define HKEY_ROOT HKEY_CLASSES_ROOT
#else
#define HKEY_ROOT ((HKEY)0x80000002)
#endif
//
// registry keys
//
#ifdef WIN32
static char szNavigatorSection[] = "Software\\Netscape\\Netscape Navigator";
static char szNavigatorCurVersionSection[] = "Software\\Netscape\\Netscape Navigator\\%s\\Main";
static char szCurrentVersionKey[] = "CurrentVersion";
static char szInstallDirKey[] = "Install Directory";
static char szMapiSection[] = "Software\\Netscape\\Netscape Navigator\\MAPI";
static char szTempFiles[] = "TempFiles";
static char szMapiLog[] = "NSMAPI32.LOG";
#else
//32 bit key strings for trying to read the 32bit registry
static char szNavigatorSection32[] = "Software\\Netscape\\Netscape Navigator";
static char szNavigatorCurVersionSection32[] = "Software\\Netscape\\Netscape Navigator\\%s\\Main";
static char szMapiSection32[] = "Software\\Netscape\\Netscape Navigator\\MAPI";
// ini section and key strings
static char szNetscapeINI[] = "nscp.ini";
static char szNavigatorSection[] = "Netscape Navigator";
static char szNavigatorCurVersionSection[] = "Netscape Navigator-%s";
static char szCurrentVersionKey[] = "CurrentVersion";
static char szInstallDirKey[] = "Install Directory";
static char szMapiSection[] = "MAPI";
static char szTempFiles[] = "TempFiles";
static char szExeName[] = "NAVSTART.EXE";
static char szMapiLog[] = "NSMAPI16.LOG";
#endif
//Since REGSAM is just an ACCESS_MASK which is just a DWORD and it's not
//declared in win16 we'll make one hear for the purpose of keeping parameters
//the same even though the access rights don't get used for win16.
typedef DWORD REGSAM;
// XP declarations
int LOAD_DS Is_16_OR_32_BIT_CommunitorRunning();
WORD LOAD_DS XP_CallProcess(LPCSTR pPath, LPCSTR pCmdLine);
HKEY LOAD_DS RegOpenParent(LPCSTR pSection, HKEY hRootKey, REGSAM access);
HKEY LOAD_DS RegCreateParent(LPCSTR pSection, HKEY hMasterKey);
BOOL LOAD_DS GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey);
BOOL LOAD_DS GetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, DWORD* pVal, HKEY hMasterKey);
BOOL LOAD_DS SetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pStr, HKEY hMasterKey);
BOOL LOAD_DS XP_GetInstallDirectory(LPCSTR pcurVersionSection, LPCSTR pInstallDirKey, LPSTR path, UINT nSize, HKEY hKey);
BOOL LOAD_DS XP_GetVersionInfoString(LPCSTR pNavigatorSection, LPCSTR pCurrentVersionKey, LPSTR pcurVersionStr, UINT nSize, HKEY hKey);
DWORD LOAD_DS XP_GetInstallLocation(LPSTR pPath, UINT nSize);
BOOL LOAD_DS XP_CopyFile(LPCSTR lpExistingFile, LPCSTR lpNewFile, BOOL bFailifExist);
#endif // __XPAPI_H

View File

@@ -1,351 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// This is a header file for the MAPI support within
// Communicator.
//
// Written by: Rich Pizzarro (rhp@netscape.com)
//
#ifndef _NSCPMAPI
#define _NSCPMAPI
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
#include <mapi.h> // for MAPI specific types...
#endif
#ifdef WIN16
typedef unsigned char UCHAR;
#endif
#define MAX_NAME_LEN 256
#define MAX_PW_LEN 256
#define MAX_MSGINFO_LEN 512
#define MAX_CON 4 // Maximum MAPI session supported
#define MAX_POINTERS 32
//
// The MAPI class that will act as the internal mechanism for
// Communicator to control multiple MAPI sessions.
//
class CMAPIConnection
{
protected:
LONG m_ID;
BOOL m_defaultConnection;
LONG m_sessionCount;
LONG m_messageIndex;
LPVOID m_cookie;
UCHAR m_messageFindInfo[MAX_MSGINFO_LEN];
UCHAR m_profileName[MAX_NAME_LEN];
UCHAR m_password[MAX_PW_LEN];
// Methods
public:
CMAPIConnection ( LONG, LPSTR, LPSTR );
~CMAPIConnection ( );
// ID related methods
LONG GetID( ) { return m_ID; } ;
// Dealing with the default session...
BOOL IsDefault( ) { return m_defaultConnection; } ;
void SetDefault( BOOL flag ) { m_defaultConnection = flag; } ;
// For handling multiple sessions on a profile name...
LONG GetSessionCount( ) { return m_sessionCount; } ;
void IncrementSessionCount() { ++m_sessionCount; } ;
void DecrementSessionCount() { --m_sessionCount; } ;
// Information retrieval stuff...
LPSTR GetProfileName( ) { return (LPSTR) m_profileName; };
LPSTR GetPassword( ) { return (LPSTR) m_password; };
// Dealing with message information...
void SetMessageIndex( LONG mIndex ) { m_messageIndex = mIndex; } ;
LONG GetMessageIndex( ) { return m_messageIndex; };
void SetMessageFindInfo( LPSTR info ) { lstrcpy((LPSTR)m_messageFindInfo, info); } ;
LPSTR GetMessageFindInfo( ) { return (LPSTR) m_messageFindInfo; };
// For enumerating Messages...
void SetMapiListContext( LPVOID cookie) { m_cookie = cookie; } ;
LPVOID GetMapiListContext( ) { return m_cookie; };
};
//
// Defines needed for requests being made with the WM_COPYDATA call...
//
typedef enum {
NSCP_MAPIStartRequestID = 0,
NSCP_MAPILogon,
NSCP_MAPILogoff,
NSCP_MAPIFree,
NSCP_MAPISendMail,
NSCP_MAPISendDocuments,
NSCP_MAPIFindNext,
NSCP_MAPIReadMail,
NSCP_MAPISaveMail,
NSCP_MAPIDeleteMail,
NSCP_MAPIAddress,
NSCP_MAPIDetails,
NSCP_MAPIResolveName,
NSCP_MAPIEndRequestID // Note: this is a marker for MAPI IPC requests
} NSCP_IPC_REQUEST;
//
// This is to keep track of the pointers allocated in the MAPI DLL
// and deal with them correctly.
//
#define MAPI_MESSAGE_TYPE 0
#define MAPI_RECIPIENT_TYPE 1
typedef struct {
LPVOID lpMem;
UCHAR memType;
} memTrackerType;
//
// This is the generic message that WM_COPYDATA will send to the
// Communicator product to allow it to attach to shared memory.
// NOTE: On Win16, this will simply reference a pointer.
//
typedef struct {
UCHAR smemName[64]; // Name of shared memory
DWORD smemSize; // Size of shared memory
LPVOID lpsmem; // Will be really used in Win16 only
} MAPIIPCType;
//
// These are message specific structures that will be used for
// the various MAPI operations.
//
typedef struct {
ULONG ulUIParam;
FLAGS flFlags;
LHANDLE lhSession;
DWORD ipcWorked; // Necessary for IPC check with Communicator
// LPSTR strSequence, // LPSTR lpszProfileName, LPSTR lpszPassword
// This is here to document the fact there will be a string sequence at
// this location
} MAPILogonType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
FLAGS flFlags;
DWORD ipcWorked; // Necessary for IPC check with Communicator
} MAPILogoffType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
FLAGS flFlags;
DWORD ipcWorked; // Necessary for IPC check with Communicator
// The following is the "FLAT" representation of the (lpMapiMessage lpMessage)
// argument of this structure
FLAGS MSG_flFlags; // unread,return receipt
ULONG MSG_nRecipCount; // Number of recipients
ULONG MSG_nFileCount; // # of file attachments
ULONG MSG_ORIG_ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
BYTE dataBuf[1]; // For easy referencing
//
// This is where it gets CONFUSING...the following buffer of memory is a
// contiguous chunk of memory for various strings that are part of this
// multilevel structure. For any of the following structure, any numbers
// are represented by strings that will have to be converted back to numeric
// values with atoi() calls.
// String 0: LPSTR lpszSubject; // Message Subject
// String 1: LPSTR lpszNoteText FILE NAME; // Message Text will be
// stored into a temp file and this will be the pointer to that file.
// String 2: LPSTR lpszDateReceived; // in YYYY/MM/DD HH:MM format
// String 3: LPSTR lpszConversationID; // conversation thread ID
//
// The following are for the originator of the message. Only ONE of these.
//
// String 4: LPSTR lpszName; // Originator name
// String 5: LPSTR lpszAddress; // Originator address (optional)
//
// The following strings are for the recipients for this message. There are
// MSG_nRecipCount of these in a row:
//
// for (i=0; i<MSG_nRecipCount; i++)
// String x: LPSTR lpszRecipClass (ULONG) // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
// String x: LPSTR lpszName; // Recipient N name
// String x: LPSTR lpszAddress; // Recipient N address (optional)
//
// Now, finally, add the attachments for this beast. There are MSG_nFileCount
// attachments so it would look like the following:
//
// for (i=0; i<MSG_nFileCount; i++)
//
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
// // This path should include the disk drive letter and directory name.
// String x: LPSTR lpszFileName // The display name for the attached file
//
} MAPISendMailType;
typedef struct {
ULONG ulUIParam;
ULONG nFileCount;
DWORD ipcWorked; // Necessary for IPC check with Communicator
BYTE dataBuf[1]; // For easy referencing
//
// The sequence of strings to follow are groups of PathName/FileName couples.
// The strings will be parsed in MAPI[32].DLL and then put into this format:
//
// for (i=0; i<nFileCount; i++)
//
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
// // This path should include the disk drive letter and directory name.
// String x: LPSTR lpszFileName // The display name for the attached file
} MAPISendDocumentsType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
FLAGS flFlags;
DWORD ipcWorked; // Necessary for IPC check with Communicator
UCHAR lpszSeedMessageID[MAX_MSGINFO_LEN];
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
} MAPIFindNextType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
DWORD ipcWorked; // Necessary for IPC check with Communicator
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
} MAPIDeleteMailType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
FLAGS flFlags;
DWORD ipcWorked; // Necessary for IPC check with Communicator
UCHAR lpszName[MAX_NAME_LEN];
// These are returned by Communicator
UCHAR lpszABookID[MAX_NAME_LEN];
UCHAR lpszABookName[MAX_NAME_LEN];
UCHAR lpszABookAddress[MAX_NAME_LEN];
} MAPIResolveNameType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
FLAGS flFlags;
DWORD ipcWorked; // Necessary for IPC check with Communicator
UCHAR lpszABookID[MAX_NAME_LEN];
} MAPIDetailsType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
FLAGS flFlags;
DWORD ipcWorked; // Necessary for IPC check with Communicator
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
//
// The following is the "FLAT" representation of the (lpMapiMessage lpMessage)
// argument of this structure
//
FLAGS MSG_flFlags; // unread, return or receipt
ULONG MSG_nRecipCount; // Number of recipients
ULONG MSG_nFileCount; // # of file attachments
ULONG MSG_ORIG_ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
//
// Output parameter for blob of information that will live on disk.
//
UCHAR lpszBlob[MAX_MSGINFO_LEN]; // file name on disk
//
// The format of this blob of information will be:
//
// String 0: LPSTR lpszSubject; // Message Subject
// String 1: LPSTR lpszNoteText FILE NAME; // Message Text will be
// stored into a temp file and this will be the pointer to that file.
// String 2: LPSTR lpszDateReceived; // in YYYY/MM/DD HH:MM format
// String 3: LPSTR lpszConversationID; // conversation thread ID
//
// The following are for the originator of the message. Only ONE of these.
//
// String 4: LPSTR lpszName; // Originator name
// String 5: LPSTR lpszAddress; // Originator address (optional)
//
// The following strings are for the recipients for this message. There are
// MSG_nRecipCount of these in a row:
//
// for (i=0; i<MSG_nRecipCount; i++)
// String x: LPSTR lpszName; // Recipient N name
// String x: LPSTR lpszAddress; // Recipient N address (optional)
// String x: LPSTR lpszRecipClass // recipient class - sprintf of ULONG
//
// Now, finally, add the attachments for this beast. There are MSG_nFileCount
// attachments so it would look like the following:
//
// for (i=0; i<MSG_nFileCount; i++)
//
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
// // This path should include the disk drive letter and directory name.
// String x: LPSTR lpszFileName // The display name for the attached file
//
} MAPIReadMailType;
typedef struct {
LHANDLE lhSession;
ULONG ulUIParam;
FLAGS flFlags;
UCHAR lpszCaption[MAX_MSGINFO_LEN];
DWORD ipcWorked; // Necessary for IPC check with Communicator
// The following is the "FLAT" representation of the (lpMapiRecipDesc lpRecips)
// argument of this structure
ULONG nRecips; // number of recips to start with...
ULONG nNewRecips; // number of recips returned...
UCHAR lpszBlob[MAX_MSGINFO_LEN]; // file name for blob of information
// that will live on disk.
BYTE dataBuf[1]; // For easy referencing
//
// The following contiguous chunk of memory is the buffer that holds
// the recipients to load into the address picker...
//
// for (i=0; i<MSG_nRecipCount; i++)
// String x: LPSTR lpszRecipClass (ULONG) // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
// String x: LPSTR lpszName; // Recipient N name
// String x: LPSTR lpszAddress; // Recipient N address (optional)
//
} MAPIAddressType;
#endif // _NSCPMAPI

View File

@@ -1,239 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
#include <windows.h>
#include <windowsx.h>
#include <string.h>
#include <stdlib.h>
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
#include <mapi.h>
#endif
#include "port.h"
#include "resource.h"
#ifndef WM_PAINTICON
#define WM_PAINTICON 0x26
#endif // WM_PAINTICON
/*
* Forward Declarations...
*/
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
BOOL CALLBACK LOADDS MyDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
extern void ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify);
BOOL OpenMAPI(void);
void CloseMAPI(void);
/*
* Global variables
*/
HINSTANCE hInst;
HWND hWnd;
#ifdef WIN16
HICON hIconApp;
#endif
char NEAR szAppName[] = "Netscape QA Helper";
char NEAR szShortAppName[] = "QAHelper";
char szClassName[] = "Netscape_QAHelper_Class_Name";
void
AppCleanup(void)
{
extern void DoMAPILogoff(HWND hWnd);
static BOOL isDone = FALSE;
if (isDone)
return;
extern LHANDLE mapiSession;
if (mapiSession != 0)
{
DoMAPILogoff(hWnd);
}
CloseMAPI();
isDone = TRUE;
}
BOOL
InitInstance(HINSTANCE hInstance, int nCmdShow)
{
/* Create a main window for this application instance. */
hWnd = CreateDialog((HINSTANCE) hInstance,
MAKEINTRESOURCE(ID_DIALOG),
(HWND) NULL, (DLGPROC) MyDlgProc);
if (!hWnd)
return FALSE;
else
return TRUE;
}
BOOL InitApp(void)
{
#ifndef WIN16
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = DefDlgProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_APP));
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
if(!RegisterClass(&wc))
return FALSE;
#else
hIconApp = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_APP));
#endif
return TRUE;
} // end InitApp
// Win Main
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
hInst = hInstance;
if (!InitApp())
{
return FALSE;
}
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
if (!OpenMAPI())
{
return FALSE;
}
ShowWindow(hWnd, SW_SHOW);
// Start the application
while ((GetMessage(&msg, (HWND) NULL, (UINT) NULL, (UINT) NULL)))
{
if(IsDialogMessage(hWnd, &msg))
continue;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(msg.wParam);
}
BOOL CALLBACK LOADDS
MyDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch (wMsg)
{
case WM_INITDIALOG:
{
hWnd = hWndMain;
SetDlgItemText(hWnd, ID_EDIT_ROW, "0");
}
break;
case WM_CLOSE:
{
DestroyWindow(hWnd);
break;
}
case WM_DESTROY:
{
AppCleanup();
#ifndef WIN16
UnregisterClass(szClassName, hInst);
#else
// Destroy the 16 bit windows icon
if(hIconApp != 0)
DestroyIcon(hIconApp);
#endif
PostQuitMessage(0);
break;
}
case WM_COMMAND:
HANDLE_WM_COMMAND(hWnd, wParam, lParam, ProcessCommand);
break;
case WM_QUERYDRAGICON:
#ifdef WIN16
return (BOOL)hIconApp;
#endif
case WM_PAINTICON:
#ifdef WIN16
SetClassWord(hWnd, GCW_HICON, 0);
// fall trough
case WM_PAINT:
{
if(!IsIconic(hWnd))
return FALSE;
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);
SetMapMode(hDC, MM_TEXT);
DrawIcon(hDC, 2, 2, hIconApp);
EndPaint(hWnd, &ps);
break;
}
#endif //WIN16
break; // RICHIE - if this is not here NT 3.51 Pukes!!!!
default:
return FALSE;
}
//~~av return (DefWindowProc(hWnd, wMsg, wParam, lParam));
return TRUE;
}

View File

@@ -1,240 +0,0 @@
# Microsoft Developer Studio Generated NMAKE File, Based on mapitest.dsp
!IF "$(CFG)" == ""
CFG=mapitest - Win32 Debug
!MESSAGE No configuration specified. Defaulting to mapitest - Win32 Debug.
!ENDIF
!IF "$(CFG)" != "mapitest - Win32 Release" && "$(CFG)" != "mapitest - Win32 Debug"
!MESSAGE Invalid configuration "$(CFG)" specified.
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "mapitest.mak" CFG="mapitest - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "mapitest - Win32 Release" (based on "Win32 (x86) Application")
!MESSAGE "mapitest - Win32 Debug" (based on "Win32 (x86) Application")
!MESSAGE
!ERROR An invalid configuration is specified.
!ENDIF
!IF "$(OS)" == "Windows_NT"
NULL=
!ELSE
NULL=nul
!ENDIF
!IF "$(CFG)" == "mapitest - Win32 Release"
OUTDIR=.\Release
INTDIR=.\Release
# Begin Custom Macros
OutDir=.\Release
# End Custom Macros
ALL : "$(OUTDIR)\mapitest.exe"
export :
libs :
install :
clobber_all : clobber
clobber:
-@erase "$(INTDIR)\main.obj"
-@erase "$(INTDIR)\mapimail.obj"
-@erase "$(INTDIR)\mapiproc.obj"
-@erase "$(INTDIR)\mtest32.res"
-@erase "$(INTDIR)\readmail.obj"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(OUTDIR)\mapitest.exe"
-@erase "$(OUTDIR)\mapitest.pch"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
CPP=cl.exe
CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\mapitest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
.c{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.c{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
MTL=midl.exe
MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
RSC=rc.exe
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mtest32.res" /d "NDEBUG"
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mapitest.bsc"
BSC32_SBRS= \
LINK32=link.exe
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)\mapitest.pdb" /machine:I386 /out:"$(OUTDIR)\mapitest.exe"
LINK32_OBJS= \
"$(INTDIR)\main.obj" \
"$(INTDIR)\mapimail.obj" \
"$(INTDIR)\mapiproc.obj" \
"$(INTDIR)\readmail.obj" \
"$(INTDIR)\mtest32.res"
"$(OUTDIR)\mapitest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
!ELSEIF "$(CFG)" == "mapitest - Win32 Debug"
OUTDIR=.\Debug
INTDIR=.\Debug
# Begin Custom Macros
OutDir=.\Debug
# End Custom Macros
ALL : "$(OUTDIR)\mapitest.exe"
export :
libs :
install :
clobber_all : clobber
clobber :
-@erase "$(INTDIR)\main.obj"
-@erase "$(INTDIR)\mapimail.obj"
-@erase "$(INTDIR)\mapiproc.obj"
-@erase "$(INTDIR)\mtest32.res"
-@erase "$(INTDIR)\readmail.obj"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(INTDIR)\vc60.pdb"
-@erase "$(OUTDIR)\mapitest.exe"
-@erase "$(OUTDIR)\mapitest.ilk"
-@erase "$(OUTDIR)\mapitest.pdb"
-@erase "$(OUTDIR)\mapitest.pch"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
CPP=cl.exe
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\mapitest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
.c{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.c{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
MTL=midl.exe
MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
RSC=rc.exe
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mtest32.res" /d "_DEBUG"
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mapitest.bsc"
BSC32_SBRS= \
LINK32=link.exe
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\mapitest.pdb" /debug /machine:I386 /out:"$(OUTDIR)\mapitest.exe" /pdbtype:sept
LINK32_OBJS= \
"$(INTDIR)\main.obj" \
"$(INTDIR)\mapimail.obj" \
"$(INTDIR)\mapiproc.obj" \
"$(INTDIR)\readmail.obj" \
"$(INTDIR)\mtest32.res"
"$(OUTDIR)\mapitest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
!ENDIF
!IF "$(NO_EXTERNAL_DEPS)" != "1"
!IF EXISTS("mapitest.dep")
!INCLUDE "mapitest.dep"
!ELSE
!MESSAGE Warning: cannot find "mapitest.dep"
!ENDIF
!ENDIF
!IF "$(CFG)" == "mapitest - Win32 Release" || "$(CFG)" == "mapitest - Win32 Debug"
SOURCE=.\main.cpp
"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)"
SOURCE=.\mapimail.cpp
"$(INTDIR)\mapimail.obj" : $(SOURCE) "$(INTDIR)"
SOURCE=.\mapiproc.cpp
"$(INTDIR)\mapiproc.obj" : $(SOURCE) "$(INTDIR)"
SOURCE=.\mtest32.rc
"$(INTDIR)\mtest32.res" : $(SOURCE) "$(INTDIR)"
$(RSC) $(RSC_PROJ) $(SOURCE)
SOURCE=.\readmail.cpp
"$(INTDIR)\readmail.obj" : $(SOURCE) "$(INTDIR)"
!ENDIF

View File

@@ -1,772 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
#include <windows.h>
#include <windowsx.h>
#include <string.h>
#include <mapi.h>
#include <stdlib.h>
#include "port.h"
#include "resource.h"
//
// Variables...
//
extern HINSTANCE m_hInstMapi;
extern LHANDLE mapiSession;
//
// Forward declarations...
//
void DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert);
extern void ShowMessage(HWND hWnd, LPSTR msg);
void DoMAPISendMail(HWND hWnd);
void DoMAPISendDocuments(HWND hWnd);
void DoMAPISaveMail(HWND hWnd);
void DoMAPIAddress(HWND hWnd);
extern void SetFooter(LPSTR msg);
extern LPSTR GetMAPIError(LONG errorCode);
void
ProcessMailCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
{
switch (id)
{
case IDCANCEL:
EndDialog(hWnd, 0);
break;
case ID_BUTTON_MAPISENDMAIL:
DoMAPISendMail(hWnd);
break;
case ID_BUTTON_MAPISENDDOCUMENTS:
DoMAPISendDocuments(hWnd);
break;
case ID_BUTTON_MAPISAVEMAIL:
DoMAPISaveMail(hWnd);
break;
case ID_BUTTON_MAPIADDRESS:
DoMAPIAddress(hWnd);
break;
default:
break;
}
}
BOOL CALLBACK LOADDS
MailDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch (wMsg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
HANDLE_WM_COMMAND(hWndMain, wParam, lParam, ProcessMailCommand);
break;
default:
return FALSE;
}
return TRUE;
}
static LPSTR lpszDelimChar = ";";
void
TackItOn(LPSTR fileBuf, LPSTR nameBuf, LPSTR addOn)
{
if (addOn[0] != '\0')
{
lstrcat(fileBuf, addOn);
lstrcat(fileBuf, lpszDelimChar);
lstrcat(nameBuf, "NAMEOF.FILE");
lstrcat(nameBuf, lpszDelimChar);
}
}
void
DoMAPISendDocuments(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPISendDocuments) (ULONG ulUIParam,
LPTSTR lpszDelimChar, LPTSTR lpszFullPaths,
LPTSTR lpszFileNames, ULONG ulReserved);
#ifdef WIN16
(FARPROC&) lpfnMAPISendDocuments = GetProcAddress(m_hInstMapi, "MAPISENDDOCUMENTS");
#else
(FARPROC&) lpfnMAPISendDocuments = GetProcAddress(m_hInstMapi, "MAPISendDocuments");
#endif
if (!lpfnMAPISendDocuments)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
char msg[1024];
char tempFileName[_MAX_PATH] = "";
char lpszFullPaths[(_MAX_PATH + 1) * 4] = "";
char lpszFileNames[(_MAX_PATH + 1) * 4] = "";
// Now get the names of the files to attach...
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, tempFileName, sizeof(tempFileName));
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, tempFileName, sizeof(tempFileName));
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, tempFileName, sizeof(tempFileName));
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, tempFileName, sizeof(tempFileName));
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
LONG rc = (*lpfnMAPISendDocuments)
( (ULONG) hWnd,
lpszDelimChar,
lpszFullPaths,
lpszFileNames,
0);
if (rc == SUCCESS_SUCCESS)
{
ShowMessage(hWnd, "Success with MAPISendDocuments");
SetFooter("MAPISendDocuments success");
}
else
{
wsprintf(msg, "FAILURE: Return code %d from MAPISendDocuments\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("MAPISendDocuments failed");
}
}
void
FreeMAPIFile(lpMapiFileDesc pv)
{
if (!pv)
return;
if (pv->lpszPathName != NULL)
free(pv->lpszPathName);
if (pv->lpszFileName != NULL)
free(pv->lpszFileName);
}
void
FreeMAPIRecipient(lpMapiRecipDesc pv)
{
if (!pv)
return;
if (pv->lpszName != NULL)
free(pv->lpszName);
if (pv->lpszAddress != NULL)
free(pv->lpszAddress);
if (pv->lpEntryID != NULL)
free(pv->lpEntryID);
}
void
FreeMAPIMessage(lpMapiMessage pv)
{
ULONG i;
if (!pv)
return;
if (pv->lpszSubject != NULL)
free(pv->lpszSubject);
if (pv->lpszNoteText)
free(pv->lpszNoteText);
if (pv->lpszMessageType)
free(pv->lpszMessageType);
if (pv->lpszDateReceived)
free(pv->lpszDateReceived);
if (pv->lpszConversationID)
free(pv->lpszConversationID);
if (pv->lpOriginator)
FreeMAPIRecipient(pv->lpOriginator);
for (i=0; i<pv->nRecipCount; i++)
{
if (&(pv->lpRecips[i]) != NULL)
{
FreeMAPIRecipient(&(pv->lpRecips[i]));
}
}
if (pv->lpRecips != NULL)
{
free(pv->lpRecips);
}
for (i=0; i<pv->nFileCount; i++)
{
if (&(pv->lpFiles[i]) != NULL)
{
FreeMAPIFile(&(pv->lpFiles[i]));
}
}
if (pv->lpFiles != NULL)
{
free(pv->lpFiles);
}
free(pv);
pv = NULL;
}
void
DoMAPISendMail(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPISendMail) (LHANDLE lhSession, ULONG ulUIParam,
lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);
#ifdef WIN16
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m_hInstMapi, "MAPISENDMAIL");
#else
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m_hInstMapi, "MAPISendMail");
#endif
if (!lpfnMAPISendMail)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
FLAGS flFlags = 0;
char msg[512];
char file1[_MAX_PATH] = "";
char file2[_MAX_PATH] = "";
char file3[_MAX_PATH] = "";
char file4[_MAX_PATH] = "";
char toAddr[128];
char ccAddr[128];
char bccAddr[128];
char subject[128];
char noteText[4096];
char dateReceived[128] = "N/A";
char threadID[128] = "N/A";;
char origName[128] = "N/A";;
char origAddress[128] = "N/A";;
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
GetDlgItemText(hWnd, ID_EDIT_SUBJECT, subject, sizeof(subject));
GetDlgItemText(hWnd, ID_EDIT_NOTETEXT, noteText, sizeof(noteText));
// Do the one flag we support for this call...
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, ID_CHECK_SHOWDIALOG)))
{
flFlags |= MAPI_DIALOG;
}
// Build the message to send off...
lpMapiMessage msgPtr = (MapiMessage *)malloc(sizeof(MapiMessage));
if (msgPtr == NULL)
{
return;
}
memset(msgPtr, 0, sizeof(MapiMessage));
//
// At this point, we need to populate the structure of information
// we are passing in via the *lppMessage
//
// Set all of the general information first!
msgPtr->lpszSubject = strdup(subject);
msgPtr->lpszNoteText = strdup(noteText);
msgPtr->lpszDateReceived = strdup(dateReceived);
msgPtr->lpszConversationID = strdup(threadID);
msgPtr->flFlags = flFlags;
// Now deal with the recipients of this message
DWORD realRecips = 0;
if (toAddr[0] != '\0') ++realRecips;
if (ccAddr[0] != '\0') ++realRecips;
if (bccAddr[0] != '\0') ++realRecips;
msgPtr->lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * realRecips));
if (!msgPtr->lpRecips)
{
FreeMAPIMessage(msgPtr);
return;
}
msgPtr->nRecipCount = realRecips;
memset(msgPtr->lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * msgPtr->nRecipCount));
DWORD rCount = 0;
if (toAddr[0] != '\0')
{
msgPtr->lpRecips[rCount].lpszName = strdup(toAddr);
msgPtr->lpRecips[rCount].lpszAddress = strdup(toAddr);
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_TO;
rCount++;
}
if (ccAddr[0] != '\0')
{
msgPtr->lpRecips[rCount].lpszName = strdup(ccAddr);
msgPtr->lpRecips[rCount].lpszAddress = strdup(ccAddr);
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_CC;
rCount++;
}
if (bccAddr[0] != '\0')
{
msgPtr->lpRecips[rCount].lpszName = strdup(bccAddr);
msgPtr->lpRecips[rCount].lpszAddress = strdup(bccAddr);
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_BCC;
rCount++;
}
// Now get the names of the files to attach...
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, file1, sizeof(file1));
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, file2, sizeof(file2));
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, file3, sizeof(file3));
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, file4, sizeof(file4));
DWORD realFiles = 0;
if (file1[0] != '\0') ++realFiles;
if (file2[0] != '\0') ++realFiles;
if (file3[0] != '\0') ++realFiles;
if (file4[0] != '\0') ++realFiles;
// Now deal with the list of attachments! Since the nFileCount should be set
// correctly, this loop will automagically be correct
//
msgPtr->nFileCount = realFiles;
if (realFiles > 0)
{
msgPtr->lpFiles = (lpMapiFileDesc) malloc((size_t) (sizeof(MapiFileDesc) * realFiles));
if (!msgPtr->lpFiles)
{
FreeMAPIMessage(msgPtr);
return;
}
memset(msgPtr->lpFiles, 0, (size_t) (sizeof(MapiFileDesc) * msgPtr->nFileCount));
}
rCount = 0;
if (file1[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file1);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file1);
++rCount;
}
if (file2[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file2);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file2);
++rCount;
}
if (file3[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file3);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file3);
++rCount;
}
if (file4[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file4);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file4);
++rCount;
}
// Finally, make the call...
LONG rc = (*lpfnMAPISendMail)
(mapiSession,
(ULONG) hWnd,
msgPtr,
flFlags,
0);
if (rc == SUCCESS_SUCCESS)
{
ShowMessage(hWnd, "Success with MAPISendMail");
SetFooter("MAPISendMail success");
}
else
{
wsprintf(msg, "FAILURE: Return code %d from MAPISendMail\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("MAPISendMail failed");
}
// Now cleanup and move on...
FreeMAPIMessage(msgPtr);
}
void
DoMAPISaveMail(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPISaveMail) (LHANDLE lhSession, ULONG ulUIParam,
lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved,
LPTSTR lpszMessageID);
#ifdef WIN16
(FARPROC&) lpfnMAPISaveMail = GetProcAddress(m_hInstMapi, "MAPISAVEMAIL");
#else
(FARPROC&) lpfnMAPISaveMail = GetProcAddress(m_hInstMapi, "MAPISaveMail");
#endif
if (!lpfnMAPISaveMail)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
FLAGS flFlags = 0;
char msg[512];
char file1[_MAX_PATH] = "";
char file2[_MAX_PATH] = "";
char file3[_MAX_PATH] = "";
char file4[_MAX_PATH] = "";
char toAddr[128];
char ccAddr[128];
char bccAddr[128];
char subject[128];
char noteText[4096];
char dateReceived[128] = "N/A";
char threadID[128] = "N/A";;
char origName[128] = "N/A";;
char origAddress[128] = "N/A";;
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
GetDlgItemText(hWnd, ID_EDIT_SUBJECT, subject, sizeof(subject));
GetDlgItemText(hWnd, ID_EDIT_NOTETEXT, noteText, sizeof(noteText));
// Build the message to send off...
lpMapiMessage msgPtr = (MapiMessage *)malloc(sizeof(MapiMessage));
if (msgPtr == NULL)
{
return;
}
memset(msgPtr, 0, sizeof(MapiMessage));
//
// At this point, we need to populate the structure of information
// we are passing in via the *lppMessage
//
// Set all of the general information first!
msgPtr->lpszSubject = strdup(subject);
msgPtr->lpszNoteText = strdup(noteText);
msgPtr->lpszDateReceived = strdup(dateReceived);
msgPtr->lpszConversationID = strdup(threadID);
msgPtr->flFlags = flFlags;
// Now deal with the recipients of this message
DWORD realRecips = 0;
if (toAddr[0] != '\0') ++realRecips;
if (ccAddr[0] != '\0') ++realRecips;
if (bccAddr[0] != '\0') ++realRecips;
msgPtr->lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * realRecips));
if (!msgPtr->lpRecips)
{
FreeMAPIMessage(msgPtr);
return;
}
msgPtr->nRecipCount = realRecips;
memset(msgPtr->lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * msgPtr->nRecipCount));
DWORD rCount = 0;
if (toAddr[0] != '\0')
{
msgPtr->lpRecips[rCount].lpszName = strdup(toAddr);
msgPtr->lpRecips[rCount].lpszAddress = strdup(toAddr);
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_TO;
rCount++;
}
if (ccAddr[0] != '\0')
{
msgPtr->lpRecips[rCount].lpszName = strdup(ccAddr);
msgPtr->lpRecips[rCount].lpszAddress = strdup(ccAddr);
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_CC;
rCount++;
}
if (bccAddr[0] != '\0')
{
msgPtr->lpRecips[rCount].lpszName = strdup(bccAddr);
msgPtr->lpRecips[rCount].lpszAddress = strdup(bccAddr);
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_BCC;
rCount++;
}
// Now get the names of the files to attach...
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, file1, sizeof(file1));
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, file2, sizeof(file2));
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, file3, sizeof(file3));
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, file4, sizeof(file4));
DWORD realFiles = 0;
if (file1[0] != '\0') ++realFiles;
if (file2[0] != '\0') ++realFiles;
if (file3[0] != '\0') ++realFiles;
if (file4[0] != '\0') ++realFiles;
// Now deal with the list of attachments! Since the nFileCount should be set
// correctly, this loop will automagically be correct
//
msgPtr->nFileCount = realFiles;
if (realFiles > 0)
{
msgPtr->lpFiles = (lpMapiFileDesc) malloc((size_t) (sizeof(MapiFileDesc) * realFiles));
if (!msgPtr->lpFiles)
{
FreeMAPIMessage(msgPtr);
return;
}
memset(msgPtr->lpFiles, 0, (size_t) (sizeof(MapiFileDesc) * msgPtr->nFileCount));
}
rCount = 0;
if (file1[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file1);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file1);
++rCount;
}
if (file2[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file2);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file2);
++rCount;
}
if (file3[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file3);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file3);
++rCount;
}
if (file4[0] != '\0')
{
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file4);
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file4);
++rCount;
}
// Finally, make the call...
LONG rc = (*lpfnMAPISaveMail)
(mapiSession,
(ULONG) hWnd,
msgPtr,
flFlags,
0, NULL);
if (rc == SUCCESS_SUCCESS)
{
ShowMessage(hWnd, "Success with MAPISaveMail");
SetFooter("MAPISaveMail success");
}
else
{
wsprintf(msg, "FAILURE: Return code %d from MAPISaveMail\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("MAPISaveMail failed");
}
// Now cleanup and move on...
FreeMAPIMessage(msgPtr);
}
void
DoMAPIAddress(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPIAddress)
(LHANDLE lhSession,
ULONG ulUIParam,
LPSTR lpszCaption,
ULONG nEditFields,
LPSTR lpszLabels,
ULONG nRecips,
lpMapiRecipDesc lpRecips,
FLAGS flFlags,
ULONG ulReserved,
LPULONG lpnNewRecips,
lpMapiRecipDesc FAR *lppNewRecips);
#ifdef WIN16
(FARPROC&) lpfnMAPIAddress = GetProcAddress(m_hInstMapi, "MAPIADDRESS");
#else
(FARPROC&) lpfnMAPIAddress = GetProcAddress(m_hInstMapi, "MAPIAddress");
#endif
if (!lpfnMAPIAddress)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
DWORD i;
FLAGS flFlags = 0;
DWORD addrCount = 0;
char msg[512];
char toAddr[128];
char ccAddr[128];
char bccAddr[128];
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
if (toAddr[0]) ++addrCount;
if (ccAddr[0]) ++addrCount;
if (bccAddr[0]) ++addrCount;
lpMapiRecipDesc lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * addrCount));
if (!lpRecips)
{
return;
}
memset(lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * addrCount));
DWORD rCount = 0;
if (toAddr[0] != '\0')
{
lpRecips[rCount].lpszName = strdup("To Address Name");
lpRecips[rCount].lpszAddress = strdup(toAddr);
lpRecips[rCount].ulRecipClass = MAPI_TO;
rCount++;
}
if (ccAddr[0] != '\0')
{
lpRecips[rCount].lpszName = strdup("CC Address Name");
lpRecips[rCount].lpszAddress = strdup(ccAddr);
lpRecips[rCount].ulRecipClass = MAPI_CC;
rCount++;
}
if (bccAddr[0] != '\0')
{
lpRecips[rCount].lpszName = strdup("BCC Address Name");
lpRecips[rCount].lpszAddress = strdup(bccAddr);
lpRecips[rCount].ulRecipClass = MAPI_BCC;
rCount++;
}
ULONG newRecips;
lpMapiRecipDesc lpNewRecips;
// Finally, make the call...
LONG rc = (*lpfnMAPIAddress)
(mapiSession,
0,
"MAPI Test Address Picker",
0,
NULL,
rCount,
lpRecips,
0,
0,
&newRecips,
&lpNewRecips);
if (rc == SUCCESS_SUCCESS)
{
for (i=0; i<newRecips; i++)
{
char tMsg[512];
wsprintf(tMsg, "User %d\nName=[%s]\nEmail=[%s]\nType=[%d]",
i,
lpNewRecips[i].lpszName,
lpNewRecips[i].lpszAddress,
lpNewRecips[i].ulRecipClass);
ShowMessage(hWnd, tMsg);
}
SetFooter("MAPIAddress success");
DoMAPIFreeBuffer(hWnd, lpNewRecips, TRUE);
}
else
{
wsprintf(msg, "FAILURE: Return code %d from MAPIAddress\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("MAPIAddress failed");
}
// Now cleanup and move on...
for (i=0; i<rCount; i++)
{
FreeMAPIRecipient(&(lpRecips[i]));
}
}

View File

@@ -1,832 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
#include <windows.h>
#include <windowsx.h>
#include <string.h>
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
#include <mapi.h>
#endif
#include "port.h"
#include "resource.h"
//
// Variables...
//
extern HINSTANCE hInst;
HINSTANCE m_hInstMapi;
LHANDLE mapiSession = 0;
//
// Forward declarations...
//
void LoadNSCPVersionFunc(HWND hWnd);
void DoMAPILogon(HWND hWnd);
void DoMAPILogoff(HWND hWnd);
void DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert);
void DoMAPISendMail(HWND hWnd);
void DoMAPISendDocuments(HWND hWnd);
void DoMAPIFindNext(HWND hWnd);
void DoMAPIReadMail(HWND hWnd);
void DoMAPIDeleteMail(HWND hWnd);
void DoMAPIDetails(HWND hWnd);
void DoMAPIResolveName(HWND hWnd);
void DoMAPIResolveNameFreeBuffer(HWND hWnd);
void SetFooter(LPSTR msg);
void DoMAPI_NSCP_Sync(HWND hWnd);
LPSTR GetMAPIError(LONG errorCode);
extern void DisplayMAPIReadMail(HWND hWnd, lpMapiMessage msgPtr);
lpMapiMessage GetMessage(HWND hWnd, LPSTR id);
void
SetFooter(LPSTR msg)
{
extern HWND hWnd;
SetDlgItemText(hWnd, ID_STATIC_RESULT, msg);
}
char FAR *
GetMAPIError(LONG errorCode)
{
static char FAR msg[128];
switch (errorCode) {
case MAPI_E_FAILURE:
lstrcpy(msg, "General MAPI Failure");
break;
case MAPI_E_INSUFFICIENT_MEMORY:
strcpy(msg, "Insufficient Memory");
break;
case MAPI_E_LOGIN_FAILURE:
strcpy(msg, "Login Failure");
break;
case MAPI_E_TOO_MANY_SESSIONS:
strcpy(msg, "Too many MAPI sessions");
break;
case MAPI_E_INVALID_SESSION:
strcpy(msg, "Invalid Session!");
break;
case MAPI_E_INVALID_MESSAGE:
strcpy(msg, "Message identifier was bad!");
break;
case MAPI_E_NO_MESSAGES:
strcpy(msg, "No messages were found!");
break;
case MAPI_E_ATTACHMENT_WRITE_FAILURE:
strcpy(msg, "Attachment write failure!");
break;
case MAPI_E_DISK_FULL:
strcpy(msg, "Attachment write failure! DISK FULL");
break;
case MAPI_E_AMBIGUOUS_RECIPIENT:
strcpy(msg, "Recipient requested is not a unique address list entry.");
break;
case MAPI_E_UNKNOWN_RECIPIENT:
strcpy(msg, "Recipient requested does not exist.");
break;
case MAPI_E_NOT_SUPPORTED:
strcpy(msg, "Not supported by messaging system");
break;
case SUCCESS_SUCCESS:
strcpy(msg, "Success on MAPI operation");
break;
case MAPI_E_INVALID_RECIPS:
strcpy(msg, "Recipient specified in the lpRecip parameter was\nunknown. No dialog box was displayed.");
break;
case MAPI_E_ATTACHMENT_OPEN_FAILURE:
strcpy(msg, "One or more files could not be located. No message was sent.");
break;
case MAPI_E_ATTACHMENT_NOT_FOUND:
strcpy(msg, "The specified attachment was not found. No message was sent.");
break;
case MAPI_E_BAD_RECIPTYPE:
strcpy(msg, "The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.");
break;
default:
strcpy(msg, "Unknown MAPI Return Code");
break;
}
return((LPSTR) &(msg[0]));
}
void
ShowMessage(HWND hWnd, LPSTR msg)
{
MessageBox(hWnd, msg, "Info Message", MB_ICONINFORMATION);
}
BOOL
OpenMAPI(void)
{
#ifdef WIN16
m_hInstMapi = LoadLibrary("Y:\\ns\\cmd\\winfe\\mapi\\MAPI.DLL");
#else
m_hInstMapi = LoadLibrary(".\\COMPONENTS\\MAPI32.DLL");
#endif
if (!m_hInstMapi)
{
ShowMessage(NULL, "Error Loading the MAPI DLL...Probably not found!");
return(FALSE);
}
return(TRUE);
}
void
CloseMAPI(void)
{
if(m_hInstMapi)
{
FreeLibrary(m_hInstMapi);
}
}
void
ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
{
switch (id)
{
case ID_BUTTON_SYNC:
DoMAPI_NSCP_Sync(hWnd);
break;
case ID_BUTTON_NSCPVERSION:
LoadNSCPVersionFunc(hWnd);
break;
case ID_BUTTON_LOGON:
DoMAPILogon(hWnd);
break;
case ID_BUTTON_LOGOFF:
DoMAPILogoff(hWnd);
break;
case ID_BUTTON_FINDNEXT:
case ID_MENU_MAPIFINDNEXT:
DoMAPIFindNext(hWnd);
break;
case ID_BUTTON_READMAIL:
case ID_MENU_MAPIREADMAIL:
DoMAPIReadMail(hWnd);
break;
case ID_BUTTON_MAIL:
{
extern CALLBACK LOADDS
MailDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam);
DialogBox(hInst, MAKEINTRESOURCE(ID_DIALOG_MAIL), hWnd,
(DLGPROC)MailDlgProc);
}
break;
case ID_BUTTON_DELETEMAIL:
case ID_MENU_MAPIDELETEMAIL:
DoMAPIDeleteMail(hWnd);
break;
case ID_MENU_MYEXIT:
DestroyWindow(hWnd);
break;
case ID_BUTTON_CLEAR:
case ID_MENU_CLEARRESULTS:
ListBox_ResetContent(GetDlgItem(hWnd, ID_LIST_RESULT));
break;
case ID_BUTTON_FREEBUFFER:
DoMAPIResolveNameFreeBuffer(hWnd);
break;
case ID_BUTTON_RESOLVENAME:
DoMAPIResolveName(hWnd);
break;
case ID_BUTTON_DETAILS:
DoMAPIDetails(hWnd);
break;
case ID_MENU_MYABOUT:
MessageBox(hWnd,
"Netscape MAPI Test Harness\nWritten by: Rich Pizzarro (rhp@netscape.com)",
"About",
MB_ICONINFORMATION);
break;
default:
break;
}
}
void
DoMAPILogon(HWND hWnd)
{
char msg[1024];
char user[128] = "";
char pw[128] = "";
// Get Address of MAPI function...
ULONG (FAR PASCAL *lpfnMAPILogon)(ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPLHANDLE);
#ifdef WIN16
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hInstMapi, "MAPILOGON");
#else
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hInstMapi, "MAPILogon");
#endif
if (!lpfnMAPILogon)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
GetDlgItemText(hWnd, ID_EDIT_USERNAME, user, sizeof(user));
GetDlgItemText(hWnd, ID_EDIT_PW, pw, sizeof(pw));
LONG rc = (*lpfnMAPILogon)((ULONG) hWnd, user, pw,
MAPI_FORCE_DOWNLOAD | MAPI_NEW_SESSION, 0, &mapiSession);
if (rc == SUCCESS_SUCCESS)
{
wsprintf(msg, "Success with session = %d", mapiSession);
ShowMessage(hWnd, msg);
SetFooter("Logon success");
}
else
{
wsprintf(msg, "FAILURE: Return code %d from Logon\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("Logon failed");
}
}
void
DoMAPILogoff(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPILogoff) ( LHANDLE lhSession, ULONG ulUIParam,
FLAGS flFlags, ULONG ulReserved);
#ifdef WIN16
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hInstMapi, "MAPILOGOFF");
#else
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hInstMapi, "MAPILogoff");
#endif
if (!lpfnMAPILogoff)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
char msg[1024];
LONG rc = (*lpfnMAPILogoff)(mapiSession, (ULONG) hWnd, 0, 0);
if (rc == SUCCESS_SUCCESS)
{
wsprintf(msg, "Successful logoff");
ShowMessage(hWnd, msg);
SetFooter(msg);
}
else
{
wsprintf(msg, "FAILURE: Return code %d from Logoff\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("Logoff failed");
}
mapiSession = 0;
}
void
DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert)
{
ULONG (FAR PASCAL *lpfnMAPIFreeBuffer) (LPVOID lpBuffer);
#ifdef WIN16
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_hInstMapi, "MAPIFREEBUFFER");
#else
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_hInstMapi, "MAPIFreeBuffer");
#endif
if (!lpfnMAPIFreeBuffer)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
char msg[1024];
LONG rc = (*lpfnMAPIFreeBuffer)(buf);
#ifdef WIN32
if (rc == S_OK)
#else
if (rc == SUCCESS_SUCCESS)
#endif
{
wsprintf(msg, "Successful Free Buffer Operation");
if (alert)
ShowMessage(hWnd, msg);
}
else
{
wsprintf(msg, "FAILURE: Return code %d from Logoff", rc);
ShowMessage(hWnd, msg);
}
}
void
DoMAPIFindNext(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPIFindNext) (LHANDLE lhSession, ULONG ulUIParam,
LPTSTR lpszMessageType, LPTSTR lpszSeedMessageID, FLAGS flFlags,
ULONG ulReserved, LPTSTR lpszMessageID);
#ifdef WIN16
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hInstMapi, "MAPIFINDNEXT");
#else
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hInstMapi, "MAPIFindNext");
#endif
if (!lpfnMAPIFindNext)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
// Clear the list before we start...
ListBox_ResetContent(GetDlgItem(hWnd, ID_LIST_RESULT));
char msg[1024];
char messageID[512];
LONG rc;
#ifdef WIN32
FLAGS flags = MAPI_GUARANTEE_FIFO | MAPI_LONG_MSGID | MAPI_UNREAD_ONLY;
#else
FLAGS flags = MAPI_GUARANTEE_FIFO | MAPI_UNREAD_ONLY;
#endif
while ( (rc = (*lpfnMAPIFindNext) (mapiSession,
(ULONG) hWnd,
NULL,
NULL,
flags,
0,
messageID)) == SUCCESS_SUCCESS)
{
//
lpMapiMessage mapiMsg = GetMessage(hWnd, messageID);
if (mapiMsg != NULL)
{
wsprintf(msg, "%s: \"%s\" Sender: %s",
messageID,
mapiMsg->lpszSubject,
mapiMsg->lpOriginator->lpszName);
DoMAPIFreeBuffer(hWnd, mapiMsg, FALSE);
}
else
{
lstrcpy(msg, messageID);
}
ListBox_InsertString(GetDlgItem(hWnd, ID_LIST_RESULT), 0, msg);
}
wsprintf(msg, "Enumeration ended: Return code %d from MAPIFindNext\nCondition=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("Enumeration ended");
}
void
DoMAPIReadMail(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPIReadMail) (LHANDLE lhSession, ULONG ulUIParam,
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved,
lpMapiMessage FAR * lppMessage);
#ifdef WIN16
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIREADMAIL");
#else
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIReadMail");
#endif
if (!lpfnMAPIReadMail)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
char msg[1024];
char lpszMessageID[512];
lpMapiMessage lpMessage = NULL;
FLAGS flFlags = 0;
DWORD selected = ListBox_GetCurSel(GetDlgItem(hWnd, ID_LIST_RESULT));
if (selected == LB_ERR)
{
ShowMessage(hWnd, "You need to select a valid message. Make sure\nyou have done a MAPIFindNext and selected\none of the resulting messages.");
return;
}
ListBox_GetText(GetDlgItem(hWnd, ID_LIST_RESULT), selected, lpszMessageID);
// Do the various flags for this call...
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_BODYASFILE)))
{
flFlags |= MAPI_BODY_AS_FILE;
}
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_ENVELOPEONLY)))
{
flFlags |= MAPI_ENVELOPE_ONLY;
}
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_PEEK)))
{
flFlags |= MAPI_PEEK;
}
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_SUPPRESSATTACH)))
{
flFlags |= MAPI_SUPPRESS_ATTACH;
}
char *ptr = strchr( (const char *) lpszMessageID, ':');
if (ptr) *ptr = '\0';
LONG rc = (*lpfnMAPIReadMail)
(mapiSession,
(ULONG) hWnd,
lpszMessageID,
flFlags,
0,
&lpMessage);
// Deal with error up front and return if need be...
if (rc != SUCCESS_SUCCESS)
{
wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("ReadMail failed");
return;
}
// Now display the message and then return...
DisplayMAPIReadMail(hWnd, lpMessage);
DoMAPIFreeBuffer(hWnd, lpMessage, TRUE);
}
void
DoMAPIDeleteMail(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPIDeleteMail) (LHANDLE lhSession, ULONG ulUIParam,
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved);
#ifdef WIN16
(FARPROC&) lpfnMAPIDeleteMail = GetProcAddress(m_hInstMapi, "MAPIDELETEMAIL");
#else
(FARPROC&) lpfnMAPIDeleteMail = GetProcAddress(m_hInstMapi, "MAPIDeleteMail");
#endif
if (!lpfnMAPIDeleteMail)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
char msg[1024];
char lpszMessageID[512];
lpMapiMessage lpMessage = NULL;
DWORD selected = ListBox_GetCurSel(GetDlgItem(hWnd, ID_LIST_RESULT));
if (selected == LB_ERR)
{
ShowMessage(hWnd, "You need to select a valid message. Make sure\nyou have done a MAPIFindNext and selected\none of the resulting messages.");
return;
}
ListBox_GetText(GetDlgItem(hWnd, ID_LIST_RESULT), selected, lpszMessageID);
char *ptr = strchr( (const char *) lpszMessageID, ':');
if (ptr) *ptr = '\0';
LONG rc = (*lpfnMAPIDeleteMail)
(mapiSession,
(ULONG) hWnd,
lpszMessageID,
0,
0);
// Deal with the return code...
if (rc == SUCCESS_SUCCESS)
{
wsprintf(msg, "Successful deletion");
ShowMessage(hWnd, msg);
SetFooter(msg);
// If it worked, refresh the list...
ShowMessage(hWnd, "The message list will now be refreshed\nsince one message was deleted.");
DoMAPIFindNext(hWnd);
}
else
{
wsprintf(msg, "FAILURE: Return code %d from MAPIDeleteMail\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("Logoff failed");
}
}
// This is for the name lookup stuff...
lpMapiRecipDesc lpRecip = NULL;
void
DoMAPIResolveName(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPIResolveName) (LHANDLE lhSession, ULONG ulUIParam,
LPTSTR lpszName, FLAGS flFlags, ULONG ulReserved,
lpMapiRecipDesc FAR * lppRecip);
#ifdef WIN16
(FARPROC&) lpfnMAPIResolveName = GetProcAddress(m_hInstMapi, "MAPIRESOLVENAME");
#else
(FARPROC&) lpfnMAPIResolveName = GetProcAddress(m_hInstMapi, "MAPIResolveName");
#endif
if (!lpfnMAPIResolveName)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
if (lpRecip != NULL)
{
ShowMessage(hWnd, "We need to free memory from a previous call...");
DoMAPIFreeBuffer(hWnd, lpRecip, TRUE);
lpRecip = NULL;
}
char userName[512];
char msg[1024];
FLAGS flFlags = 0; // We support none...
GetDlgItemText(hWnd, IDC_EDIT_RESOLVENAME, userName, sizeof(userName));
LONG rc = (*lpfnMAPIResolveName)
(mapiSession,
(ULONG) hWnd,
userName,
flFlags,
0,
&lpRecip);
// Deal with error up front and return if need be...
if (rc != SUCCESS_SUCCESS)
{
wsprintf(msg, "FAILURE: Return code %d from DoMAPIResolveName\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("DoMAPIResolveName failed");
return;
}
// If we get here, we should probably show the information that we
// got back
wsprintf(msg, "Received information for %s\nName=[%s]\nAddress=[%s]\nID=[%s]",
userName, lpRecip->lpszName, lpRecip->lpszAddress, (LPSTR) lpRecip->lpEntryID);
ShowMessage(hWnd, msg);
}
void
DoMAPIResolveNameFreeBuffer(HWND hWnd)
{
if (lpRecip == NULL)
{
ShowMessage(hWnd, "There is no memory allocated from MAPIResolveName()\nto be freed. Request ignored.");
}
else
{
DoMAPIFreeBuffer(hWnd, lpRecip, TRUE);
lpRecip = NULL;
}
}
void
DoMAPIDetails(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnMAPIDetails) (LHANDLE lhSession, ULONG ulUIParam,
lpMapiRecipDesc lpRecip, FLAGS flFlags, ULONG ulReserved);
#ifdef WIN16
(FARPROC&) lpfnMAPIDetails = GetProcAddress(m_hInstMapi, "MAPIDetails");
#else
(FARPROC&) lpfnMAPIDetails = GetProcAddress(m_hInstMapi, "MAPIDetails");
#endif
if (!lpfnMAPIDetails)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
char msg[1024];
FLAGS flFlags = 0; // We really don't support these...
LONG rc = (*lpfnMAPIDetails)
(mapiSession,
(ULONG) hWnd,
lpRecip,
flFlags,
0);
if (rc == SUCCESS_SUCCESS)
{
wsprintf(msg, "MAPIDetails call succeeded");
ShowMessage(hWnd, msg);
SetFooter(msg);
}
else
{
wsprintf(msg, "FAILURE: Return code %d from MAPIDetails\nError=[%s]",
rc, GetMAPIError(rc));
if (lpRecip == NULL)
{
lstrcat(msg, "\nNOTE: There is no valid pointer from a MAPIResolveName()\ncall to show details about.");
}
ShowMessage(hWnd, msg);
SetFooter("MAPIDetails failed");
}
}
lpMapiMessage
GetMessage(HWND hWnd, LPSTR id)
{
ULONG (FAR PASCAL *lpfnMAPIReadMail) (LHANDLE lhSession, ULONG ulUIParam,
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved,
lpMapiMessage FAR * lppMessage);
#ifdef WIN16
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIREADMAIL");
#else
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIReadMail");
#endif
if (!lpfnMAPIReadMail)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return NULL;
}
char msg[1024];
lpMapiMessage lpMessage = NULL;
FLAGS flFlags = 0;
flFlags |= MAPI_ENVELOPE_ONLY;
LONG rc = (*lpfnMAPIReadMail)
(mapiSession,
(ULONG) hWnd,
id,
flFlags,
0,
&lpMessage);
// Deal with error up front and return if need be...
if (rc != SUCCESS_SUCCESS)
{
wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("ReadMail failed");
return NULL;
}
return(lpMessage);
}
void
LoadNSCPVersionFunc(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnLoadNSCPVersion) ( void );
#ifdef WIN16
(FARPROC&) lpfnLoadNSCPVersion = GetProcAddress(m_hInstMapi, "MAPIGETNERSCAPEVERSION");
#else
(FARPROC&) lpfnLoadNSCPVersion = GetProcAddress(m_hInstMapi, "MAPIGetNetscapeVersion");
#endif
if (!lpfnLoadNSCPVersion)
{
ShowMessage(hWnd, "Unable to locate MAPIGetNetscapeVersion() function.");
}
else
{
ShowMessage(hWnd, "MAPIGetNetscapeVersion() function was FOUND!");
}
return;
}
void
DoMAPI_NSCP_Sync(HWND hWnd)
{
ULONG (FAR PASCAL *lpfnNSCPSync) ( LHANDLE lhSession,
ULONG ulReserved );
#ifdef WIN16
(FARPROC&) lpfnNSCPSync = GetProcAddress(m_hInstMapi, "MAPI_NSCP_SYNCHRONIZECLIENT");
#else
(FARPROC&) lpfnNSCPSync = GetProcAddress(m_hInstMapi, "MAPI_NSCP_SynchronizeClient");
#endif
if (!lpfnNSCPSync)
{
ShowMessage(hWnd, "Unable to locate MAPI function.");
return;
}
LONG rc = (*lpfnNSCPSync) (mapiSession, 0);
char msg[256];
// Deal with error up front and return if need be...
if (rc != SUCCESS_SUCCESS)
{
wsprintf(msg, "FAILURE: Return code %d from MAPI_NSCP_SynchronizeClient\nError=[%s]",
rc, GetMAPIError(rc));
ShowMessage(hWnd, msg);
SetFooter("MAPI_NSCP_SynchronizeClient failed");
return;
}
else
{
wsprintf(msg, "Success for MAPI_NSCP_SynchronizeClient");
ShowMessage(hWnd, msg);
SetFooter("MAPI_NSCP_SynchronizeClient success");
}
}

View File

@@ -1,25 +0,0 @@
# Microsoft Developer Studio Generated Dependency File, included by mapitest.mak
.\main.cpp : \
".\port.h"\
"c:\program files\msdev\vc98\include\basetsd.h"\
.\mapimail.cpp : \
".\port.h"\
"c:\program files\msdev\vc98\include\basetsd.h"\
.\mapiproc.cpp : \
".\port.h"\
"c:\program files\msdev\vc98\include\basetsd.h"\
.\mtest32.rc : \
".\nscicon.ico"\
.\readmail.cpp : \
".\port.h"\
"c:\program files\msdev\vc98\include\basetsd.h"\

View File

@@ -1,121 +0,0 @@
# Microsoft Developer Studio Project File - Name="mapitest" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Application" 0x0101
CFG=mapitest - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "mapitest.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "mapitest.mak" CFG="mapitest - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "mapitest - Win32 Release" (based on "Win32 (x86) Application")
!MESSAGE "mapitest - Win32 Debug" (based on "Win32 (x86) Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "mapitest - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
!ELSEIF "$(CFG)" == "mapitest - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "mapitest - Win32 Release"
# Name "mapitest - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\main.cpp
# End Source File
# Begin Source File
SOURCE=.\mapimail.cpp
# End Source File
# Begin Source File
SOURCE=.\mapiproc.cpp
# End Source File
# Begin Source File
SOURCE=.\mtest32.rc
# End Source File
# Begin Source File
SOURCE=.\readmail.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

View File

@@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "mapitest"=.\mapitest.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@@ -1,44 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: mapitest - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating command line "rc.exe /l 0x409 /fo"Debug/mtest32.res" /d "_DEBUG" "Y:\mozilla\mailnews\mapi\tests\mapitest\mtest32.rc""
Creating temporary file "C:\TEMP\RSP38A.tmp" with contents
[
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"Debug/mapitest.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
"Y:\mozilla\mailnews\mapi\tests\mapitest\readmail.cpp"
"Y:\mozilla\mailnews\mapi\tests\mapitest\mapimail.cpp"
"Y:\mozilla\mailnews\mapi\tests\mapitest\mapiproc.cpp"
"Y:\mozilla\mailnews\mapi\tests\mapitest\main.cpp"
]
Creating command line "cl.exe @C:\TEMP\RSP38A.tmp"
Creating temporary file "C:\TEMP\RSP38B.tmp" with contents
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/mapitest.pdb" /debug /machine:I386 /out:"Debug/mapitest.exe" /pdbtype:sept
.\Debug\readmail.obj
.\Debug\mapimail.obj
.\Debug\mapiproc.obj
.\Debug\mtest32.res
.\Debug\main.obj
]
Creating command line "link.exe @C:\TEMP\RSP38B.tmp"
<h3>Output Window</h3>
Compiling resources...
Compiling...
readmail.cpp
mapimail.cpp
mapiproc.cpp
main.cpp
Linking...
<h3>Results</h3>
mapitest.exe - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@@ -1,245 +0,0 @@
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
ID_DIALOG DIALOG DISCARDABLE 0, 0, 344, 229
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Netscape MAPI Test Harness"
MENU ID_MENU
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "Open/Close",IDC_STATIC,4,4,336,27
LTEXT "User:",IDC_STATIC,9,17,18,11
EDITTEXT ID_EDIT_USERNAME,28,15,41,12,ES_AUTOHSCROLL
LTEXT "Password:",IDC_STATIC,74,17,38,11
EDITTEXT ID_EDIT_PW,112,15,41,12,ES_PASSWORD | ES_AUTOHSCROLL
PUSHBUTTON "MAPILogon",ID_BUTTON_LOGON,157,13,46,14
PUSHBUTTON "MAPILogoff",ID_BUTTON_LOGOFF,209,13,46,14
GROUPBOX "Mail Operations",IDC_STATIC,4,36,336,142
PUSHBUTTON "MAPIFindNext",ID_BUTTON_FINDNEXT,17,50,57,14
PUSHBUTTON "MAPIDeleteMail",ID_BUTTON_DELETEMAIL,80,50,57,14
PUSHBUTTON "Clear Results",ID_BUTTON_CLEAR,143,50,57,14
PUSHBUTTON "Send Mail",ID_BUTTON_MAIL,206,50,57,14
LISTBOX ID_LIST_RESULT,9,66,325,56,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL |
WS_TABSTOP
GROUPBOX "User Information",IDC_STATIC,4,181,336,28
PUSHBUTTON "MAPIResolveName",ID_BUTTON_RESOLVENAME,9,192,68,14
EDITTEXT IDC_EDIT_RESOLVENAME,82,192,130,14,ES_AUTOHSCROLL
PUSHBUTTON "MAPIDetails",ID_BUTTON_DETAILS,219,192,48,14
LTEXT "",ID_STATIC_RESULT,4,214,336,13,SS_SUNKEN
PUSHBUTTON "MAPIReadMail",ID_BUTTON_READMAIL,34,142,57,14
CONTROL "MAPI_BODY_AS_FILE - Body as attachment",
IDC_CHECK_BODYASFILE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,121,125,188,9
CONTROL "MAPI_ENVELOPE_ONLY - Header information only",
IDC_CHECK_ENVELOPEONLY,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,121,138,188,9
CONTROL "MAPI_PEEK - Don't mark message as read",IDC_CHECK_PEEK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,151,188,9
CONTROL "MAPI_SUPPRESS_ATTACH - Suppress attachments",
IDC_CHECK_SUPPRESSATTACH,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,121,164,188,9
PUSHBUTTON "<- MAPIFreeBuffer",ID_BUTTON_FREEBUFFER,272,192,63,14
PUSHBUTTON "MAPIGetNSCPVersion",ID_BUTTON_NSCPVERSION,261,13,76,14
PUSHBUTTON "Synchronize",ID_BUTTON_SYNC,269,50,57,14
END
ID_DIALOG_MAIL DIALOG DISCARDABLE 0, 0, 285, 246
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Composition"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "Address Information",IDC_STATIC,4,4,275,55
LTEXT "To:",IDC_STATIC,21,19,12,8
EDITTEXT ID_EDIT_TOADDRESS,36,16,239,13,ES_AUTOHSCROLL
EDITTEXT ID_EDIT_CCADDRESS,36,30,239,13,ES_AUTOHSCROLL
EDITTEXT ID_EDIT_BCCADDRESS,36,44,239,13,ES_AUTOHSCROLL
LTEXT "Subject:",IDC_STATIC,5,65,29,9
EDITTEXT ID_EDIT_SUBJECT,36,63,239,13,ES_AUTOHSCROLL
EDITTEXT ID_EDIT_NOTETEXT,4,78,271,72,ES_MULTILINE |
ES_AUTOHSCROLL
GROUPBOX "Attachments",IDC_STATIC,4,153,275,39
EDITTEXT ID_EDIT_ATTACH1,16,162,122,13,ES_AUTOHSCROLL
EDITTEXT ID_EDIT_ATTACH2,16,176,122,13,ES_AUTOHSCROLL
EDITTEXT ID_EDIT_ATTACH3,147,162,122,13,ES_AUTOHSCROLL
EDITTEXT ID_EDIT_ATTACH4,147,175,122,13,ES_AUTOHSCROLL
PUSHBUTTON "MAPISendMail",ID_BUTTON_MAPISENDMAIL,70,204,58,14
PUSHBUTTON "Cancel",IDCANCEL,50,225,84,14
PUSHBUTTON "MAPISendDocuments",ID_BUTTON_MAPISENDDOCUMENTS,132,204,
79,14
CONTROL "Show Dialog",ID_CHECK_SHOWDIALOG,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,8,207,55,9
LTEXT "cc:",IDC_STATIC,22,32,12,8
LTEXT "bcc:",IDC_STATIC,18,47,15,8
GROUPBOX "Send Operations",IDC_STATIC,4,196,275,26
PUSHBUTTON "MAPISaveMail",ID_BUTTON_MAPISAVEMAIL,215,204,57,14
PUSHBUTTON "MAPIAddress",ID_BUTTON_MAPIADDRESS,150,225,84,14
END
ID_DIALOG_READMAIL DIALOG DISCARDABLE 0, 0, 269, 266
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Mail Message"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Subject:",IDC_STATIC,5,71,27,9
EDITTEXT IDC_EDIT_SUBJECT,36,69,229,12,ES_AUTOHSCROLL |
ES_READONLY
LISTBOX IDC_LIST_ATTACHMENTS,4,211,261,37,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_EDIT_BODYTEXT,4,113,261,85,ES_MULTILINE |
ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY |
ES_WANTRETURN
LISTBOX IDC_LIST_RECIPIENTS,4,29,261,36,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LTEXT "Recipients:",IDC_STATIC,4,19,43,9
LTEXT "Attachments:",IDC_STATIC,4,202,43,9
EDITTEXT IDC_EDIT_DATETIME,36,83,229,12,ES_AUTOHSCROLL |
ES_READONLY
LTEXT "Date:",IDC_STATIC,13,84,19,9
PUSHBUTTON "OK",ID_OK,114,249,42,13
EDITTEXT IDC_EDIT_THREAD,36,97,229,12,ES_AUTOHSCROLL |
ES_READONLY
LTEXT "Thread:",IDC_STATIC,6,99,25,9
LTEXT "From:",IDC_STATIC,4,6,19,9
EDITTEXT IDC_EDIT_FROM,27,4,238,12,ES_AUTOHSCROLL | ES_READONLY
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
ID_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 340
VERTGUIDE, 9
VERTGUIDE, 309
TOPMARGIN, 4
BOTTOMMARGIN, 227
HORZGUIDE, 206
END
ID_DIALOG_MAIL, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 281
TOPMARGIN, 4
BOTTOMMARGIN, 239
END
ID_DIALOG_READMAIL, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 265
TOPMARGIN, 4
BOTTOMMARGIN, 262
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
ID_ICON_APP ICON DISCARDABLE "nscicon.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
ID_MENU MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "MAPI&FindNext", ID_MENU_MAPIFINDNEXT
MENUITEM "MAPI&ReadMail", ID_MENU_MAPIREADMAIL
MENUITEM SEPARATOR
MENUITEM "E&xit", ID_MENU_MYEXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "MAPI&DeleteMail", ID_MENU_MAPIDELETEMAIL
MENUITEM "&Clear Results", ID_MENU_CLEARRESULTS
END
POPUP "&Help"
BEGIN
MENUITEM "&About...", ID_MENU_MYABOUT
END
END
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

View File

@@ -1,303 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
#ifndef PORT_H
#define PORT_H
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************\
* *
* PORT.H *
* *
* Win16/Win32 portability stuff *
* *
* A.Sokolsky *
* 3.10.94 distilled into this header *
* *
\*****************************************************************/
/*
* calling conventions
*/
#include <assert.h>
#ifndef CDECL
#define CDECL __cdecl
#endif // CDECL
#ifndef PASCAL
#define PASCAL __pascal
#endif // PASCAL
#ifdef FASTCALL
#error FASTCALL defined
#endif // FASTCALL
#ifdef NDEBUG
#define FASTCALL __fastcall
#else
#define FASTCALL PASCAL
#endif // NDEBUG
#ifndef HWND2DWORD
# ifdef WIN32
# define HWND2DWORD(X_hWnd) ( (DWORD)(X_hWnd) )
# else // WIN16
# define HWND2DWORD(X_hWnd) ( (DWORD)MAKELONG(((WORD)(X_hWnd)), 0) )
# endif
#endif // HWND2DWORD
/*
* WIN16 - WIN32 compatibility stuff
*/
#ifdef WIN32
# define DLLEXPORT __declspec( dllexport )
# define EXPORT
# define LOADDS
# define HUGE
# ifndef FAR
# define FAR
# endif // FAR
# ifndef NEAR
# define NEAR
# endif // NEAR
# ifdef UNICODE
# define SIZEOF(x) (sizeof(x)/sizeof(WCHAR))
# else
# define SIZEOF(x) sizeof(x)
# endif
#else // !WIN32 == WIN16
# define DLLEXPORT
# define EXPORT __export
# define LOADDS __loadds
# define HUGE __huge
# ifndef FAR
# define FAR __far
# define NEAR __near
# endif // FAR
# define CONST const
# define SIZEOF(x) sizeof(x)
# define CHAR char
# define TCHAR char
# define WCHAR char
# ifndef LPTSTR
# define LPTSTR LPSTR
# endif
# ifndef LPCTSTR
# define LPCTSTR LPCSTR
# endif
# define UNREFERENCED_PARAMETER(x) x;
# ifndef TEXT
# define TEXT(x) x
# endif
# define GetWindowTextW GetWindowText
# define lstrcpyW lstrcpy
# define BN_DBLCLK BN_DOUBLECLICKED // ~~MRJ needed for custom control.
// ~~MRJ begin Win95 backward compat section
# define LPWSTR LPSTR
# define LPCWSTR LPCSTR
// button check state for WIN16
#ifndef BST_UNCHECKED
#define BST_UNCHECKED 0x0000
#endif
#ifndef BST_CHECKED
#define BST_CHECKED 0x0001
#endif
#ifndef WIN95_COMPAT
# define WIN95_COMPAT
#endif
// ~~MRJ end Win95 compat section.
// critical section API stubs
typedef DWORD CRITICAL_SECTION;
typedef CRITICAL_SECTION FAR * LPCRITICAL_SECTION;
#ifdef __cplusplus
inline void InitializeCriticalSection(LPCRITICAL_SECTION lpSection) {}
inline void DeleteCriticalSection(LPCRITICAL_SECTION lpSection) {}
inline void EnterCriticalSection(LPCRITICAL_SECTION lpSection) {}
inline void LeaveCriticalSection(LPCRITICAL_SECTION lpSection) {}
#endif // __cplusplus
// Added for nssock16 ---Neeti
#ifndef ZeroMemory
#include <memory.h>
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
#endif // ZeroMemory
#endif // WIN16
/*
* unix - windows compatibility stuff
*/
typedef DWORD u_int32;
typedef WORD u_int16;
typedef BYTE u_int8;
#ifdef WIN32
typedef short int Bool16;
#else // WIN16
typedef BOOL Bool16;
#endif // WIN16
/*
* Cross Platform Compatibility
*/
#ifndef UNALIGNED
# ifdef _M_ALPHA
# define UNALIGNED __unaligned
# else // !_M_ALPHA
# define UNALIGNED
# endif // !_M_ALPHA
#endif // UNALIGNED
//
// RICHIE - for the Alpha port
//
#ifdef _M_ALPHA
# undef pascal
# undef PASCAL
# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
# define pascal __stdcall
# define PASCAL __stdcall
# else
# define PASCAL
# endif
#endif
/*
* Useful Types
*/
typedef char HUGE *HPSTR;
typedef const char HUGE *HPCSTR;
typedef unsigned char HUGE *HPBYTE;
typedef WORD HUGE *HPWORD;
typedef UINT FAR *LPUINT;
typedef BOOL (CALLBACK *USERABORTPROC)();
typedef BOOL (CALLBACK *PROGRESSPROC)(UINT uPos, UINT uRange);
typedef int INT; // ~~MRJ a function needed this defined.
typedef MINMAXINFO FAR *LPMINMAXINFO; // ~~MRJ
//
// stuff missing from windows.h
//
#ifndef MAKEWORD
#define MAKEWORD(low, high) ((WORD)(((BYTE)(low)) | (((WORD)((BYTE)(high))) << 8)))
#endif // MAKEWORD
#ifdef WIN32
# ifndef hmemcpy
# define hmemcpy memcpy
# endif // !defined(hmemcpy)
# define _fmemset memset
# include <malloc.h>
#ifdef __cplusplus
inline BOOL IsGDIObject(HGDIOBJ hObj) { return (hObj != 0); }
inline void *_halloc(long num, unsigned int size) { return malloc(num * size); }
inline void _hfree( void *memblock ) { free(memblock); }
/*
inline BOOL IsInstance(HINSTANCE hInst) {
# ifdef WIN32
return (hInst != 0);
# else // WIN16
return (hInst > HINSTANCE_ERROR);
# endif
}
*/
#endif // __cplusplus
WINUSERAPI HANDLE WINAPI LoadImageA(HINSTANCE, LPCSTR, UINT, int, int, UINT);
#endif // WIN32
#ifdef __cplusplus
inline BOOL IsInstance(HINSTANCE hInst) {
# ifdef WIN32
return (hInst != 0);
# else // WIN16
return (hInst > HINSTANCE_ERROR);
# endif
}
inline void SetWindowSmallIcon(HINSTANCE hInst, HWND hWnd, UINT uIconResourceId) {
#ifdef WIN32
# ifndef WM_SETICON
# define WM_SETICON 0x0080
# endif // WM_SETICON
# ifndef IMAGE_ICON
# define IMAGE_ICON 1
# endif
assert(IsWindow(hWnd));
HICON hIcon = (HICON)LoadImageA(hInst, MAKEINTRESOURCE(uIconResourceId), IMAGE_ICON,
16, 16, 0);
if(NULL != hIcon) {
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
} else {
HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(uIconResourceId));
assert(hIcon != 0);
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
}
#endif // WIN32
}
#endif // __cplusplus
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* PORT_H */

View File

@@ -1,137 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
#include <windows.h>
#include <windowsx.h>
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
#include <mapi.h>
#endif
#include "port.h"
#include "resource.h"
//
// Variables...
//
extern HINSTANCE hInst;
extern HINSTANCE m_hInstMapi;
extern LHANDLE mapiSession;
//
// Forward declarations...
//
extern void ShowMessage(HWND hWnd, LPSTR msg);
extern void SetFooter(LPSTR msg);
extern LPSTR GetMAPIError(LONG errorCode);
lpMapiMessage mailPtr = NULL;
void
ProcessReadMailCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
{
switch (id)
{
case ID_OK:
case IDCANCEL:
EndDialog(hWnd, 0);
break;
default:
break;
}
}
BOOL CALLBACK LOADDS
ReadMailDlgProc(HWND hWndMail, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch (wMsg)
{
case WM_INITDIALOG:
{
DWORD i;
// Do everything we need to display the message pointed to by
// mailPtr
if (!mailPtr)
break;
// Start with the basics...
SetDlgItemText(hWndMail, IDC_EDIT_SUBJECT, mailPtr->lpszSubject);
SetDlgItemText(hWndMail, IDC_EDIT_DATETIME, mailPtr->lpszDateReceived);
SetDlgItemText(hWndMail, IDC_EDIT_THREAD, mailPtr->lpszConversationID);
SetDlgItemText(hWndMail, IDC_EDIT_BODYTEXT, mailPtr->lpszNoteText);
char buf[1024];
wsprintf(buf, "%s (%s)", mailPtr->lpOriginator->lpszName,
mailPtr->lpOriginator->lpszAddress);
SetDlgItemText(hWndMail, IDC_EDIT_FROM, buf);
for (i=0; i<mailPtr->nRecipCount; i++)
{
wsprintf(buf, "%s (%s)", mailPtr->lpRecips[i].lpszName,
mailPtr->lpRecips[i].lpszAddress);
ListBox_InsertString(GetDlgItem(hWndMail, IDC_LIST_RECIPIENTS),
ListBox_GetCount(GetDlgItem(hWndMail, IDC_LIST_RECIPIENTS)),
buf);
}
for (i=0; i<mailPtr->nFileCount; i++)
{
ListBox_InsertString(GetDlgItem(hWndMail, IDC_LIST_ATTACHMENTS),
ListBox_GetCount(GetDlgItem(hWndMail, IDC_LIST_ATTACHMENTS)),
mailPtr->lpFiles[i].lpszPathName);
}
}
break;
case WM_COMMAND:
HANDLE_WM_COMMAND(hWndMail, wParam, lParam, ProcessReadMailCommand);
break;
default:
return FALSE;
}
return TRUE;
}
void
DisplayMAPIReadMail(HWND hWnd, lpMapiMessage msgPtr)
{
mailPtr = msgPtr;
DialogBox(hInst, MAKEINTRESOURCE(ID_DIALOG_READMAIL), hWnd,
(DLGPROC)ReadMailDlgProc);
}

View File

@@ -1,108 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by mtest32.rc
//
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#define ID_GUI_MESSAGE1 1
#define ID_BUTTON_MAPIADDRESS 3
#define ID_DIALOG 101
#define ID_ICON_APP 102
#define ID_MENU 104
#define ID_DIALOG_MAIL 105
#define ID_DIALOG_READMAIL 106
#define ID_SETFROMEDIT 1000
#define ID_SETTEXT 1001
#define ID_GETROWS 1001
#define ID_EDIT 1002
#define ID_EDIT_HWND 1002
#define ID_RESOURCETEXT 1003
#define ID_GETTEXT 1003
#define ID_STATIC_RESULT 1004
#define ID_GETVISROWS 1005
#define ID_GETWINID 1006
#define ID_SETROWFOCUS 1007
#define ID_GETROWFOCUS 1008
#define ID_EDIT_ROW 1009
#define ID_LIST_RESULT 1010
#define ID_GETCOLCOUNT 1011
#define ID_BUTTON_LOGON 1011
#define ID_SETROWINVIEW 1012
#define ID_BUTTON_LOGOFF 1012
#define ID_GETNUMCHILDREN 1013
#define ID_EDIT_USERNAME 1013
#define ID_CLEARRESULTS 1014
#define ID_EDIT_PW 1014
#define ID_BUTTON_FINDNEXT 1015
#define ID_BUTTON_CLEAR 1016
#define ID_BUTTON_READMAIL 1017
#define ID_BUTTON_DELETEMAIL 1018
#define IDC_EDIT_RESOLVENAME 1019
#define ID_BUTTON_MAPISENDMAIL 1020
#define ID_BUTTON_NSCPVERSION 1020
#define ID_BUTTON_RESOLVENAME 1021
#define ID_BUTTON_MAPISENDDOCUMENTS 1021
#define ID_EDIT_TOADDRESS 1022
#define ID_EDIT_CCADDRESS 1023
#define ID_BUTTON_DETAILS 1024
#define ID_EDIT_BCCADDRESS 1024
#define ID_EDIT_SUBJECT 1025
#define ID_BUTTON_MAIL 1025
#define ID_BUTTON_FREEBUFFER 1026
#define ID_EDIT_NOTETEXT 1026
#define ID_EDIT_ATTACH1 1027
#define ID_BUTTON_SYNC 1027
#define ID_EDIT_ATTACH2 1028
#define IDC_CHECK_BODYASFILE 1028
#define ID_EDIT_ATTACH3 1029
#define IDC_CHECK_ENVELOPEONLY 1029
#define IDC_LIST_ATTACHMENTS 1029
#define ID_EDIT_ATTACH4 1030
#define IDC_CHECK_PEEK 1030
#define IDC_EDIT_BODYTEXT 1030
#define IDC_CHECK_SUPPRESSATTACH 1031
#define IDC_LIST_RECIPIENTS 1031
#define ID_BUTTON_MAPISAVEMAIL 1031
#define IDC_EDIT_SUBJECT 1032
#define IDC_EDIT_DATETIME 1033
#define ID_OK 1034
#define IDC_EDIT_THREAD 1035
#define ID_CHECK_SHOWDIALOG 1035
#define IDC_EDIT_FROM 1036
#define ID_MENU_MYEXIT 30001
#define ID_MENU_CLEAR 30002
#define ID_MENU_MYABOUT 30003
#define ID_MENU_CLEARRESULTS 30004
#define ID_MENU_MAPIDELETEMAIL 30005
#define ID_MENU_MAPIFINDNEXT 30006
#define ID_MENU_MAPIREADMAIL 30007
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 107
#define _APS_NEXT_COMMAND_VALUE 30008
#define _APS_NEXT_CONTROL_VALUE 1036
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -1,117 +0,0 @@
<?xml version="1.0"?>
<!-- If you modify this file, please also update the following files -->
<!-- mailnews/mapi/resources/content/contents.rdf in the ns tree -->
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
<!-- list all the packages being supplied by this jar -->
<RDF:Seq about="urn:mozilla:package:root">
<RDF:li resource="urn:mozilla:package:messenger"/>
</RDF:Seq>
<!-- package information -->
<RDF:Description about="urn:mozilla:package:messenger"
chrome:displayName="Messenger"
chrome:author="mozilla.org"
chrome:name="messenger"
chrome:localeVersion="0.9.4"
chrome:skinVersion="0.9.4">
</RDF:Description>
<!-- overlay information -->
<RDF:Seq about="urn:mozilla:overlays">
<RDF:li resource="chrome://communicator/content/pref/preftree.xul"/>
<RDF:li resource="chrome://communicator/content/pref/pref-appearance.xul"/>
<RDF:li resource="chrome://communicator/content/pref/pref-advanced.xul"/>
<RDF:li resource="chrome://communicator/content/tasksOverlay.xul"/>
<RDF:li resource="chrome://navigator/content/navigatorOverlay.xul"/>
<RDF:li resource="chrome://communicator/content/history/history.xul"/>
<RDF:li resource="chrome://communicator/content/bookmarks/bookmarks.xul"/>
<RDF:li resource="chrome://communicator/content/bookmarks/bm-find.xul"/>
<RDF:li resource="chrome://messenger/content/messenger.xul"/>
<RDF:li resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul"/>
<RDF:li resource="chrome://messenger/content/messengercompose/messengercompose.xul"/>
<RDF:li resource="chrome://messenger/content/addressbook/addressbook.xul"/>
<RDF:li resource="chrome://messenger/content/addressbook/abSelectAddressesDialog.xul"/>
<RDF:li resource="chrome://editor/content/editor.xul"/>
<RDF:li resource="chrome://messenger/content/pref-mailnews.xul"/>
</RDF:Seq>
<!-- messenger preferences branches -->
<RDF:Seq about="chrome://communicator/content/pref/preftree.xul">
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger startup pref -->
<RDF:Seq about="chrome://communicator/content/pref/pref-appearance.xul">
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger js toggle pref -->
<RDF:Seq about="chrome://communicator/content/pref/pref-advanced.xul">
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger taskbar/tasks menu items -->
<RDF:Seq about="chrome://communicator/content/tasksOverlay.xul">
<RDF:li>chrome://messenger/content/mailTasksOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for History -->
<RDF:Seq about="chrome://communicator/content/history/history.xul">
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for Bookmarks -->
<RDF:Seq about="chrome://communicator/content/bookmarks/bookmarks.xul">
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for History -->
<RDF:Seq about="chrome://communicator/content/bookmarks/bm-find.xul">
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for Navigator -->
<RDF:Seq about="chrome://navigator/content/navigatorOverlay.xul">
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for Messenger -->
<RDF:Seq about="chrome://messenger/content/messenger.xul">
<RDF:li>chrome://messenger/content/mailMessengerOverlay.xul</RDF:li>
</RDF:Seq>
<RDF:Seq about="chrome://messenger/content/mail3PaneWindowVertLayout.xul">
<RDF:li>chrome://messenger/content/mailMessengerOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for Mail Compose -->
<RDF:Seq about="chrome://messenger/content/messengercompose/messengercompose.xul">
<RDF:li>chrome://messenger/content/mailMessengerComposeOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for Addressbook -->
<RDF:Seq about="chrome://messenger/content/addressbook/addressbook.xul">
<RDF:li>chrome://messenger/content/mailABOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for Select Addresses dialog -->
<RDF:Seq about="chrome://messenger/content/addressbook/abSelectAddressesDialog.xul">
<RDF:li>chrome://messenger/content/mailOverlay.xul</RDF:li>
</RDF:Seq>
<!-- messenger items for Composer -->
<RDF:Seq about="chrome://editor/content/editor.xul">
<RDF:li>chrome://messenger/content/mailEditorOverlay.xul</RDF:li>
</RDF:Seq>
<!-- mapi items for Mail And Newsgroups preferences pane -->
<RDF:Seq about="chrome://messenger/content/pref-mailnews.xul">
<RDF:li>chrome://messenger/content/pref-mailnewsOverlay.xul</RDF:li>
</RDF:Seq>
</RDF:RDF>

View File

@@ -1,4 +0,0 @@
messenger.jar:
content/messenger/pref-mailnewsOverlay.xul
+ content/messenger/contents.rdf
content/messenger/pref-mailnewsOverlay.js

View File

@@ -1,14 +0,0 @@
<?xml version="1.0"?>
<RDF:RDF xmlns:chrome="http://www.mozilla.org/rdf/chrome#"
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<!-- mapi items for mailnews preferences -->
<RDF:Seq about="urn:mozilla:overlays">
<RDF:li resource="chrome://messenger/content/pref-mailnews.xul"/>
</RDF:Seq>
<RDF:Seq about="chrome://messenger/content/pref-mailnews.xul">
<RDF:li>chrome://messenger/content/pref-mailnewsOverlay.xul</RDF:li>
</RDF:Seq>
</RDF:RDF>

View File

@@ -1,104 +0,0 @@
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Srilatha Moturi <srilatha@netscape.com>
*/
function mailnewsOverlayStartup() {
mailnewsOverlayInit();
parent.hPrefWindow.registerOKCallbackFunc(onOK);
if (!("mapiPref" in parent)) {
parent.mapiPref = new Object;
parent.mapiPref.isDefaultMailClient =
document.getElementById("mailnewsEnableMapi").checked;
}
else {
// when we switch between different panes
// set the checkbox based on the saved state
var mailnewsEnableMapi = document.getElementById("mailnewsEnableMapi");
if (parent.mapiPref.isDefaultMailClient)
mailnewsEnableMapi.setAttribute("checked", "true");
else
mailnewsEnableMapi.setAttribute("checked", "false");
}
}
function mailnewsOverlayInit() {
try {
var mapiRegistry = Components.classes[ "@mozilla.org/mapiregistry;1" ].
getService( Components.interfaces.nsIMapiRegistry );
}
catch(ex){
mapiRegistry = null;
}
const prefbase = "system.windows.lock_ui.";
var mailnewsEnableMapi = document.getElementById("mailnewsEnableMapi");
if (mapiRegistry) {
// initialise preference component.
// While the data is coming from the system registry, we use a set
// of parallel preferences to indicate if the ui should be locked.
try {
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService()
.QueryInterface(Components.interfaces.nsIPrefService);
var prefBranch = prefService.getBranch(prefbase);
if (prefBranch && prefBranch.prefIsLocked("default_mail_client")) {
if (prefBranch.getBoolPref("default_mail_client"))
mapiRegistry.setDefaultMailClient();
else
mapiRegistry.unsetDefaultMailClient();
mailnewsEnableMapi.setAttribute("disabled", "true");
}
}
catch(ex) {}
if (mapiRegistry.isDefaultMailClient)
mailnewsEnableMapi.setAttribute("checked", "true");
else
mailnewsEnableMapi.setAttribute("checked", "false");
}
else
mailnewsEnableMapi.setAttribute("disabled", "true");
}
function onEnableMapi() {
// save the state of the checkbox
if ("mapiPref" in parent)
parent.mapiPref.isDefaultMailClient =
document.getElementById("mailnewsEnableMapi").checked;
}
function onOK()
{
try {
var mapiRegistry = Components.classes[ "@mozilla.org/mapiregistry;1" ].
getService( Components.interfaces.nsIMapiRegistry );
}
catch(ex){
mapiRegistry = null;
}
if (mapiRegistry &&
("mapiPref" in parent) &&
(mapiRegistry.isDefaultMailClient != parent.mapiPref.isDefaultMailClient)) {
if (parent.mapiPref.isDefaultMailClient)
mapiRegistry.setDefaultMailClient();
else
mapiRegistry.unsetDefaultMailClient();
}
}

View File

@@ -1,44 +0,0 @@
<?xml version="1.0"?>
<!--
The contents of this file are subject to the Mozilla Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/MPL/
oftware distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is mozilla.org code.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 2001 Netscape Communications Corporation. All
Rights Reserved.
Contributor(s):
Srilatha Moturi <srilatha@netscape.com>
-->
<!DOCTYPE window [
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
%brandDTD;
<!ENTITY % prefMailnewsOverlayDTD SYSTEM "chrome://messenger/locale/pref-mailnewsOverlay.dtd" >
%prefMailnewsOverlayDTD;
]>
<overlay id="prefMailnewsOverlay"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript">
<![CDATA[
_elementIDs.push("mailnewsEnableMapi");
]]>
</script>
<script type="application/x-javascript" src="chrome://messenger/content/pref-mailnewsOverlay.js"/>
<hbox autostretch="never" id="mapi">
<checkbox id="mailnewsEnableMapi" label="&enableMapi.label;"
accesskey="&enableMapi.accesskey;"
oncommand="onEnableMapi();"
startFunc="mailnewsOverlayStartup();"/>
</hbox>
</overlay>

View File

@@ -1,3 +0,0 @@
en-US.jar:
locale/en-US/messenger/pref-mailnewsOverlay.dtd
locale/en-US/messenger/mapi.properties

View File

@@ -1,18 +0,0 @@
# Mail Integration Dialog
dialogTitle=%S Mail
dialogText=Do you want to use %S as the default mail application?
checkboxText=Do not display this dialog again
# MAPI Messages
loginText=Please enter your password for %S:
loginTextwithName=Please enter your username and password
loginTitle=%S Mail
PasswordTitle=%S Mail
# MAPI Error Messages
errorMessage=%S Mail could not be set as the default mail application because a registry key could not be updated. Verify with your system administrator that you have write access to your system registry, and then try again.
errorMessageTitle=%S Mail
# MAPI Security Messages
mapiBlindSendWarning=Another application is attempting to send mail using your user profile. Are you sure you want to send mail?
mapiBlindSendDontShowAgain=Warn me whenever other applications try to send mail from me

View File

@@ -1,3 +0,0 @@
<!ENTITY enableMapiTitle.label "When sending mail from other applications">
<!ENTITY enableMapi.label "Use &vendorShortName; Mail as the default mail application.">
<!ENTITY enableMapi.accesskey "u">

View File

@@ -0,0 +1,39 @@
/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsIChannel.idl"
interface nsISimpleEnumerator;
[scriptable, uuid(c7e410d1-85f2-11d3-9f63-006008a6efe9)]
interface nsIJARChannel : nsIChannel
{
/**
* Enumerates all the entries in the JAR (the root URI).
* ARGUMENTS:
* aRoot - a string representing the root dir to enumerate from
* or null to enumerate the whole thing.
*/
nsISimpleEnumerator EnumerateEntries(in string aRoot);
};

View File

@@ -0,0 +1,34 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "nsIProtocolHandler.idl"
interface nsIZipReaderCache;
[scriptable, uuid(92c3b42c-98c4-11d3-8cd9-0060b0fc14a3)]
interface nsIJARProtocolHandler : nsIProtocolHandler {
/**
* JARCache contains the collection of open jar files.
*/
readonly attribute nsIZipReaderCache JARCache;
};

View File

@@ -0,0 +1,42 @@
/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsIURI.idl"
/**
* JAR URLs have the following syntax
*
* jar:<jar-file-uri>!/<jar-entry>
*
* EXAMPLE: jar:http://www.big.com/blue.jar!/ocean.html
*/
[scriptable, uuid(c7e410d3-85f2-11d3-9f63-006008a6efe9)]
interface nsIJARURI : nsIURI {
/**
* Returns the root URI (the one for the actual JAR file) for this JAR.
* eg http://www.big.com/blue.jar
*/
attribute nsIURI JARFile;
/**
* Returns the entry specified for this JAR URI.
* eg ocean.html
*/
attribute string JAREntry;
};

View File

@@ -0,0 +1,696 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998,2000 Netscape Communications Corporation. All Rights
* Reserved.
*
*/
#include "nsNetUtil.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsJARChannel.h"
#include "nsCRT.h"
#include "nsIFileTransportService.h"
#include "nsIURI.h"
#include "nsCExternalHandlerService.h"
#include "nsIMIMEService.h"
#include "nsAutoLock.h"
#include "nsIFileStreams.h"
#include "nsMimeTypes.h"
#include "nsScriptSecurityManager.h"
#include "nsIAggregatePrincipal.h"
#include "nsIProgressEventSink.h"
#include "nsXPIDLString.h"
#include "nsIJAR.h"
static NS_DEFINE_CID(kFileTransportServiceCID, NS_FILETRANSPORTSERVICE_CID);
static NS_DEFINE_CID(kZipReaderCID, NS_ZIPREADER_CID);
static NS_DEFINE_CID(kScriptSecurityManagerCID, NS_SCRIPTSECURITYMANAGER_CID);
#if defined(PR_LOGGING)
//
// Log module for SocketTransport logging...
//
// To enable logging (see prlog.h for full details):
//
// set NSPR_LOG_MODULES=nsJarProtocol:5
// set NSPR_LOG_FILE=nspr.log
//
// this enables PR_LOG_DEBUG level information and places all output in
// the file nspr.log
//
PRLogModuleInfo* gJarProtocolLog = nsnull;
#endif /* PR_LOGGING */
////////////////////////////////////////////////////////////////////////////////
#define NS_DEFAULT_JAR_BUFFER_SEGMENT_SIZE (16*1024)
#define NS_DEFAULT_JAR_BUFFER_MAX_SIZE (256*1024)
nsJARChannel::nsJARChannel()
: mLoadFlags(LOAD_NORMAL),
mContentType(nsnull),
mContentLength(-1),
mJAREntry(nsnull),
mStatus(NS_OK),
mMonitor(nsnull)
{
NS_INIT_REFCNT();
#if defined(PR_LOGGING)
//
// Initialize the global PRLogModule for socket transport logging
// if necessary...
//
if (nsnull == gJarProtocolLog) {
gJarProtocolLog = PR_NewLogModule("nsJarProtocol");
}
#endif /* PR_LOGGING */
}
nsJARChannel::~nsJARChannel()
{
if (mContentType)
nsCRT::free(mContentType);
if (mJAREntry)
nsCRT::free(mJAREntry);
if (mMonitor)
PR_DestroyMonitor(mMonitor);
}
NS_IMPL_THREADSAFE_ISUPPORTS7(nsJARChannel,
nsIJARChannel,
nsIChannel,
nsIRequest,
nsIRequestObserver,
nsIStreamListener,
nsIStreamIO,
nsIDownloadObserver)
NS_METHOD
nsJARChannel::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
{
nsresult rv;
if (aOuter)
return NS_ERROR_NO_AGGREGATION;
nsJARChannel* jarChannel = new nsJARChannel();
if (jarChannel == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(jarChannel);
rv = jarChannel->QueryInterface(aIID, aResult);
NS_RELEASE(jarChannel);
return rv;
}
nsresult
nsJARChannel::Init(nsIJARProtocolHandler* aHandler, nsIURI* uri)
{
nsresult rv;
mURI = do_QueryInterface(uri, &rv);
if (NS_FAILED(rv)) return rv;
mMonitor = PR_NewMonitor();
if (mMonitor == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
mJARProtocolHandler = aHandler;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// nsIRequest methods
NS_IMETHODIMP
nsJARChannel::GetName(PRUnichar* *result)
{
nsresult rv;
nsXPIDLCString urlStr;
rv = mURI->GetSpec(getter_Copies(urlStr));
if (NS_FAILED(rv)) return rv;
nsString name;
name.AppendWithConversion(urlStr);
*result = name.ToNewUnicode();
return *result ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsJARChannel::IsPending(PRBool* result)
{
NS_NOTREACHED("nsJARChannel::IsPending");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::GetStatus(nsresult *status)
{
*status = mStatus;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::Cancel(nsresult status)
{
NS_ASSERTION(NS_FAILED(status), "shouldn't cancel with a success code");
nsresult rv = NS_OK;
nsAutoMonitor monitor(mMonitor);
if (mJarExtractionTransport) {
rv = mJarExtractionTransport->Cancel(status);
mJarExtractionTransport = nsnull;
}
mStatus = status;
return rv;
}
NS_IMETHODIMP
nsJARChannel::Suspend()
{
nsresult rv = NS_OK;
nsAutoMonitor monitor(mMonitor);
if (mJarExtractionTransport) {
rv = mJarExtractionTransport->Suspend();
}
return rv;
}
NS_IMETHODIMP
nsJARChannel::Resume()
{
nsresult rv = NS_OK;
nsAutoMonitor monitor(mMonitor);
if (mJarExtractionTransport) {
rv = mJarExtractionTransport->Resume();
}
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIChannel methods
NS_IMETHODIMP
nsJARChannel::GetOriginalURI(nsIURI* *aOriginalURI)
{
if (mOriginalURI)
*aOriginalURI = mOriginalURI;
else
*aOriginalURI = NS_STATIC_CAST(nsIURI*, mURI);
NS_IF_ADDREF(*aOriginalURI);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetOriginalURI(nsIURI* aOriginalURI)
{
mOriginalURI = aOriginalURI;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetURI(nsIURI* *aURI)
{
*aURI = mURI;
NS_ADDREF(*aURI);
return NS_OK;
}
nsresult
nsJARChannel::OpenJARElement()
{
nsresult rv;
nsAutoCMonitor mon(this);
rv = Open(nsnull, nsnull);
if (NS_SUCCEEDED(rv))
rv = GetInputStream(getter_AddRefs(mSynchronousInputStream));
mon.Notify(); // wake up nsIChannel::Open
return rv;
}
NS_IMETHODIMP
nsJARChannel::Open(nsIInputStream* *result)
{
nsAutoCMonitor mon(this);
nsresult rv;
mSynchronousRead = PR_TRUE;
rv = EnsureJARFileAvailable();
if (NS_FAILED(rv)) return rv;
if (mSynchronousInputStream == nsnull)
mon.Wait();
if (mSynchronousInputStream)
{
*result = mSynchronousInputStream; // Result of GetInputStream called on transport thread
NS_ADDREF(*result);
mSynchronousInputStream = 0;
return NS_OK;
}
else
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARChannel::AsyncOpen(nsIStreamListener* listener, nsISupports* ctxt)
{
nsresult rv;
mUserContext = ctxt;
mUserListener = listener;
if (mLoadGroup) {
rv = mLoadGroup->AddRequest(this, nsnull);
if (NS_FAILED(rv)) return rv;
}
mSynchronousRead = PR_FALSE;
return EnsureJARFileAvailable();
}
nsresult
nsJARChannel::EnsureJARFileAvailable()
{
nsresult rv;
nsCOMPtr<nsIChannel> jarBaseChannel;
nsCOMPtr<nsIFile> jarCacheFile;
nsCOMPtr<nsIChannel> jarCacheTransport;
nsCOMPtr<nsIInputStream> jarBaseIn;
#ifdef PR_LOGGING
nsXPIDLCString jarURLStr;
mURI->GetSpec(getter_Copies(jarURLStr));
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: EnsureJARFileAvailable %s", (const char*)jarURLStr));
#endif
rv = mURI->GetJARFile(getter_AddRefs(mJARBaseURI));
if (NS_FAILED(rv)) goto error;
rv = mURI->GetJAREntry(&mJAREntry);
if (NS_FAILED(rv)) goto error;
rv = NS_NewDownloader(getter_AddRefs(mDownloader),
mJARBaseURI, this, nsnull, mSynchronousRead, mLoadGroup, mCallbacks,
mLoadFlags);
// if DownloadComplete() was called early, need to release the reference.
if (mSynchronousRead && mSynchronousInputStream)
mDownloader = null_nsCOMPtr();
error:
if (NS_FAILED(rv) && mLoadGroup) {
nsresult rv2 = mLoadGroup->RemoveRequest(this, nsnull, NS_OK);
NS_ASSERTION(NS_SUCCEEDED(rv2), "RemoveChannel failed");
}
return rv;
}
nsresult
nsJARChannel::AsyncReadJARElement()
{
nsresult rv;
nsAutoMonitor monitor(mMonitor);
NS_WITH_SERVICE(nsIFileTransportService, fts, kFileTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsITransport> jarTransport;
rv = fts->CreateTransportFromStreamIO(this, getter_AddRefs(jarTransport));
if (NS_FAILED(rv)) return rv;
if (mCallbacks) {
nsCOMPtr<nsIProgressEventSink> sink = do_GetInterface(mCallbacks);
if (sink) {
// don't think that this is not needed anymore
// jarTransport->SetProgressEventSink(sink);
}
}
#ifdef PR_LOGGING
nsXPIDLCString jarURLStr;
mURI->GetSpec(getter_Copies(jarURLStr));
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: AsyncRead jar entry %s", (const char*)jarURLStr));
#endif
rv = jarTransport->AsyncRead(this, nsnull, 0, PRUint32(-1), 0,
getter_AddRefs(mJarExtractionTransport));
mJarExtractionTransport = 0;
jarTransport = 0;
return rv;
}
NS_IMETHODIMP
nsJARChannel::GetLoadFlags(PRUint32* aLoadFlags)
{
*aLoadFlags = mLoadFlags;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetLoadFlags(PRUint32 aLoadFlags)
{
mLoadFlags = aLoadFlags;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetContentType(char* *aContentType)
{
nsresult rv = NS_OK;
if (mContentType == nsnull) {
if (!mJAREntry)
return NS_ERROR_FAILURE;
char* fileName = nsCRT::strdup(mJAREntry);
if (fileName != nsnull) {
PRInt32 len = nsCRT::strlen(fileName);
const char* ext = nsnull;
for (PRInt32 i = len-1; i >= 0; i--) {
if (fileName[i] == '.') {
ext = &fileName[i + 1];
break;
}
}
if (ext) {
nsCOMPtr<nsIMIMEService> mimeServ (do_GetService(NS_MIMESERVICE_CONTRACTID, &rv));
if (NS_SUCCEEDED(rv)) {
rv = mimeServ->GetTypeFromExtension(ext, &mContentType);
}
}
else
rv = NS_ERROR_OUT_OF_MEMORY;
nsCRT::free(fileName);
}
else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
if (NS_FAILED(rv)) {
mContentType = nsCRT::strdup(UNKNOWN_CONTENT_TYPE);
if (mContentType == nsnull)
rv = NS_ERROR_OUT_OF_MEMORY;
else
rv = NS_OK;
}
}
if (NS_SUCCEEDED(rv)) {
*aContentType = nsCRT::strdup(mContentType);
if (*aContentType == nsnull)
rv = NS_ERROR_OUT_OF_MEMORY;
}
return rv;
}
NS_IMETHODIMP
nsJARChannel::SetContentType(const char *aContentType)
{
if (mContentType) {
nsCRT::free(mContentType);
}
mContentType = nsCRT::strdup(aContentType);
if (!mContentType) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetContentLength(PRInt32* aContentLength)
{
if (mContentLength == -1)
return NS_ERROR_FAILURE;
*aContentLength = mContentLength;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetContentLength(PRInt32 aContentLength)
{
NS_NOTREACHED("nsJARChannel::SetContentLength");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
{
*aLoadGroup = mLoadGroup;
NS_IF_ADDREF(*aLoadGroup);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
{
mLoadGroup = aLoadGroup;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetOwner(nsISupports* *aOwner)
{
nsresult rv;
if (mOwner == nsnull) {
//-- Verify signature, if one is present, and set owner accordingly
rv = EnsureZipReader();
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIJAR> jar = do_QueryInterface(mJAR, &rv);
NS_ASSERTION(NS_SUCCEEDED(rv), "Zip reader is not an nsIJAR");
nsCOMPtr<nsIPrincipal> certificate;
rv = jar->GetCertificatePrincipal(mJAREntry,
getter_AddRefs(certificate));
if (NS_FAILED(rv)) return rv;
if (certificate)
{ // Get the codebase principal
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
kScriptSecurityManagerCID, &rv);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
nsCOMPtr<nsIPrincipal> codebase;
rv = secMan->GetCodebasePrincipal(mJARBaseURI,
getter_AddRefs(codebase));
if (NS_FAILED(rv)) return rv;
// Join the certificate and the codebase
nsCOMPtr<nsIAggregatePrincipal> agg;
agg = do_QueryInterface(certificate, &rv);
rv = agg->SetCodebase(codebase);
if (NS_FAILED(rv)) return rv;
mOwner = do_QueryInterface(agg, &rv);
if (NS_FAILED(rv)) return rv;
}
}
*aOwner = mOwner;
NS_IF_ADDREF(*aOwner);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetOwner(nsISupports* aOwner)
{
mOwner = aOwner;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
{
*aNotificationCallbacks = mCallbacks.get();
NS_IF_ADDREF(*aNotificationCallbacks);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
{
mCallbacks = aNotificationCallbacks;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetSecurityInfo(nsISupports * *aSecurityInfo)
{
*aSecurityInfo = nsnull;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// nsIDownloadObserver methods:
NS_IMETHODIMP
nsJARChannel::OnDownloadComplete(nsIDownloader* aDownloader, nsISupports* aClosure,
nsresult aStatus, nsIFile* aFile)
{
nsresult rv=aStatus;
if(NS_SUCCEEDED(aStatus)) {
NS_ASSERTION(!mDownloader ||(aDownloader == mDownloader.get()), "wrong downloader");
mDownloadedJARFile = aFile;
// after successfully downloading the jar file to the cache,
// start the extraction process:
if (mSynchronousRead)
rv = OpenJARElement();
else
rv = AsyncReadJARElement();
}
mDownloader = 0;
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIRequestObserver methods:
NS_IMETHODIMP
nsJARChannel::OnStartRequest(nsIRequest* jarExtractionTransport,
nsISupports* context)
{
return mUserListener->OnStartRequest(this, mUserContext);
}
NS_IMETHODIMP
nsJARChannel::OnStopRequest(nsIRequest* jarExtractionTransport, nsISupports* context,
nsresult aStatus)
{
nsresult rv;
#ifdef PR_LOGGING
nsCOMPtr<nsIURI> jarURI;
nsXPIDLCString jarURLStr;
rv = mURI->GetSpec(getter_Copies(jarURLStr));
if (NS_SUCCEEDED(rv)) {
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: jar extraction complete %s status=%x",
(const char*)jarURLStr, aStatus));
}
#endif
rv = mUserListener->OnStopRequest(this, mUserContext, aStatus);
NS_ASSERTION(NS_SUCCEEDED(rv), "OnStopRequest failed");
if (mLoadGroup)
mLoadGroup->RemoveRequest(this, context, aStatus);
mUserListener = nsnull;
mUserContext = nsnull;
mJarExtractionTransport = nsnull;
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIStreamListener methods:
NS_IMETHODIMP
nsJARChannel::OnDataAvailable(nsIRequest* jarCacheTransport,
nsISupports* context,
nsIInputStream *inStr,
PRUint32 sourceOffset,
PRUint32 count)
{
return mUserListener->OnDataAvailable(this, mUserContext,
inStr, sourceOffset, count);
}
////////////////////////////////////////////////////////////////////////////////
// nsIStreamIO methods:
nsresult
nsJARChannel::EnsureZipReader()
{
if (mJAR == nsnull) {
nsresult rv;
if (mDownloadedJARFile == nsnull)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIZipReaderCache> jarCache;
rv = mJARProtocolHandler->GetJARCache(getter_AddRefs(jarCache));
if (NS_FAILED(rv)) return rv;
rv = jarCache->GetZip(mDownloadedJARFile, getter_AddRefs(mJAR));
if (NS_FAILED(rv)) return rv;
}
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::Open(char* *contentType, PRInt32 *contentLength)
{
nsresult rv;
rv = EnsureZipReader();
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIZipEntry> entry;
rv = mJAR->GetEntry(mJAREntry, getter_AddRefs(entry));
if (NS_FAILED(rv)) return rv;
if (contentLength) {
rv = entry->GetRealSize((PRUint32*)contentLength);
if (NS_FAILED(rv)) return rv;
}
if (contentType) {
rv = GetContentType(contentType);
if (NS_FAILED(rv)) return rv;
}
return rv;
}
NS_IMETHODIMP
nsJARChannel::Close(nsresult status)
{
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetInputStream(nsIInputStream* *aInputStream)
{
#ifdef PR_LOGGING
nsXPIDLCString jarURLStr;
mURI->GetSpec(getter_Copies(jarURLStr));
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: GetInputStream jar entry %s", (const char*)jarURLStr));
#endif
NS_ENSURE_TRUE(mJAR, NS_ERROR_NULL_POINTER);
return mJAR->GetInputStream(mJAREntry, aInputStream);
}
NS_IMETHODIMP
nsJARChannel::GetOutputStream(nsIOutputStream* *aOutputStream)
{
NS_NOTREACHED("nsJARChannel::GetOutputStream");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::GetName(char* *aName)
{
return mURI->GetSpec(aName);
}
////////////////////////////////////////////////////////////////////////////////
// nsIJARChannel methods:
NS_IMETHODIMP
nsJARChannel::EnumerateEntries(const char *aRoot, nsISimpleEnumerator **_retval)
{
NS_NOTREACHED("nsJARChannel::EnumerateEntries");
return NS_ERROR_NOT_IMPLEMENTED;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,111 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998,2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef nsJARChannel_h__
#define nsJARChannel_h__
#include "nsIJARChannel.h"
#include "nsIStreamListener.h"
#include "nsIJARProtocolHandler.h"
#include "nsIJARURI.h"
#include "nsIStreamIO.h"
#include "nsIChannel.h"
#include "nsIZipReader.h"
#include "nsIChannel.h"
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "nsIFile.h"
#include "prmon.h"
#include "nsIDownloader.h"
#include "nsIInputStream.h"
class nsIFileChannel;
class nsJARChannel;
#define NS_JARCHANNEL_CID \
{ /* 0xc7e410d5-0x85f2-11d3-9f63-006008a6efe9 */ \
0xc7e410d5, \
0x85f2, \
0x11d3, \
{0x9f, 0x63, 0x00, 0x60, 0x08, 0xa6, 0xef, 0xe9} \
}
class nsJARChannel : public nsIJARChannel,
public nsIStreamListener,
public nsIStreamIO,
public nsIDownloadObserver
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSIJARCHANNEL
NS_DECL_NSIREQUESTOBSERVER
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSISTREAMIO
NS_DECL_NSIDOWNLOADOBSERVER
nsJARChannel();
virtual ~nsJARChannel();
// Define a Create method to be used with a factory:
static NS_METHOD
Create(nsISupports* aOuter, REFNSIID aIID, void **aResult);
nsresult Init(nsIJARProtocolHandler* aHandler, nsIURI* uri);
nsresult EnsureJARFileAvailable();
nsresult OpenJARElement();
nsresult AsyncReadJARElement();
nsresult EnsureZipReader();
friend class nsJARDownloadObserver;
protected:
nsCOMPtr<nsIJARProtocolHandler> mJARProtocolHandler;
nsCOMPtr<nsIJARURI> mURI;
nsCOMPtr<nsILoadGroup> mLoadGroup;
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI;
nsLoadFlags mLoadFlags;
nsCOMPtr<nsISupports> mOwner;
nsCOMPtr<nsISupports> mUserContext;
nsCOMPtr<nsIStreamListener> mUserListener;
char* mContentType;
PRInt32 mContentLength;
nsCOMPtr<nsIURI> mJARBaseURI;
char* mJAREntry;
nsCOMPtr<nsIZipReader> mJAR;
nsCOMPtr<nsIFile> mDownloadedJARFile;
nsresult mStatus;
PRBool mSynchronousRead;
nsCOMPtr<nsIInputStream> mSynchronousInputStream;
PRMonitor* mMonitor;
nsCOMPtr<nsIDownloader> mDownloader;
nsCOMPtr<nsIRequest> mJarExtractionTransport;
};
#endif // nsJARChannel_h__

Some files were not shown because too many files have changed in this diff Show More