static void aufs_inotify(struct inotify_watch *watch, u32 wd __maybe_unused, u32 mask, u32 cookie __maybe_unused, const char *h_child_name, struct inode *h_child_inode) { struct au_hnotify *hnotify; struct qstr h_child_qstr = { .name = h_child_name }; /* if IN_UNMOUNT happens, there must be another bug */ AuDebugOn(mask & IN_UNMOUNT); if (mask & (IN_IGNORED | IN_UNMOUNT)) { put_inotify_watch(watch); return; } #ifdef AuDbgHnotify au_debug(1); if (1 || !h_child_name || strcmp(h_child_name, AUFS_XINO_FNAME)) { AuDbg("i%lu, wd %d, mask 0x%x %s, cookie 0x%x, hcname %s," " hi%lu\n", watch->inode->i_ino, wd, mask, in_name(mask), cookie, h_child_name ? h_child_name : "", h_child_inode ? h_child_inode->i_ino : 0); WARN_ON(1); } au_debug(0); #endif if (h_child_name) h_child_qstr.len = strlen(h_child_name); hnotify = container_of(watch, struct au_hnotify, hn_watch); au_hnotify(watch->inode, hnotify, mask, &h_child_qstr, h_child_inode); }
void do_notify(inotify_event const * iev) { std::string name; do { std::lock_guard<decltype(mutex_)> lock(mutex_); auto it = files_.find(iev->wd); if (it == files_.end()) return; name = it->second; if (iev->mask & IN_IGNORED) files_.erase(it); } while(false); std::string in_name(iev->name, std::strlen(iev->name)); static_cast<Derived *>(this)->on_event(name); if (iev->mask & IN_ACCESS) static_cast<Derived *>(this)->on_access(name); if (iev->mask & IN_ATTRIB) static_cast<Derived *>(this)->on_attribute(name); if (iev->mask & IN_CLOSE_WRITE) static_cast<Derived *>(this)->on_close_write(name); if (iev->mask & IN_CLOSE_NOWRITE) static_cast<Derived *>(this)->on_close_nowrite(name); if (iev->mask & IN_CLOSE) static_cast<Derived *>(this)->on_close(name); if (iev->mask & IN_MODIFY) static_cast<Derived *>(this)->on_modify(name); if (iev->mask & IN_OPEN) static_cast<Derived *>(this)->on_open(name); if (iev->mask & IN_MOVE_SELF) static_cast<Derived *>(this)->on_move(name); if (iev->mask * IN_DELETE_SELF) static_cast<Derived *>(this)->on_delete(name); if (iev->mask & IN_MOVED_FROM) static_cast<Derived *>(this)->on_moved_from(name, in_name); if (iev->mask & IN_MOVED_TO) static_cast<Derived *>(this)->on_moved_to(name, in_name); if (iev->mask & IN_CREATE) static_cast<Derived *>(this)->on_create_path(name, in_name); if (iev->mask & IN_DELETE) static_cast<Derived *>(this)->on_remove_path(name, in_name); if (iev->mask & IN_IGNORED) static_cast<Derived *>(this)->on_disposed(name); }
/** * CSVファイルからVMDへの変換 * @param const char* 入力ファイルのパス * @param const char* 出力ファイルのパス */ int wxMMDViewerUtil::CSV2VMD( const char* inputFile, const char* outputFile ) { size_t line = 0,size; FIELDS fields; clsVMDFile vmd; clsCSVFile csv; std::string in_name(inputFile); std::string out_name(outputFile); std::string::size_type pos = out_name.find_last_of("."); if ( pos == std::string::npos ) return -1; out_name.replace(pos,4,".vmd"); if ( !csv.Open( in_name.c_str() ) ) return -1; PARSE_LINE_BUFFER& buff = csv.GetBuffer(); if ( buff.size() < 3 ) return -2; buff[line++].Export( fields ); vmd.GetHeader().Import( fields ) ; buff[line++].Export( fields ); if ( fields.size() ) vmd.SetActor( fields[0].c_str() ); else return -2; buff[line++].Export( fields ); fields >> size; if ( buff.size()<=line ) return -2; vmd.SetMotionChunkSize( size ); for ( size_t i=0;i<size;i++ ) { buff[line++].Export( fields ); vmd.GetMotionChunk()[i].Import( fields ); if ( buff.size()<=line ) return -2; } buff[line++].Export( fields ); fields >> size; vmd.SetMorpChunkSize( size ); for ( size_t i=0;i<size;i++ ) { buff[line++].Export( fields ); vmd.GetMorpChunk()[i].Import( fields ); if ( buff.size()<=line ) return -2; } buff[line++].Export( fields ); fields >> size; vmd.SetCameraChunkSize( size ); for ( size_t i=0;i<size;i++ ) { buff[line++].Export( fields ); vmd.GetCameraChunk()[i].Import( fields ); if ( buff.size()<=line ) return -2; } buff[line++].Export( fields ); fields >> size; vmd.SetLightChunkSize( size ); for ( size_t i=0;i<size;i++ ) { buff[line++].Export( fields ); vmd.GetLightChunk()[i].Import( fields ); if ( buff.size()<=line ) return -2; } if ( !vmd.Commit( out_name.c_str() ) ) return -3; return 0; }
/** * VMDファイルからCSVへの変換 * @param const char* 入力ファイルのパス * @param const char* 出力ファイルのパス */ int wxMMDViewerUtil::VMD2CSV( const char* inputFile, const char* outputFile ) { FIELDS fields; clsVMDFile vmd; clsCSVFile csv; std::string in_name(inputFile); std::string out_name(outputFile); std::string::size_type pos = out_name.find_last_of("."); if ( pos == std::string::npos ) return -1; out_name.replace(pos,4,".csv"); if ( !vmd.Open( in_name.c_str() ) ) return -1; if ( !vmd.GetActor() ) { return -1; } vmd.GetHeader().Export( fields ); csv.AddFields( fields ); NEW_FIELD(fields); fields << vmd.GetActor(); csv.AddFields( fields ); { VMD_MOTION_CHUNK &buff = vmd.GetMotionChunk(); NEW_FIELD(fields); fields << vmd.GetMotionChunkSize(); csv.AddFields( fields ); for (size_t i=0;i<vmd.GetMotionChunkSize();i++) { VMD_MOTION_RECORD &rec = buff[i]; rec.Export( fields ); csv.AddFields( fields ); } } { VMD_MORP_CHUNK &buff = vmd.GetMorpChunk(); NEW_FIELD(fields); fields << vmd.GetMorpChunkSize(); csv.AddFields( fields ); for (size_t i=0;i<vmd.GetMorpChunkSize();i++) { VMD_MORP_RECORD &rec = buff[i]; rec.Export( fields ); csv.AddFields( fields ); } } { VMD_CAMERA_CHUNK &buff = vmd.GetCameraChunk(); NEW_FIELD(fields); fields << vmd.GetCameraChunkSize(); csv.AddFields( fields ); for (size_t i=0;i<vmd.GetCameraChunkSize();i++) { VMD_CAMERA_RECORD &rec = buff[i]; rec.Export( fields ); csv.AddFields( fields ); } } { VMD_LIGHT_CHUNK &buff = vmd.GetLightChunk(); NEW_FIELD(fields); fields << vmd.GetLightChunkSize(); csv.AddFields( fields ); for (size_t i=0;i<vmd.GetLightChunkSize();i++) { VMD_LIGHT_RECORD &rec = buff[i]; rec.Export( fields ); csv.AddFields( fields ); } } if ( !csv.Commit( out_name.c_str() ) ) return -3; return 0; }