/** * Copyright (c) 2011 Martin M Reed * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.hardisonbrewing.signingserver.service.push; import net.hardisonbrewing.signingserver.SigservApplication; import net.hardisonbrewing.signingserver.closed.Settings.BISPushInfo; import net.hardisonbrewing.signingserver.service.icon.IconService; import net.hardisonbrewing.signingserver.service.store.push.PushPPGStatusChangeListenerStore; import net.hardisonbrewing.signingserver.service.store.push.PushPPGStatusStore; import net.rim.blackberry.api.push.PushApplicationDescriptor; import net.rim.blackberry.api.push.PushApplicationRegistry; import net.rim.blackberry.api.push.PushApplicationStatus; import net.rim.device.api.system.ApplicationDescriptor; import net.rim.device.api.system.ApplicationManager; import net.rim.device.api.system.ApplicationManagerException; import net.rim.device.api.system.DeviceInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PushPPGService { private static final Logger log = LoggerFactory.getLogger( PushPPGService.class ); private static PushApplicationDescriptor pushApplicationDescriptor; public static byte getStatus() { PushApplicationDescriptor pushApplicationDescriptor = getPushApplicationDescriptor(); PushApplicationStatus pushApplicationStatus = PushApplicationRegistry.getStatus( pushApplicationDescriptor ); return pushApplicationStatus.getStatus(); } public static boolean shouldRegister() { if ( DeviceInfo.isSimulator() ) { return false; } switch (getStatus()) { case PushApplicationStatus.STATUS_ACTIVE: case PushApplicationStatus.STATUS_PENDING: { return false; } default: { return true; } } } public static final void waitUntilUnregistered() { if ( shouldRegister() ) { return; } PushApplicationDescriptor pushApplicationDescriptor = getPushApplicationDescriptor(); PushApplicationRegistry.unregisterApplication( pushApplicationDescriptor ); log.info( "Waiting for push to unregister" ); while (!shouldRegister()) { try { Thread.sleep( 200 ); } catch (InterruptedException e) { // do nothing } } log.info( "Push is no longer registered" ); } public static void registerOnStartup() throws ApplicationManagerException { waitUntilUnregistered(); register( true ); } public static void unregister() { PushApplicationRegistry.unregisterApplication(); updateStoredStatus( PushApplicationStatus.STATUS_NOT_REGISTERED ); } public static int register( boolean register ) throws ApplicationManagerException { log.info( "Invoking PUSH un/registration application" ); ApplicationDescriptor systemApplicationDescriptor = SigservApplication.getSystemApplicationDescriptor(); if ( !register ) { ApplicationDescriptor currentApplicationDescriptor = ApplicationDescriptor.currentApplicationDescriptor(); if ( currentApplicationDescriptor.getModuleHandle() == systemApplicationDescriptor.getModuleHandle() ) { unregister(); return -1; } } String[] arguments = new String[] { register ? SigservApplication.PUSH_REGISTER : SigservApplication.PUSH_UNREGISTER }; ApplicationDescriptor applicationDescriptor = new ApplicationDescriptor( systemApplicationDescriptor, arguments ); return ApplicationManager.getApplicationManager().runApplication( applicationDescriptor ); } public static void updateStoredStatus( byte status ) { log.info( "Updating PUSH stored status" ); PushPPGStatusStore.put( status ); IconService.updateIcon(); PushPPGStatusChangeListenerStore.notifyListeners( status ); } public static PushApplicationDescriptor getPushApplicationDescriptor() { if ( pushApplicationDescriptor == null ) { String[] startupArguments = { SigservApplication.PUSH_STARTUP }; ApplicationDescriptor systemApplicationDescriptor = SigservApplication.getSystemApplicationDescriptor(); ApplicationDescriptor applicationDescriptor = new ApplicationDescriptor( systemApplicationDescriptor, startupArguments ); PushApplicationDescriptor pushApplicationDescriptor = new PushApplicationDescriptor( BISPushInfo.PORT ); pushApplicationDescriptor.setAppId( BISPushInfo.APPID ); pushApplicationDescriptor.setAppDescriptor( applicationDescriptor ); pushApplicationDescriptor.setServerUrl( BISPushInfo.URL ); pushApplicationDescriptor.setServerType( PushApplicationDescriptor.SERVER_TYPE_BPAS ); PushPPGService.pushApplicationDescriptor = pushApplicationDescriptor; } return pushApplicationDescriptor; } }