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