IHM::IHM() //: _LinesL_b(sf::PrimitiveType::Lines, 256), _LinesR_b(sf::PrimitiveType::Lines, 256),_LinesL_h(sf::PrimitiveType::Lines, 256),_LinesR_h(sf::PrimitiveType::Lines, 256) { initComponent(); manager.loadMusicFromFolder("./playMe"); manager.getAllFiles(_files); _listfilesHolder->Remove( _listFiles ); _listFiles = sfg::Box::Create( sfg::Box::Orientation::VERTICAL,5.f ); for(std::vector<File>::iterator it = _files.begin() ; it != _files.end(); ++it) packFile(*it); _listfilesHolder->AddWithViewport( _listFiles ); }
void IHM::OnLoadBtnClick() { manager.loadMusicFromFolder(_entryLoader->GetText(), _iterateSubFolders->IsActive());//load manager.getAllFiles(_files); _listfilesHolder->Remove( _listFiles ); _listFiles = sfg::Box::Create( sfg::Box::Orientation::VERTICAL,5.f); auto box = sfg::Box::Create( sfg::Box::Orientation::HORIZONTAL, 300.f); _listFiles->Pack( box, false); for(std::vector<File>::iterator it = _files.begin() ; it != _files.end(); ++it) packFile(*it); _listfilesHolder->AddWithViewport( _listFiles ); }
void sendFileToReduce(char* fileName, char* content, struct in_addr ipJob, t_connection connection, int puertoNodo) { t_header header; void* message; int contentLength = strlen(content) + 1; int messageLength = sizeof(t_header) + contentLength + sizeof(int) * 2 + strlen(fileName) + 1 + sizeof(struct in_addr); header.tipoMensaje = EnvioArchivoAReducir; header.tamanioMensaje = messageLength - sizeof(t_header); message = malloc(messageLength); packHeader(header, message); packFile(fileName, content, contentLength, message); int offset = messageLength - sizeof(struct in_addr); memcpy(message + offset, (struct in_addr*) &ipJob, sizeof(struct in_addr)); int sock; if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } struct sockaddr_in addr; addr = connection.connectionAddr; addr.sin_port = puertoNodo; if(connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1) { perror("connect"); exit(1); } sendAll(sock, message, messageLength); return; }
void sendFileContent(char* fileName, char* content, struct in_addr ip, int puerto) { t_header header; void* message; int contentLength = strlen(content) + 1; int messageLength = sizeof(t_header) + contentLength + sizeof(int) * 2 + strlen(fileName) + 1; header.tipoMensaje = EnvioArchivo; header.tamanioMensaje = messageLength - sizeof(t_header); message = malloc(messageLength); packHeader(header, message); packFile(fileName, content, contentLength, message); int sock; if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } struct sockaddr_in addr; addr.sin_addr = ip; addr.sin_family = AF_INET; addr.sin_port = puerto; memset(&(addr.sin_zero), '\0', 8); //Conecto al socket al FileSystem para notificar conexion del nodo if(connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1) { perror("connect"); exit(1); } sendAll(sock, message, messageLength); return; }
shared_ptr<CMabiFileSystem> CMabiFileSystem::CreateByPackFile(const wstring& path) { shared_ptr<CMabiFileSystem> spFileSystem(new CMabiFileSystem); shared_ptr<CMabiFile> spRootFile = static_pointer_cast<CMabiFile>(spFileSystem->GetRoot()); shared_ptr<CFileWithPool> spFilePool(new CFileWithPool(path)); ifstream packFile(path, ios::binary | ios::in); _s_pack_header header; packFile.read(reinterpret_cast<char *>(&header), sizeof(header)); if (memcmp(header.signature, "PACK", 4) != 0) { throw logic_error("this file is not a mabinogi pack file."); } _s_pack_list_header list_header; packFile.read(reinterpret_cast<char *>(&list_header), sizeof(list_header)); // 加载到内存 char * p_list_buffer = new char[list_header.list_header_size]; packFile.read(p_list_buffer, list_header.list_header_size); char * p_tmp = p_list_buffer; for (unsigned long i = 0; i < list_header.sum; i++) { // 准备内容 shared_ptr<CMabiFile> file = spFileSystem->CreateFile(); _s_pack_item_name * p_item_name = (_s_pack_item_name *) p_tmp; int size; if (p_item_name->len_or_type < 4) { // 第一字节小于4 size = (0x10 * (p_item_name->len_or_type + 1)); } else if (p_item_name->len_or_type == 4) { // 可恶的恶魔猫,这里怎么要搞特殊的 size = 0x60 ; } else { // 基本参考mabiunpack代码 size = p_item_name->len + 5; } // 下面其实存在溢出可能,但是目前应该没有这么长的目录 wstring fullPath; if ( p_item_name->len_or_type <= 0x04 ) { fullPath = _ansi2unicode(&p_item_name->sz_ansi_name[0]); } else // 0x05 { fullPath = _ansi2unicode(&p_item_name->sz_ansi_name2[0]); } // 指针跨越名称定义区 p_tmp += size; _s_pack_item_info * p_info = (_s_pack_item_info *) p_tmp; // 偏移是从文件头开始的 shared_ptr<CPackFileContentProvider> spContentProvider(new CPackFileContentProvider); spContentProvider->m_offset = p_info->offset + sizeof(_s_pack_header) + sizeof(_s_pack_list_header) + list_header.list_header_size; spContentProvider->m_seed = p_info->seed; spContentProvider->m_compress_size = p_info->compress_size; spContentProvider->m_decompress_size = p_info->decompress_size; spContentProvider->m_is_compressed = p_info->is_compressed; memcpy(spContentProvider->m_ft, p_info->ft, sizeof(FILETIME) * 5); spContentProvider->m_packFile = spFilePool; // 指针定位到下一项 p_tmp += sizeof(_s_pack_item_info); // 需要把文件放入合适的容器中 // 替换所有的\变成/ replace(fullPath.begin(), fullPath.end(), '\\', '/'); shared_ptr<CMabiFile> container = spRootFile; wstring::size_type pos = 0; wstring::size_type findPos = 0; while ((findPos = fullPath.find('/', pos)) != wstring::npos) { wstring segment = fullPath.substr(pos, findPos - pos); // 处理下连续 / 的情况 container = static_pointer_cast<CMabiFile>(container->CreateFolder(segment)); pos = fullPath.find_first_not_of('/', findPos); } wstring fileName = fullPath.substr(pos); file->SetName(fileName); file->SetContentProvider(spContentProvider); container->AddFile(file); } return spFileSystem; }
bool KviPackageWriter::packInternal(const QString & szFileName, kvi_u32_t) { KviFile f(szFileName); if(!f.open(QFile::WriteOnly | QFile::Truncate)) { setLastError(__tr2qs("Can't open file for writing")); return false; } // write the PackageHeader // Magic char magic[4]; magic[0] = 'K'; magic[1] = 'V'; magic[2] = 'P'; magic[3] = 'F'; if(f.write(magic, 4) != 4) return writeError(); // Version kvi_u32_t uVersion = 0x1; if(!f.save(uVersion)) return writeError(); // Flags kvi_u32_t uFlags = 0x0; if(!f.save(uFlags)) return writeError(); // write PackageInfo // InfoFieldCount kvi_u32_t uCount = stringInfoFields()->count() + binaryInfoFields()->count(); if(!f.save(uCount)) return writeError(); m_p->iCurrentProgress = 5; if(!updateProgress(m_p->iCurrentProgress, __tr2qs("Writing informational fields"))) return false; // aborted // InfoFields (string) KviPointerHashTableIterator<QString, QString> it(*stringInfoFields()); while(QString * s = it.current()) { if(!f.save(it.currentKey())) return writeError(); kvi_u32_t uType = KVI_PACKAGE_INFOFIELD_TYPE_STRING; if(!f.save(uType)) return writeError(); if(!f.save(*s)) return writeError(); ++it; } // InfoFields (binary) KviPointerHashTableIterator<QString, QByteArray> it2(*binaryInfoFields()); while(QByteArray * b = it2.current()) { if(!f.save(it2.currentKey())) return writeError(); kvi_u32_t uType = KVI_PACKAGE_INFOFIELD_TYPE_BINARYBUFFER; if(!f.save(uType)) return writeError(); if(!f.save(*b)) return writeError(); ++it2; } m_p->iCurrentProgress = 10; if(!updateProgress(m_p->iCurrentProgress, __tr2qs("Writing package data"))) return false; // aborted // write PackageData int iIdx = 0; for(KviPackageWriterDataField * pDataField = m_p->pDataFields->first(); pDataField; pDataField = m_p->pDataFields->next()) { kvi_u32_t uKviPackageWriterDataFieldType = pDataField->m_uType; if(!f.save(uKviPackageWriterDataFieldType)) return writeError(); kvi_file_offset_t savedLenOffset = f.pos(); // here we will store the length of the field once it's written if(!f.save(uKviPackageWriterDataFieldType)) return writeError(); m_p->iCurrentProgress = 10 + ((90 * iIdx) / m_p->pDataFields->count()); switch(pDataField->m_uType) { case KVI_PACKAGE_DATAFIELD_TYPE_FILE: if(!packFile(&f, pDataField)) return false; break; default: setLastError(__tr2qs("Internal error")); return false; break; } kvi_file_offset_t savedEndOffset = f.pos(); f.seek(savedLenOffset); if(!f.save(pDataField->m_uWrittenFieldLength)) return writeError(); f.seek(savedEndOffset); iIdx++; } return true; }