1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #include <stdlib.h> 25 #include <stdio.h> 26 #include <string.h> 27 #include <unistd.h> 28 #include <process.h> 29 #include <time.h> 30 31 #define INCL_DOS 32 #define INCL_DOSERRORS 33 #define INCL_PM 34 #include <os2.h> 35 36 // OOo uses popen() to start us, so we cannot show PM dialogs. 37 // log message to disk. 38 void logMessage( char* msg) 39 { 40 PPIB pib; 41 CHAR szApplicationName[_MAX_PATH]; 42 CHAR szDrive[_MAX_PATH]; 43 CHAR szDir[_MAX_PATH]; 44 CHAR szFileName[_MAX_PATH]; 45 CHAR szExt[_MAX_PATH]; 46 FILE* log; 47 time_t timeOfDay; 48 struct tm* localTime; 49 50 // get executable fullpath 51 DosGetInfoBlocks(NULL, &pib); 52 DosQueryModuleName(pib->pib_hmte, sizeof(szApplicationName), szApplicationName); 53 _splitpath( szApplicationName, szDrive, szDir, szFileName, szExt ); 54 // log name 55 _makepath( szApplicationName, szDrive, szDir, szFileName, (".LOG") ); 56 log = fopen( szApplicationName, "a"); 57 if (!log) 58 return; 59 time( &timeOfDay); 60 localTime = localtime( &timeOfDay); 61 fprintf( log, "%04d/%02d/%02d %02d:%02d:%02d %s\n", 62 localTime->tm_year+1900, localTime->tm_mon+1, localTime->tm_mday, 63 localTime->tm_hour, localTime->tm_min, localTime->tm_sec, msg); 64 fclose( log); 65 } 66 67 // dump comand line arguments 68 void dumpArgs( int argc, char *argv[] ) 69 { 70 int i; 71 72 logMessage( "Start of command line arguments dump:"); 73 for( i=0; i<argc; i++) 74 logMessage( argv[i]); 75 } 76 77 /* 78 * The intended use of this tool is to pass the argument to 79 * the default mail handler. 80 */ 81 int main(int argc, char *argv[] ) 82 { 83 APIRET rc; 84 RESULTCODES result = {0}; 85 char szAppFromINI[_MAX_PATH]; 86 char szDirFromINI[_MAX_PATH]; 87 char szCmdLine[1024]; 88 char szFail[ _MAX_PATH]; 89 ULONG ulSID; 90 PID pid; 91 int i; 92 BOOL bMailClient = FALSE; 93 94 // check parameters 95 if (argc < 5) 96 { 97 logMessage( "Usage: senddoc --mailclient <client> --attach <uri>"); 98 dumpArgs( argc, argv); 99 return -1; 100 } 101 102 // check configuration 103 rc = PrfQueryProfileString(HINI_USER, "WPURLDEFAULTSETTINGS", 104 "DefaultMailExe", "", 105 szAppFromINI, sizeof(szAppFromINI)); 106 rc = PrfQueryProfileString(HINI_USER, "WPURLDEFAULTSETTINGS", 107 "DefaultMailWorkingDir", "", 108 szDirFromINI, sizeof(szDirFromINI)); 109 if (*szAppFromINI == 0 || *szDirFromINI == 0) 110 { 111 logMessage( "Unable to find default mail handler in USER.INI; exiting."); 112 dumpArgs( argc, argv); 113 return -1; 114 } 115 116 // get default parameter list, at leat -compose is required 117 rc = PrfQueryProfileString(HINI_USER, "WPURLDEFAULTSETTINGS", 118 "DefaultMailParameters", "", 119 szCmdLine, sizeof(szCmdLine)); 120 if (strstr( szCmdLine, "-compose") == 0) 121 strcat( szCmdLine, " -compose"); // add if missing! 122 123 // parse cmdline arguments 124 for( i=1; i<argc; i++) 125 { 126 if (!strcmp( argv[i], "--mailclient")) { 127 // we support only Thunderbird/Mozilla command line options, check exe name 128 if (strstr( argv[i+1], "thunderbird") == 0 129 && strstr( argv[i+1], "mozilla") == 0 130 && strstr( argv[i+1], "seamonkey") == 0) 131 { 132 logMessage( "Only Thunderbird/Mozilla is currently supported. Exiting."); 133 dumpArgs( argc, argv); 134 return -1; 135 } 136 // mail client found 137 bMailClient = TRUE; 138 i++; 139 } else if (!strcmp( argv[i], "--attach")) { 140 strcat( szCmdLine, " attachment=file://"); 141 strcat( szCmdLine, argv[i+1]); 142 i++; 143 } 144 // ignore other options (BTW currently none) 145 } 146 if (bMailClient == FALSE) 147 { 148 logMessage( "No mail client specified. Exiting."); 149 dumpArgs( argc, argv); 150 return -1; 151 } 152 153 // change default directory 154 _chdir( szDirFromINI); 155 156 // start default handler 157 STARTDATA SData; 158 CHAR szObjBuf[CCHMAXPATH]; 159 160 SData.Length = sizeof(STARTDATA); 161 SData.Related = SSF_RELATED_INDEPENDENT; 162 SData.FgBg = (1) ? SSF_FGBG_FORE : SSF_FGBG_BACK; 163 SData.TraceOpt = SSF_TRACEOPT_NONE; 164 165 SData.PgmTitle = (PSZ)szAppFromINI; 166 167 SData.PgmName = (PSZ)szAppFromINI; 168 SData.PgmInputs = (PSZ)szCmdLine; 169 170 SData.TermQ = NULL; 171 SData.Environment = 0; 172 SData.InheritOpt = SSF_INHERTOPT_PARENT; 173 SData.SessionType = SSF_TYPE_PM; 174 SData.IconFile = 0; 175 SData.PgmHandle = 0; 176 177 SData.PgmControl = SSF_CONTROL_VISIBLE; 178 179 SData.InitXPos = 30; 180 SData.InitYPos = 40; 181 SData.InitXSize = 200; 182 SData.InitYSize = 140; 183 SData.Reserved = 0; 184 SData.ObjectBuffer = szFail; 185 SData.ObjectBuffLen = (ULONG)sizeof(szFail); 186 187 rc = DosStartSession( &SData, &ulSID, &pid); 188 // show error dialog in case of problems 189 if (rc != NO_ERROR && rc != ERROR_SMG_START_IN_BACKGROUND) { 190 char szMessage[ _MAX_PATH*2]; 191 sprintf( szMessage, "Execution failed! rc: %d, failing module:%s", rc, szFail); 192 logMessage( szMessage); 193 dumpArgs( argc, argv); 194 return -1; 195 } 196 197 // ok 198 return 0; 199 } 200 201