/*
* Copyright (C) 2013-2015 RoboVM AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.robovm.apple.coreservices;
/*<imports>*/
import java.io.*;
import java.nio.*;
import java.util.*;
import org.robovm.objc.*;
import org.robovm.objc.annotation.*;
import org.robovm.objc.block.*;
import org.robovm.rt.*;
import org.robovm.rt.annotation.*;
import org.robovm.rt.bro.*;
import org.robovm.rt.bro.annotation.*;
import org.robovm.rt.bro.ptr.*;
import org.robovm.apple.foundation.*;
import org.robovm.apple.corefoundation.*;
/*</imports>*/
/*<javadoc>*/
/*</javadoc>*/
/*<annotations>*/@Library("CFNetwork")/*</annotations>*/
/*<visibility>*/public/*</visibility>*/ class /*<name>*/CFProxySupport/*</name>*/
extends /*<extends>*/CocoaUtility/*</extends>*/
/*<implements>*//*</implements>*/ {
/*<ptr>*/
/*</ptr>*/
public interface AutoConfigurationClientCallback {
void invoke(List<CFProxy> proxyList, NSError error);
}
private static final java.util.concurrent.atomic.AtomicLong refconId = new java.util.concurrent.atomic.AtomicLong();
private long localRefconId;
private static final LongMap<AutoConfigurationClientCallback> callbacks = new LongMap<>();
private static final java.lang.reflect.Method cbInvoke;
static {
try {
cbInvoke = CFProxySupport.class.getDeclaredMethod("cbInvoke", long.class, CFArray.class, NSError.class);
} catch (Throwable e) {
throw new Error(e);
}
}
/*<bind>*/static { Bro.bind(CFProxySupport.class); }/*</bind>*/
/*<constants>*//*</constants>*/
/*<constructors>*//*</constructors>*/
/*<properties>*//*</properties>*/
/*<members>*//*</members>*/
@Callback
private static void cbInvoke(@Pointer long refcon, CFArray proxyList0, NSError error) {
AutoConfigurationClientCallback callback = null;
synchronized (callbacks) {
callback = callbacks.get(refcon);
}
List<CFProxy> proxyList = new ArrayList<CFProxy>();
for (int i = 0; i < proxyList0.size(); i++) {
proxyList.add(new CFProxy(proxyList0.get(i, CFDictionary.class)));
}
callback.invoke(proxyList, error);
}
/**
* @since Available in iOS 2.0 and later.
*/
public static CFRunLoopSource executeProxyAutoConfigurationScript(String proxyAutoConfigurationScript, NSURL targetURL, AutoConfigurationClientCallback callback) {
long refconId = CFProxySupport.refconId.getAndIncrement();
CFStreamClientContext context = new CFStreamClientContext();
context.setInfo(refconId);
CFRunLoopSource source = executeProxyAutoConfigurationScript(proxyAutoConfigurationScript, targetURL, new FunctionPtr(cbInvoke), context);
if (source != null) {
synchronized (callbacks) {
callbacks.put(refconId, callback);
}
return source;
}
return null;
}
/**
* @since Available in iOS 2.0 and later.
*/
public static CFRunLoopSource executeProxyAutoConfigurationURL(NSURL proxyAutoConfigURL, NSURL targetURL, AutoConfigurationClientCallback callback) {
long refconId = CFProxySupport.refconId.getAndIncrement();
CFStreamClientContext context = new CFStreamClientContext();
context.setInfo(refconId);
CFRunLoopSource source = executeProxyAutoConfigurationURL(proxyAutoConfigURL, targetURL, new FunctionPtr(cbInvoke), context);
if (source != null) {
synchronized (callbacks) {
callbacks.put(refconId, callback);
}
return source;
}
return null;
}
/*<methods>*/
/**
* @since Available in iOS 2.0 and later.
*/
@Bridge(symbol="CFNetworkCopySystemProxySettings", optional=true)
public static native CFSystemProxySettings getSystemProxySettings();
/**
* @since Available in iOS 2.0 and later.
*/
public static List<CFProxy> getProxies(String proxyAutoConfigurationScript, NSURL targetURL) throws NSErrorException {
NSError.NSErrorPtr ptr = new NSError.NSErrorPtr();
List<CFProxy> result = getProxies(proxyAutoConfigurationScript, targetURL, ptr);
if (ptr.get() != null) { throw new NSErrorException(ptr.get()); }
return result;
}
/**
* @since Available in iOS 2.0 and later.
*/
@Bridge(symbol="CFNetworkCopyProxiesForAutoConfigurationScript", optional=true)
private static native @org.robovm.rt.bro.annotation.Marshaler(CFProxy.AsListMarshaler.class) List<CFProxy> getProxies(String proxyAutoConfigurationScript, NSURL targetURL, NSError.NSErrorPtr error);
/**
* @since Available in iOS 2.0 and later.
*/
@Bridge(symbol="CFNetworkExecuteProxyAutoConfigurationScript", optional=true)
private static native CFRunLoopSource executeProxyAutoConfigurationScript(String proxyAutoConfigurationScript, NSURL targetURL, FunctionPtr cb, CFStreamClientContext clientContext);
/**
* @since Available in iOS 2.0 and later.
*/
@Bridge(symbol="CFNetworkExecuteProxyAutoConfigurationURL", optional=true)
private static native CFRunLoopSource executeProxyAutoConfigurationURL(NSURL proxyAutoConfigURL, NSURL targetURL, FunctionPtr cb, CFStreamClientContext clientContext);
/*</methods>*/
}