⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apsinterface.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        {
            (*m_pProfileMap)[pczNewName] = strGUID;
        }
        if (m_strCollectionID.empty())
        {
            nRes = m_pYpClient->GetGUID(strGUID, 0);
            if (nRes == 0)
            {
                m_strCollectionID = strGUID;
            }
        }

        m_pMutex->Release();

        return ChangeProfile(pczNewName);
    }

    m_pMutex->Release();

    return APS_PARAMERROR;
}

int APSInterface::DeleteProfile(const char *pczNewName, bool bServerToo)
{
    // TODO: add server side deletion as well
    if (pczNewName == NULL) 
        return APS_PARAMERROR;

    string logfilename = m_profilePath + string(DIR_MARKER_STR) + 
                         string(pczNewName);
#ifdef WIN32
    DeleteFile(logfilename.c_str());
#else
    unlink(logfilename.c_str());
#endif

    m_pProfileMap->erase(pczNewName);
    if (m_strCurrentProfile == pczNewName)
    {
        m_strCurrentProfile = ""; // clear current profile
        if (m_pLogFile != NULL)
        {
            m_pLogFile->close();
            delete m_pLogFile;
            m_pLogFile = NULL;
        }
    }

    string savedProfiles = m_profilePath + string(DIR_MARKER_STR) +
                           string("profiles.txt");
    WriteProfileMap(savedProfiles.c_str());

    return APS_NOERROR;
}

int APSInterface::LoadProfileMap(const char *pczFile)
{
    if (pczFile == NULL) 
        return APS_PARAMERROR;

	FILE* pfIn = fopen(pczFile, "r");
	if (pfIn == NULL) return APS_PARAMERROR;

    int nNumProfiles = 0;
    string strCurrentProfileName;
    string strCollectionID;
	bool bIsOn = false;
	int nBufLen = 2048;
	int nStrLen = 0;
	char* pBuffer = new char[nBufLen];
	memset(pBuffer, 0x00, nBufLen);
	
	int nRes = fread(&nNumProfiles, sizeof(int), 1, pfIn);	// Number of profiles
	if (nRes == 0)
	{
		delete [] pBuffer;
		fclose(pfIn);
		return APS_PARAMERROR;
	}
	
	nRes = fread(&bIsOn, sizeof(bool), 1, pfIn); // is on flag
	if (nRes == 0)
	{
		delete [] pBuffer;
		fclose(pfIn);
		return APS_PARAMERROR;
	}
	
	nRes = fread(&nStrLen, sizeof(int), 1, pfIn); // len of current profile
	if ((nRes == 0) && (nStrLen < nBufLen))
	{
		delete [] pBuffer;
		fclose(pfIn);
		return APS_PARAMERROR;
	}
	
	nRes = fread(pBuffer, nStrLen, 1, pfIn); // current profile
	if (nRes == 0)
	{
		delete [] pBuffer;
		fclose(pfIn);
		return APS_PARAMERROR;
	}
	
	strCurrentProfileName = pBuffer;
	memset(pBuffer, 0x00, nStrLen);

	nRes = fread(&nStrLen, sizeof(int), 1, pfIn); // len of collection ID
	if ((nRes == 0) && (nStrLen < nBufLen))
	{
		delete [] pBuffer;
		fclose(pfIn);
		return APS_PARAMERROR;
	}
	
	nRes = fread(pBuffer, nStrLen, 1, pfIn);  // collection id
	if (nRes == 0)
	{
		delete [] pBuffer;
		fclose(pfIn);
		return APS_PARAMERROR;
	}

	strCollectionID = pBuffer;
	memset(pBuffer, 0x00, nStrLen);

	string* pProfNames = new string[nNumProfiles];
	string* pProfGUID = new string[nNumProfiles];
	
	int i = 0;
	for (i = 0; i < nNumProfiles; i++)
	{
		nRes = fread(&nStrLen, sizeof(int), 1, pfIn); // profile name len
		if ((nRes == 0) && (nStrLen < nBufLen))
		{
			delete [] pProfNames;
			delete [] pProfGUID;
			delete [] pBuffer;
			fclose(pfIn);
			return APS_PARAMERROR;
		}
		
		nRes = fread(pBuffer, nStrLen, 1, pfIn); // profile name
		if (nRes == 0)
		{
			delete [] pProfNames;
			delete [] pProfGUID;
			delete [] pBuffer;
			fclose(pfIn);
			return APS_PARAMERROR;
		}
		
		pProfNames[i] = pBuffer;
		memset(pBuffer, 0x00, nStrLen);

		nRes = fread(&nStrLen, sizeof(int), 1, pfIn); // GUID len
		if ((nRes == 0) && (nStrLen < nBufLen))
		{
			delete [] pProfNames;
			delete [] pProfGUID;
			delete [] pBuffer;
			fclose(pfIn);
			return APS_PARAMERROR;
		}
		
		nRes = fread(pBuffer, nStrLen, 1, pfIn); // GUID
		if (nRes == 0)
		{
			delete [] pProfNames;
			delete [] pProfGUID;
			delete [] pBuffer;
			fclose(pfIn);
			return APS_PARAMERROR;
		}
		
		pProfGUID[i] = pBuffer;
		memset(pBuffer, 0x00, nStrLen);
	}
	
	// having successfully read in the entire profile log file, apply it
    fclose(pfIn);

    if (strCollectionID == "NULL")
        m_strCollectionID = "";
    else
        m_strCollectionID = strCollectionID;

	m_bRelatableOn = bIsOn;
    for (i = 0; i < nNumProfiles; i++)
    {
        if ((!pProfNames[i].empty()) && (!pProfGUID[i].empty()))
            (*m_pProfileMap)[pProfNames[i]] = pProfGUID[i];
    }
	
	delete [] pProfNames;
	delete [] pProfGUID;
	delete [] pBuffer;

    if (!strCurrentProfileName.empty())
        return ChangeProfile(strCurrentProfileName.c_str());
    else
        return -1;  // no active profile
}

