Jabber-клиент на ActionScript 3.0 (Введение)

Здравствуйте, дорогие любители этого интересного. Вот и появилась более или менее интересная задача в виде написания Jabber-клиента, используя ActionScript 3.0 и AIR.

Прогуглив over 20000 запросов в гугле по типу «Jabber library XMPP Actionscript 3.0» и иже с этим — свой выбор остановил на одной опенсоурс библиотеке XIFF (http://www.igniterealtime.org/downloads/index.jsp). Скачивать самую последнюю (где Flash). Можно юзать как SWC, так и сам пакет классов.

Кстати, очень помог мой товарищ, подкинув пару ссылок на интересные ресурсы, к примеру http://yapro.ru/web-master/xml/pishem-jabber-klient.html. Очень советую ознакомиться (там правда на Дельфях, но смысла не меняет). Да, и половину того, что там делается вручную XIFF умеет и могЁт сам, так что нам останется только код написать.

Библиотека XIFF очень своебразная, практически с полным отсутствием примеров реализации. Посему пришлось разбираться в ней самому. А чтобы это не выглядело как набор букв и отпало половину вопросов почему это работает так, а не иначе — первоочередная задача ознакомиться с ссылками выше. Введение на этом заканчиваю, в понедельник напишем коннект к серверу и пообщаемся с кем-либо. Все просто, но прочитать надо бы.

Реклама

Buttonmode для компонента Label

После долгих мучений и попыток установить курсор в виде пальца над лейблом — родилось такое решение:

useHandCursor = true;
mouseChildren = false;
buttonMode = true;

По-другому оно никак не хотело работать. Мудотатство.

Поддержка сжатия GZip Actionscript 3.0, Adobe AIR

Здравствуйте, уважаемые любители этого интересного. Сегодня мы разберем вопрос поддержки сжатия GZip флеш-плеером.
Дело в том, что при работе с большими объемами данных (приём-пересылка) бывает необходимо архивировать данные сервером при пересылке клиенту. На уровне HTML поддержка GZip браузерами реализована на 5 баллов.

Как это работает?
Клиент запрашивает у сервера данные. К примеру, сервер решил, что текстовых данных аж 2 мегабайта. Пока вы дождетесь пересылки их от сервера клиенту — яйца седыми станут. Поэтому сервер упаковывает их в формат GZip, пересылает клиенту 30 килобайт данных, а клиент за секунду разархивирует их в нужные нам 2 мегабайта текстовой информации.

Сразу оговорюсь как это работает в различных условиях.
Flash IDE — никак. Нужно подключать сторонние библиотеки для чтения GZip формата.
И постоянно слать заголовок ‘Accept-Encoding’:’gzip’. Принимаемые данные будут нечитаемыми.

При публикации и просмотре AIR или EXE файла — все работает на ура. Но! Длина принимаемых данных определяется неверно. То есть фактически длина принятых данных во много раз превышает общую длину данных. Поэтому в обработчике URLLoaderа ProgressEvent.PROGRESS можно получить и 400 и 1000% принимаемых данных.

Как это исправить? Серверу необходимо отправлять клиенту Air дополнительный заголовок.
К примеру назовём его: public static const AIR_CONTENT_LENGTH:String = ‘Air-Content-Length’;

Затем посмотрим что приходит от сервера:

myURLLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, onHTTPResponseStatus);
private var total_response_length:Number = 0;

//получаем заголовки сервера
private function onHTTPResponseStatus(e:HTTPStatusEvent):void
{
  var isHeaderPresent:Boolean = false;
    
  for (var i:int = 0; i < HTTPStatusEvent(e).responseHeaders.length; i++)
  {
    //правильный подсчет длины респонза сервера
    if (HTTPStatusEvent(e).responseHeaders[i]['name'] == AIR_CONTENT_LENGTH)
    {
      total_response_length = Number(HTTPStatusEvent(e).responseHeaders[i]['value']);    isHeaderPresent = true;
    }
  }
  if (!isHeaderPresent)
  {
    total_response_length = 0;
  }
}

Теперь смотрим евент процесса загрузки:

//процент загрузки
public var persentage:int = 0;
  
private function onRequestProgress(e:ProgressEvent):void
{
  persentage = (total_response_length == 0)? int(e.bytesLoaded / e.bytesTotal * 100) : int(e.bytesLoaded / total_response_length * 100);
  var bt_total:Number = (total_response_length == 0) ? e.bytesTotal : total_response_length;
}

Короче. Есть хэдэр — берём общее значение длины ответа из него, нет хэдэра — берется стандартный Content-Length, передаваемый сервером.

Опубликовано в Adobe AIR 2.*, AS 3.0. Метки: , , , , . Leave a Comment »

Запись файла на диск через Adobe AIR и ByteArray в любой кодировке

Случается так, что файл нужно записать на диск в кодировке, отличной от кодировки проекта. Поскольку нормальным в РФ считается клепать сайты и ПО в UTF-8 — то работа с документами MS Office (excel, csv) становится проблематичным в виду того, что Excel понимает UTF-8 в виде кракозябр.

private var fileRef:FileReference;
    
//выбрать файл
private function selectHndl(e:Event = null):void
{
  var export_str:String = 'Здрасте-мордасте )) UTF-8 -> CP1251';
    fileRef = new FileReference();
            
  var ba:ByteArray = new ByteArray();
  ba.writeMultiByte(export_str, 'x-cp1251');
            
  fileRef.save(ba, "file.csv");
}


* This source code was highlighted with Source Code Highlighter.

Готово.

Визуализация звука во Flash.

Здравствуйте, уважаемые любители этого интересного. Сегодня поставил эксперимент по визуализации звука (music visualization). Под кат!
Читать далее…

Метод getPixel или делаем свой colorPicker.

Здравствуйте, уважаемые любители «этого интересного». У вас есть изображение и очень бы хотелось получить цвет какой-либо его точки? Вам сюда, под кат, в смысле.
Читать далее…

Flash, MySQL и MDM.Zinc.

Ну что, уважаемые любители этого интересного. Сегодня будем пробовать получить данные из базы данных MySQL, используя связку MDM.Zinc -> Flash -> MySQL. Нам потребуется подключить всего одно расширение для взаимодействия с БД — database. Для начала как всегда нужно инициализировать приложение MDM, после чего присоединиться к БД, сделать запрос и вывести данные.
Я зашил все переменные в класс (чтобы не заморачиваться с инпутами и со всем остальным, но вы можете сделать так, как считаете нужным — хоть в статическом классе объявите чётко, хоть с инпутами, хоть с системой авторизации — как душе угодно).

Этот мини-туториал для тех, кто не хочет лезть и разбираться в хэлп.
Читать далее…