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 #include <osl/process.h>
24 #ifndef _RTL_OSTRINGBUFFER_HXX_
25 #include <rtl/strbuf.hxx>
26 #endif
27 #include <rtl/ustring.hxx>
28 #include <osl/thread.h>
29 #include <osl/file.hxx>
30
31 #include <stdlib.h>
32 #include <stdio.h>
33 #if defined(SAL_W32) || defined(SAL_OS2)
34 #include <io.h>
35 #include <direct.h>
36 #include <errno.h>
37 #endif
38
39 #ifdef UNX
40 #include <sys/stat.h>
41 #include <errno.h>
42 #include <unistd.h>
43 #endif
44 #include <codemaker/global.hxx>
45
46 #ifdef SAL_UNX
47 #define SEPARATOR '/'
48 #else
49 #define SEPARATOR '\\'
50 #endif
51
52 using namespace ::rtl;
53 using namespace ::osl;
54
inGlobalSet(const OUString & rValue)55 const OString inGlobalSet(const OUString & rValue)
56 {
57 OString sValue( OUStringToOString(rValue, RTL_TEXTENCODING_UTF8) );
58 static StringSet aGlobalMap;
59 StringSet::iterator iter = aGlobalMap.find( sValue );
60 if( iter != aGlobalMap.end() )
61 return *iter;
62 return *(aGlobalMap.insert( sValue ).first);
63 }
64
isFileUrl(const OString & fileName)65 static sal_Bool isFileUrl(const OString& fileName)
66 {
67 if (fileName.indexOf("file://") == 0 )
68 return sal_True;
69 return sal_False;
70 }
71
convertToFileUrl(const OString & fileName)72 OUString convertToFileUrl(const OString& fileName)
73 {
74 if ( isFileUrl(fileName) )
75 {
76 return OStringToOUString(fileName, osl_getThreadTextEncoding());
77 }
78
79 OUString uUrlFileName;
80 OUString uFileName(fileName.getStr(), fileName.getLength(), osl_getThreadTextEncoding());
81 if ( fileName.indexOf('.') == 0 || fileName.indexOf(SEPARATOR) < 0 )
82 {
83 OUString uWorkingDir;
84 if (osl_getProcessWorkingDir(&uWorkingDir.pData) != osl_Process_E_None) {
85 OSL_ASSERT(false);
86 }
87 if (FileBase::getAbsoluteFileURL(uWorkingDir, uFileName, uUrlFileName)
88 != FileBase::E_None)
89 {
90 OSL_ASSERT(false);
91 }
92 } else
93 {
94 if (FileBase::getFileURLFromSystemPath(uFileName, uUrlFileName)
95 != FileBase::E_None)
96 {
97 OSL_ASSERT(false);
98 }
99 }
100
101 return uUrlFileName;
102 }
103
104 //*************************************************************************
105 // FileStream
106 //*************************************************************************
FileStream()107 FileStream::FileStream()
108 {
109 }
110
~FileStream()111 FileStream::~FileStream()
112 {
113 if ( isValid() )
114 {
115 fflush(m_pFile);
116 fclose(m_pFile);
117 }
118 }
119
isValid()120 sal_Bool FileStream::isValid()
121 {
122 if ( m_pFile )
123 return sal_True;
124
125 return sal_False;
126 }
127
open(const OString & name,FileAccessMode mode)128 void FileStream::open(const OString& name, FileAccessMode mode)
129 {
130 if ( name.getLength() > 0 )
131 {
132 m_name = name;
133 m_pFile = fopen( m_name.getStr(), checkAccessMode(mode));
134 }
135 }
136
close()137 void FileStream::close()
138 {
139 if ( isValid() )
140 {
141 fflush(m_pFile);
142 fclose(m_pFile);
143 m_pFile = NULL;
144 m_name = OString();
145 }
146 }
147
checkAccessMode(FileAccessMode mode)148 const sal_Char* FileStream::checkAccessMode(FileAccessMode mode)
149 {
150 switch( mode )
151 {
152 case FAM_READ:
153 return "r";
154 case FAM_WRITE:
155 return "w";
156 case FAM_APPEND:
157 return "a";
158 case FAM_READWRITE_EXIST:
159 return "r+";
160 case FAM_READWRITE:
161 return "w+";
162 case FAM_READAPPEND:
163 return "a+";
164 }
165 return "w+";
166 }
167
168