高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1234
Accessing HTTPS Proxy Settings


Q: Mac OS X 10.2 では、「ネットワーク」環境設定パネルに Secure Web プロキシ (HTTPS) を設定する新しいフィールドが追加されています。Internet Config API を通じてこれらの設定値を取得する方法はないようです。これらのフィールドにアクセスするにはどうしたらよいでしょうか?

A: 現時点では、Internet Config API を通じて HTTPS プロキシに関する情報を取得する方法はありません。代わりに、System Configuration フレームワークからこの情報を読み込む必要があります。

注記:
多くの点で、Mac OS X の Internet Config API は、互換性を保持するための API です。このため基盤となる API(この場合は System Configuration フレームワーク)に新しい機能が追加されたときに、それらが互換性を保持するための API(Internet Config)にも組み込まれるとは限りません。これが許容できるのは、Internet Config ベースの既存のアプリケーションはいずれも、基盤となる API に追加された機能を想定していないためです。

System Configuration フレームワークからこの情報を直接取得できます。実際に、これを実行するのに適した、SCDynamicStoreCopyProxies という高レベルの API が存在します。お使いのプログラムでこの API を使用するには、「SystemConfiguration.framework」をプロジェクトに追加し、<SystemConfiguration/SystemConfiguration.h> ヘッダをインクルードします。こうすることで、リスト 1 に示すように SCDynamicStoreCopyProxies を呼び出せます。

リスト 1. SCDynamicStoreCopyProxies の使用

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;
}

リスト 1 は、HTTPS プロキシ設定を取得する方法のみを示しています。proxyDict ディクショナリにある他のキーを調べることによって、他のプロキシ設定を取得できます。設定についての詳細は、<SystemConfiguration/SCSchemaDefinitions.h> ヘッダファイルのコメントを参照してください。


[2003 年 2 月 6 日]