xref: /trunk/main/xml2cmp/source/support/syshelp.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 
29 #include <syshelp.hxx>
30 
31 
32 // NOT FULLY DEFINED SERVICES
33 #include <string.h>
34 #include "sistr.hxx"
35 #include "list.hxx"
36 
37 #ifdef WNT
38 #include <io.h>
39 #elif defined(UNX) || defined(OS2)
40 #include <sys/types.h>
41 #include <sys/stat.h>
42 #include <dirent.h>
43 #define stricmp strcasecmp
44 #else
45 #error Must run under unix or windows, please define UNX or WNT.
46 #endif
47 
48 
49 char C_sSpaceInName[] = "&nbsp;&nbsp;&nbsp;";
50 
51 void
52 WriteName( std::ostream &       o_rFile,
53            const Simstr &   i_rIdlDocuBaseDir,
54            const Simstr &   i_rName,
55            E_LinkType       i_eLinkType )
56 {
57     if (i_rName.l() == 0)
58         return;
59 
60 
61     const char * pNameEnd = strstr( i_rName.str(), " in " );
62 
63     // No link:
64     if ( i_eLinkType == lt_nolink )
65     {
66         if ( pNameEnd != 0 )
67         {
68             const char * pStart = i_rName.str();
69             o_rFile.write( pStart, pNameEnd - pStart );
70             WriteStr( o_rFile, C_sSpaceInName );
71             WriteStr( o_rFile, pNameEnd );
72         }
73         else
74         {
75             WriteStr( o_rFile, i_rName );
76         }
77         return;
78     }
79 
80     if ( i_eLinkType == lt_idl )
81     {
82         Simstr sPath(i_rName);
83         sPath.replace_all('.','/');
84         int nNameEnd = sPath.pos_first(' ');
85         int nPathStart = sPath.pos_last(' ');
86         WriteStr( o_rFile, "<A HREF=\"" );
87 
88         if ( nNameEnd > -1 )
89         {
90             WriteStr( o_rFile, "file:///" );
91             WriteStr( o_rFile, i_rIdlDocuBaseDir );
92             WriteStr( o_rFile, "/" );
93             WriteStr( o_rFile, sPath.str() + 1 + nPathStart );
94             WriteStr( o_rFile, "/" );
95             o_rFile.write( sPath.str(), nNameEnd );
96             WriteStr( o_rFile, ".html\">" );
97         }
98         else
99         {   // Should not be reached:
100             WriteStr(o_rFile, i_rName);
101             return;
102         }
103     }
104     else if ( i_eLinkType == lt_html )
105     {
106         int nKomma = i_rName.pos_first(',');
107         int nEnd = i_rName.pos_first(' ');
108         if ( nKomma > -1 )
109         {
110             o_rFile.write( i_rName.str(), nKomma );
111             WriteStr( o_rFile, ": " );
112 
113             WriteStr( o_rFile, "<A HREF=\"" );
114 
115             o_rFile.write( i_rName.str(), nKomma );
116             WriteStr( o_rFile, ".html#" );
117             if ( nEnd > -1 )
118                 o_rFile.write( i_rName.str() + nKomma + 1, nEnd - nKomma );
119             else
120                 WriteStr( o_rFile, i_rName.str() + nKomma + 1 );
121             WriteStr( o_rFile, "\">" );
122 
123             o_rFile.write( i_rName.str() + nKomma + 1, nEnd - nKomma );
124         }
125         else
126         {
127             WriteStr( o_rFile, "<A HREF=\"" );
128             WriteStr( o_rFile, i_rName );
129             WriteStr( o_rFile, ".html\">" );
130 
131             WriteStr( o_rFile, i_rName );
132         }
133         WriteStr( o_rFile, "</A>" );
134         return;
135     }
136 
137     if ( pNameEnd != 0 )
138     {
139         const char * pStart = i_rName.str();
140         if ( pNameEnd > pStart )
141             o_rFile.write( pStart, pNameEnd - pStart );
142         WriteStr( o_rFile, "</A>" );
143 
144         WriteStr( o_rFile, C_sSpaceInName );
145         WriteStr( o_rFile, pNameEnd );
146     }
147     else
148     {
149         WriteStr( o_rFile, i_rName );
150         WriteStr( o_rFile, "</A>" );
151     }
152 }
153 
154 
155 void
156 WriteStr( std::ostream &    o_rFile,
157           const char *      i_sStr )
158 {
159     o_rFile.write( i_sStr, (int) strlen(i_sStr) );
160 }
161 
162 void
163 WriteStr( std::ostream &      o_rFile,
164           const Simstr &      i_sStr )
165 {
166     o_rFile.write( i_sStr.str(), i_sStr.l() );
167 }
168 
169 
170 const char C_sXML_END[] = "\\*.xml";
171 
172 void
173 GatherFileNames( List<Simstr> &     o_sFiles,
174                  const char *       i_sSrcDirectory )
175 {
176     static int   nAliveCounter = 0;
177 
178     char *       sNextDir = 0;
179     Simstr       sNew = 0;
180 
181 #ifdef WNT
182     struct _finddata_t aEntry;
183     long hFile = 0;
184     int bFindMore = 0;
185     char * sFilter = new char[ strlen(i_sSrcDirectory) + sizeof C_sXML_END ];
186 
187     // Stayingalive sign
188     if (++nAliveCounter % 100 == 1)
189         std::cout << "." << std::flush;
190 
191     strcpy(sFilter, i_sSrcDirectory);       // STRCPY SAFE HERE
192     strcat(sFilter,C_sXML_END);             // STRCAT SAFE HERE
193 
194     hFile = _findfirst( sFilter, &aEntry );
195     for ( bFindMore = hFile == -1;
196           bFindMore == 0;
197           bFindMore = _findnext( hFile, &aEntry ) )
198     {
199         sNew = i_sSrcDirectory;
200         sNew += "\\";
201         sNew += aEntry.name;
202         o_sFiles.push_back(sNew);
203     }   // end for
204 
205     _findclose(hFile);
206     delete [] sFilter;
207 #elif defined(UNX) || defined(OS2)
208     DIR * pDir = opendir( i_sSrcDirectory );
209     dirent * pEntry = 0;
210     char * sEnding;
211 
212     // Stayingalive sign
213     if (++nAliveCounter % 100 == 1)
214         std::cout << "." << std::flush;
215 
216     while ( (pEntry = readdir(pDir)) != 0 )
217     {
218         sEnding = strrchr(pEntry->d_name,'.');
219         if (sEnding != 0 ? stricmp(sEnding,".xml") == 0 : 0 )
220         {
221             sNew = i_sSrcDirectory;
222             sNew += "/";
223             sNew += pEntry->d_name;
224             o_sFiles.push_back(sNew);
225         }
226     }   // end while
227 
228     closedir( pDir );
229 #else
230 #error Must run on unix or windows, please define UNX or WNT.
231 #endif
232 
233     //  gathering from subdirectories:
234     List<Simstr> aSubDirectories;
235     GatherSubDirectories( aSubDirectories, i_sSrcDirectory );
236 
237     unsigned d_max = aSubDirectories.size();
238     for ( unsigned d = 0; d < d_max; ++d )
239     {
240         sNextDir = new char[ strlen(i_sSrcDirectory) + 2 + aSubDirectories[d].l() ];
241 
242         strcpy(sNextDir, i_sSrcDirectory);
243         strcat(sNextDir, C_sSLASH);
244         strcat(sNextDir, aSubDirectories[d].str());
245         GatherFileNames(o_sFiles, sNextDir);
246 
247         delete [] sNextDir;
248     }
249 }
250 
251 
252 const char * C_sANYDIR = "\\*.*";
253 
254 void
255 GatherSubDirectories( List<Simstr> &    o_sSubDirectories,
256                       const char *      i_sParentdDirectory )
257 {
258     Simstr sNew;
259 
260 #ifdef WNT
261     struct _finddata_t aEntry;
262     long hFile = 0;
263     int bFindMore = 0;
264     char * sFilter = new char[strlen(i_sParentdDirectory) + sizeof C_sANYDIR];
265 
266     strcpy(sFilter, i_sParentdDirectory);
267     strcat(sFilter,C_sANYDIR);
268 
269     hFile = _findfirst( sFilter, &aEntry );
270     for ( bFindMore = hFile == -1;
271           bFindMore == 0;
272           bFindMore = _findnext( hFile, &aEntry ) )
273     {
274         if (aEntry.attrib == _A_SUBDIR)
275         {
276             // Do not gather . .. and outputtree directories
277             if ( strchr(aEntry.name,'.') == 0
278                  && strncmp(aEntry.name, "wnt", 3) != 0
279                  && strncmp(aEntry.name, "unx", 3) != 0 )
280             {
281                 sNew = aEntry.name;
282                 o_sSubDirectories.push_back(sNew);
283             }
284         }   // endif (aEntry.attrib == _A_SUBDIR)
285     }   // end for
286     _findclose(hFile);
287     delete [] sFilter;
288 
289 #elif defined(UNX) || defined(OS2)
290     DIR * pDir = opendir( i_sParentdDirectory );
291     dirent * pEntry = 0;
292     struct stat     aEntryStatus;
293 
294     while ( ( pEntry = readdir(pDir) ) != 0 )
295     {
296         stat(pEntry->d_name, &aEntryStatus);
297         if ( ( aEntryStatus.st_mode & S_IFDIR ) == S_IFDIR )
298         {
299             // Do not gather . .. and outputtree directories
300             if ( strchr(pEntry->d_name,'.') == 0
301                  && strncmp(pEntry->d_name, "wnt", 3) != 0
302                  && strncmp(pEntry->d_name, "unx", 3) != 0 )
303             {
304                 sNew = pEntry->d_name;
305                 o_sSubDirectories.push_back(sNew);
306             }
307         }   // endif (aEntry.attrib == _A_SUBDIR)
308     }   // end while
309     closedir( pDir );
310 #else
311 #error Must run on unix or windows, please define UNX or WNT.
312 #endif
313 }
314 
315