int APSInterface::WriteProfileMap(const char *pczFile)
{
    if (pczFile == NULL) 
        return APS_PARAMERROR;

    int nNumProfiles = m_pProfileMap->size();
    int nStrLen = 0;
    FILE* pfOut = fopen(pczFile, "w+b");
	
    if (pfOut == NULL)
	return APS_PARAMERROR;

    map<string, string>::iterator i;
    string strCurrentProfile = m_strCurrentProfile;
    if (strCurrentProfile.empty()) 
        strCurrentProfile = "NULL";
    
    string strCollectionID = m_strCollectionID;
    if (strCollectionID.empty())
        strCollectionID = "NULL";
	
    // file format is : numprofiles, isenabled flag, current profile name len, current profile name, 
    //	current collection id len, current collection id, 
    // for each profile entry, name len, name, guid len, guid
    int nRes = fwrite(&nNumProfiles, sizeof(int), 1, pfOut);
    if (nRes == 0) 
    {
	fclose(pfOut);
	return APS_PARAMERROR;
    }
	
	nRes = fwrite(&m_bRelatableOn, sizeof(bool), 1, pfOut);
	if (nRes == 0) 
	{
		fclose(pfOut);
		return APS_PARAMERROR;
	}

	nStrLen = strCurrentProfile.size();
	nRes = fwrite(&nStrLen, sizeof(int), 1, pfOut);
	if (nRes == 0) 
	{
		fclose(pfOut);
		return APS_PARAMERROR;
	}
	
	nRes = fwrite(strCurrentProfile.c_str(), nStrLen, 1, pfOut);
	if (nRes == 0) 
	{
		fclose(pfOut);
		return APS_PARAMERROR;
	}
	
	nStrLen = strCollectionID.size();
	nRes = fwrite(&nStrLen, sizeof(int), 1, pfOut);
	if (nRes == 0) 
	{
		fclose(pfOut);
		return APS_PARAMERROR;
	}

	nRes = fwrite(strCollectionID.c_str(), nStrLen, 1, pfOut);
	if (nRes == 0) 
	{
		fclose(pfOut);
		return APS_PARAMERROR;
	}
	
    for (i = m_pProfileMap->begin(); i != m_pProfileMap->end(); i++)
    {
		nStrLen = (*i).first.size();
		nRes = fwrite(&nStrLen, sizeof(int), 1, pfOut);
		if (nRes == 0) 
		{
			fclose(pfOut);
			return APS_PARAMERROR;
		}

		nRes = fwrite((*i).first.c_str(), nStrLen, 1, pfOut);
		if (nRes == 0) 
		{
			fclose(pfOut);
			return APS_PARAMERROR;
		}
		
		nStrLen = (*i).second.size();
		nRes = fwrite(&nStrLen, sizeof(int), 1, pfOut);
		if (nRes == 0) 
		{
			fclose(pfOut);
			return APS_PARAMERROR;
		}
		
		nRes = fwrite((*i).second.c_str(), nStrLen, 1, pfOut);
		if (nRes == 0) 
		{
			fclose(pfOut);
			return APS_PARAMERROR;
		}
    }

    fclose(pfOut);
    return APS_NOERROR;
}

