def main():
    sys.stdout.write("Android Gateway Pull Test\n")
    if len(sys.argv) != 3:
        sys.stderr.write("Usage: %s <host> <port> \n" % sys.argv[0])
        sys.exit(-1)
    
    deviceName = "device:test/" + uuid.uuid1().hex
    userName = "******" + uuid.uuid1().hex
    connector = AndroidConnector(sys.argv[1], int(sys.argv[2]), deviceName, userName, "")
    
    try:
        connector.start()
        connector.waitForAuthentication()

        # Pull request options... For LDAP pull, only the first two are important (as of now)
        mimetype = "ammo/edu.vu.isis.ammo.launcher.contact_pull"
        query = "cn=John"
        maxResults = 0
        startFromCount = 0
        liveQuery = False
        
        # Send the pull request
        connector.pullRequest(mimetype, query, "", maxResults, startFromCount, liveQuery)
        
        while True:
            while(connector.isDataAvailable()):
                result = connector.dequeueMessage()
                if(result != None):
                    (msg, receivedTime) = result
                    print "Message received at:", receivedTime
                    print msg
            time.sleep(0.5)
    except KeyboardInterrupt:
        sys.stdout.write("Got ^C...  Closing\n")
        reactor.callFromThread(reactor.stop)
    except:
        sys.stderr.write("Unexpected error...  dying.\n")
        reactor.callFromThread(reactor.stop)
        raise
    query += branch + ","
    query += phone + ","
    query += email + ","
    
    # Private contacts data is not stored as a blob so we don't use a projection string
    projection = ""
  
    maxResults = 0
    startFromCount = 0
    liveQuery = False

    connector.pullRequest(mimeType, query, projection, maxResults, startFromCount, liveQuery)
    
    while True:
      while(connector.isDataAvailable()):
        result = connector.dequeueMessage()
        if(result != None):
          (msg, receivedTime) = result
          print "Message received at:", receivedTime
          print msg
      time.sleep(0.5)
      
  except KeyboardInterrupt:
    print "Got ^C...  Closing"
    reactor.callFromThread(reactor.stop)
    # re-raising the exception so we get a traceback (useful for debugging,
    # occasionally).  Real "applications"/testdrivers shouldn't do this.
    raise 
  except:
    print "Unexpected error...  dying."
    reactor.callFromThread(reactor.stop)