Показаны сообщения с ярлыком wxWidgets. Показать все сообщения
Показаны сообщения с ярлыком wxWidgets. Показать все сообщения

23 авг. 2022 г.

Обновление в приложении

 


Дошли руки дописать апдейтер в приложении.
Список возможностей формировался из собственных требований к функционалу:

  •  Проверка наличия обновлений с заданным временным интервалом.
  •  Уведомление о наличии обновлений.
  •  Опциональность либо обязательность обновления.
  •  Вывод полной информации о обновлением (версия, дата, размер, контрольная сумма) перед его загрузкой/применением.
  •  Проверка и сравнение текущей (локальной) и обновленной версии (Major/Minor/Micro).
  •  Проверка на соответствие контрольной суммы в манифесте обновления и скачанного файла.
  •  Вывод чейнджлога по подгруппам ("added", "fixed", "removed", "other").
  •  Вывод истории обновлений, не установленных юзером. Т.е. при локальной версии 1.1.1 будет отображена информация по 1.2.3, 1.2.4 и тд. Дабы полностью ознакомится со списком всего нового в т.ч и из предыдущих неустановленных обновлений.


Для файла манифеста выбран JSON:

Пример:

meta_url:

{
    "build": {
        "stable": {
            "channel": "stable",
            "meta_url": "http://localhost:3000/assets/db_version.json",
            "release_notes_url": "http://localhost:3000/assets/db_version_notes.json",
            "release_notes_history_url": "http://localhost:3000/assets/db_version_history.json",
            "update_url": "http://localhost:3000/assets/games.db",
            "update_size": 1466368,
            "update_sha256": "efa618ab65e31d921cd4f9d355e1a9d17d908e3c326bf3c1a89bf3ee38d646c1",
            "update_optional": true,
            "last_version_number_major": 1,
            "last_version_number_minor": 2,
            "last_version_number_micro": 4,
            "last_version_unix_time": 1660769543,
            "compatible_since_major": 1,
            "compatible_since_minor": 0,
            "compatible_since_micro": 0
        },
        "beta": {
            "channel": "beta"
        }
    }
}



где,
build - билд с которым работает обновление (stable, beta  и тд).
meta_url - собственно url данного манифеста.
release_notes_url - список изменений текущего обновления.
release_notes_history_url  полный список изменений по версиям.
update_size - размер обновления
update_sha256 - контрольная сумма
update_optional - флаг обязательности/опциональности обновления
last_version_number_major, last_version_number_minor, last_version_number_micro - собственно версия обновления
last_version_unix_time - дата выхода Unix timestamp ака UNIX Epoch time
compatible_since_* - совместимость обновления с версией приложения.


release_notes_url:

    "build": {
        "stable": {
            "version": {
                "major": 1,
                "minor": 2,
                "micro": 4,
                "unix_time": 1660769543,
                "changelog": {
                    "added": [
                        "Some things added",
                        "Another cool things added"
                    ],
                    "removed": [
                        "Removed some unused features"
                    ],
                    "fixed": [
                        "Minor bugfix"
                    ],
                    "other": []
                }
            }
        }
    }
}

Чейнджлог разбит по подгруппам ("added", "fixed", "removed", "other") для группировки.


release_notes_history_url:

{
    "build": {
        "stable": {
            "version": [
                {
                    "major": 1,
                    "minor": 2,
                    "micro": 4,
                    "unix_time": 1660769543,
                    "changelog": {
                        "added": [
                            "Some things added",
                            "Another cool things added"
                        ],
                        "removed": [
                            "Removed some unused features"
                        ],
                        "fixed": [
                            "Minor bugfix"
                        ],
                        "other": []
                    }
                },
                {
                    "major": 1,
                    "minor": 2,
                    "micro": 3,
                    "unix_time": 1660759543,
                    "changelog": {
                        "added": [
                            "Added XYZ",
                            "Added ZYX"
                        ],
                        "removed": [],
                        "fixed": [],
                        "other": [
                            "Migrate from old format to new"
                        ]
                    }
                },
                {
                    "major": 1,
                    "minor": 2,
                    "micro": 2,
                    "unix_time": 1660733543,
                    "changelog": {
                        "added": [],
                        "removed": [],
                        "fixed": [],
                        "other": []
                    }
                }
            ]
        }
    }
}


По сути тоже, что и в release_notes_url, где атрибут version возвращает массив с данными.

