1<?php
2
3namespace Sabre\VObject\Splitter;
4
5use
6    Sabre\VObject,
7    Sabre\VObject\Parser\MimeDir;
8
9/**
10 * Splitter
11 *
12 * This class is responsible for splitting up VCard objects.
13 *
14 * It is assumed that the input stream contains 1 or more VCARD objects. This
15 * class checks for BEGIN:VCARD and END:VCARD and parses each encountered
16 * component individually.
17 *
18 * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
19 * @author Dominik Tobschall
20 * @author Armin Hackmann
21 * @license http://sabre.io/license/ Modified BSD License
22 */
23class VCard implements SplitterInterface {
24
25    /**
26     * File handle
27     *
28     * @var resource
29     */
30    protected $input;
31
32    /**
33     * Persistent parser
34     *
35     * @var MimeDir
36     */
37    protected $parser;
38
39    /**
40     * Constructor
41     *
42     * The splitter should receive an readable file stream as it's input.
43     *
44     * @param resource $input
45     * @param int $options Parser options, see the OPTIONS constants.
46     */
47    public function __construct($input, $options = 0) {
48
49        $this->input = $input;
50        $this->parser = new MimeDir($input, $options);
51
52    }
53
54    /**
55     * Every time getNext() is called, a new object will be parsed, until we
56     * hit the end of the stream.
57     *
58     * When the end is reached, null will be returned.
59     *
60     * @return Sabre\VObject\Component|null
61     */
62    public function getNext() {
63
64        try {
65            $object = $this->parser->parse();
66
67            if (!$object instanceof VObject\Component\VCard) {
68                throw new VObject\ParseException('The supplied input contained non-VCARD data.');
69            }
70
71        } catch (VObject\EofException $e) {
72            return null;
73        }
74
75        return $object;
76
77    }
78
79}
80