Develop and Download Open Source Software

Browse CVS Repository

Diff of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.18 by aga, Tue Nov 30 05:46:32 2004 UTC revision 1.19 by youi, Tue Nov 30 06:40:11 2004 UTC
# Line 2  Line 2 
2   *   *
3   * $Revision$   * $Revision$
4   * $Log$   * $Log$
5     * Revision 1.19  2004/11/30 06:40:11  youi
6     * 関数を追加(gidExists, uidExists)
7     * getGroupCountを定義.
8     * getGroupsByUidを定義.
9     * isGroupAdminを修正.
10     * dumpGroupAdminsを定義.
11     * deleteMemberを定義.
12     * insertMemberを定義.
13     * getMembersを定義.
14     * isModeratorを定義.
15     *
16   * Revision 1.18  2004/11/30 05:46:32  aga   * Revision 1.18  2004/11/30 05:46:32  aga
17   * ・sessionからremoteHostを削除.   * ・sessionからremoteHostを削除.
18   *   *
# Line 112  string addSlashes( const char *str ) Line 123  string addSlashes( const char *str )
123    
124  /**  /**
125   *   *
126     * gidの存在をチェック.
127     * DBのアクセス失敗などもfalseとなる.
128     *
129     * @param gid チェックしたいGID
130     * @return true 存在する
131     * @return false 存在しない
132     *
133     */
134    static bool gidExists( groupid_t gid )
135    {
136        string sql;
137        MYSQL_RES* result;
138        MYSQL_ROW row;
139        
140        sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups ";
141        sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
142        if( mysql_query( mysql, sql.c_str( ) ) ){
143            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
144            return false;
145        }
146        result = mysql_store_result( mysql ) ;
147        if( !mysql_fetch_row(result) ){
148            mysql_free_result( result );
149            return false;
150        }
151        mysql_free_result( result );
152        return true;
153    }
154    
155        
156    /**
157     *
158     * uidの存在をチェック.
159     * DBのアクセス失敗などもfalseとなる.
160     *
161     * @param uid チェックしたいUID
162     * @return true 存在する
163     * @return false 存在しない
164     *
165     */
166    static bool uidExists( userid_t uid )
167    {
168        string sql;
169        MYSQL_RES* result;
170        MYSQL_ROW row;
171        
172        sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
173        sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
174        if( mysql_query( mysql, sql.c_str( ) ) ){
175            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
176            return false;
177        }
178        result = mysql_store_result( mysql ) ;
179        if( !mysql_fetch_row(result) ){
180            mysql_free_result( result );
181            return false;
182        }
183        mysql_free_result( result );
184        return true;
185    }
186    
187        
188    /**
189     *
190   * criteria を SQLに変換する   * criteria を SQLに変換する
191   *   *
192   *   *
# Line 626  result_t dumpUids( sessionid_t sid, crit Line 701  result_t dumpUids( sessionid_t sid, crit
701      MYSQL_ROW row;      MYSQL_ROW row;
702      userid_t* dst = 0;      userid_t* dst = 0;
703            
704      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";      sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";
705      sql += criteria2str( cri );      sql += criteria2str( cri );
706      if( mysql_query( mysql, sql.c_str( ) ) ){      if( mysql_query( mysql, sql.c_str( ) ) ){
707          fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );          fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
708          return RES_DB_QUERY_ERROR;          return RES_DB_QUERY_ERROR;
709      }      }
710      result = mysql_store_result( mysql ) ;      result = mysql_store_result( mysql ) ;
711      if( row = mysql_fetch_row(result) ){      if( result == NULL ){
         *uidsLen = atoi( row[ 0 ] );  
         dst = new userid_t[ *uidsLen ];  
     }else{  
         mysql_free_result( result );  
         return RES_ERROR;  
     }  
     mysql_free_result( result );  
       
     sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";  
     sql += criteria2str( cri );  
     if( mysql_query( mysql, sql.c_str( ) ) ){  
712          fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );          fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
713          return RES_DB_QUERY_ERROR;          return RES_DB_QUERY_ERROR;
714      }      }
715            *uidsLen = mysql_num_rows( result );
716      result = mysql_use_result( mysql ) ;      dst = new userid_t[ *uidsLen ];
717      for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < *uidsLen ; i++ ){      for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < *uidsLen ; i++ ){
718          dst[ i ] = atoi( row[ 0 ] );          dst[ i ] = atoi( row[ 0 ] );
719      }      }
# Line 661  result_t dumpUids( sessionid_t sid, crit Line 725  result_t dumpUids( sessionid_t sid, crit
725    
726  /**  /**
727   *   *
728   * グループ数   * グループ数を返す.
729     * 不正なセッションIDなら0を返す.
730   *   *
731   * @param   * @param sid セッションID
732   * @return   * @return グループ数
733   *   *
734   */   */
735  int getGroupCount( sessionid_t sid )  int getGroupCount( sessionid_t sid )
736  {  {
737      return 0;      if( mysql == NULL ) return 0;
738        if( !isValidSessionID( sid ) ) return 0;
739        
740        string sql;
741        MYSQL_RES* result;
742        MYSQL_ROW row;
743        int groupLen = 0;
744        
745        //グループ数を求める
746        sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups";
747        if( mysql_query( mysql, sql.c_str( ) ) ){
748            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
749            return RES_DB_QUERY_ERROR;
750        }
751        result = mysql_store_result( mysql ) ;
752        if( row = mysql_fetch_row(result) ){
753            groupLen = atoi( row[ 0 ] );
754        }
755        mysql_free_result( result );
756        return groupLen;
757  }  }
758    
759  /**  /**
# Line 682  int getGroupCount( sessionid_t sid ) Line 766  int getGroupCount( sessionid_t sid )
766   */   */
767  result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )  result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
768  {  {
769      return RES_ERROR;      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
770        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
771        if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック
772        
773        string sql;
774        MYSQL_RES* result;
775        MYSQL_ROW row;
776        groupid_t* dst = 0;
777        int len = 0;
778        
779        //所属するグループの最大個数を求める
780        sql = "SELECT count(*) FROM " + dbprefix + "_vpaccount_groups_users_link";
781        sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
782        sql += criteria2str( cri );
783        if( mysql_query( mysql, sql.c_str( ) ) ){
784            fprintf( stderr, "%s\n", sql.c_str( ) );
785            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
786            return RES_DB_QUERY_ERROR;
787        }
788        result = mysql_store_result( mysql ) ;
789        if( row = mysql_fetch_row(result) ){
790            len = atoi( row[ 0 ] );
791        }
792        mysql_free_result( result );
793        
794        sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link";
795        sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
796        sql += criteria2str( cri );
797        if( mysql_query( mysql, sql.c_str( ) ) ){
798            fprintf( stderr, "%s\n", sql.c_str( ) );
799            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
800            return RES_DB_QUERY_ERROR;
801        }
802        *gidsLen = 0;
803        dst = new groupid_t[ len ];
804        result = mysql_store_result( mysql ) ;
805        for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < len ; i++ ){
806            dst[ i ] = atoi( row[ 0 ] );
807            ( *gidsLen )++;
808        }
809        mysql_free_result( result );
810        *gids = dst;
811        
812        return RES_OK;
813  }  }
814    
815  /**  /**
# Line 695  result_t getGroupsByUid( sessionid_t sid Line 822  result_t getGroupsByUid( sessionid_t sid
822   */   */
823  bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )  bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
824  {  {
825      return RES_ERROR;      if( mysql == NULL ) return false;
826        if( !isValidSessionID( sid ) ) return false;
827        if( !uidExists( uid ) ) return false;
828        if( !gidExists( gid ) ) return false;
829        
830        string sql;
831        MYSQL_RES* result;
832        MYSQL_ROW row;
833        groupid_t* dst = 0;
834        result_t res;
835        
836        sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups_users_link ";
837        sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
838        sql += " AND uid=" + string( unsignedIntToString( uid ) );
839        sql += " AND is_admin=1";
840        if( mysql_query( mysql, sql.c_str( ) ) ){
841            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
842            return false;
843        }
844        result = mysql_store_result( mysql );
845        if( !mysql_fetch_row(result) ){
846            mysql_free_result( result );
847            return false;
848        }
849        
850        mysql_free_result( result );
851        return true;;
852  }  }
853    
854  /**  /**
# Line 716  result_t dumpGids( sessionid_t sid, crit Line 869  result_t dumpGids( sessionid_t sid, crit
869      MYSQL_ROW row;      MYSQL_ROW row;
870      groupid_t* dst = 0;      groupid_t* dst = 0;
871            
872        sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";
873        sql += criteria2str( cri );
874        if( mysql_query( mysql, sql.c_str( ) ) ){
875            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
876            return RES_DB_QUERY_ERROR;
877        }
878        result = mysql_store_result( mysql ) ;
879        if( result == NULL ){
880            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
881            return RES_DB_QUERY_ERROR;
882        }
883        *gidsLen = mysql_num_rows( result );
884        dst = new groupid_t[ *gidsLen ];
885        for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < *gidsLen ; i++ ){
886            dst[ i ] = atoi( row[ 0 ] );
887        }
888        mysql_free_result( result );
889        *gids = dst;
890        
891        return RES_OK;
892    /*
893        if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
894        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
895        
896        string sql;
897        MYSQL_RES* result;
898        MYSQL_ROW row;
899        groupid_t* dst = 0;
900        
901      //グループ数を求める      //グループ数を求める
902      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups ";      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups ";
903      sql += criteria2str( cri );      sql += criteria2str( cri );
# Line 733  result_t dumpGids( sessionid_t sid, crit Line 915  result_t dumpGids( sessionid_t sid, crit
915      }      }
916      mysql_free_result( result );      mysql_free_result( result );
917            
918      sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";      sql = "SELECT gid, gname, gdesc FROM " + dbprefix + "_vpaccount_groups ";
919      sql += criteria2str( cri );      sql += criteria2str( cri );
920      if( mysql_query( mysql, sql.c_str( ) ) ){      if( mysql_query( mysql, sql.c_str( ) ) ){
921          fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );          fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
# Line 748  result_t dumpGids( sessionid_t sid, crit Line 930  result_t dumpGids( sessionid_t sid, crit
930      *gids = dst;      *gids = dst;
931            
932      return RES_OK;      return RES_OK;
933    */
934  }  }
935    
936  /**  /**
937   *   *
938   * グループ管理者ID取得   * グループ管理者IDを取得する
939   *   *
940   * @param   * @param sid セッションID
941   * @return   * @param gid 問い合わせるグループをIDで指定する
942     * @param cri 結果の範囲指定,ソート条件指定
943     * @param uids 管理者のUIDの配列を受け取るポインタ
944     * @param uidsLen uids配列の要素数
945     * @return RES_OK | RES_DB_NOT_INITIALIZED | RES_NO_SUCH_SESSION | RES_DB_QUERY_ERROR | RES_ERROR
946   *   *
947   */   */
948  result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )  result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
949  {  {
950      return RES_ERROR;      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
951        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
952        
953        string sql;
954        MYSQL_RES* result;
955        MYSQL_ROW row;
956        userid_t* dst = 0;
957        
958        sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link ";
959        sql += " WHERE is_admin=1";
960        if( mysql_query( mysql, sql.c_str( ) ) ){
961            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
962            return RES_DB_QUERY_ERROR;
963        }
964        
965        result = mysql_store_result( mysql );
966        if( result == NULL ){
967            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
968            return RES_DB_QUERY_ERROR;
969        }
970        
971        *uidsLen = mysql_num_rows( result );
972        dst = new userid_t[ *uidsLen ];
973        for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < *uidsLen ; i++ ){
974            dst[ i ] = atoi( row[ 0 ] );
975        }
976        mysql_free_result( result );
977        *uids = dst;
978        
979        return RES_OK;
980  }  }
981    
982  /**  /**
# Line 773  result_t dumpGroupAdmins( sessionid_t si Line 989  result_t dumpGroupAdmins( sessionid_t si
989   */   */
990  result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )  result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
991  {  {
992      return RES_ERROR;      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
993        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
994        if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック
995        if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック
996        
997        string sql;
998        
999        sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link ";
1000        sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1001        sql += " AND uid=" + string( unsignedIntToString( uid ) );
1002        if( mysql_query( mysql, sql.c_str( ) ) ){
1003            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1004            return RES_DB_QUERY_ERROR;
1005        }
1006        return RES_OK;
1007  }  }
1008    
1009  /**  /**
1010   *   *
1011   * グループ所属ユーザ追加   * グループ所属ユーザ追加
1012   *   *
1013   * @param   * @param sid セッションID
1014   * @return   * @param gid 所属先グループのID
1015     * @param uid 所属させるユーザのID
1016     * @param admin 管理者権限を与えるならtrue
1017     * @return RES_OK | RES_DB_NOT_INITIALIZED | RES_NO_SUCH_SESSION | RES_DB_QUERY_ERROR | RES_ERROR
1018   *   *
1019   */   */
1020  result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid )  result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
1021  {  {
1022      return RES_ERROR;      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1023        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1024        if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック
1025        if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック
1026        
1027        string sql;
1028        MYSQL_RES* result;
1029        MYSQL_ROW row;
1030        groupid_t* dst = 0;
1031        result_t res;
1032        
1033        //メンバーを追加
1034        sql = "INSERT INTO " + dbprefix + "_vpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";
1035        sql += string( unsignedIntToString( gid ) ) + ", ";
1036        sql += string( unsignedIntToString( uid ) ) + ", ";
1037        sql += string( admin ? "1" : "0" ) + ") ";
1038        if( mysql_query( mysql, sql.c_str( ) ) ){
1039            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1040            return RES_DB_QUERY_ERROR;
1041        }
1042        return RES_OK;
1043  }  }
1044    
1045  /**  /**
# Line 799  result_t insertMember( sessionid_t sid, Line 1052  result_t insertMember( sessionid_t sid,
1052   */   */
1053  result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )  result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1054  {  {
1055      return RES_ERROR;      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1056        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1057        if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック
1058        
1059        string sql;
1060        MYSQL_RES* result;
1061        MYSQL_ROW row;
1062        userid_t* dst = 0;
1063        int len = 0;
1064        
1065        //メンバー数を求めてメモリ確保
1066        sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link ";
1067        sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1068        if( mysql_query( mysql, sql.c_str( ) ) ){
1069            fprintf( stderr, "%s\n", sql.c_str( ) );
1070            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1071            return RES_DB_QUERY_ERROR;
1072        }
1073        result = mysql_store_result( mysql ) ;
1074        if( row = mysql_fetch_row(result) ){
1075            len = atoi( row[ 0 ] );
1076            dst = new userid_t[ len ];
1077        }else{
1078            mysql_free_result( result );
1079            return RES_ERROR;
1080        }
1081        mysql_free_result( result );
1082        
1083        sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link ";
1084        sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1085        sql += " " + string( criteria2str( cri ) );
1086        if( mysql_query( mysql, sql.c_str( ) ) ){
1087            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1088            delete[] dst;
1089            *uidsLen = 0;
1090            return RES_DB_QUERY_ERROR;
1091        }
1092        *uidsLen = 0;
1093        result = mysql_use_result( mysql ) ;
1094        for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < len ; i++ ){
1095            dst[ i ] = atoi( row[ 0 ] );
1096            ( *uidsLen )++;
1097        }
1098        mysql_free_result( result );
1099        *uids = dst;
1100        return RES_OK;
1101  }  }
1102    
1103  /**  /**
# Line 939  result_t getGroups( sessionid_t sid, gro Line 1237  result_t getGroups( sessionid_t sid, gro
1237    
1238  /**  /**
1239   *   *
1240   * モデレータ権限問合せ   * モデレータ権限の有無を返す
1241   *   *
1242   * @param   * @param sid セッションID
1243   * @return   * @param uid 問い合わせたいユーザのUID
1244     * @return true 権限あり
1245     * @return false 権限なし
1246   *   *
1247   */   */
1248  bool isModerator( sessionid_t sid, userid_t uid )  bool isModerator( sessionid_t sid, userid_t uid )
1249  {  {
1250      return RES_ERROR;      if( mysql == NULL ) return false;
1251        if( !isValidSessionID( sid ) ) return false;
1252        //if( !uidExists( uid ) ) return false;
1253        
1254        string sql;
1255        MYSQL_RES* result;
1256        MYSQL_ROW row;
1257        groupid_t* dst = 0;
1258        result_t res;
1259        
1260        sql = "SELECT value FROM " + dbprefix + "_vpaccount_config";
1261        sql += " WHERE name='moderator_gid'";
1262        if( mysql_query( mysql, sql.c_str( ) ) ){
1263            fprintf( stderr, "%s\n", sql.c_str( ) );
1264            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1265            return false;
1266        }
1267        result = mysql_store_result( mysql ) ;
1268        if( result == NULL ){
1269            fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1270            return false;
1271        }
1272        if( row = mysql_fetch_row(result) ){
1273            sql = "SELECT * from " + dbprefix + "_groups_users_link ";
1274            sql += "WHERE groupid=" + string( row[ 0 ] );
1275            sql += " AND uid=" + string( unsignedIntToString( uid ) );
1276            mysql_free_result( result );
1277            
1278            if( mysql_query( mysql, sql.c_str( ) ) ){
1279                fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1280                return false;
1281            }
1282            result = mysql_store_result( mysql );
1283            if( result == NULL ){
1284                fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
1285                return false;
1286            }
1287            if( !mysql_fetch_row(result) ){
1288                mysql_free_result( result );
1289                return false;
1290            }
1291            mysql_free_result( result );
1292            return true;
1293        }else{
1294            mysql_free_result( result );
1295            return false;
1296        }
1297  }  }
1298    
1299  /**  /**

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.19

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26