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.cpp.com;
032
033import org.bridj.*;
034import org.bridj.ann.*;
035import org.bridj.ann.Runtime;
036import org.bridj.cpp.CPPObject;
037import org.bridj.cpp.mfc.MFCRuntime;
038
039import static org.bridj.cpp.com.COMRuntime.*;
040
041@Convention(Convention.Style.StdCall)
042@IID("00000000-0000-0000-C000-000000000046")
043@Runtime(COMRuntime.class)
044public class IUnknown extends CPPObject {
045
046    protected boolean autoRelease;
047
048    public static IUnknown wrap(Object object) {
049        if (object instanceof IUnknown) {
050            return (IUnknown) object;
051        }
052
053        return new COMCallableWrapper(object);
054    }
055
056    @Override
057    protected void finalize() throws Throwable {
058        if (autoRelease) {
059            Release();
060        }
061        super.finalize();
062    }
063
064    @Virtual(0)
065    @Deprecated
066    public native int QueryInterface(
067            Pointer<Byte> riid,
068            Pointer<Pointer<IUnknown>> ppvObject);
069
070    public <I extends IUnknown> I QueryInterface(Class<I> type) {
071        Pointer<Pointer<IUnknown>> p = Pointer.allocatePointer(IUnknown.class);
072        int ret = QueryInterface(getIID(type), p);
073        if (ret != S_OK) {
074            return null;
075        }
076
077        return p.get().getNativeObject(type);
078    }
079
080    @Virtual(1)
081    public native int AddRef();
082
083    @Virtual(2)
084    public native int Release();
085}