package cao.Message;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JIComServer;
import org.jinterop.dcom.core.JIFlags;
import org.jinterop.dcom.core.JILocalCoClass;
import org.jinterop.dcom.core.JILocalInterfaceDefinition;
import org.jinterop.dcom.core.JILocalMethodDescriptor;
import org.jinterop.dcom.core.JILocalParamsDescriptor;
import org.jinterop.dcom.core.JIProgId;
import org.jinterop.dcom.core.JISession;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.impls.JIObjectFactory;
import org.jinterop.dcom.impls.automation.IJIDispatch;

public class Message {

	public static void main(String[] args)  throws JIException, SecurityException, IOException {
		IJIDispatch caoEng_dispatch = null;
		IJIDispatch workspace_dispatch = null;
		IJIDispatch controller_dispatch = null;

		IJIComObject eventListener = null;
		String strIdentifier = null;


		JISession session = JISession.createSession("DOMAIN","USERNAME","PASSWORD");

		try{
			// Now create the COM server to the target machine, this could either be an IP address or a hostname.
			JIComServer comServer = new JIComServer(JIProgId.valueOf("CAO.CaoEngine"), session);

			// Instantiate the COM Server
			IJIComObject caoEngObject = comServer.createInstance();

			// CaoEngineオブジェクトの生成
			caoEng_dispatch = (IJIDispatch)JIObjectFactory.narrowObject((IJIComObject)caoEngObject.queryInterface(IJIDispatch.IID));

			// CaoWorkspaceオブジェクトの生成
			JIVariant[] workspace = caoEng_dispatch.callMethodA("AddWorkspace", new Object[]{"ws"});
			workspace_dispatch = (IJIDispatch)JIObjectFactory.narrowObject((workspace[0]).getObjectAsComObject());


			// CaoControllerオブジェクトの生成
			JIVariant[] controller = workspace_dispatch.callMethodA("AddController", new Object[]{"RC1", "CaoProv.Dummy", "", ""});
			controller_dispatch = (IJIDispatch)JIObjectFactory.narrowObject((controller[0]).getObjectAsComObject());


			// OnMessage使用準備
			String IID_ICaoControllerEvents = "a7b43ef1-0215-4940-a6f6-21744b8cba52";
			JILocalCoClass javaComponent = new JILocalCoClass(new JILocalInterfaceDefinition(IID_ICaoControllerEvents, true), new ControllerCallback_Impl());

			JILocalParamsDescriptor paramObject = new JILocalParamsDescriptor();
			paramObject.addInParamAsType(IJIComObject.class, JIFlags.FLAG_REPRESENTATION_IDISPATCH_INVOKE);
			javaComponent.getInterfaceDefinition().addMethodDescriptor(new JILocalMethodDescriptor("OnMessage",1, paramObject));
			List<String> eventInterfaces = new ArrayList<String> ();
	        eventInterfaces.add (IID_ICaoControllerEvents);
			javaComponent.setSupportedEventInterfaces(eventInterfaces);
			eventListener = JIObjectFactory.buildObject(session, javaComponent);
			strIdentifier = JIObjectFactory.attachEventHandler(controller_dispatch, IID_ICaoControllerEvents, eventListener);


			// イベント発生用のExecute実行
			JIVariant[] Execute_ret = controller_dispatch.callMethodA("Execute", new Object[]{"", "0"});
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} finally {
			// CAOオブジェクトの解放処理
			controller_dispatch.release();
			workspace_dispatch.release();
			caoEng_dispatch.release();
			JISession.destroySession(session);
		}
	}

	///////////////////////////////////////////////////////
	// OnMessage処理
	///////////////////////////////////////////////////////
	public static class ControllerCallback_Impl {
		public void OnMessage(IJIComObject caoMess) throws JIException{
			IJIDispatch caoMess_dispatch = null;
			JIVariant caoMess_DateTime = null;

			try {
				caoMess_dispatch = (IJIDispatch)JIObjectFactory.narrowObject((IJIComObject)caoMess.queryInterface(IJIDispatch.IID));
				caoMess_DateTime = caoMess_dispatch.get("DateTime");
				System.out.println(caoMess_DateTime);
			} catch (JIException e) {
				e.printStackTrace();
			} finally {
				caoMess_dispatch.release();
			}
		}
	}
}
