Ejemplo n.º 1
0
wchar_t * ContentStream::processStringObject(StringObject * stringObject)
{
  if(stringObject == null)
  {
    cerr << "\nContentStream: Can't proces null object in processStringObject method. Something went wrong.\n";
    return null;
  }

  wchar_t * result = null;
  
  if(this->currentCMap != null) //try toUnicode map
  {
    result = convertStringWithToUnicode(stringObject, this->currentCMap);
    if(result != null)
      return result;
  }
  if(this->currentFont != null) //try some basic encoding
  {
    char ** differences = null;
    PdfObject * encoding = this->currentFont->getObject("/Encoding", true);
    if(encoding != null && encoding->objectType == PdfObject::TYPE_DICTIONARY)
    {
      //TODO: get diffs from map
      PdfObject * diffs;
      diffs = ((DictionaryObject*) encoding)->getObject("/Differences", true);
      if(diffs != null)
      {
        if(diffs->objectType == PdfObject::TYPE_ARRAY)
        {
          ArrayObject * diffsArr = (ArrayObject*) diffs;
          differences = new char*[256];
          int di;
          for(di = 0; di < 256; di++)
          {
            differences[di] = null;
          }
          vector<PdfObject*>::iterator diffsArrIt = diffsArr->objectList.begin();
          int charCode = 0;
          for(; diffsArrIt != diffsArr->objectList.end(); diffsArrIt++)
          {
            if((*diffsArrIt)->objectType == PdfObject::TYPE_NUMBER)
            {
              charCode = (int) ((NumberObject*)(*diffsArrIt))->number;
            }
            if((*diffsArrIt)->objectType == PdfObject::TYPE_NAME)
            {
              int nameLen = strlen(((NameObject*)(*diffsArrIt))->name) -1;
              char * diffName = new char[nameLen+1]; 
              strncpy(diffName, ((NameObject*)(*diffsArrIt))->name+1, nameLen); //we need to add "+1" because we want remove initial '/' char
              diffName[nameLen] = 0;
              if(charCode >= 0 && charCode < 256)
                differences[charCode] = diffName;
              else
              {
                cerr << "\nContentStream: Problem with creating differences array.\n";
                break;
              }
              charCode++;
            }
          }
          //TODO: set diffs to map
        }
        else
        {
          cerr << "\nContentStream: unknown object for differences array.\n";
        }
      }
      encoding = ((DictionaryObject*) encoding)->getObject("/BaseEncoding", true);
    }
    if(encoding != null && encoding->objectType == PdfObject::TYPE_NAME)
    {
      NameObject * encodingName = (NameObject*) encoding;
      if(strcmp(encodingName->name, "/MacRomanEncoding") == 0)
      {
        return convertWithBaseEncoding(stringObject, encoding_MacRoman, differences);
      }
      else if(strcmp(encodingName->name, "/MacExpertEncoding") == 0)
      {
        return convertWithBaseEncoding(stringObject, encoding_MacExpert, differences);
      }
      else if(strcmp(encodingName->name, "/WinAnsiEncoding") == 0)
      {
        return convertWithBaseEncoding(stringObject, encoding_WinAnsi, differences);
      }
      else if(strcmp(encodingName->name, "/StandardEncoding") == 0)
      {
        return convertWithBaseEncoding(stringObject, encoding_Standard, differences);
      }
      else
      {
        if(this->currentCMap == null) //TODO: find out why some chars are missing in toUnicode map of type 0 font (use thesis.pdf)
        {
          cerr << "\nContentStream: Unsupported encoding. Using simple conversion.\n";
        }
        return charToWchar((char*)stringObject->getByteString(), stringObject->getByteStringLen());
      }
    }
    else //if no encoding specified than use standard one
    {
      return convertWithBaseEncoding(stringObject, encoding_Standard, differences);
    }
  }
  else
  {
    cerr << "\nContentStream: No font found for decoding string.\n";
    return L"\0";
  }
  cerr << "\nContentStream: All implemented methods for decoding string failed.\n";
  return L"\0";
}
Ejemplo n.º 2
0
// SOF2 had some silly two-stage thing. They stored off the session parms here, then used
// a couple globals to delay advertisement until later. I'm going to try and avoid that
void XBL_MM_Init_Session()
{
	// Fill in # of slots. OpenPublic is total slots, minus one for server, minus # reserved for private
	session.PrivateFilled		= 0;
	session.PrivateOpen			= sv_privateClients->integer;
	session.PublicFilled		= (com_dedicated->integer ? 0 : 1);	// Non-dedicated server fills a slot
	session.PublicOpen			= sv_maxclients->integer - (session.PrivateOpen + session.PublicFilled);
	session.TotalPlayers		= session.PublicFilled;

	// Get current map index, and gametype
	int index = mapNameToIndex( sv_mapname->string );
	if (index == MAP_ARRAY_SIZE)
	{
		Com_Error( ERR_FATAL, "Bad map name: %s\n", sv_mapname->string );
	}
	session.CurrentMap = index;
	session.GameType = sv_gametype->integer;

	// Copy the host's gamertag to the session name
	XONLINE_USER* pHostAccount = XBL_GetUserInfo( XBL_GetSelectedAccountIndex() );
	WCHAR sessionName[XONLINE_GAMERTAG_SIZE] = { 0 };
	if ( pHostAccount )
	{
		charToWchar( sessionName, pHostAccount->szGamertag );
	}
	else
	{
		charToWchar( sessionName, "unknown" );
	}
	session.SetSessionName( sessionName );

	// All other game options:
	session.FriendlyFire	= g_friendlyFire.integer;
	session.JediMastery		= g_maxForceRank.integer;
	session.SaberOnly		= HasSetSaberOnly();
	session.Dedicated		= com_dedicated->integer;

	// Actually create the session. If we don't call Process immediately, it explodes
	HRESULT hr = session.Create();
	if (hr != S_OK)
	{
		Com_Error( ERR_DROP, "Failed to create session: 0x%x\n", hr );
	}

	do
	{
		if( !XBL_PumpLogon() )
			return;
		hr = session.Process();
	} while ( session.IsCreating() );

	// VVFIXME - Better error handling
	if ( !session.Exists() )
	{
		Com_Error( ERR_DROP, "Failed to create session #2: 0x%x\n", hr );
	}

	// Fix for a bug. Server was using Notification API before advertising, so for
	// the first few seconds, had the wrong sessionID, and thus couldn't invite.
	// Force an update now:
	XBL_F_CheckJoinableStatus( true );
}