001/* 002 * BridJ - Dynamic and blazing-fast native interop for Java. 003 * http://bridj.googlecode.com/ 004 * 005 * Copyright (c) 2010-2013, Olivier Chafik (http://ochafik.com/) 006 * All rights reserved. 007 * 008 * Redistribution and use in source and binary forms, with or without 009 * modification, are permitted provided that the following conditions are met: 010 * 011 * * Redistributions of source code must retain the above copyright 012 * notice, this list of conditions and the following disclaimer. 013 * * Redistributions in binary form must reproduce the above copyright 014 * notice, this list of conditions and the following disclaimer in the 015 * documentation and/or other materials provided with the distribution. 016 * * Neither the name of Olivier Chafik nor the 017 * names of its contributors may be used to endorse or promote products 018 * derived from this software without specific prior written permission. 019 * 020 * THIS SOFTWARE IS PROVIDED BY OLIVIER CHAFIK AND CONTRIBUTORS ``AS IS'' AND ANY 021 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 022 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 023 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY 024 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 025 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 026 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 027 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 028 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 030 */ 031package org.bridj.objc; 032 033import java.util.HashMap; 034import org.bridj.Pointer; 035import java.util.Map; 036import org.bridj.BridJ; 037import static org.bridj.objc.FoundationLibrary.*; 038import static org.bridj.Pointer.*; 039 040/** 041 * 042 * @author ochafik 043 */ 044public class NSDictionary extends NSObject { 045 046 static { 047 BridJ.register(); 048 } 049 050 public NSDictionary() { 051 super(); 052 } 053// public NSDictionary(Map<String, NSObject> map) { 054// super(pointerToNSDictionary(map)); 055// } 056 057 public native Pointer<NSObject> valueForKey(Pointer<NSString> key); 058 059 public native Pointer<NSObject> objectForKey(Pointer<NSObject> key); 060 061 public native int count(); 062 063 public native void getObjects_andKeys(Pointer<Pointer<NSObject>> objects, Pointer<Pointer<NSObject>> keys); 064 065 public static native Pointer<NSDictionary> dictionaryWithContentsOfFile(Pointer<NSString> path); 066 067 public static native Pointer<NSDictionary> dictionaryWithObjects_forKeys_count(Pointer<Pointer<NSObject>> objects, Pointer<Pointer<NSObject>> keys, int count); 068 069 public static Pointer<NSDictionary> pointerToNSDictionary(Map<String, NSObject> map) { 070 int n = map.size(); 071 Pointer<Pointer<NSObject>> objects = allocatePointers(NSObject.class, n); 072 Pointer<Pointer<NSObject>> keys = allocatePointers(NSObject.class, n); 073 074 int i = 0; 075 for (Map.Entry<String, NSObject> e : map.entrySet()) { 076 keys.set(i, (Pointer) pointerToNSString(e.getKey())); 077 objects.set(i, getPointer(e.getValue())); 078 i++; 079 } 080 081 return dictionaryWithObjects_forKeys_count(objects, keys, n); 082 } 083 084 public static NSDictionary valueOf(Map<String, NSObject> map) { 085 return pointerToNSDictionary(map).get(); 086 } 087 088 public Map<String, NSObject> toMap() { 089 int n = count(); 090 Pointer<Pointer<NSObject>> objects = allocatePointers(NSObject.class, n); 091 Pointer<Pointer<NSString>> keys = allocatePointers(NSString.class, n); 092 093 getObjects_andKeys(objects, (Pointer) keys); 094 095 Map<String, NSObject> ret = new HashMap<String, NSObject>(); 096 for (int i = 0; i < n; i++) { 097 Pointer<NSString> key = keys.get(i); 098 Pointer<NSObject> value = objects.get(i); 099 100 ret.put(key.get().toString(), value == null ? null : value.get()); 101 } 102 return ret; 103 } 104}