1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_shell.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // For MAXHOSTNAMELEN constant
28*b1cdbd2cSJim Jagielski #include <sys/param.h>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <premac.h>
31*b1cdbd2cSJim Jagielski #include <SystemConfiguration/SystemConfiguration.h>
32*b1cdbd2cSJim Jagielski #include <Foundation/NSPathUtilities.h>
33*b1cdbd2cSJim Jagielski #include <postmac.h>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include "macbackend.hxx"
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include "com/sun/star/beans/Optional.hpp"
38*b1cdbd2cSJim Jagielski #include "rtl/ustrbuf.hxx"
39*b1cdbd2cSJim Jagielski #include "osl/file.h"
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #define SPACE      ' '
42*b1cdbd2cSJim Jagielski #define SEMI_COLON ';'
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski typedef struct
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski     rtl::OUString Server;
47*b1cdbd2cSJim Jagielski     sal_Int32 Port;
48*b1cdbd2cSJim Jagielski } ProxyEntry;
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski typedef enum {
51*b1cdbd2cSJim Jagielski     sHTTP,
52*b1cdbd2cSJim Jagielski 	sHTTPS,
53*b1cdbd2cSJim Jagielski     sFTP
54*b1cdbd2cSJim Jagielski } ServiceType;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
57*b1cdbd2cSJim Jagielski // helper functions
58*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski namespace // private
61*b1cdbd2cSJim Jagielski {
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski /*
64*b1cdbd2cSJim Jagielski  * Returns current proxy settings for selected service type (HTTP or
65*b1cdbd2cSJim Jagielski  * FTP) as a C string (in the buffer specified by host and hostSize)
66*b1cdbd2cSJim Jagielski  * and a port number.
67*b1cdbd2cSJim Jagielski  */
68*b1cdbd2cSJim Jagielski 
GetProxySetting(ServiceType sType,char * host,size_t hostSize,UInt16 * port)69*b1cdbd2cSJim Jagielski bool GetProxySetting(ServiceType sType, char *host, size_t hostSize, UInt16 *port)
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski     bool                result;
72*b1cdbd2cSJim Jagielski     CFDictionaryRef     proxyDict;
73*b1cdbd2cSJim Jagielski     CFNumberRef         enableNum;
74*b1cdbd2cSJim Jagielski     int                 enable;
75*b1cdbd2cSJim Jagielski     CFStringRef         hostStr;
76*b1cdbd2cSJim Jagielski     CFNumberRef         portNum;
77*b1cdbd2cSJim Jagielski     int                 portInt;
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski     proxyDict = SCDynamicStoreCopyProxies(NULL);
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski     if (!proxyDict)
82*b1cdbd2cSJim Jagielski         return false;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 	CFStringRef proxiesEnable;
85*b1cdbd2cSJim Jagielski 	CFStringRef proxiesProxy;
86*b1cdbd2cSJim Jagielski 	CFStringRef proxiesPort;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 	switch ( sType )
89*b1cdbd2cSJim Jagielski 	{
90*b1cdbd2cSJim Jagielski 		case sHTTP : proxiesEnable =  kSCPropNetProxiesHTTPEnable;
91*b1cdbd2cSJim Jagielski 					 proxiesProxy = kSCPropNetProxiesHTTPProxy;
92*b1cdbd2cSJim Jagielski 					 proxiesPort = kSCPropNetProxiesHTTPPort;
93*b1cdbd2cSJim Jagielski 			break;
94*b1cdbd2cSJim Jagielski 		case sHTTPS: proxiesEnable = kSCPropNetProxiesHTTPSEnable;
95*b1cdbd2cSJim Jagielski 					 proxiesProxy = kSCPropNetProxiesHTTPSProxy;
96*b1cdbd2cSJim Jagielski 					 proxiesPort = kSCPropNetProxiesHTTPSPort;
97*b1cdbd2cSJim Jagielski 			break;
98*b1cdbd2cSJim Jagielski 		default: proxiesEnable = kSCPropNetProxiesFTPEnable;
99*b1cdbd2cSJim Jagielski 				 proxiesProxy = kSCPropNetProxiesFTPProxy;
100*b1cdbd2cSJim Jagielski 				 proxiesPort = kSCPropNetProxiesFTPPort;
101*b1cdbd2cSJim Jagielski 			break;
102*b1cdbd2cSJim Jagielski 	}
103*b1cdbd2cSJim Jagielski     // Proxy enabled?
104*b1cdbd2cSJim Jagielski     enableNum = (CFNumberRef) CFDictionaryGetValue( proxyDict,
105*b1cdbd2cSJim Jagielski                                                    proxiesEnable );
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     result = (enableNum != NULL) && (CFGetTypeID(enableNum) == CFNumberGetTypeID());
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski     if (result)
110*b1cdbd2cSJim Jagielski         result = CFNumberGetValue(enableNum, kCFNumberIntType, &enable) && (enable != 0);
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski     // Proxy enabled -> get hostname
113*b1cdbd2cSJim Jagielski     if (result)
114*b1cdbd2cSJim Jagielski     {
115*b1cdbd2cSJim Jagielski         hostStr = (CFStringRef) CFDictionaryGetValue( proxyDict,
116*b1cdbd2cSJim Jagielski                                                      proxiesProxy );
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski         result = (hostStr != NULL) && (CFGetTypeID(hostStr) == CFStringGetTypeID());
119*b1cdbd2cSJim Jagielski     }
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski     if (result)
122*b1cdbd2cSJim Jagielski         result = CFStringGetCString(hostStr, host, (CFIndex) hostSize, kCFStringEncodingASCII);
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski     // Get proxy port
125*b1cdbd2cSJim Jagielski     if (result)
126*b1cdbd2cSJim Jagielski     {
127*b1cdbd2cSJim Jagielski         portNum = (CFNumberRef) CFDictionaryGetValue( proxyDict,
128*b1cdbd2cSJim Jagielski                                                      proxiesPort );
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski         result = (portNum != NULL) && (CFGetTypeID(portNum) == CFNumberGetTypeID());
131*b1cdbd2cSJim Jagielski     }
132*b1cdbd2cSJim Jagielski     else
133*b1cdbd2cSJim Jagielski     {
134*b1cdbd2cSJim Jagielski         CFRelease(proxyDict);
135*b1cdbd2cSJim Jagielski         return false;
136*b1cdbd2cSJim Jagielski     }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     if (result)
139*b1cdbd2cSJim Jagielski         result = CFNumberGetValue(portNum, kCFNumberIntType, &portInt);
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski     if (result)
142*b1cdbd2cSJim Jagielski         *port = (UInt16) portInt;
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski     if (proxyDict)
145*b1cdbd2cSJim Jagielski         CFRelease(proxyDict);
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski     if (!result)
148*b1cdbd2cSJim Jagielski     {
149*b1cdbd2cSJim Jagielski         *host = 0;
150*b1cdbd2cSJim Jagielski         *port = 0;
151*b1cdbd2cSJim Jagielski     }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski     return result;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski } // end private namespace
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
159*b1cdbd2cSJim Jagielski 
MacOSXBackend()160*b1cdbd2cSJim Jagielski MacOSXBackend::MacOSXBackend()
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
165*b1cdbd2cSJim Jagielski 
~MacOSXBackend(void)166*b1cdbd2cSJim Jagielski MacOSXBackend::~MacOSXBackend(void)
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
171*b1cdbd2cSJim Jagielski 
createInstance()172*b1cdbd2cSJim Jagielski MacOSXBackend* MacOSXBackend::createInstance()
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski     return new MacOSXBackend;
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------
178*b1cdbd2cSJim Jagielski 
CFStringToOUString(const CFStringRef sOrig)179*b1cdbd2cSJim Jagielski rtl::OUString CFStringToOUString(const CFStringRef sOrig) {
180*b1cdbd2cSJim Jagielski     CFRetain(sOrig);
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     CFIndex nStringLen = CFStringGetLength(sOrig)+1;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski     // Allocate a c string buffer
185*b1cdbd2cSJim Jagielski     char sBuffer[nStringLen];
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     CFStringGetCString(sOrig, sBuffer, nStringLen, kCFStringEncodingASCII);
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski     CFRelease(sOrig);
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski     return rtl::OUString::createFromAscii((sal_Char*)sBuffer);
192*b1cdbd2cSJim Jagielski }
193*b1cdbd2cSJim Jagielski 
GetOUString(NSString * pStr)194*b1cdbd2cSJim Jagielski rtl::OUString GetOUString( NSString* pStr )
195*b1cdbd2cSJim Jagielski {
196*b1cdbd2cSJim Jagielski     if( ! pStr )
197*b1cdbd2cSJim Jagielski         return rtl::OUString();
198*b1cdbd2cSJim Jagielski     int nLen = [pStr length];
199*b1cdbd2cSJim Jagielski     if( nLen == 0 )
200*b1cdbd2cSJim Jagielski         return rtl::OUString();
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski     rtl::OUStringBuffer aBuf( nLen+1 );
203*b1cdbd2cSJim Jagielski     aBuf.setLength( nLen );
204*b1cdbd2cSJim Jagielski     [pStr getCharacters: const_cast<sal_Unicode*>(aBuf.getStr())];
205*b1cdbd2cSJim Jagielski     return aBuf.makeStringAndClear();
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
setPropertyValue(rtl::OUString const &,css::uno::Any const &)208*b1cdbd2cSJim Jagielski void MacOSXBackend::setPropertyValue(
209*b1cdbd2cSJim Jagielski     rtl::OUString const &, css::uno::Any const &)
210*b1cdbd2cSJim Jagielski     throw (
211*b1cdbd2cSJim Jagielski         css::beans::UnknownPropertyException, css::beans::PropertyVetoException,
212*b1cdbd2cSJim Jagielski         css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
213*b1cdbd2cSJim Jagielski         css::uno::RuntimeException)
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski     throw css::lang::IllegalArgumentException(
216*b1cdbd2cSJim Jagielski         rtl::OUString(
217*b1cdbd2cSJim Jagielski             RTL_CONSTASCII_USTRINGPARAM("setPropertyValue not supported")),
218*b1cdbd2cSJim Jagielski         static_cast< cppu::OWeakObject * >(this), -1);
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski 
getPropertyValue(rtl::OUString const & PropertyName)221*b1cdbd2cSJim Jagielski css::uno::Any MacOSXBackend::getPropertyValue(
222*b1cdbd2cSJim Jagielski     rtl::OUString const & PropertyName)
223*b1cdbd2cSJim Jagielski     throw (
224*b1cdbd2cSJim Jagielski         css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
225*b1cdbd2cSJim Jagielski         css::uno::RuntimeException)
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski     if (PropertyName.equalsAsciiL(
228*b1cdbd2cSJim Jagielski             RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")))
229*b1cdbd2cSJim Jagielski     {
230*b1cdbd2cSJim Jagielski         rtl::OUString aDocDir;
231*b1cdbd2cSJim Jagielski         NSArray* pPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, true );
232*b1cdbd2cSJim Jagielski         if( pPaths && [pPaths count] > 0 )
233*b1cdbd2cSJim Jagielski         {
234*b1cdbd2cSJim Jagielski             aDocDir = GetOUString( [pPaths objectAtIndex: 0] );
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski             rtl::OUString aDocURL;
237*b1cdbd2cSJim Jagielski             if( aDocDir.getLength() > 0 &&
238*b1cdbd2cSJim Jagielski                 osl_getFileURLFromSystemPath( aDocDir.pData, &aDocURL.pData ) == osl_File_E_None )
239*b1cdbd2cSJim Jagielski             {
240*b1cdbd2cSJim Jagielski                 return css::uno::makeAny(
241*b1cdbd2cSJim Jagielski                     css::beans::Optional< css::uno::Any >(
242*b1cdbd2cSJim Jagielski                         true, css::uno::makeAny( aDocURL ) ) );
243*b1cdbd2cSJim Jagielski             }
244*b1cdbd2cSJim Jagielski             else
245*b1cdbd2cSJim Jagielski             {
246*b1cdbd2cSJim Jagielski                 OSL_TRACE( "user documents list contains empty file path or conversion failed" );
247*b1cdbd2cSJim Jagielski             }
248*b1cdbd2cSJim Jagielski         }
249*b1cdbd2cSJim Jagielski         else
250*b1cdbd2cSJim Jagielski         {
251*b1cdbd2cSJim Jagielski             OSL_TRACE( "Got nil or empty list of user document directories" );
252*b1cdbd2cSJim Jagielski         }
253*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
254*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
255*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")))
256*b1cdbd2cSJim Jagielski     {
257*b1cdbd2cSJim Jagielski         ProxyEntry aFtpProxy;
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski         char host[MAXHOSTNAMELEN];
260*b1cdbd2cSJim Jagielski         UInt16 port;
261*b1cdbd2cSJim Jagielski         bool retVal;
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski         retVal = GetProxySetting(sFTP, host, 100, &port);
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski         if (retVal)
266*b1cdbd2cSJim Jagielski         {
267*b1cdbd2cSJim Jagielski             aFtpProxy.Server = rtl::OUString::createFromAscii( host );
268*b1cdbd2cSJim Jagielski         }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski         // ftp proxy name
271*b1cdbd2cSJim Jagielski         if( aFtpProxy.Server.getLength() > 0 )
272*b1cdbd2cSJim Jagielski         {
273*b1cdbd2cSJim Jagielski             return css::uno::makeAny(
274*b1cdbd2cSJim Jagielski                 css::beans::Optional< css::uno::Any >(
275*b1cdbd2cSJim Jagielski                     true, uno::makeAny( aFtpProxy.Server ) ) );
276*b1cdbd2cSJim Jagielski         }
277*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
278*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
279*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")))
280*b1cdbd2cSJim Jagielski     {
281*b1cdbd2cSJim Jagielski         ProxyEntry aFtpProxy;
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski         char host[MAXHOSTNAMELEN];
284*b1cdbd2cSJim Jagielski         UInt16 port;
285*b1cdbd2cSJim Jagielski         bool retVal;
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski         retVal = GetProxySetting(sFTP, host, 100, &port);
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski         if (retVal)
290*b1cdbd2cSJim Jagielski         {
291*b1cdbd2cSJim Jagielski             aFtpProxy.Port = port;
292*b1cdbd2cSJim Jagielski         }
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski         // ftp proxy port
295*b1cdbd2cSJim Jagielski         if( aFtpProxy.Port > 0 )
296*b1cdbd2cSJim Jagielski         {
297*b1cdbd2cSJim Jagielski             return css::uno::makeAny(
298*b1cdbd2cSJim Jagielski                 css::beans::Optional< css::uno::Any >(
299*b1cdbd2cSJim Jagielski                     true, uno::makeAny( aFtpProxy.Port ) ) );
300*b1cdbd2cSJim Jagielski         }
301*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
302*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
303*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")))
304*b1cdbd2cSJim Jagielski     {
305*b1cdbd2cSJim Jagielski         ProxyEntry aHttpProxy;
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski         char host[MAXHOSTNAMELEN];
308*b1cdbd2cSJim Jagielski         UInt16 port;
309*b1cdbd2cSJim Jagielski         bool retVal;
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski         retVal = GetProxySetting(sHTTP, host, 100, &port);
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski         if (retVal)
314*b1cdbd2cSJim Jagielski         {
315*b1cdbd2cSJim Jagielski             aHttpProxy.Server = rtl::OUString::createFromAscii( host );
316*b1cdbd2cSJim Jagielski         }
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski         // http proxy name
319*b1cdbd2cSJim Jagielski         if( aHttpProxy.Server.getLength() > 0 )
320*b1cdbd2cSJim Jagielski         {
321*b1cdbd2cSJim Jagielski             return css::uno::makeAny(
322*b1cdbd2cSJim Jagielski                 css::beans::Optional< css::uno::Any >(
323*b1cdbd2cSJim Jagielski                     true, uno::makeAny( aHttpProxy.Server ) ) );
324*b1cdbd2cSJim Jagielski         }
325*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
326*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
327*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")))
328*b1cdbd2cSJim Jagielski     {
329*b1cdbd2cSJim Jagielski         ProxyEntry aHttpProxy;
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski         char host[MAXHOSTNAMELEN];
332*b1cdbd2cSJim Jagielski         UInt16 port;
333*b1cdbd2cSJim Jagielski         bool retVal;
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski         retVal = GetProxySetting(sHTTP, host, 100, &port);
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski         if (retVal)
338*b1cdbd2cSJim Jagielski         {
339*b1cdbd2cSJim Jagielski             aHttpProxy.Port = port;
340*b1cdbd2cSJim Jagielski         }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski         // http proxy port
343*b1cdbd2cSJim Jagielski         if( aHttpProxy.Port > 0 )
344*b1cdbd2cSJim Jagielski         {
345*b1cdbd2cSJim Jagielski             return css::uno::makeAny(
346*b1cdbd2cSJim Jagielski                 css::beans::Optional< css::uno::Any >(
347*b1cdbd2cSJim Jagielski                     true, uno::makeAny( aHttpProxy.Port ) ) );
348*b1cdbd2cSJim Jagielski         }
349*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
350*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
351*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")))
352*b1cdbd2cSJim Jagielski     {
353*b1cdbd2cSJim Jagielski         ProxyEntry aHttpsProxy;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski         char host[MAXHOSTNAMELEN];
356*b1cdbd2cSJim Jagielski         UInt16 port;
357*b1cdbd2cSJim Jagielski         bool retVal;
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski         retVal = GetProxySetting(sHTTPS, host, 100, &port);
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski         if (retVal)
362*b1cdbd2cSJim Jagielski         {
363*b1cdbd2cSJim Jagielski             aHttpsProxy.Server = rtl::OUString::createFromAscii( host );
364*b1cdbd2cSJim Jagielski         }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski         // https proxy name
367*b1cdbd2cSJim Jagielski         if( aHttpsProxy.Server.getLength() > 0 )
368*b1cdbd2cSJim Jagielski         {
369*b1cdbd2cSJim Jagielski             return css::uno::makeAny(
370*b1cdbd2cSJim Jagielski                 css::beans::Optional< css::uno::Any >(
371*b1cdbd2cSJim Jagielski                     true, uno::makeAny( aHttpsProxy.Server ) ) );
372*b1cdbd2cSJim Jagielski         }
373*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
374*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
375*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")))
376*b1cdbd2cSJim Jagielski     {
377*b1cdbd2cSJim Jagielski         ProxyEntry aHttpsProxy;
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski         char host[MAXHOSTNAMELEN];
380*b1cdbd2cSJim Jagielski         UInt16 port;
381*b1cdbd2cSJim Jagielski         bool retVal;
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski         retVal = GetProxySetting(sHTTPS, host, 100, &port);
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski         if (retVal)
386*b1cdbd2cSJim Jagielski         {
387*b1cdbd2cSJim Jagielski             aHttpsProxy.Port = port;
388*b1cdbd2cSJim Jagielski         }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski         // https proxy port
391*b1cdbd2cSJim Jagielski         if( aHttpsProxy.Port > 0 )
392*b1cdbd2cSJim Jagielski         {
393*b1cdbd2cSJim Jagielski             return css::uno::makeAny(
394*b1cdbd2cSJim Jagielski                 css::beans::Optional< css::uno::Any >(
395*b1cdbd2cSJim Jagielski                     true, uno::makeAny( aHttpsProxy.Port ) ) );
396*b1cdbd2cSJim Jagielski         }
397*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
398*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
399*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetProxyType")))
400*b1cdbd2cSJim Jagielski     {
401*b1cdbd2cSJim Jagielski         // override default for ProxyType, which is "0" meaning "No proxies".
402*b1cdbd2cSJim Jagielski         sal_Int32 nProperties = 1;
403*b1cdbd2cSJim Jagielski         return css::uno::makeAny(
404*b1cdbd2cSJim Jagielski             css::beans::Optional< css::uno::Any >(
405*b1cdbd2cSJim Jagielski                 true, uno::makeAny( nProperties ) ) );
406*b1cdbd2cSJim Jagielski     } else if (PropertyName.equalsAsciiL(
407*b1cdbd2cSJim Jagielski                    RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy")))
408*b1cdbd2cSJim Jagielski     {
409*b1cdbd2cSJim Jagielski         rtl::OUString aProxyBypassList;
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski         CFArrayRef rExceptionsList;
412*b1cdbd2cSJim Jagielski         CFDictionaryRef rProxyDict = SCDynamicStoreCopyProxies(NULL);
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski         if (!rProxyDict)
415*b1cdbd2cSJim Jagielski             rExceptionsList = nil;
416*b1cdbd2cSJim Jagielski         else
417*b1cdbd2cSJim Jagielski             rExceptionsList = (CFArrayRef) CFDictionaryGetValue(rProxyDict, kSCPropNetProxiesExceptionsList);
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski         if (rExceptionsList)
420*b1cdbd2cSJim Jagielski         {
421*b1cdbd2cSJim Jagielski             for (CFIndex idx = 0; idx < CFArrayGetCount(rExceptionsList); idx++)
422*b1cdbd2cSJim Jagielski             {
423*b1cdbd2cSJim Jagielski                 CFStringRef rException = (CFStringRef) CFArrayGetValueAtIndex(rExceptionsList, idx);
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski                 if (idx>0)
426*b1cdbd2cSJim Jagielski                     aProxyBypassList += rtl::OUString::createFromAscii( ";" );
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski                 aProxyBypassList += CFStringToOUString(rException);
429*b1cdbd2cSJim Jagielski             }
430*b1cdbd2cSJim Jagielski         }
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski         if (rProxyDict)
433*b1cdbd2cSJim Jagielski             CFRelease(rProxyDict);
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski         // fill proxy bypass list
436*b1cdbd2cSJim Jagielski         if( aProxyBypassList.getLength() > 0 )
437*b1cdbd2cSJim Jagielski         {
438*b1cdbd2cSJim Jagielski             return css::uno::makeAny(
439*b1cdbd2cSJim Jagielski                 css::beans::Optional< css::uno::Any >(
440*b1cdbd2cSJim Jagielski                     true,
441*b1cdbd2cSJim Jagielski                     uno::makeAny( aProxyBypassList.replace( SPACE, SEMI_COLON ) ) ) );
442*b1cdbd2cSJim Jagielski         }
443*b1cdbd2cSJim Jagielski         return css::uno::makeAny(css::beans::Optional< css::uno::Any >());
444*b1cdbd2cSJim Jagielski     } else {
445*b1cdbd2cSJim Jagielski         throw css::beans::UnknownPropertyException(
446*b1cdbd2cSJim Jagielski             PropertyName, static_cast< cppu::OWeakObject * >(this));
447*b1cdbd2cSJim Jagielski     }
448*b1cdbd2cSJim Jagielski }
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
451*b1cdbd2cSJim Jagielski 
getBackendName(void)452*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL MacOSXBackend::getBackendName(void)
453*b1cdbd2cSJim Jagielski {
454*b1cdbd2cSJim Jagielski 	return rtl::OUString::createFromAscii("com.sun.star.comp.configuration.backend.MacOSXBackend");
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
458*b1cdbd2cSJim Jagielski 
getImplementationName(void)459*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL MacOSXBackend::getImplementationName(void)
460*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
461*b1cdbd2cSJim Jagielski {
462*b1cdbd2cSJim Jagielski     return getBackendName();
463*b1cdbd2cSJim Jagielski }
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
466*b1cdbd2cSJim Jagielski 
getBackendServiceNames(void)467*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString> SAL_CALL MacOSXBackend::getBackendServiceNames(void)
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski     uno::Sequence<rtl::OUString> aServiceNameList(1);
470*b1cdbd2cSJim Jagielski     aServiceNameList[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.backend.MacOSXBackend"));
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski     return aServiceNameList;
473*b1cdbd2cSJim Jagielski }
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
476*b1cdbd2cSJim Jagielski 
supportsService(const rtl::OUString & aServiceName)477*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL MacOSXBackend::supportsService(const rtl::OUString& aServiceName)
478*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
479*b1cdbd2cSJim Jagielski {
480*b1cdbd2cSJim Jagielski     uno::Sequence< rtl::OUString > const svc = getBackendServiceNames();
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski     for(sal_Int32 i = 0; i < svc.getLength(); ++i )
483*b1cdbd2cSJim Jagielski         if(svc[i] == aServiceName)
484*b1cdbd2cSJim Jagielski             return true;
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski     return false;
487*b1cdbd2cSJim Jagielski }
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
490*b1cdbd2cSJim Jagielski 
getSupportedServiceNames(void)491*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString> SAL_CALL MacOSXBackend::getSupportedServiceNames(void)
492*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski     return getBackendServiceNames();
495*b1cdbd2cSJim Jagielski }
496