// frmContactEditorSound.cpp - frmContactEditorSound form.
//
// (c) 2012-2015 Xestia Software Development.
//
// This file is part of Xestia Address Book.
//
// Xestia Address Book is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation, version 3 of the license.
//
// Xestia Address Book is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with Xestia Address Book. If not, see
#include "frmContactEditorSound.h"
#include
#include
#include
#include "../common/textprocessing.h"
#include "../common/base64.h"
#include "../common/mime.h"
frmContactEditorSound::frmContactEditorSound( wxWindow* parent )
:
frmContactEditorSoundADT( parent )
{
EditorMode = FALSE;
sliPriority->Disable();
cmbType->Append(wxT(""));
cmbType->Append(_("Home"));
cmbType->Append(_("Work"));
}
void frmContactEditorSound::EnablePriority( wxCommandEvent& event )
{
if (chkUsePref->IsChecked()){
sliPriority->Enable();
} else {
sliPriority->Disable();
}
}
void frmContactEditorSound::ProcessData( wxCommandEvent& event )
{
long ListCtrlIndex;
if (EditorMode == FALSE){
// Load the file into memory.
wxFile AudioFile;
wxString wxSAudioString;
wxString wxSAudioFilename;
wxString wxSAudioMIMEType;
sf::SoundBuffer AudioBuffer;
wxFileOffset len;
std::string b64enc;
wxSAudioFilename = fipSound->GetPath();
/*
#if wxABI_VERSION < 20900
if (AudioFile.Open(wxSAudioFilename.c_str(), wxT("rb"))){
#else
if (AudioFile.Open(wxSAudioFilename, wxT("rb"))){
#endif
*/
if (AudioFile.Open(wxSAudioFilename, wxFile::read)){
ssize_t flen;
len = AudioFile.Length();
unsigned char* AudioFileData = new unsigned char[len];
flen = AudioFile.Read(AudioFileData, (size_t)len);
// Get MIME Type.
/*const char *MIMEType;
magic_t MagicCookie = magic_open(MAGIC_MIME);
magic_setflags(MagicCookie, MAGIC_MIME_TYPE);
if (!MagicCookie){
wxMessageBox(_("An error occured with the support library for getting the picture type."), _("Error opening picture file"), wxICON_ERROR);
return;
}
if (magic_load(MagicCookie, NULL) != 0) {
wxMessageBox(_("An error occured whilst determining the picture type."), _("Error opening picture file"), wxICON_ERROR);
return;
}
MIMEType = magic_file(MagicCookie, wxSAudioFilename.mb_str());
wxSAudioMIMEType = wxString::FromUTF8(MIMEType);
magic_close(MagicCookie);*/
wxSAudioMIMEType = GetMIME(wxSAudioFilename);
// Check to make sure it is an audio file.
if (!AudioBuffer.loadFromMemory(AudioFileData, (size_t)len)){
// Can't load file. We must flee...
// Also show an error message too.
wxMessageBox(_("This file is in an audio format that is unsupported or is not an audio file."), _("Error opening audio file"), wxICON_ERROR);
return;
}
// Covert the file into base64.
b64enc = base64_encode(AudioFileData, (int)len);
delete[] AudioFileData;
} else {
wxMessageBox(_("There was an error opening the audio file!"), _("Error opening audio file"), wxICON_ERROR);
return;
}
SoundListPtr->insert(std::make_pair(SoundListIndex, b64enc));
wxString strValue;
strValue.Clear();
strValue = cmbType->GetString(cmbType->GetSelection());
// Setup Sound Type.
if (strValue == _("Home")) {
SoundListTypePtr->insert(std::make_pair(SoundListIndex, wxT("home")));
} else if (strValue == _("Work")) {
SoundListTypePtr->insert(std::make_pair(SoundListIndex, wxT("work")));
} else {
SoundListTypePtr->insert(std::make_pair(SoundListIndex, wxT("")));
}
// Setup Organisation Priority.
if (chkUsePref->IsChecked()){
SoundListPrefPtr->insert(std::make_pair(SoundListIndex, sliPriority->GetValue()));
} else {
SoundListPrefPtr->insert(std::make_pair(SoundListIndex, 0));
}
// Setup MIME Type.
SoundListAudioTypePtr->insert(std::make_pair(SoundListIndex, wxSAudioMIMEType));
// Setup Encoding Type.
SoundListAudioEncTypePtr->insert(std::make_pair(SoundListIndex, wxT("base64")));
// Add to form.
wxListItem coldata;
coldata.SetId(SoundListIndex);
coldata.SetData(SoundListIndex);
coldata.SetText(_("Sound"));
ListCtrlIndex = SoundListCtrlPtr->InsertItem(coldata);
if (strValue == _("Home")) {
SoundListCtrlPtr->SetItem(ListCtrlIndex, 1, _("Home"));
} else if (strValue == _("Work")) {
SoundListCtrlPtr->SetItem(ListCtrlIndex, 1, _("Work"));
} else {
}
if (chkUsePref->IsChecked()){
SoundListCtrlPtr->SetItem(ListCtrlIndex, 2, wxString::Format(wxT("%i"), sliPriority->GetValue()));
}
this->Close();
} else if (EditorMode == TRUE) {
// Do not touch the audio file but update the settings
// associated with the audio file.
long longSelected = -1;
wxString strValue;
// Update Category Type.
SoundListTypePtr->erase(SoundListIndex);
strValue = cmbType->GetString(cmbType->GetSelection());
if (strValue == _("Home")) {
SoundListTypePtr->insert(std::make_pair(SoundListIndex, wxT("home")));
} else if (strValue == _("Work")) {
SoundListTypePtr->insert(std::make_pair(SoundListIndex, wxT("work")));
}
// Update Category Priority.
SoundListPrefPtr->erase(SoundListIndex);
if (chkUsePref->IsChecked()){
SoundListPrefPtr->insert(std::make_pair(SoundListIndex, sliPriority->GetValue()));
} else {
SoundListPrefPtr->insert(std::make_pair(SoundListIndex, 0));
}
// Update form.
longSelected = SoundListCtrlPtr->GetNextItem(longSelected,
wxLIST_NEXT_ALL,
wxLIST_STATE_SELECTED);
if (longSelected == -1){
return;
}
SoundListCtrlPtr->SetItem(longSelected, 0, wxT("Sound"));
SoundListCtrlPtr->SetItem(longSelected, 1, strValue);
if (chkUsePref->IsChecked()){
SoundListCtrlPtr->SetItem(longSelected, 2, wxString::Format(wxT("%i"), sliPriority->GetValue()));
} else {
SoundListCtrlPtr->SetItem(longSelected, 2, wxT(""));
}
this->Close();
}
}
void frmContactEditorSound::CloseWindow( wxCommandEvent& event )
{
this->Close();
}
void frmContactEditorSound::SetEditorMode(bool EditMode)
{
// Set if the editor is adding or editing an address.
// FALSE = Add
// TRUE = Edit
if (EditMode == FALSE){
EditorMode = FALSE;
btnAction->SetLabel(_("Add"));
this->SetTitle(_("Add Sound"));
} else if (EditMode == TRUE){
EditorMode = TRUE;
btnAction->SetLabel(_("Modify"));
this->SetTitle(_("Modify Sound"));
fipSound->Disable();
std::map::iterator intiter;
std::map::iterator striter;
wxString strValue;
// Load the data into the form. Get the website.
striter = SoundListTypePtr->find(SoundListIndex);
if (striter->first == SoundListIndex){
strValue = striter->second;
}
if (strValue == wxT("home")){
cmbType->SetSelection(1);
} else if (strValue == wxT("work")){
cmbType->SetSelection(2);
} else {
cmbType->SetSelection(0);
}
//strValue.Clear();
// Get the website priority.
intiter = SoundListPrefPtr->find(SoundListIndex);
if (intiter->first == SoundListIndex && intiter->second > 0){
sliPriority->SetValue(intiter->second);
sliPriority->Enable();
chkUsePref->SetValue(TRUE);
}
}
}
void frmContactEditorSound::SetupPointers(std::map *SoundList,
std::map *SoundListAltID,
std::map *SoundListPID,
std::map *SoundListType,
std::map *SoundListAudioType,
std::map *SoundListAudioEncType,
std::map *SoundListTokens,
std::map *SoundListMediatype,
std::map *SoundListPref,
wxListCtrl *SoundListCtrl,
int SoundIndex )
{
SoundListPtr = SoundList;
SoundListAltIDPtr = SoundListAltID;
SoundListPIDPtr = SoundListPID;
SoundListTypePtr = SoundListType;
SoundListAudioTypePtr = SoundListAudioType;
SoundListAudioEncTypePtr = SoundListAudioEncType;
SoundListTokensPtr = SoundListTokens;
SoundListMediatypePtr = SoundListMediatype;
SoundListPrefPtr = SoundListPref;
SoundListCtrlPtr = SoundListCtrl;
SoundListIndex = SoundIndex;
}