В планах:
- Добавление "зеркал" для обновления, в случае недоступности основного источника.
- Добавление зависимостей для обновления.
- Проверка цифровой подписи скачанного файла. Crypto++ уже используется в приложении для проверки контрольных сумм.

На данный момент используется для обновления базы данных используемой в приложении.










17 июл. 2013 г.

Зарелизился wxWidgets 2.9.5

Изменений с последней dev-версии 2.9.4, которая вышла год назад, довольно много: wxWidgets 2.9.5 changelog
http://sourceforge.net/projects/wxwindows/files/2.9.5/
Как и в 2.9.4 доступны бинарные MSW сборки для MS Visual Studio 2008, 2010 и 2012 В плане "сел и поехал" хороший шаг, ибо собирается все вручную (не)прилично долго.
Думаю пора делать переход с 2.8.x на 2.9. Ну и переход к декларативному XRC не за горами (в 2.9.5 wxAuiNotebook и wxRibbonBar как раз добавили в XRC).
Хотя после подобных видео:
мысли всякие посещают. Хотя уверен предполагаю, на деле с Qt 5.1 и Qt Quick не всё так гладко. Но презентации привлекают, да. Ладно, декларативный UI не самоцель,  вот наличие QtWebKit и на MSW сильный плюс, тут Qt даст фору. Ну и с мобильными платформами у wxWidgets увы, пока никак.

12 июл. 2013 г.

wxCrafter - еще один GUI builder для wxWidgets

Полку wxSmith, wxFormBuilder, DialogBlocks прибыло,  собственно сабж:

wxCrafter
wxCrafter
От автора CodeLight IDE, которая мне в своё время (чуть более 3-х лет ago) не сильно понравилась (IDE в смысле, не автор). Изначально был плагином к CodeLight, теперь вот добавился и standalone вариант wxCrafter
Стоит - $39 (DialogBlocks - $90, wxSmith и wxFormBuilder - Free).
Никаких особых эмоций не вызвал, ни сильно положительных, ни резко отрицательных, есть поддержка некоторых современных контролов из линейки wxWidgets 2.9.x, например wxRibbonBar (в бесплатном варианте ощутимо урезан в плане доступных контролов).
Свои проекты хранит в *.wxcp, что на поверку оказывается файлом формата JSON. Есть импорт проектов wxFormBuilder, wxSmith и ресурсов *.xrc, сам генерит *.xrc и *.cpp.

9 июн. 2010 г.

I luv wxCURL

Долго и упорно боролся с wxHTTP, нарисовал свой класс на его основе, многопоточность, редиректы, какое-никакое разруливание кодов ответа сервера, система кастомных ивентов (custom events), etc, etc. Разобрался с багом 50% загрузки процессора при запросе не этот , другой (хорошо в трее сидит иконка с гистограммой загрузки CPU от Rainmeter, так бы ни в жисть не увидел). Т.е. классическая система костылей и подпорок, best friends of codemonkey.
Кстати гугля (в частности code.google.com) кладет болт на стандарты HTTP и на запрос заголовков ответа сервера (метод HEAD, т.е. без тела) дает облизать фигу (404 Not Found). Google professionals is so professionals :3
В общем всячески пытался изобрести лисапед. Что характерно знал что есть CURL и wx-обвязка для него wxCURL, но по какой то неведомой причине считал что он GPL (я же лиценс-виолатор любитель мирандосорсов какой нить), оказалось что лицензия MIT, т.е. вполне кошерно ложится на source closed продукт, и не против статической линковки. Короче +200 kb и спокойные нервы вполне сопоставимая цена. При динамической линковке ненужное (WebDAV и подобное) можно убрать из редистриба либы.
Не особо хитро-мудро собирается но для VC кое-что напортачено, а для MinGW через make вообще просто.

30 дек. 2009 г.

MinGW vs MSVC

