Pisząc kolejny projekt, miałem sobie oto taki kod:
return this->Send(&msgSize, sizeof(MessageSizeType)) + this->Send(&catLength, sizeof(MessageCatLengthType)) + this->Send(category.c_str(), catLength * sizeof(wchar_t)) + this->Send(msg.c_str(), msg.length() * sizeof(wchar_t));
Nie wydaje mi się bardzo skomplikowany. Powinno wystarczyć, gdy zaznaczę, że wysyła on jedną „wiadomość” przez sieć – ot, 5 pierwszych bajtów to nagłówek(MessageSizeType – unsigned, MessageCatLengthType – unsigned char) a reszta dane. Oczywiście MUSZĄ być one dostarczone wszystkie, w takiej kolejności w jakiej są, więc wszystko leci po TCP. Pytanie: co tu jest źle?
Kilka dni temu zacząłem pisać swoją pierwszą, „dużą” wtyczkę do Foobara2000. Posiadam w domu słuchawki bezprzewodowe(Seenheiser RS130, polecam – świetny sprzęt) i czasami nie mam dostępu do klawiatury a chcę zobaczyć co leci(jeśli nie rozpoznałem) lub zmienić piosenkę. Gotowego nie znalazłem, więc postanowiłem napisać stosowne oprogramowanie. I tak oto powstała wtyczka foo_RemoteControl. Ma ona za zadanie udostępniać podstawowe(i nie tylko, ale trzeba je dopisać) funkcje do zarządzania odtwarzaczem poprzez TCP/IP. Jest już ona gotowa do użytku i raczej nie będzie dalej rozwijana(choć może się to zmienić, wystarczy, że ludzie wykażą zainteresowanie projektem i potrzebę nowej funkcjonalności), taka funkcjonalność mi wystarcza. Już niedługo pojawi się pierwszy „klient” dla tej wtyczki pod Androida.
Więcej informacji na stronie projektu.
Mam okazję pisać „większą” wtyczkę do Foobara2000(więcej o niej już wkrótce). Foobar2000 w dużej mierze opiera się na wyjątkach bazujących na std::exception. Ja, chcąc zaraportować błąd, postanowiłem stworzyć sobie własny wyjątek. Beztrosko piszę sobie klasę dziedziczącą z std::exception, dobieram parametry do konstruktora i próbuję zainizjalizować klasę bazową. Wszystko byłoby okej, gdyby nie to, że ja używam std::wstring a wyjątki bazują na std::string. Całe szczęście nie okazało się to dużym problemem, wystarczy skopiować wstring do stringa i „wszystko gra”(pod warunkiem, że nie używamy znaków spoza ASCII).
std::string base = L"abcd"; std::string out(base.begin(), base.end());
.
Chciałem też sformatować sobie wiadomość, coby ładnie wyglądała a ja nie musiał za każdym razem przekazywać całej wiadomości(bo i tak tylko dwa parametry się zmieniały). Normalnie zrobiłbym to w ciele konstruktora za pomocą s(w)printf lub tym podobnych(stringstream?). Niestety, std::exception nie umożliwia zmieniania wiadomości poza konstruktorem. Całe szczęście std::stringi można w prosty sposób łączyć(przeładowany operator +). Tym oto sposobem napisałem takiego potworka:
class CommandParamsException:
public std::exception
{
public:
CommandParamsException(const std::wstring& paramName, const std::wstring& reason)
: exception(
(
std::string("Parameter '") +
std::string(paramName.begin(), paramName.end()) +
"' is " +
std::string(reason.begin(), reason.end()) +
". "
).c_str()
) {}
};
Ostatnimi czasy wpadłem na pomysł, by napisać sobie wtyczkę do Foobara2000(w Foobarze nazywają się komponentami). W ramach tej idei pragnę napisać kilka notek związanych z ich tworzeniem. Dokumentacja do SDK niby jest, ale bardzo minimalistyczna. Do tego nie ma prawie żadnych tutoriali a i na forum ciężko znaleźć informacje. Pierwsze notki będą totalnie dla laików. Tak więc zaczynamy – konfiguracja środowiska VC++ 2010 EE i pierwsza, bardzo prosta, wtyczka.
Czytaj dalej…