Squeak.ru - шаблоны программирования

Как получить разборчивый ответ от SendCmd в Indy?

Если я использую TIdImap4.SendCmd для ручной отправки неподдерживаемой команды в Indy, я немного запутался, как получить полный ответ для его ручного анализа.

Я отправляю следующую команду, чтобы вручную запросить ярлыки Gmail для сообщения, поскольку это еще не поддерживается Indy:

  IMAP.SendCmd(ImapCmdNum(),'UID FETCH '+uid+' (X-GM-LABELS)',['OK','BAD','NO'], false);

После вызова этой команды я проверил свой файл Indy Log и успешно получил соответствующий ответ от сервера:

Sent 9/19/2015 11:10:40 AM: C5 UID FETCH 2385 (X-GM-LABELS)<EOL>
Recv 9/19/2015 11:10:40 AM: * 542 FETCH (X-GM-LABELS (testlabel) UID 2385)<EOL>C5 OK Success<EOL>

Но теперь я не могу получить никакой части этого ответа, кроме «ОК» от Инди. Я пробовал следующее в отладчике, и ни у одного из них нет необработанного ответа или чего-либо еще, что я мог бы проанализировать вручную:

IMAP.LastCmdResult = ('OK', $2521E60, nil, $2521EC0)
IMAP.LastCmdResult.Text = ()
IMAP.LastCmdResult.Code = 'OK'
IMAP.LastCmdResult.NumericCode = 0
IMAP.LastCmdResult.FormattedReply = ()

Из документации SendCmd:

SendCmd — это перегруженная функция, используемая для отправки команды, указанной в AOut, на одноранговое соединение.

SendCmd использует IOHandler для записи команды в AOut для однорангового соединения.

AResponse указывает ответ, разрешенный для команды.

SendCmd вызывает GetResponse, чтобы определить, разрешен ли ответ от однорангового соединения. Если ответ не разрешен, во время обработки в GetResponse возникает исключение.

Когда AResponse содержит -1, GetResponse вызывается с пустым массивом, чтобы указать, что для команды разрешен любой код ответа. В противном случае значение в AResponse используется для подтверждения кода ответа.

Используйте LastCmdResult для доступа к числовой и текстовой частям ответа на команду.

Насколько я понимаю, я должен использовать LastCmdResult для доступа к различным «частям ответа», но ни один из них не имеет необработанного ответа или какой-либо части ответа, кроме «ОК», так как я могу получить что-то анализируемое из ответа отправить команду?

19.09.2015

Ответы:


1

Текст, который вы ищете, на самом деле находится в свойстве LastCmdResult.Text. Отладчик не показывает его вам, но там находятся данные метки.

Как я уже говорил вам 2 месяца назад в комментариях к моему другому ответу, на который вы ссылались:

Посмотрите на реализацию TIdIMAP4.UIDRetrieveFlags(). Он вызывает SendCmd(), а затем ParseLastCmdResult() для анализа возвращенных флагов. Вам придется воспроизвести ту же логику, заменив fdGmailLabels там, где в настоящее время используется fdFlags (за исключением вызова ParseMessageFlagString(), который анализирует строку флагов на TIdMessageFlagsSet).

Если вы посмотрите на реализацию TIdIMAP4.UIDRetrieveFlags(), а затем посмотрите на свой код, вы даже не будете правильно вызывать SendCmd(). Вы передаете неправильное значение параметру ATag (unless ImapCmdNum() просто вызывает TIdIMAP4.NewCmdCounter - TIdIMAP4 необходимо сгенерировать счетчики команд, чтобы он мог сопоставить их с ответами), и, что более важно, вы передаете неправильные значения параметру AExpectedResponses.

Попробуйте это вместо этого (я проверил это, и это работает):

type
  TIdIMAP4Access = class(TIdIMAP4);
  TIdIMAPLineStructAccess = class(TIdIMAPLineStruct);

var
  uid: string;
  labels: string;
begin
  ...
  uid := ...;
  labels := '';
  IMAP.SendCmd('UID FETCH ' + uid + ' (X-GM-LABELS)', ['FETCH','UID']);
  if IMAP.LastCmdResult.Code = IMAP_OK then
  begin
    if IMAP.LastCmdResult.Text.Count > 0 then
    begin
      // The requested data is in IMAP.LastCmdResult.Text[0].

      // You can either parse it manually, or use the below
      // code to let TIdIMAP4 parse it for you...

      if TIdIMAP4Access(IMAP).ParseLastCmdResult(IMAP.LastCmdResult.Text[0], 'FETCH', ['X-GM-LABELS']) then begin
        labels := TIdIMAPLineStructAccess(TIdIMAP4Access(IMAP).FLineStruct).IMAPValue;
      end;
    end;
  end;
  ...
end;
20.09.2015
  • Спасибо, что нашли время, чтобы объяснить все это. После того, как я изменил параметр AExpectedResponses, как это было предложено, мой LastCmdResult.Text больше не был пустым, поэтому у меня есть кое-что, что можно продвинуть в синтаксическом анализе, как упоминалось ранее. 21.09.2015
  • Этот трюк с TIdIMAP4Access тоже довольно крут. Если бы я знал, что существует такой простой способ доступа к некоторым из этих закрытых методов, мне, вероятно, понадобился бы ImapCmdNum. ImapCmdNum в основном реплицировал NewCmdCounter с неупорядоченным номером C... но теперь, когда я правильно исправил ожидаемые ответы, использование перегруженной версии SendCmd с автоматической порядковой нумерацией больше не приводит к неожиданному поведению. 21.09.2015
  • В Indy очень мало участников private. Непубличные члены преднамеренно protected, чтобы потомки могли получить к ним доступ. Уловка использует преимущества функции Delphi, когда модуль может получить доступ ко всему, что определено в том же модуле. Унаследовав локальные классы от TIdIMAP4 и TIdIMAPLineStruct, они получают доступ к унаследованным методам protected, а затем модуль также получает доступ к своим методам protected. Классы не добавляют дополнительные элементы данных или собственные виртуальные методы, поэтому виртуальная таблица остается правильно выровненной, что позволяет работать приведения типов. 21.09.2015
  • Использование так называемых классов доступа — очень распространенный трюк в коде Delphi. Но это работает только для (strict) protected участников, к которым можно получить доступ через наследование. Доступ к (strict) private членам через наследование невозможен, поэтому для них этот трюк не работает. 21.09.2015
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...