Решил попробовать скомпилировать проект с помощью бесплатного тулкита Microsoft Visual Studio Express а именно Visual Studio 8 (2005). Тулкит "жирный" 462 mb. сама Visual Studio, и 395 mb. Windows Platform SDK (в 2005 версии не входит в состав VS, imho это правильно).
Наверное дело привычки, но студия как IDE после Code::Blocks мне не понравилась, почти без "танцев" сбилдил либы wxWidgets, сам же проект "ниасилил", в общем на Code::Blocks лично мне оказалось удобней (правда геморрой был и там, но спасло гугление на официальном форуме wxWidgets).
В общем Release теперь билдиться только с помощью компилятора MSVC. Почему? Все просто: размер бинарника собранного в MinGW - 3.3 mb, в MSVC - 2.2 mb, т.е. - 30% (или + 50% это как посмотреть). К тому же компилятор явно быстрее, это факт. Но к студии необъяснимое отвращение, почему-то интерфейс (контролы и т.п.) вызывают стойкую ассоциацию с .NET приложением, воротит и все тут.
Параллельно посмотрел Qt 4.6, чего-то не собираются некоторые экземплы, покрутил примеры, да, фреймворк по-хорошему толст, примеры некоторые впечатляют, говорят современный (обозвать ивенты и обработчики событий сигналами и слотами и присобачить слева moc прекомпилятор это нее**цо модерново, да).
Но вот я подумал о своем приложении не супер-пупер, но и не самом простом (IPC, Custom Events, Sockets, не самый хреновый GUI, кстати нативный и выглядящий как на WinAPI). Так вот аппликуха использует в среднем около 2.5-3 mb оперативной памяти, сидит в трее и расчитана на постоянное использование, размер NSIS инсталлятора менее психологической метки в 1 mb и никаких дополнительных либ, для небольших и средних проектов самое оно (хотя назвать Code::Blocks небольшим или средним язык не поворачивается и он чертовски хорош). С Qt эти показатели увеличиваются в разы. Лицензия wxWidgets опять же намного свободней. Вот и вся логика, а модерн ради модерна пусть будет для эстетов и пиарастов.
P.S. Разработка wxWidgets началась в 1992 году, Qt - в 1994, думаю костылей и там и там хватает.

15 дек. 2009 г.

wxWidgets 2.9

Попробовал нестабильную ветку. Она действительно нестабильная. И кривая. Местами.
Некоторые методы объявлены как депрекейтед, некоторые просто изменили. Строки (wxString) например, DDE (wxConnection) и т.д. и т.п.
Но это все можно понять, избавляются от старого хлама. Но вот чего я понять не могу, так это изменившегося размера exe-шника статически слинкованного приложения:
3.3 mb на wxWidgets 2.8.10
7.2 mb на wxWidgets 2.9.0
5.2 mb на wxWidgets 2.9.0 после применения патча на кривые руки

Понятно что не WinAPI, но так недалеко и до Q-евого кошмарика где приложение тянет с собой туеву хучу бегамайт shared либ (QutIM например при размере около 2 mb тянет более 20 mb либ), это просто 3.14дец, хуже только .NET (недавно обновился на 250 mb ради Paint.NET).

В общем убежал в ужасе обратно на stable.

27 нояб. 2009 г.

MinGW, wxString::ToLongLong() и все все все

Дано:
wxString - строка содержащая число в строковом представлении.
m_nSize - 64 битное число.
MinGW - компилятор.
wxWidgets - фреймворк.

Задача:
Конвертировать строку в число, дабы произвести некие действия.

Решение:
Открываем доки, ищем и находим следующее:

wxString::ToLongLong
bool ToLongLong(wxLongLong_t *val, int base = 10) const

Если конвертирование возможно получаем true, но вся соль в том, что в случае с MinGW во всех случаях обламываемся и получаем false, т.к. есть некоторое условие:

Compilers with C99 support and Microsoft Visual C++ version 7 and higher do support this.

Читаем и изучаем stdlib.h и внимательно справку по wxString
Получаем следующее:

m_nSize = atoll(strHeaderSize.char_str());

Проверяем результат:

wxMessageBox(wxString::Format(wxT("%lld"), m_Size));

и обламываемся, оказывается M$ имеет свой стандарт на форматирование и в MinGW

надо использовать следующее:

wxMessageBox(wxString::Format(wxT("%I64d"), m_nSize));


Да-да, стандарты существуют для того же для чего и законы.


P.S. в Symbian при переходе с 7.0s-8.1a на 8.1b тоже изменили:

BEFORE:

x.GetTInt();

AFTER:

I64INT(x);

26 нояб. 2009 г.

Nightly Builds

Активно попользовался Code::Blocks (8.02 Stable), раздражали только несколько вещей:
- Никакущий code outline
- Не всегда логичное поведение табов
- Меню Copy/Paste за каким то х**ом спрятано в подменю ("очень" удобно особенно ночью когда на ощупь вместо Ctrl+C и Ctrl+V попадаещь не на ту клавишу, т.к. у меня на Ctrl+B стоит компиляция)
- Отсутствие хоткеев на Find Declaration/Implementation

