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"; }
// 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 ); }