예제 #1
0
파일: Model.cpp 프로젝트: komadori/HsQML
void HsQMLAutoListModel::updateModelByKey(bool reorder)
{
    int srcLen = sourceLength();

    // Build a map of element key's highest indices in the new source
    typedef QHash<QString, int> SrcDict;
    SrcDict srcDict;
    if (reorder) {
        for (int i=0; i<srcLen; i++) {
            QJSValue srcVal = mSource.property(i);
            srcDict.insert(keyFunction(srcVal), i);
        }
    }

    // Build a map of element key's previous indices in the old model
    typedef QMultiHash<QString, int> ModelDict;
    ModelDict modelDict;
    for (int idx = mOldModel.size()-1; idx >= 0; --idx) {
        Element& e = mOldModel[idx];
        if (mRehash) {
            e.mKey = keyFunction(e.mValue);
        }
        modelDict.insert(e.mKey, idx);
    }
    mRehash = false;

    // Rearrange and insert new elements
    Q_ASSERT(!mNewModel.size() && !mOldOffset);
    mNewModel.reserve(srcLen);
    for (int i=0; i<srcLen; i++) {
        QJSValue srcVal = mSource.property(i);
        QString srcKey = keyFunction(srcVal);

        ModelDict::iterator it = modelDict.find(srcKey);
        if (it != modelDict.end()) {
            const int elemIdx = *it;
            Q_ASSERT(elemIdx >= mOldOffset);
            Q_ASSERT(elemIdx < mOldModel.size());
            modelDict.erase(it);

            // Try removing elements before target
            while (elemIdx > mOldOffset) {
                const Element& nextElem = mOldModel[mOldOffset];

                if (reorder) {
                    // Check if element will be used later
                    SrcDict::iterator srcIt = srcDict.find(nextElem.mKey);
                    if (srcIt != srcDict.end()) {
                        if (srcIt.value() >= i) {
                            // Old element is still needed by the new source
                            break;
                        }
                    }
                }

                // Remove element
                HSQML_LOG(3, QString().sprintf(
                    "AutoListModel.ByKey: Removed element at %d.", i));
                beginRemoveRows(QModelIndex(), i, i);
                mOldOffset++;
                endRemoveRows();
                modelDict.erase(modelDict.find(nextElem.mKey));
            }

            // Move target element earlier in list if needed
            if (elemIdx > mOldOffset) {
                Q_ASSERT(reorder);
                int srcIdx = fromOldIndex(elemIdx);
                HSQML_LOG(3, QString().sprintf(
                    "AutoListModel.ByKey: Moved element at %d to %d.",
                    srcIdx, i));
                beginMoveRows(QModelIndex(), srcIdx, srcIdx, QModelIndex(), i);
                mNewModel.append(mOldModel[elemIdx]);
                mOldModel.remove(elemIdx);
                endMoveRows();

                // Renumber remaining indices in the old model
                for (ModelDict::iterator renumIt = modelDict.begin();
                     renumIt != modelDict.end();) {
                    ModelDict::iterator currIt = renumIt++;
                    Q_ASSERT(currIt.value() >= mOldOffset);
                    if (currIt.value() > elemIdx) {
                        currIt.value()--;
                    }
                }
            }
            else {
                // Transfer element from old to new model
                mNewModel.append(mOldModel[elemIdx]);
                mOldOffset++;
            }

            // Has value changed?
            handleInequality(srcVal, mNewModel, i);
            Q_ASSERT(mNewModel.size() == i+1);
        }
        else {
            HSQML_LOG(3, QString().sprintf(
                "AutoListModel.ByKey: Inserted element at %d.", i));
            beginInsertRows(QModelIndex(), i, i);
            mNewModel.append(Element(srcVal, srcKey));
            endInsertRows();
        }
    }

    // Move element to the old model, removing any excess elements from the end
    bool excess = mOldOffset < mOldModel.size();
    if (excess) {
        HSQML_LOG(3, QString().sprintf(
            "AutoListModel.ByKey: Removed %d excess elements at %d.",
            mOldModel.size() - mOldOffset, srcLen));
        beginRemoveRows(QModelIndex(), srcLen, rowCount(QModelIndex())-1);
    }
    mNewModel.swap(mOldModel);
    mNewModel.clear();
    mOldOffset = 0;
    if (excess) {
        endRemoveRows();
    }
}
예제 #2
0
//===== Main encrypt function
int encrypt( FILE *ftable, FILE *fin, const char *key_str, const int decrypt_flag ) {
	
	//==================== Get and check key
	unsigned char	*key_byte;
	
	// Get size of key array
	int				key_byte_len;
	key_byte_len	= ( strlen(key_str) + 1 ) / 2;
	
	key_byte = keyFunction( key_str, key_byte_len, VALID_KEY_LEN );
	
	// Key error checking
	if( key_byte == NULL ) {
		
		fprintf(stderr, "hw5: ERROR: Key processing failure!\n");
		
		return 1;
	}
	
	
	//==================== Get tablefile tables
	
	//--- Check tablefiles
	if ( tableCheck( ftable ) ) {
		
		fprintf(stderr, "\nhw5: ERROR: Tablefile errors!\n");
		
		free(key_byte);
		
		return 1;
	}
	
	// DEBUG :
	{
		//printf( "\nTablefile check passes!\n" );
	}
	
	
	unsigned int	*ip_table;
	unsigned int	*e_table;
	unsigned int	**s_table;
	s_table = (unsigned int**) malloc( sizeof(unsigned int*) * S_TABLE_NUM );
	unsigned int	*p_table;
	unsigned int	*v_table;
	unsigned int	*pc1_table;
	unsigned int	*pc2_table;
	unsigned int	*fp_table;
	
	//--- Call get table functions
	{
		ip_table	= getTableValues( ftable, TOKEN_IP, IP_TABLE_LEN );
		e_table		= getTableValues( ftable, TOKEN_E, E_TABLE_LEN );
		s_table[0]	= getTableValues( ftable, TOKEN_S1, S_TABLE_LEN );
		s_table[1]	= getTableValues( ftable, TOKEN_S2, S_TABLE_LEN );
		s_table[2]	= getTableValues( ftable, TOKEN_S3, S_TABLE_LEN );
		s_table[3]	= getTableValues( ftable, TOKEN_S4, S_TABLE_LEN );
		s_table[4]	= getTableValues( ftable, TOKEN_S5, S_TABLE_LEN );
		s_table[5]	= getTableValues( ftable, TOKEN_S6, S_TABLE_LEN );
		s_table[6]	= getTableValues( ftable, TOKEN_S7, S_TABLE_LEN );
		s_table[7]	= getTableValues( ftable, TOKEN_S8, S_TABLE_LEN );
		p_table		= getTableValues( ftable, TOKEN_P, P_TABLE_LEN );
		v_table		= getTableValues( ftable, TOKEN_V, V_TABLE_LEN );
		pc1_table	= getTableValues( ftable, TOKEN_PC1, PC1_TABLE_LEN );
		pc2_table	= getTableValues( ftable, TOKEN_PC2, PC2_TABLE_LEN );
		fp_table	= computeFPTable( ip_table, IP_TABLE_LEN );
	}
	
	// DEBUG :
	{
		/*
		int dti;
		printf( "\nIP-Table:" );
		for ( dti=0; dti<IP_TABLE_LEN; dti++ ) {
			if ( dti % 8 == 0 ) {
				printf( "\n" );
			}
			printf( "%02d ", ip_table[dti] );
		}
		printf( "\n" );
		*/
		
		/*
		printf( "\nE-Table:" );
		int dti;
		for ( dti=0; dti<E_TABLE_LEN; dti++ ) {
			if ( dti % 6 == 0 ) {
				printf( "\n" );
			}
			printf( "%02d ", e_table[dti] );
		}
		printf( "\n" );
		*/
	
		/*
		int dti;
		int dtj;
		for ( dtj=0; dtj<S_TABLE_NUM; dtj++ ) {
		
			printf( "\nS%d-Table:", dtj );
			for ( dti=0; dti<S_TABLE_LEN; dti++ ) {
				if ( dti % 16 == 0 ) {
					printf( "\n" );
				}
				printf( "%02d ", s_table[dtj][dti] );
			}
			printf( "\n" );
		}
		*/
		
		/*
		printf( "\nP-Table:" );
		int dti;
		for ( dti=0; dti<P_TABLE_LEN; dti++ ) {
			if ( dti % 4 == 0 ) {
				printf( "\n" );
			}
			printf( "%02d ", p_table[dti] );
		}
		printf( "\n" );
		*/
		
		/*
		printf( "\nV-Table:\n" );
		int dti;
		for ( dti=0; dti<V_TABLE_LEN; dti++ ) {
			printf( "%d ", v_table[dti] );
		}
		printf( "\n" );
		*/
		
		/*
		int dti;
		printf( "\nPC1-Table:\n" );
		for ( dti=0; dti<PC1_TABLE_LEN; dti++ ) {
			if ( dti % 7 == 0 ) {
				printf( "\n" );
			}
			printf( "%02d ", pc1_table[dti] );
		}
		printf( "\n" );
		*/
		
		/*
		printf( "\nPC2-Table:\n" );
		int dti;
		for ( dti=0; dti<PC2_TABLE_LEN; dti++ ) {
			if ( dti % 7 == 0 ) {
				printf( "\n" );
			}
			printf( "%02d ", pc2_table[dti] );
		}
		printf( "\n" );
		*/
		
		/*
		printf( "\nFP-Table:\n" );
		int dti;
		for ( dti=0; dti<IP_TABLE_LEN; dti++ ) {
			if ( dti % 8 == 0 ) {
				printf( "\n" );
			}
			printf( "%02d ", fp_table[dti] );
		}
		printf( "\n" );
		*/
	}
	
	
	//==================== Compute subkeys
	unsigned char	**subkey;
	subkey			= (unsigned char**) malloc( sizeof(unsigned char*) * FEISTEL_ROUNDS );
	
	int				subkey_len				= PC2_TABLE_LEN / 8;
	
	subkeyFunction(	pc1_table, PC1_TABLE_LEN,
					v_table, V_TABLE_LEN,
					pc2_table, PC2_TABLE_LEN,
					key_byte, key_byte_len,
					FEISTEL_ROUNDS,
					decrypt_flag,
					subkey, subkey_len );
	
	
	//==================== Encryption 
	
	int				msg_block_bytes			= 1;
	int				block_cnt				= 0;
	int				block_len				= BLOCK_BYTES;
	
	// Initialize ciphter block
	unsigned char	*cipher_block;
	
	//--- Get initial 8-byte block of message
	unsigned char	msg_block[block_len];
	
	msg_block_bytes = getMsgBlock( fin, msg_block, block_len  );
	block_cnt++;
	
	
	//--- Loop to process block and get next blocks
	while ( msg_block_bytes > 0 ) {
		
		// DEBUG :
		{
			/*
			printf( "\nMessage block bytes: %d\n", msg_block_bytes );
			printf( "Plaintext : " );
			int i;
			for ( i=0; i<BLOCK_BYTES; i++ ) {
			
				printf( "%02x", msg_block[i] );
			}
			printf( "\n" );
			*/
		}
		
		//--- Call get cipher block function
		cipher_block = getCipherBlock(	ip_table, IP_TABLE_LEN,
										e_table, E_TABLE_LEN,
										s_table, S_TABLE_NUM, S_TABLE_LEN,
										p_table, P_TABLE_LEN,
										fp_table, IP_TABLE_LEN,
										subkey, FEISTEL_ROUNDS, subkey_len,
										msg_block, block_len, 
										block_cnt );
		
		
		//--- Write to stdout
		fwrite( cipher_block, 1, block_len, stdout );
		
		
		//--- Get next 8-byte block of message
		msg_block_bytes = getMsgBlock( fin, msg_block, block_len );
		
		if ( msg_block_bytes == 0 ) {
			
			// Free heap memory
			free(cipher_block);
		
			break;
		}
		
		block_cnt++;
		
		// Free heap memory
		free(cipher_block);
	}
	
	
	//===== Free heap memory
	{
		free(key_byte);
		free(v_table);
		free(pc1_table);
		free(pc2_table);
		free(ip_table);
		free(fp_table);
		free(e_table);
		free(p_table);
		
		int fhi;
		for ( fhi=0; fhi<S_TABLE_NUM; fhi++ ) {
			free(s_table[fhi]);
		}
		free(s_table);
		
		for ( fhi=0; fhi<FEISTEL_ROUNDS; fhi++ ) {
			free(subkey[fhi]);
		}
		free(subkey);
	}
	
	
	return 0;
	
	/*
	SUBKEY_ERROR: {
	
		free(key_byte);
		free(ip_table);
		free(e_table);
		free(p_table);
		free(v_table);
		free(pc1_table);
		free(pc2_table);
		free(fp_table);
		int fhi;
		for ( fhi=0; fhi<S_TABLE_NUM; fhi++ ) {
			free(s_table[fhi]);
		}
		free(s_table);
		
		return 1;
	}
	*/
}