Boolean GetHTTPSProxySetting(char *host, size_t hostSize, UInt16 *port)
// C の文字列として(host と hostSize によって指定されるバッファに)
// 現在の HTTPS プロキシ設定と、ポート番号を返す
{
Boolean result;
CFDictionaryRef proxyDict;
CFNumberRef enableNum;
int enable;
CFStringRef hostStr;
CFNumberRef portNum;
int portInt;
assert(host != NULL);
assert(port != NULL);
// ディクショナリを取得
proxyDict = SCDynamicStoreCopyProxies(NULL);
result = (proxyDict != NULL);
// 有効化フラグを取得。これは、CFBoolean ではなく CFNumber
if (result) {
enableNum = (CFNumberRef) CFDictionaryGetValue(proxyDict,
kSCPropNetProxiesHTTPSEnable);
result = (enableNum != NULL)
&& (CFGetTypeID(enableNum) == CFNumberGetTypeID());
}
if (result) {
result = CFNumberGetValue(enableNum, kCFNumberIntType,
&enable) && (enable != 0);
}
// プロキシのホストを取得。DNS 名は ASCII 文字でなければならない。
// 「ネットワーク」環境設定パネルの「Secure Web プロキシ」フィールド
// ASCII 以外の文字を入力すると、CFStringGetCString 関数は失敗して
// false を返す
if (result) {
hostStr = (CFStringRef) CFDictionaryGetValue(proxyDict,
kSCPropNetProxiesHTTPSProxy);
result = (hostStr != NULL)
&& (CFGetTypeID(hostStr) == CFStringGetTypeID());
}
if (result) {
result = CFStringGetCString(hostStr, host,
(CFIndex) hostSize, kCFStringEncodingASCII);
}
// プロキシのポートを取得
if (result) {
portNum = (CFNumberRef) CFDictionaryGetValue(proxyDict,
kSCPropNetProxiesHTTPSPort);
result = (portNum != NULL)
&& (CFGetTypeID(portNum) == CFNumberGetTypeID());
}
if (result) {
result = CFNumberGetValue(portNum, kCFNumberIntType, &portInt);
}
if (result) {
*port = (UInt16) portInt;
}
// クリーンアップ
if (proxyDict != NULL) {
CFRelease(proxyDict);
}
if ( ! result ) {
*host = 0;
*port = 0;
}
return result;
}
|