• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/google/outgoingeventmanager.php
  • Класс: BitrixCalendarSyncGoogleOutgoingEventManager
  • Вызов: OutgoingEventManager::multipartDecode
private function multipartDecode($response, array $syncEventList): void
{
	$boundary = $this->httpClient->getClient()->getHeaders()->getBoundary();

	$response = str_replace("--$boundary--", "--$boundary", $response);
	$parts = explode("--$boundary" . self::LINE_SEPARATOR, $response);

	foreach ($parts as $part)
	{
		$part = trim($part);
		if (!empty($part))
		{
			$partEvent = explode(self::LINE_SEPARATOR . self::LINE_SEPARATOR, $part);
			$data = $this->getMetaInfo($partEvent[1]);


			$eventId = $this->getId($partEvent[0]);
			if ($eventId === null)
			{
				continue;
			}

			try
			{
				$parsedData = Json::decode($partEvent[2]);
			}
			catch (ArgumentException $e)
			{
				continue;
			}

			if ($data['status'] === 200)
			{

				/** @var SyncEvent $masterEvent */
				$syncEvent = $syncEventList[$parsedData['iCalUID']];

				if ($syncEvent === null)
				{
					continue;
				}

				if ($syncEvent->hasInstances() && isset($parsedData['originalStartTime']))
				{
					$syncEvent = $this->getInstanceByOriginalDate($syncEvent, $parsedData);

					// TODO: it's workaround to skip errors
					if ($syncEvent === null)
					{
						continue;
					}
				}

				$eventConnection = (new BuilderEventConnectionFromExternalEvent(
					$parsedData,
					$syncEvent,
					$this->connection
				))->build();

				$syncEvent
					->setEventConnection($eventConnection)
					->setAction(Dictionary::SYNC_EVENT_ACTION['success'])
				;
			}
			elseif (isset($parsedData['error']['code'], $parsedData['error']['message']))
			{
				return;
			}
		}
	}
}