Я могу получить системный прокси с помощью кода Objective-C, но я хочу написать его с помощью C ++. Не могли бы вы помочь мне конвертировать код target-c в c ++? - PullRequest
1 голос
/ 10 января 2012

Я не знаком с целью-c, поэтому мне сложно понять его и преобразовать в c ++. Код объективного c следующим образом, он получит прокси системы iOS. Не могли бы вы помочь мне преобразовать его в C ++?

NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);  
NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.google.com"], (CFDictionaryRef)proxySettings) autorelease]);  
NSDictionary *settings = [proxies objectAtIndex:0];  
NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);  
NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);  
NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);  

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Спасибо, Дэвид Гелхар. С вашим предложением я наконец-то выписал код, он может работать на iOS и MAC:

int CHTTP::GetMacProxy() {    
  CFURLRef        urlRef = NULL;
  CFDictionaryRef proxyDicRef = NULL;
  CFArrayRef      urlProxArrayRef = NULL;
  CFDictionaryRef defProxyDic = NULL;
  int             port = 0;
  CFStringRef     hostNameRef = NULL;
  CFNumberRef     portNumberRef = NULL;
  char            hostNameBuffer[200];

  urlRef = CFURLCreateWithBytes(kCFAllocatorDefault, (const UInt8*)m_URL.Deref(), m_URL.Length(), kCFStringEncodingASCII, NULL);
  if (!urlRef) goto done;

  proxyDicRef = CFNetworkCopySystemProxySettings();
  if (!proxyDicRef) goto done;

 urlProxArrayRef = CFNetworkCopyProxiesForURL(urlRef, proxyDicRef);
  if (!urlProxArrayRef) goto done;

  defProxyDic = (CFDictionaryRef)CFArrayGetValueAtIndex(urlProxArrayRef, 0);
  if (!defProxyDic) goto done;

  portNumberRef = (CFNumberRef)CFDictionaryGetValue(defProxyDic, (const void*)kCFProxyPortNumberKey);
  if (!portNumberRef) goto done;
  if (!CFNumberGetValue(portNumberRef, kCFNumberSInt32Type, &port)) goto done;

  hostNameRef = (CFStringRef)CFDictionaryGetValue(defProxyDic, (const void*)kCFProxyHostNameKey);
  if (!hostNameRef) goto done;


  if (!CFStringGetCString(hostNameRef, hostNameBuffer, 200, kCFStringEncodingASCII)) goto done;

  // Log port
  // Log hostNameBuffer.


done:
  if (hostNameRef)     {CFRelease(hostNameRef); hostNameRef = NULL;}
  if (urlProxArrayRef) {CFRelease(urlProxArrayRef); urlProxArrayRef = NULL;}
  if (proxyDicRef)     {CFRelease(proxyDicRef); proxyDicRef = NULL;}
  if (urlRef)          {CFRelease(urlRef); urlRef = NULL;}

  return 0;

}
3 голосов
/ 10 января 2012

Пример кода, который вы нашли, уже использует API-интерфейсы C (CFNetworkCopySystemProxySettings, CFNetworkCopyProxiesForURL), а затем приступает к некоторой дополнительной работе по преобразованию результатов во что-то более дружественное для программы Objective-C (например, вызов NSMakeCollectable для включения Objective-С мусора).

Это может помочь вам понять это, если вы знаете, что вызовы "CF *" - это API "Core Foundation", который вызывается из C (или C ++), а "NS *" - это Objective-Cклассы / методы.Таким образом, ваша задача состоит в том, чтобы повторно привести код с использованием только вызовов и типов данных Core Foundation.Например, CFDictionary и NSDictionary являются взаимозаменяемыми («бесплатный телефонный мост», на языке Apple), поэтому вы можете обрабатывать словарь из программы на C / C ++, используя API CFDictionary вместо NSDictionary.

Для пониманиякак это работает (вместо того, чтобы просто попросить кого-то перевести это для вас), вам нужно исследовать такие функции, как:

CFNetworkCopySystemProxySettings

CFURLCreateWithString

CFNetworkCopyProxiesForURL

CFDictionaryGetValue

Вам также понадобятся базовые знания Управление памятью Core Foundationправила

...