'Internal implementation of adding tasks where tasks must be a list.'

def __AddTasks(self, tasks, transactional, fill_request, multiple, rpc=None):

    def ResultHook(rpc):
        'Process    the    TaskQueueBulkAddResponse.'
        try:
            rpc.check_success()
        except apiproxy_errors.ApplicationError as e:
            raise _TranslateError(e.application_error, e.error_detail)
        assert (rpc.response.taskresult_size() == len(tasks)), ('expected    %d    results    from    BulkAdd(),    got    %d' % (len(tasks), rpc.response.taskresult_size()))
        exception = None
        for (task, task_result) in zip(tasks, rpc.response.taskresult_list()):
            if (task_result.result() == taskqueue_service_pb.TaskQueueServiceError.OK):
                if task_result.has_chosen_task_name():
                    task._Task__name = task_result.chosen_task_name()
                task._Task__queue_name = self.__name
                task._Task__enqueued = True
            elif (task_result.result() == taskqueue_service_pb.TaskQueueServiceError.SKIPPED):
                pass
            elif ((exception is None) or isinstance(exception, TaskAlreadyExistsError) or isinstance(exception, TombstonedTaskError)):
                exception = _TranslateError(task_result.result())
        if (exception is not None):
            raise exception
        if multiple:
            return tasks
        else:
            assert (len(tasks) == 1)
            return tasks[0]
    if (len(tasks) > MAX_TASKS_PER_ADD):
        raise TooManyTasksError(('No    more    than    %d    tasks    can    be    added    in    a    single    call' % MAX_TASKS_PER_ADD))
    request = taskqueue_service_pb.TaskQueueBulkAddRequest()
    response = taskqueue_service_pb.TaskQueueBulkAddResponse()
    task_names = set()
    for task in tasks:
        if task.name:
            if (task.name in task_names):
                raise DuplicateTaskNameError(('The    task    name    %r    is    used    more    than    once    in    the    request' % task.name))
            task_names.add(task.name)
        if task.was_enqueued:
            raise BadTaskStateError('Task    has    already    been    enqueued.')
        fill_request(task, request.add_add_request(), transactional)
    if (transactional and (request.ByteSize() > MAX_TRANSACTIONAL_REQUEST_SIZE_BYTES)):
        raise TransactionalRequestTooLargeError(('Transactional    request    size    must    be    less    than    %d;    found    %d' % (MAX_TRANSACTIONAL_REQUEST_SIZE_BYTES, request.ByteSize())))
    return _MakeAsyncCall('BulkAdd', request, response, ResultHook, rpc)