Терзался стоит ли связываться с ночником, но стабильная версия датирована 28 Feb 2008...
В общем паралельно поставил ночной билд и из всего списка остался только Меню Copy/Paste. Outline удобнейший, табы лучше, все хоткеи в настройках + бонусы в виде новых плагинов (выделение слов по дабл клику, inline поиск, список открытых файлов, wxSmith с AUI, Тетрис!!!111). Но падал 2 раза на закрытии при запросе сохранения лайота, в принципе не чревато если предохраняться сохраняться.
Да и написан на C++ и wxWidgets т.е. быстр, нетребователен к ресурсам и вносит некоторый элемент гармонии "на чем пишу тем и пользуюся" после диссонанса навеяного Carbide.C++ являющимся выкормышем Eclipse и Java к которой у меня и не только у меня "трепетное" отношение.

Параллельно попобовал CodeLite вот где тихий ужас, пытался настроить компилятор на статичную линковку 3 часа(!), оказалось что сначала надо задать директорию с lib (изначально натравлен он на динамическую), затем уже создавать workspace. Неправильный порядок вводил светлокод в тупняк, а погромиста в ярость. В общем блоку пока сливает всухую. Но если сравнить например с QT Creator то не так страшно, это чудо вообще IDE не назовешь, медиаплеер даже кнопка "Play" есть, бугага.

29 сент. 2009 г.

The power of the OpenSource ("звезда в шоке")

WxWidgets 2.8.10

http.h

...
protected:
enum wxHTTP_Req
{
wxHTTP_GET,
wxHTTP_POST,
wxHTTP_HEAD
};
...

bool BuildRequest(const wxString& path, wxHTTP_Req req);
...



http.cpp


bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req)
{
const wxChar *request;

switch (req)
{
case wxHTTP_GET:
request = wxT("GET");
break;

case wxHTTP_POST:
request = wxT("POST");
if ( GetHeader( wxT("Content-Length") ).IsNull() )
SetHeader( wxT("Content-Length"), wxString::Format( wxT("%lu"), (unsigned long)m_post_buf.Len() ) );
break;

default:
return false;
}


Но ведь подумали же, твоюжтымать! есть такой метод "HEAD", есть.

P.S.

Name: src/common/http.cpp
Purpose: HTTP protocol
Author: Guilhem Lavaux
Modified by: Simo Virokannas (authentication, Dec 2005)
Created: August 1997
RCS-ID: $Id: http.cpp 44660 2007-03-07 23:07:17Z VZ $
Copyright: (c) 1997, 1998 Guilhem Lavaux
Licence: wxWindows licence

23 сент. 2009 г.

BTW: wxWidgets meet Symbian

На форум.нокиа некоторое время назад разговор о wxWidgets оказывается его портировали на Symbian, пытался тогда еще собрать, но потерпел эпичный фейл, в чем дело было уже не помню да и забросили давно, однако вот тут пишут, что его еще пинают
"Another good news is that people are working on using wx under several new platforms: this month we had posts about wxSymbian again (wxBase part only, no GUI yet)"
, а то сигналы... слоты...

Code::Blocks & wxWidgets

Возникла нужда пописать на венду, тащить монстра Eclipse с C++ плагинами было лениво скачал сабж. Поставил настроил, затем сабжевый же тулкит, виндовый MinGW входил в комплект Code::Blocks, стал собирать. Указал в PATH путь к бинарникам компилятора открыл консоль, начал собирать wxWidgets и хрен... "mingw32-make не является командой или пакетным файлом...". Ладно, плавали: "SET PATH=c:\Program Files\CodeBlocks\MinGW\bin" в консольной сессии, собрал 4 версии, ура.
Приложение не собирается из-за Symbian-овского GCC, оно пыталось компилить с его помощью, понятно что в эти тапочки мы не влезем но в настройках Code::Blocks есть переменные среды которые аплятся как я понял из описания при его старте. Прописал путь к MinG, рестартнул иду, те же яйца. Почесал репу, открыл консоль перешел в папку с Code::Blocks настучал: "SET PATH=c:\Program Files\CodeBlocks\MinGW\bin" и из этой же консольной сессии стартанул иду и о чудо... оно собирает мой проект! Написал батник, жизнь удалась сталбыть.