int APSInterface::CombineProfile(const char *ProfileName)
{
    if (ProfileName == NULL) 
        return APS_PARAMERROR;

    bool bInList = false;

    vector<string>::iterator i;

    for ( i = m_pActiveProfiles->begin(); i != m_pActiveProfiles->end(); i++)
    {
        if (*i == ProfileName) 
            bInList = true;
    }

    if (!bInList)
    {
        map<string, string>::iterator i;
        i = m_pProfileMap->find(ProfileName);
        if (i != m_pProfileMap->end())
        {
            m_pActiveProfiles->insert(m_pActiveProfiles->end(), ProfileName);
        }
    }

    return APS_NOERROR;
}

vector<string>* APSInterface::GetKnownProfiles()
{
    if (m_pProfileMap->empty()) 
        return NULL;

    vector<string>* pReturn = new vector<string>;
    map<string, string>::iterator i = m_pProfileMap->begin();

    if (m_pProfileMap->size() == 1)
    {
        pReturn->insert(pReturn->end(), (*i).first);
    }
    else {
        for (i = m_pProfileMap->begin(); i != m_pProfileMap->end(); i++)
        {
            pReturn->insert(pReturn->end(), (*i).first);
        }
    }

    if (pReturn->empty())
    {
        delete pReturn;
        return NULL;
    }

    return pReturn;
}

vector<string>* APSInterface::GetActiveProfiles()
{
    if (!IsTurnedOn()) 
        return NULL;

    vector<string>* pReturn = new vector<string>(*m_pActiveProfiles);

    return pReturn;
}

void APSInterface::ClearActiveProfiles()
{
    m_pActiveProfiles->clear();

    if (!m_strCurrentProfile.empty()) 
        CombineProfile(m_strCurrentProfile.c_str());
}

int APSInterface::SyncLog()
{
    if (!IsTurnedOn())
        return APS_PARAMERROR;

    int nRes = -1;

    EventRecord TempRecord;
    EventLog TheLog;
    m_pMutex->Acquire();
       
    if (m_pLogFile != NULL) // close the current log file
    {
        if (m_pLogFile->is_open()) 
            m_pLogFile->close();
        delete m_pLogFile;
        m_pLogFile = NULL;
    }
    string logfilename = m_profilePath + string(DIR_MARKER_STR) +
                         m_strCurrentProfile;

    fstream fIn(logfilename.c_str(), ios_base::in);
    if (fIn.is_open()) {  
 
        TempRecord.strGUID = "blah";
        // Does this deal with the spaces between fields or the binary bits 
        // in the GUID?
        while (!fIn.eof() && !TempRecord.strGUID.empty())
        {
            TempRecord.strGUID.erase(TempRecord.strGUID.begin(), 
                                     TempRecord.strGUID.end());
            fIn >> TempRecord.lTimeStamp >> TempRecord.strGUID 
                >> TempRecord.nEventType;
            if (!TempRecord.strGUID.empty())
            {
                TheLog.push_back(TempRecord);
            }
        }
       
        fIn.close();
        if (TheLog.size() > 0)
        {
            nRes = m_pYpClient->SyncLog(TheLog, 
                                        (*m_pProfileMap)[m_strCurrentProfile]);
       
            if (nRes == 0)
            {
               // empty the log file
               fIn.open(logfilename.c_str(), ios_base::out | ios_base::trunc);
               if (fIn.is_open())
                   fIn.close();
            }
        }
    }
                      
    m_pMutex->Release();
       
    this->ChangeProfile(m_strCurrentProfile.c_str()); // reopen logfile.
    return nRes;
}

bool APSInterface::IsTurnedOn()
{
    if (m_bRelatableOn && m_strCurrentProfile != "")
        return true;
    return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -