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);
}
示例#2
0
    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);
    }
示例#3
0
/**
 * 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;
}
示例#4
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;
}