package com.mobilesorcery.sdk.ui.targetphone.iphoneos; import java.io.File; import java.io.IOException; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.window.IShellProvider; import org.eclipse.ui.IMemento; import com.mobilesorcery.sdk.builder.iphoneos.Activator; import com.mobilesorcery.sdk.builder.iphoneos.IPhoneOSPackager; import com.mobilesorcery.sdk.builder.iphoneos.XCodeBuild; import com.mobilesorcery.sdk.core.IBuildVariant; import com.mobilesorcery.sdk.core.MoSyncBuilder; import com.mobilesorcery.sdk.core.MoSyncProject; import com.mobilesorcery.sdk.profiles.IDeviceFilter; import com.mobilesorcery.sdk.profiles.IProfile; import com.mobilesorcery.sdk.profiles.ProfileDBManager; import com.mobilesorcery.sdk.profiles.filter.AbstractDeviceFilter; import com.mobilesorcery.sdk.ui.targetphone.ITargetPhone; import com.mobilesorcery.sdk.ui.targetphone.ITargetPhoneTransportDelegate; import com.mobilesorcery.sdk.ui.targetphone.TargetPhonePlugin; import com.mobilesorcery.sdk.ui.targetphone.TargetPhoneTransportEvent; public class IPhoneOSTargetPhoneTransport implements ITargetPhoneTransportDelegate { private static final String ID = "ios"; private static final IDeviceFilter IOS_DEVICE_FILTER = new AbstractDeviceFilter() { @Override public boolean acceptProfile(IProfile profile) { return "iOS".equalsIgnoreCase(ProfileDBManager.getPlatform(profile)); } @Override public String getFactoryId() { return null; } @Override public void saveState(IMemento memento) { } }; public IPhoneOSTargetPhoneTransport() { } @Override public boolean store(ITargetPhone phone, IMemento memento) { return (phone instanceof IPhoneOSTargetPhone); } @Override public ITargetPhone load(IMemento memento, String name) { return new IPhoneOSTargetPhone(name, ID); } @Override public void send(IShellProvider shell, MoSyncProject project, IBuildVariant variant, ITargetPhone phone, File packageToSend, IProgressMonitor monitor) throws CoreException { if (!XCodeBuild.getDefault().isValid()) { throw new CoreException(new Status(IStatus.ERROR, IPhoneOSTransportPlugin.PLUGIN_ID, "To send to an IPhone requires Xcode to be installed.")); } if (!IPhoneOSPackager.shouldUseProvisioning(project, variant)) { throw new CoreException(new Status(IStatus.ERROR, IPhoneOSTransportPlugin.PLUGIN_ID, "To send to an IPhone requires a provisioning profile to be set.")); } String cert = IPhoneOSPackager.getCertificate(project, variant); if (Activator.IPHONE_DEV_CERT.equals(cert)) { throw new CoreException(new Status(IStatus.ERROR, IPhoneOSTransportPlugin.PLUGIN_ID, "To send to an IPhone requires a distribution (ad hoc) certificate to be used.")); } try { IPhoneOSOTAServer.getDefault().offerProject(project, variant); if (AwaitConnectionDialog.show(project, variant) == AwaitConnectionDialog.CANCEL) { TargetPhonePlugin.getDefault().notifyListeners(new TargetPhoneTransportEvent(TargetPhoneTransportEvent.LAUNCH_CANCELLED, phone, project, variant)); } else { // We send the ABOUT_TO_RUN event here, after the dialog has been dismissed. TargetPhonePlugin.getDefault().notifyListeners(new TargetPhoneTransportEvent(TargetPhoneTransportEvent.ABOUT_TO_LAUNCH, phone, project, variant)); } } catch (IOException e) { throw new CoreException(new Status(IStatus.ERROR, IPhoneOSTransportPlugin.PLUGIN_ID, "Unable to start local OTA server", e)); } } @Override public ITargetPhone scan(IShellProvider shell, IProgressMonitor monitor) throws CoreException { return new IPhoneOSTargetPhone("IPhone OTA", ID); } @Override public IDeviceFilter getAcceptedProfiles() { return IOS_DEVICE_FILTER; } @Override public String getDescription(String context) { return "IPhone OTA"; } @Override public boolean isAvailable() { return XCodeBuild.isMac(); } }