//色付文字を出力 DWORD Console::outputString(int foreground,int background,const TCHAR* fmt,...){ DWORD written_chars=0; if(fmt==NULL)return written_chars; int orig_colors=getColors(); if(!isRedirected()){ //色設定を変更する if(foreground!=NONE)setFGColor(foreground); if(background!=NONE)setBGColor(background); } va_list argp; va_start(argp,fmt); write(fmt,argp,&written_chars); va_end(argp); if(!isRedirected()){ //色設定を元に戻す setColors(orig_colors); } return written_chars; }
int IoClose_new( PspIoDrvFileArg * arg ) { PspIoDrvArg * drv = arg->drv; int num = isRedirected( arg ); if( num >= 0 && arg->fs_num == 0 ) { arg->drv = ms_drv; handler_count --; memcpy( &ctf_handler[num], &ctf_handler[num + 1], sizeof( CtfHandler ) * ( handler_count - num ) ); int ret = fatms_drv->funcs->IoClose( arg ); arg->drv = drv; return ret; } if ( arg->arg == t_record ) { log( "write finished!\n" ); int fd = sceIoOpen( CXMB_CONF_FILE, PSP_O_RDWR | PSP_O_CREAT | PSP_O_TRUNC, 0777 ); if ( fd < 0 ) { log( "failed in openning %s\n", CXMB_CONF_FILE ); } else { sceIoWrite( fd, selected_theme_file, strlen( selected_theme_file ) + 1 ); sceIoClose( fd ); } IoClose( arg ); sceKernelSignalSema( sema, 1 ); } arg->drv = drv; int ret = IoClose(arg); return ret; }
int IoIoctl_new( PspIoDrvFileArg * arg, unsigned int cmd, void * indata, int inlen, void * outdata, int outlen ) { PspIoDrvArg * drv = arg->drv; int num = isRedirected( arg ); if( num >= 0 && arg->fs_num == 0 ) { arg->drv = ms_drv; int ret = fatms_drv->funcs->IoIoctl( arg, cmd, indata, inlen, outdata, outlen ); if ( ret < 0 ) { log( "error: %08x when ioctl cmd %08x %s\n", ret, cmd, ctf_header[ctf_handler[num].num].name ); /*arg->drv = drv; ret = IoReopen( arg, num ); if ( ret < 0 ) { char name[128]; strcpy( name, ctf_header[ctf_handler[num].num].name ); uninstall_cxmb(); if( ret != -2 ) lflash_drv->funcs->IoOpen( arg, name, PSP_O_RDONLY, 0644 ); return IoIoctl( arg, cmd, indata, inlen, outdata, outlen ); } num = handler_count - 1; ret = fatms_drv->funcs->IoIoctl( arg, cmd, indata, inlen, outdata, outlen );*/ } arg->drv = drv; return ret; } int ret = IoIoctl( arg, cmd, indata, inlen, outdata, outlen ); return ret; }
int IoRead_new( PspIoDrvFileArg * arg, char * data, int len ) { PspIoDrvArg * drv = arg->drv; int num = isRedirected( arg ); if( num >= 0 && arg->fs_num == 0 ) { arg->drv = ms_drv; int ret = fatms_drv->funcs->IoLseek( arg, 0, PSP_SEEK_CUR ); if ( ret < 0 ) { log( "error: %08x when read %s\n", ret, ctf_header[ctf_handler[num].num].name ); arg->drv = drv; ret = IoReopen( arg, &num ); if ( ret < 0 ) { return ret; } } int sub = ret + len - ctf_header[ctf_handler[num].num].start - ctf_header[ctf_handler[num].num].size; if ( sub <= 0 ) { sub = 0; } ret = fatms_drv->funcs->IoRead( arg, data, len - sub ); ctf_handler[num].offset += ret; arg->drv = drv; return ret; } int ret = IoRead( arg, data, len ); return ret; }
//文字を読み込む bool Console::read(VOID* buffer,DWORD buffer_size,LPDWORD read_chars){ bool result=false; DWORD read=0; if(isRedirected()){ result=::ReadFile(m_handle,buffer,buffer_size,&read,NULL)!=0; if(read_chars)*read_chars=read/sizeof(TCHAR); }else{ //TODO:大きなバッファサイズの文字列の読み込み result=::ReadConsole(m_handle,buffer,buffer_size,&read,NULL)!=0; if(read_chars)*read_chars=read; } return result; }
//文字を書き込む bool Console::write(const VOID* buffer,DWORD buffer_size,LPDWORD written_chars){ bool result=false; DWORD written=0; if(isRedirected()){ tstring buffer_str((const TCHAR*)buffer); str::replaceString(buffer_str,_T("\n"),_T("\r\n")); #ifdef UNICODE if(isAnsiMode()){ std::string ansi=str::utf162sjis(buffer_str); result=::WriteFile(m_handle,ansi.c_str(),ansi.length()*sizeof(char),&written,NULL)!=0; }else #endif result=::WriteFile(m_handle,buffer_str.c_str(),buffer_str.length()*sizeof(TCHAR),&written,NULL)!=0; if(written_chars)*written_chars=written/sizeof(TCHAR); }else{ //バッファサイズが大き過ぎる場合出力されない // result=::WriteConsole(m_handle,buffer,buffer_size,&written,NULL); //分割して出力 #ifdef UNICODE if(!isAnsiMode()){ #endif const TCHAR* ptr=static_cast<const TCHAR*>(buffer); const TCHAR* end=ptr+lstrlen(static_cast<const TCHAR*>(buffer)); for(DWORD write_size=io_buffer_size;ptr<end;ptr+=written){ if(write_size>static_cast<DWORD>(end-ptr))write_size=end-ptr; result=::WriteConsole(m_handle,ptr,write_size,&written,NULL)!=0; } if(written_chars)*written_chars=ptr-(const TCHAR*)buffer; #ifdef UNICODE }else{ std::string ansi=str::utf162sjis(static_cast<const wchar_t*>(buffer)); const char* ptr=ansi.c_str(); const char* end=ptr+lstrlenA(ansi.c_str()); for(DWORD write_size=io_buffer_size;ptr<end;ptr+=written){ if(write_size>static_cast<DWORD>(end-ptr))write_size=end-ptr; result=::WriteConsoleA(m_handle,ptr,write_size,&written,NULL)!=0; } if(written_chars)*written_chars=ptr-ansi.c_str(); } #endif } return result; }
void getComNumAndRedirectedPos(char **args,int *pComNum,int*pRedirectedPos){ int i; int pos=0; short totalLen=0; short comLen=0; *pRedirectedPos=0; for(i=0;i<*pComNum;i++){ pos=isRedirected(args+totalLen,&comLen); if(pos!=0){ *pComNum=i+1; *pRedirectedPos=pos; return; } totalLen+=comLen; } }
SceOff IoLseek_new( PspIoDrvFileArg * arg, SceOff ofs, int whence ) { PspIoDrvArg * drv = arg->drv; int num = isRedirected( arg ); if( num >= 0 && arg->fs_num == 0 ) { arg->drv = ms_drv; int ret = fatms_drv->funcs->IoLseek( arg, 0, PSP_SEEK_CUR ); if ( ret < 0 ) { log( "error: %08x when seek %s\n", ret, ctf_header[ctf_handler[num].num].name ); arg->drv = drv; ret = IoReopen( arg, &num ); if ( ret < 0 ) { return ret; } } switch ( whence ) { case PSP_SEEK_SET: fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start, PSP_SEEK_SET ); break; case PSP_SEEK_END: fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start + ctf_header[ctf_handler[num].num].size, PSP_SEEK_SET ); break; } ret = fatms_drv->funcs->IoLseek( arg, ofs, PSP_SEEK_CUR ); if ( ret < ctf_header[ctf_handler[num].num].start ) { ret = fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start, PSP_SEEK_SET ); } else if ( ret > ( ctf_header[ctf_handler[num].num].start + ctf_header[ctf_handler[num].num].size ) ) { ret = fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start + ctf_header[ctf_handler[num].num].size, PSP_SEEK_SET ); } ctf_handler[num].offset = ret; ret -= ctf_header[ctf_handler[num].num].start; arg->drv = drv; return ret; } int ret = IoLseek( arg, ofs, whence ); return ret; }
int IoReopen( PspIoDrvFileArg * arg, int * num ) { unsigned int sig = 0; int err = 0; CtfHandler tmp; memcpy( &tmp, &ctf_handler[*num], sizeof( CtfHandler ) ); int fd = -1, i = 0; for ( i = 0; fd < 0 && i < 10; i ++ ) { sceKernelDelayThread( 100000 ); fd = sceIoOpen( cxmb_theme_file, PSP_O_RDONLY, 0644 ); } if ( fd >= 0 ) { sceIoLseek( fd, 8, PSP_SEEK_SET ); sceIoRead( fd, &sig, 4 ); sceIoClose( fd ); if ( sig == ctf_sig ) { *num = isRedirected( arg ); if ( *num >= 0 && ctf_handler[*num].num == tmp.num ) { lflash_drv->funcs->IoClose( arg ); lflash_drv->funcs->IoOpen( arg, ctf_header[tmp.num].name, PSP_O_RDONLY, 0644 ); ctf_handler[*num].offset = tmp.offset; arg->drv = ms_drv; int ret = fatms_drv->funcs->IoLseek( arg, ctf_handler[*num].offset, PSP_SEEK_SET ); if ( ret >= 0 ) { return ret; } else { log( "failed in seek the reopen file!\noffset: %08x\n, ret: %08x\n", tmp.offset, ret ); uninstall_cxmb(); return ret; } } else { log( "failed in reopen ctf theme file!\n" ); err = -2; } } else { log( "ctf theme file changed!\nori %08x now: %08x\n", ctf_sig, sig ); err = -3; } } else { log( "ctf theme file removed!\n" ); err = -4; } lflash_drv->funcs->IoClose( arg ); uninstall_cxmb(); lflash_drv->funcs->IoOpen( arg, ctf_header[tmp.num].name, PSP_O_RDONLY, 0644 ); log( "uninstalled!\n" ); return err; }